Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
car-controlserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wenzhongjian
car-controlserver
Commits
c380ff23
Commit
c380ff23
authored
Jun 26, 2025
by
学习的菜鸟
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feature://加入了jwt验证,已测试一部分,后端还在测试,测试通过后直接打标签
parent
8deca748
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
565 additions
and
345 deletions
+565
-345
version.h
build/include/version.h
+1
-1
main
build/main
+0
-0
mqtt_verify.h
include/mqtt_verify.h
+7
-2
audioplay.c
src/audioplay.c
+4
-1
mqtt.c
src/mqtt.c
+69
-19
mqtt_verify.c
src/mqtt_verify.c
+471
-312
thread_main.c
src/thread_main.c
+1
-1
gpio_pwm_car0102.c
system/gpio/gpio_pwm_car0102.c
+7
-7
heat.c
system/sensor/heat.c
+1
-0
warm.c
system/sensor/warm.c
+4
-2
No files found.
build/include/version.h
View file @
c380ff23
...
...
@@ -2,5 +2,5 @@
#define PROJECT_VERSION_MINOR 1
#define PROJECT_VERSION_PATCH 8
#define GIT_HASH ""
#define BUILD_TIMESTAMP "2025-06-2
4T10:17:31
"
#define BUILD_TIMESTAMP "2025-06-2
6T03:49:36
"
#define BUILD_USER "orangepi"
build/main
View file @
c380ff23
No preview for this file type
include/mqtt_verify.h
View file @
c380ff23
...
...
@@ -6,10 +6,14 @@
extern
int
gverify_count
;
//验证计时
extern
int
gverify_index
;
//判断是否验证成功
int
receive_jwt
(
cJSON
*
body
);
//jwt验证
//接收安卓发送的mqtt
int
receive_verify
(
cJSON
*
body
);
//int receive_verify(cJSON *body);//为aes验证,暂时不用,注释
//加密并发送mqtt
int
mqtt_encryption
();
//int mqtt_encryption();//为aes验证,暂时不用,注释
int
message2006_verify
(
cJSON
*
body
);
#endif
\ No newline at end of file
src/audioplay.c
View file @
c380ff23
...
...
@@ -8,6 +8,7 @@ char urlbuf[512];
char
keybuf
[
256
];
double
audio_volume
=
0
.
8
;
//接收音频播放
void
audioplay_mqtt_receive
(
cJSON
*
json
)
{
// 解析"audioLink"字段(修正了原始JSON中的拼写错误)
cJSON
*
audio_link
=
cJSON_GetObjectItemCaseSensitive
(
json
,
"audioLink"
);
...
...
@@ -49,7 +50,8 @@ void audioplay_mqtt_receive(cJSON *json) {
}
}
void
audioplay_send_mqtt
()
{
//发送音频播放是否完毕
//发送音频播放是否完毕
void
audioplay_send_mqtt
()
{
cJSON
*
root
=
cJSON_CreateObject
();
cJSON
*
body
=
cJSON_CreateObject
();
cJSON
*
head
=
cJSON_CreateObject
();
...
...
@@ -73,6 +75,7 @@ void audioplay_send_mqtt() {//发送音频播放是否完毕
cJSON_Delete
(
root
);
}
//音频播放
void
audioplay_cycle
(){
char
command
[
512
];
int
ret
;
...
...
src/mqtt.c
View file @
c380ff23
...
...
@@ -52,6 +52,7 @@ char *glon=NULL;//加入gps后删除,心跳预留,不更改
time_t
gStart
;
//时间戳
//mqtt初始化
int
mqtt_init
()
{
mosquitto_lib_init
();
// 这里创建mosq可以保留,也可以删除这一行,让创建放到 Mqtt_onnect 里
...
...
@@ -64,7 +65,8 @@ int mqtt_init() {
return
0
;
}
void
on_connect
(
struct
mosquitto
*
mosq
,
void
*
obj
,
int
rc
)
{
//回调函数
//回调函数
void
on_connect
(
struct
mosquitto
*
mosq
,
void
*
obj
,
int
rc
)
{
if
(
rc
==
0
)
{
my_zlog_debug
(
"Connected to broker"
);
topic_middle_value
();
...
...
@@ -76,7 +78,8 @@ void on_connect(struct mosquitto *mosq, void *obj, int rc) {//回调函数
}
}
void
heartbeat_send
()
{
//心跳发送格式*5/2
//心跳发送格式*5/2
void
heartbeat_send
()
{
float
voltage
=
INA226_readBusVoltage
();
float
current
=
INA226_readCurrent
();
//my_zlog_debug("%.2f\n", voltage);
...
...
@@ -130,7 +133,8 @@ void heartbeat_send() {//心跳发送格式*5/2
cJSON_Delete
(
root
);
// 释放 cJSON 对象
}
void
angle_mqtt_send
()
{
//角度发送
//角度发送
void
angle_mqtt_send
()
{
float
angle_shot
=
ads1115_read_channel
(
2
);
if
(
angle_shot
>
0
){
angle_shot
=
angle_shot
*
360
/
5
;
...
...
@@ -151,14 +155,16 @@ void angle_mqtt_send() { //角度发送
}
void
mqtt_wirte
(){
//心跳格式,每5s一次心跳
//心跳格式,每5s一次心跳
void
mqtt_wirte
(){
if
(
heartbeat_count
>=
30
)
heartbeat_send
();
if
(
AppExit_pin_pwm
==
202
)
angle_mqtt_send
();
}
void
message_3
(
cJSON
*
body
){
//message_type为3,控制pwm
//message_type为3,控制pwm
void
message_3
(
cJSON
*
body
){
cJSON
*
pwm_ctrl
=
cJSON_GetObjectItem
(
body
,
"pwm_ctrl"
);
cJSON
*
pin_setctrl
=
cJSON_GetObjectItem
(
body
,
"pin_setctrl"
);
if
(
pwm_ctrl
==
NULL
||
pin_setctrl
==
NULL
){
...
...
@@ -220,7 +226,39 @@ void message_4(cJSON *body){//message 为4时候
if
(
AppExit_pin_pwm
==
202
)
tank_shot_back_stop
(
gvalt
[
1
],
gvalt
[
2
]);
}
int
download_message
(
cJSON
*
body
){
//接收的下载的mqtt消息
//当接收到2时候验证
void
message_2_judyverify
(
cJSON
*
body
){
receive_jwt
(
body
);
if
(
gverify_index
==
0
)
{
refresh_cam
();
}
else
{
my_zlog_warn
(
"验证不通过"
);
}
}
//当接收到3时候验证
void
message_3_judyverify
(
cJSON
*
body
){
receive_jwt
(
body
);
if
(
gverify_index
==
0
)
{
message_3
(
body
);
}
else
{
my_zlog_warn
(
"验证不通过"
);
}
}
//当接收到4时候验证
void
message_4_judyverify
(
cJSON
*
body
){
receive_jwt
(
body
);
if
(
gverify_index
==
0
)
{
message_4
(
body
);
}
else
{
my_zlog_warn
(
"验证不通过"
);
}
}
//接收的下载的mqtt消息
int
download_message
(
cJSON
*
body
){
if
(
cJSON_IsObject
(
body
))
{
// 获取 doby 对象
// 获取 site 中的 name 和 url
...
...
@@ -246,6 +284,7 @@ int download_message(cJSON *body){//接收的下载的mqtt消息
return
0
;
}
//接收到设备改名函数
int
device_mqttchange_name
(
cJSON
*
device_id
){
cJSON
*
id
=
cJSON_GetObjectItem
(
device_id
,
"id"
);
// 提取ID
cJSON
*
date
=
cJSON_GetObjectItem
(
device_id
,
"date"
);
// 提取日期
...
...
@@ -274,21 +313,16 @@ int device_message_receive(cJSON *json){//接收到的控制设备的mqtt消息
gmessage_type
=
message_type
->
valueint
;
my_zlog_debug
(
"message_type: %d"
,
message_type
->
valueint
);
switch
(
gmessage_type
){
case
1
:
system
(
"sudo reboot"
);
//重启香橙派
my_zlog_debug
(
"重启成功"
);
break
;
case
2
:
refresh_cam
();
my_zlog_debug
(
"
刷新成功
"
);
message_2_judyverify
(
body
);
my_zlog_debug
(
"
进入刷新
"
);
break
;
case
3
:
receive_verify
(
body
);
if
(
gverify_index
==
0
)
message_3
(
body
);
message_3_judyverify
(
body
);
my_zlog_debug
(
"进入pwm控制"
);
break
;
case
4
:
message_4
(
body
);
message_4
_judyverify
(
body
);
my_zlog_debug
(
"进入引脚控制"
);
break
;
case
2001
:
...
...
@@ -309,6 +343,19 @@ int device_message_receive(cJSON *json){//接收到的控制设备的mqtt消息
break
;
case
2005
:
download_message
(
body
);
my_zlog_debug
(
"进入下载"
);
break
;
case
2006
:
message2006_verify
(
body
);
my_zlog_debug
(
"进入消息为2006验证"
);
break
;
case
2011
:
system
(
"sudo reboot"
);
//重启香橙派
my_zlog_debug
(
"重启成功"
);
break
;
case
2012
:
refresh_cam
();
my_zlog_debug
(
"刷新成功"
);
break
;
default
:
break
;
...
...
@@ -318,7 +365,8 @@ int device_message_receive(cJSON *json){//接收到的控制设备的mqtt消息
return
0
;
}
void
on_message
(
struct
mosquitto
*
mosq
,
void
*
obj
,
const
struct
mosquitto_message
*
message
)
{
//消息回环函数
//消息回环函数
void
on_message
(
struct
mosquitto
*
mosq
,
void
*
obj
,
const
struct
mosquitto_message
*
message
)
{
time_t
end
=
time
(
NULL
);
if
(
gStart
+
5
>
end
){
...
...
@@ -349,8 +397,8 @@ void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_messag
}
}
int
mqtt_create
(
struct
mosquitto
*
mosq
)
{
// 返回连接结果,0成功,非0失败
// 返回连接结果,0成功,非0失败
int
mqtt_create
(
struct
mosquitto
*
mosq
)
{
mosquitto_reconnect_delay_set
(
mosq
,
2
,
10
,
true
);
mosquitto_connect_callback_set
(
mosq
,
on_connect
);
mosquitto_message_callback_set
(
mosq
,
on_message
);
...
...
@@ -365,7 +413,8 @@ int mqtt_create(struct mosquitto *mosq) { // 返回连接结果,0成功,非0
return
0
;
// 成功
}
int
mqtt_cycle
(
struct
mosquitto
*
mosq
)
{
//阻塞型
//阻塞型
int
mqtt_cycle
(
struct
mosquitto
*
mosq
)
{
// 这个函数会阻塞直到连接断开或错误返回
int
rc
=
mosquitto_loop_forever
(
mosq
,
-
1
,
1
);
if
(
rc
!=
MOSQ_ERR_SUCCESS
)
{
...
...
@@ -386,6 +435,7 @@ int mqtt_cycle(struct mosquitto *mosq) {//阻塞型
// }
// }
//mqtt清理
void
mqtt_clean
(
struct
mosquitto
*
mosq
){
// 清理
mosquitto_destroy
(
mosq
);
...
...
src/mqtt_verify.c
View file @
c380ff23
...
...
@@ -11,144 +11,52 @@
#include "mqtt.h"
#include "judg.h"
bool
service_verify
=
TRUE
;
//验证判断
char
*
id
=
NULL
;
char
*
model
=
NULL
;
char
*
number
=
NULL
;
int
*
start_time
=
NULL
;
char
*
user_id
=
NULL
;
int
gverify_count
=
12000
;
//判断是否有一分钟
int
gverify_count
=
0
;
//判断是否有15s
int
gverify_index
=
0
;
//判断是否验证成功
char
only_id_middle
[
11
];
char
secret_key
[
256
];
//存储上一次的topic
bool
secret_key_index
=
TRUE
;
//用于判断是否对比topic
//接收验证消息并15s一次验证,只有在接收时候才会15s一次验证
int
receive_verify
(
cJSON
*
body
)
{
cJSON
*
device_info
=
cJSON_GetObjectItem
(
body
,
"device_info"
);
if
(
device_info
==
NULL
)
{
my_zlog_debug
(
"验证为空"
);
return
1
;
}
// 取各个字段(字符串类型)
cJSON
*
json_id
=
cJSON_GetObjectItem
(
device_info
,
"id"
);
cJSON
*
json_model
=
cJSON_GetObjectItem
(
device_info
,
"model"
);
cJSON
*
json_number
=
cJSON_GetObjectItem
(
device_info
,
"number"
);
cJSON
*
json_start_time
=
cJSON_GetObjectItem
(
device_info
,
"start_time"
);
cJSON
*
json_user_id
=
cJSON_GetObjectItem
(
device_info
,
"user_id"
);
if
(
json_id
&&
json_model
&&
json_number
&&
json_start_time
&&
json_user_id
)
{
id
=
json_id
->
valuestring
;
model
=
json_model
->
valuestring
;
number
=
json_number
->
valuestring
;
start_time
=&
json_start_time
->
valueint
;
user_id
=
json_user_id
->
valuestring
;
my_zlog_debug
(
"id: %s"
,
id
);
my_zlog_debug
(
"model: %s"
,
model
);
my_zlog_debug
(
"number: %s"
,
number
);
my_zlog_debug
(
"start_time: %d"
,
*
start_time
);
my_zlog_debug
(
"user_id: %s"
,
user_id
);
if
(
gverify_count
>
3000
){
int
encryption_index
=
mqtt_encryption
();
my_zlog_notice
(
"加密情况:%d"
,
encryption_index
);
gverify_count
=
0
;
}
int
gverify_index
=
0
;
//判断是否验证成功
pthread_mutex_t
gverify_mutex
=
PTHREAD_MUTEX_INITIALIZER
;
//线程锁
}
else
{
my_zlog_warn
(
"Some fields missing"
);
return
-
1
;
}
char
*
generate_random_id
()
{
return
0
;
}
char
*
id_buffer
=
malloc
(
11
);
// 1. 定义字符池:包含所有小写字母、大写字母和数字
const
char
charset
[]
=
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
;
const
int
charset_size
=
sizeof
(
charset
)
-
1
;
// 减去末尾的 '\0'
/**
* @brief 根据传入的参数动态创建一个JSON字符串。
*
* @param id 记录ID
* @param model 设备型号
* @param number 编号
* @param start_time 开始时间
* @param user_id 用户ID
* @return char* 一个动态分配的JSON字符串。使用后必须调用free()释放。
* 如果内存分配失败,返回NULL。
*/
char
*
create_json_string
(
const
char
*
id
,
const
char
*
model
,
const
char
*
number
,
const
int
*
start_time
,
const
char
*
user_id
,
const
char
*
only_id
)
{
// JSON格式模板
const
char
*
json_format
=
"{
\"
id
\"
:
\"
%s
\"
,
\"
model
\"
:
\"
%s
\"
,
\"
number
\"
:
\"
%s
\"
,
\"
start_time
\"
:
\"
%s
\"
,
\"
user_id
\"
:
\"
%s
\"
,
\"
only_id
\"
:
\"
%s
\"
}"
;
char
time_str
[
20
];
// 足够存储20位数字和终止符
snprintf
(
time_str
,
sizeof
(
time_str
),
"%d"
,
*
start_time
);
// 1. 计算所需总长度,以安全地分配内存
// 长度 = 模板长度 - 5*%s长度(10) + 各字符串实际长度 + 1个空终止符
int
needed_size
=
strlen
(
json_format
)
-
10
+
strlen
(
id
)
+
strlen
(
model
)
+
strlen
(
number
)
+
strlen
(
time_str
)
+
strlen
(
user_id
)
+
strlen
(
only_id
)
+
1
;
// 2. 分配内存
char
*
json_string
=
(
char
*
)
malloc
(
needed_size
);
if
(
json_string
==
NULL
)
{
fprintf
(
stderr
,
"错误: JSON字符串内存分配失败
\n
"
);
return
NULL
;
// 2. 循环生成每个字符
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
// 从字符池中随机选择一个字符
int
key
=
rand
()
%
charset_size
;
id_buffer
[
i
]
=
charset
[
key
];
}
// 3. 使用snprintf安全地格式化字符串
snprintf
(
json_string
,
needed_size
,
json_format
,
id
,
model
,
number
,
time_str
,
user_id
,
only_id
);
return
json_string
;
// 3. 在字符串末尾添加空字符终止符
id_buffer
[
10
]
=
'\0'
;
return
id_buffer
;
}
//base64编码代码
char
*
base64_encode
(
const
unsigned
char
*
buffer
,
int
length
)
{
// Base64编码后的长度计算公式:4 * ((length + 2) / 3)
// +1 是为了最后的空终止符 '\0'
int
b64_len
=
4
*
((
length
+
2
)
/
3
)
+
1
;
char
*
b64_str
=
(
char
*
)
malloc
(
b64_len
);
if
(
b64_str
==
NULL
)
{
fprintf
(
stderr
,
"错误: Base64字符串内存分配失败
\n
"
);
return
NULL
;
}
// 使用OpenSSL的函数进行编码
int
encoded_len
=
EVP_EncodeBlock
((
unsigned
char
*
)
b64_str
,
buffer
,
length
);
// EVP_EncodeBlock 不会添加空终止符,我们需要手动添加
b64_str
[
encoded_len
]
=
'\0'
;
return
b64_str
;
}
void
mqtt_send_verify
(
unsigned
char
*
ciphertext
,
int
cipher_len
)
{
//发送用户获取jwt给服务端验证
int
send_jwtser
(
const
char
*
token
){
topic_middle_value
();
//指针中间函数
cJSON
*
root
=
cJSON_CreateObject
();
cJSON
*
body
=
cJSON_CreateObject
();
cJSON
*
head
=
cJSON_CreateObject
();
char
*
only_Id
=
generate_random_id
();
// 8. 【新】将拼接后的二进制数据进行 Base64 编码
char
*
base64_output_str
=
base64_encode
(
ciphertext
,
cipher_len
);
if
(
base64_output_str
==
NULL
)
{
// 错误处理
my_zlog_debug
(
"base64_output_str为空"
);
return
;
}
strcpy
(
only_id_middle
,
only_Id
);
// 打印出最终的、可以直接复制的Base64字符串
my_zlog_debug
(
"要发送的完整数据 (Base64): %s"
,
base64_output_str
);
cJSON_AddStringToObject
(
body
,
"data"
,
token
);
//为0成功
cJSON_AddStringToObject
(
body
,
"data"
,
base64_output_str
);
//为0成功
cJSON_AddStringToObject
(
body
,
"only_id"
,
only_Id
);
cJSON_AddNumberToObject
(
head
,
"message_type"
,
3006
);
...
...
@@ -159,231 +67,481 @@ void mqtt_send_verify(unsigned char *ciphertext, int cipher_len) {
my_zlog_debug
(
"%s"
,
payload
);
mosquitto_publish
(
mosq
,
NULL
,
TOPIC3
,
strlen
(
payload
),
payload
,
0
,
false
);
free
(
only_Id
);
cJSON_Delete
(
root
);
// 释放 cJSON 对象
}
//jwt验证函数
int
receive_jwt
(
cJSON
*
body
)
{
//加密并发送mqtt
int
mqtt_encryption
(){
// =================================================================
char
*
only_id
=
"sadas"
;
// 1. 准备明文、密钥和IV
// 从配置数据动态生成JSON字符串
char
*
json_to_encrypt
=
create_json_string
(
id
,
model
,
number
,
start_time
,
user_id
,
only_id
);
if
(
json_to_encrypt
==
NULL
)
{
return
1
;
// 内存分配失败,退出
}
char
*
token
=
NULL
;
char
*
token_time
=
NULL
;
my_zlog_debug
(
"生成的待加密JSON: %s"
,
json_to_encrypt
);
const
unsigned
char
*
plaintext
=
(
const
unsigned
char
*
)
json_to_encrypt
;
const
unsigned
char
*
key
=
(
const
unsigned
char
*
)
"gds-dfgbcvdfgghj"
;
//密钥
unsigned
char
iv
[
AES_BLOCK_SIZE
];
// 生成随机IV
if
(
!
RAND_bytes
(
iv
,
sizeof
(
iv
)))
{
fprintf
(
stderr
,
"错误: 无法生成随机IV
\n
"
);
my_zlog_error
(
"错误: 无法生成随机IV"
);
free
(
json_to_encrypt
);
// 别忘了释放内存
return
1
;
}
my_zlog_debug
(
"原始JSON: %s"
,
plaintext
);
my_zlog_debug
(
"
\n
--- 加密开始 ---"
);
// 2. 初始化加密上下文
EVP_CIPHER_CTX
*
ctx
=
EVP_CIPHER_CTX_new
();
if
(
!
ctx
)
{
fprintf
(
stderr
,
"错误: EVP_CIPHER_CTX_new 失败
\n
"
);
my_zlog_debug
(
"错误: EVP_CIPHER_CTX_new 失败"
);
free
(
json_to_encrypt
);
cJSON
*
json_token
=
cJSON_GetObjectItem
(
body
,
"token"
);
cJSON
*
json_token_time
=
cJSON_GetObjectItem
(
body
,
"token_time"
);
if
(
json_token
==
NULL
||
json_token_time
==
NULL
)
{
my_zlog_debug
(
"验证为空"
);
gverify_index
=
1
;
return
1
;
}
// 3. 设置加密算法、密钥和IV
if
(
1
!=
EVP_EncryptInit_ex
(
ctx
,
EVP_aes_128_cbc
(),
NULL
,
key
,
iv
))
{
fprintf
(
stderr
,
"错误: EVP_EncryptInit_ex 失败
\n
"
);
my_zlog_debug
(
"错误: EVP_EncryptInit_ex 失败"
);
EVP_CIPHER_CTX_free
(
ctx
);
free
(
json_to_encrypt
);
return
1
;
}
token
=
json_token
->
valuestring
;
token_time
=
json_token_time
->
valuestring
;
// 4. 提供明文进行加密
int
plaintext_len
=
strlen
((
char
*
)
plaintext
);
unsigned
char
*
ciphertext
=
malloc
(
plaintext_len
+
AES_BLOCK_SIZE
);
int
len
,
ciphertext_len
;
if
(
1
!=
EVP_EncryptUpdate
(
ctx
,
ciphertext
,
&
len
,
plaintext
,
plaintext_len
))
{
// ... 错误处理 ...
my_zlog_error
(
"错误处理,释放相关内存,返回1"
);
EVP_CIPHER_CTX_free
(
ctx
);
free
(
json_to_encrypt
);
free
(
ciphertext
);
return
1
;
}
ciphertext_len
=
len
;
// 5. 结束加密
if
(
1
!=
EVP_EncryptFinal_ex
(
ctx
,
ciphertext
+
len
,
&
len
))
{
// ... 错误处理 ...
EVP_CIPHER_CTX_free
(
ctx
);
free
(
json_to_encrypt
);
free
(
ciphertext
);
return
1
;
if
(
secret_key_index
==
FALSE
)
{
if
(
strcmp
(
token
,
secret_key
)
!=
0
){
send_jwtser
(
token
);
secret_key_index
=
TRUE
;
pthread_mutex_lock
(
&
gverify_mutex
);
gverify_count
=
0
;
pthread_mutex_unlock
(
&
gverify_mutex
);
my_zlog_notice
(
"topic不同,验证完成"
);
}
ciphertext_len
+=
len
;
// 6. 打印结果并清理
my_zlog_debug
(
"加密后的密文 (Ciphertext)"
,
ciphertext
,
ciphertext_len
);
EVP_CIPHER_CTX_free
(
ctx
);
//拼接cbc
int
final_data_len
=
AES_BLOCK_SIZE
+
ciphertext_len
;
unsigned
char
*
final_data
=
malloc
(
final_data_len
);
if
(
final_data
==
NULL
)
{
// 错误处理
my_zlog_error
(
"最终数据内存分配失败"
);
free
(
json_to_encrypt
);
free
(
ciphertext
);
return
1
;
}
// 先拷贝IV到最终数据的前16个字节
memcpy
(
final_data
,
iv
,
AES_BLOCK_SIZE
);
// 再拷贝密文到IV的后面
memcpy
(
final_data
+
AES_BLOCK_SIZE
,
ciphertext
,
ciphertext_len
);
my_zlog_debug
(
"--- 加密完成 ---"
);
mqtt_send_verify
(
final_data
,
final_data_len
);
//发送mqtt给服务端
// ********** 重要: 释放所有动态分配的内存 **********
free
(
json_to_encrypt
);
free
(
ciphertext
);
free
(
final_data
);
return
0
;
}
//解密函数
// base64解码函数
unsigned
char
*
base64_decode
(
const
char
*
base64_str
,
int
*
out_len
)
{
BIO
*
bio
,
*
b64
;
int
decode_len
=
strlen
(
base64_str
)
*
3
/
4
;
unsigned
char
*
buffer
=
(
unsigned
char
*
)
malloc
(
decode_len
+
1
);
if
(
buffer
==
NULL
)
{
fprintf
(
stderr
,
"内存分配失败
\n
"
);
return
NULL
;
if
(
secret_key_index
==
TRUE
)
{
strcpy
(
secret_key
,
token
);
secret_key_index
=
FALSE
;
}
bio
=
BIO_new_mem_buf
((
void
*
)
base64_str
,
-
1
);
b64
=
BIO_new
(
BIO_f_base64
());
bio
=
BIO_push
(
b64
,
bio
);
unsigned
long
long
token_time_s
=
strtoull
(
token_time
,
NULL
,
10
);
//
不使用换行符
BIO_set_flags
(
bio
,
BIO_FLAGS_BASE64_NO_NL
);
//
转换为秒级时间戳
time_t
token_time_sec
=
(
time_t
)(
token_time_s
);
//后端给的时间戳
*
out_len
=
BIO_read
(
bio
,
buffer
,
strlen
(
base64_str
));
buffer
[
*
out_len
]
=
'\0'
;
time_t
current_verify_time
=
time
(
NULL
);
//当前时间戳
BIO_free_all
(
bio
);
return
buffer
;
}
// AES-128-CBC 解密
int
aes_decrypt
(
const
unsigned
char
*
ciphertext
,
int
ciphertext_len
,
const
unsigned
char
*
key
,
const
unsigned
char
*
iv
,
unsigned
char
**
plaintext
)
{
EVP_CIPHER_CTX
*
ctx
=
EVP_CIPHER_CTX_new
();
if
(
!
ctx
)
{
fprintf
(
stderr
,
"EVP_CIPHER_CTX_new 失败
\n
"
);
return
-
1
;
}
my_zlog_debug
(
"目前时间戳:%1d"
,(
long
)
current_verify_time
);
my_zlog_debug
(
"token时间戳:%1d"
,(
long
)
token_time_sec
);
if
(
1
!=
EVP_DecryptInit_ex
(
ctx
,
EVP_aes_128_cbc
(),
NULL
,
key
,
iv
))
{
fprintf
(
stderr
,
"EVP_DecryptInit_ex 失败
\n
"
);
EVP_CIPHER_CTX_free
(
ctx
);
return
-
1
;
}
*
plaintext
=
(
unsigned
char
*
)
malloc
(
ciphertext_len
+
AES_BLOCK_SIZE
);
if
(
*
plaintext
==
NULL
)
{
fprintf
(
stderr
,
"内存分配失败
\n
"
);
EVP_CIPHER_CTX_free
(
ctx
);
return
-
1
;
if
(
token_time_sec
>
current_verify_time
){
if
(
service_verify
==
TRUE
)
gverify_index
=
0
;
//验证默认为正确
my_zlog_debug
(
"gverify_index= %d "
,
gverify_index
);
if
(
gverify_count
>
12000
){
send_jwtser
(
token
);
my_zlog_debug
(
"在有效期内"
);
pthread_mutex_lock
(
&
gverify_mutex
);
gverify_count
=
0
;
pthread_mutex_unlock
(
&
gverify_mutex
);
my_zlog_debug
(
"gverify_count=%d"
,
gverify_count
);
}
int
len
,
plaintext_len
;
if
(
1
!=
EVP_DecryptUpdate
(
ctx
,
*
plaintext
,
&
len
,
ciphertext
,
ciphertext_len
))
{
fprintf
(
stderr
,
"EVP_DecryptUpdate 失败
\n
"
);
EVP_CIPHER_CTX_free
(
ctx
);
free
(
*
plaintext
);
return
-
1
;
}
else
{
gverify_index
=
1
;
my_zlog_debug
(
"gverify_index= %d "
,
gverify_index
);
}
plaintext_len
=
len
;
if
(
1
!=
EVP_DecryptFinal_ex
(
ctx
,
*
plaintext
+
len
,
&
len
))
{
fprintf
(
stderr
,
"EVP_DecryptFinal_ex 失败,可能是密钥或IV错误,或者填充不正确
\n
"
);
EVP_CIPHER_CTX_free
(
ctx
);
free
(
*
plaintext
);
return
-
1
;
}
plaintext_len
+=
len
;
(
*
plaintext
)[
plaintext_len
]
=
'\0'
;
my_zlog_info
(
"token: %s"
,
token
);
my_zlog_info
(
"token_time: %s"
,
token_time
);
return
0
;
EVP_CIPHER_CTX_free
(
ctx
);
return
plaintext_len
;
}
//当接收到2006判断是否验证成功
int
message2006_verify
(
cJSON
*
body
){
char
*
status
=
NULL
;
char
*
onlyid
=
NULL
;
//总解密函数,将base64位进行解密
int
aes_decrypt_base64_cbc
(
const
char
*
base64_input
)
{
cJSON
*
json_status
=
cJSON_GetObjectItem
(
body
,
"status"
);
cJSON
*
json_onlyid
=
cJSON_GetObjectItem
(
body
,
"only_id"
);
// 密钥 (必须与加密端一致)
const
unsigned
char
*
key
=
(
const
unsigned
char
*
)
"gds-dfgbcvdfgghj"
;
// 1. Base64 解码
int
binary_len
=
0
;
unsigned
char
*
binary_data
=
base64_decode
(
base64_input
,
&
binary_len
);
if
(
binary_data
==
NULL
)
{
fprintf
(
stderr
,
"Base64 解码失败
\n
"
);
my_zlog_warn
(
"Base64 解码失败"
);
if
(
json_status
==
NULL
||
json_onlyid
==
NULL
)
{
my_zlog_debug
(
"验证为空"
);
service_verify
=
FALSE
;
gverify_index
=
1
;
my_zlog_debug
(
"gverify_index= %d "
,
gverify_index
);
return
1
;
}
// 2. 提取 IV 和密文
if
(
binary_len
<=
AES_BLOCK_SIZE
)
{
fprintf
(
stderr
,
"数据长度不足,无法提取 IV
\n
"
);
my_zlog_warn
(
"数据长度不足,无法提取 IV"
);
free
(
binary_data
);
return
1
;
status
=
json_status
->
valuestring
;
onlyid
=
json_onlyid
->
valuestring
;
my_zlog_debug
(
"data: %s"
,
status
);
my_zlog_debug
(
"onlyid: %s"
,
onlyid
);
if
(
strcmp
(
onlyid
,
only_id_middle
)
==
0
&&
strcmp
(
status
,
"1"
)
==
0
){
my_zlog_debug
(
"获得验证正确"
);
service_verify
=
TRUE
;
}
else
{
my_zlog_debug
(
"获得验证c错误,禁止使用"
);
gverify_index
=
1
;
my_zlog_debug
(
"gverify_index= %d "
,
gverify_index
);
service_verify
=
FALSE
;
return
2
;
}
unsigned
char
iv
[
AES_BLOCK_SIZE
];
memcpy
(
iv
,
binary_data
,
AES_BLOCK_SIZE
);
unsigned
char
*
ciphertext
=
binary_data
+
AES_BLOCK_SIZE
;
int
ciphertext_len
=
binary_len
-
AES_BLOCK_SIZE
;
return
0
;
// 3. 解密
unsigned
char
*
plaintext
=
NULL
;
int
plaintext_len
=
aes_decrypt
(
ciphertext
,
ciphertext_len
,
key
,
iv
,
&
plaintext
);
if
(
plaintext_len
<
0
)
{
fprintf
(
stderr
,
"解密失败
\n
"
);
my_zlog_error
(
"解密失败"
);
free
(
binary_data
);
return
1
;
}
my_zlog_debug
(
"解密结果: %s"
,
plaintext
);
//解密出来的基本为json字符串,到时候可用
// 释放内存
free
(
binary_data
);
free
(
plaintext
);
return
0
;
}
// 以下为aes验证,暂时不用注释
// //接收验证消息一次验证,只有在接收时候才会验证,此为aes验证
// int receive_verify(cJSON *body) {
// cJSON *device_info = cJSON_GetObjectItem(body, "device_info");
// if(device_info == NULL) {
// my_zlog_debug("验证为空");
// return 1;
// }
// char *id = NULL;
// char *model = NULL;
// char *number = NULL;
// int *start_time = NULL;
// char *user_id = NULL;
// char *only_id="sdadas";
// // 取各个字段(字符串类型)
// cJSON *json_id = cJSON_GetObjectItem(device_info, "id");
// cJSON *json_model = cJSON_GetObjectItem(device_info, "model");
// cJSON *json_number = cJSON_GetObjectItem(device_info, "number");
// cJSON *json_start_time = cJSON_GetObjectItem(device_info, "start_time");
// cJSON *json_user_id = cJSON_GetObjectItem(device_info, "user_id");
// if (json_id && json_model && json_number && json_start_time && json_user_id) {
// id=json_id->valuestring;
// model=json_model->valuestring;
// number=json_number->valuestring;
// start_time=&json_start_time->valueint;
// user_id=json_user_id->valuestring;
// my_zlog_debug("id: %s", id);
// my_zlog_debug("model: %s", model);
// my_zlog_debug("number: %s", number);
// my_zlog_debug("start_time: %d", *start_time);
// my_zlog_debug("user_id: %s", user_id);
// if(gverify_count>3000){
// int encryption_index=mqtt_encryption(id,model,number, start_time,user_id,only_id);
// my_zlog_notice("加密情况:%d",encryption_index);
// gverify_count=0;
// }
// } else {
// my_zlog_warn("Some fields missing");
// return -1;
// }
// return 0;
// }
// /**
// * @brief 根据传入的参数动态创建一个JSON字符串。
// *
// * @param id 记录ID
// * @param model 设备型号
// * @param number 编号
// * @param start_time 开始时间
// * @param user_id 用户ID
// * @return char* 一个动态分配的JSON字符串。使用后必须调用free()释放。
// * 如果内存分配失败,返回NULL。
// */
// char* create_json_string(const char* id, const char* model, const char* number, const int* start_time, const char* user_id , const char* only_id) {
// // JSON格式模板
// const char *json_format = "{\"id\":\"%s\",\"model\":\"%s\",\"number\":\"%s\",\"start_time\":\"%s\",\"user_id\":\"%s\",\"only_id\":\"%s\"}";
// char time_str[20]; // 足够存储20位数字和终止符
// snprintf(time_str, sizeof(time_str), "%d", *start_time);
// // 1. 计算所需总长度,以安全地分配内存
// // 长度 = 模板长度 - 5*%s长度(10) + 各字符串实际长度 + 1个空终止符
// int needed_size = strlen(json_format) - 10
// + strlen(id)
// + strlen(model)
// + strlen(number)
// + strlen(time_str)
// + strlen(user_id)
// + strlen(only_id) + 1;
// // 2. 分配内存
// char *json_string = (char*)malloc(needed_size);
// if (json_string == NULL) {
// fprintf(stderr, "错误: JSON字符串内存分配失败\n");
// return NULL;
// }
// // 3. 使用snprintf安全地格式化字符串
// snprintf(json_string, needed_size, json_format, id, model, number, time_str, user_id,only_id);
// return json_string;
// }
// //base64编码代码
// char* base64_encode(const unsigned char* buffer, int length) {
// // Base64编码后的长度计算公式:4 * ((length + 2) / 3)
// // +1 是为了最后的空终止符 '\0'
// int b64_len = 4 * ((length + 2) / 3) + 1;
// char *b64_str = (char*)malloc(b64_len);
// if (b64_str == NULL) {
// fprintf(stderr, "错误: Base64字符串内存分配失败\n");
// return NULL;
// }
// // 使用OpenSSL的函数进行编码
// int encoded_len = EVP_EncodeBlock((unsigned char*)b64_str, buffer, length);
// // EVP_EncodeBlock 不会添加空终止符,我们需要手动添加
// b64_str[encoded_len] = '\0';
// return b64_str;
// }
// void mqtt_send_verify(unsigned char *ciphertext, int cipher_len) {
// topic_middle_value();//指针中间函数
// cJSON *root = cJSON_CreateObject();
// cJSON *body = cJSON_CreateObject();
// cJSON *head = cJSON_CreateObject();
// // 8. 【新】将拼接后的二进制数据进行 Base64 编码
// char *base64_output_str = base64_encode(ciphertext, cipher_len);
// if (base64_output_str == NULL) {
// // 错误处理
// my_zlog_debug("base64_output_str为空");
// return ;
// }
// // 打印出最终的、可以直接复制的Base64字符串
// my_zlog_debug("要发送的完整数据 (Base64): %s", base64_output_str);
// cJSON_AddStringToObject(body, "data", base64_output_str);//为0成功
// cJSON_AddNumberToObject(head, "message_type",3006);
// cJSON_AddItemToObject(root, "body", body);
// cJSON_AddItemToObject(root, "head",head);
// char *payload = cJSON_PrintUnformatted(root);
// my_zlog_debug("%s",payload);
// mosquitto_publish(mosq, NULL, TOPIC3, strlen(payload), payload, 0, false);
// cJSON_Delete(root); // 释放 cJSON 对象
// }
// //加密并发送mqtt
// int mqtt_encryption(const char* id, const char* model, const char* number, const int* start_time, const char* user_id , const char* only_id){
// // =================================================================
// // 1. 准备明文、密钥和IV
// // 从配置数据动态生成JSON字符串
// char *json_to_encrypt = create_json_string(id, model, number, start_time, user_id,only_id);
// if (json_to_encrypt == NULL) {
// return 1; // 内存分配失败,退出
// }
// my_zlog_debug("生成的待加密JSON: %s", json_to_encrypt);
// const unsigned char *plaintext = (const unsigned char *)json_to_encrypt;
// const unsigned char *key = (const unsigned char *)"gds-dfgbcvdfgghj";//密钥
// unsigned char iv[AES_BLOCK_SIZE];
// // 生成随机IV
// if (!RAND_bytes(iv, sizeof(iv))) {
// fprintf(stderr, "错误: 无法生成随机IV\n");
// my_zlog_error("错误: 无法生成随机IV");
// free(json_to_encrypt); // 别忘了释放内存
// return 1;
// }
// my_zlog_debug("原始JSON: %s", plaintext);
// my_zlog_debug("\n--- 加密开始 ---");
// // 2. 初始化加密上下文
// EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
// if (!ctx) {
// fprintf(stderr, "错误: EVP_CIPHER_CTX_new 失败\n");
// my_zlog_debug("错误: EVP_CIPHER_CTX_new 失败");
// free(json_to_encrypt);
// return 1;
// }
// // 3. 设置加密算法、密钥和IV
// if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv)) {
// fprintf(stderr, "错误: EVP_EncryptInit_ex 失败\n");
// my_zlog_debug("错误: EVP_EncryptInit_ex 失败");
// EVP_CIPHER_CTX_free(ctx);
// free(json_to_encrypt);
// return 1;
// }
// // 4. 提供明文进行加密
// int plaintext_len = strlen((char*)plaintext);
// unsigned char *ciphertext = malloc(plaintext_len + AES_BLOCK_SIZE);
// int len, ciphertext_len;
// if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len)) {
// // ... 错误处理 ...
// my_zlog_error("错误处理,释放相关内存,返回1");
// EVP_CIPHER_CTX_free(ctx);
// free(json_to_encrypt);
// free(ciphertext);
// return 1;
// }
// ciphertext_len = len;
// // 5. 结束加密
// if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) {
// // ... 错误处理 ...
// EVP_CIPHER_CTX_free(ctx);
// free(json_to_encrypt);
// free(ciphertext);
// return 1;
// }
// ciphertext_len += len;
// // 6. 打印结果并清理
// my_zlog_debug("加密后的密文 (Ciphertext)", ciphertext, ciphertext_len);
// EVP_CIPHER_CTX_free(ctx);
// //拼接cbc
// int final_data_len = AES_BLOCK_SIZE + ciphertext_len;
// unsigned char *final_data = malloc(final_data_len);
// if (final_data == NULL) {
// // 错误处理
// my_zlog_error("最终数据内存分配失败");
// free(json_to_encrypt);
// free(ciphertext);
// return 1;
// }
// // 先拷贝IV到最终数据的前16个字节
// memcpy(final_data, iv, AES_BLOCK_SIZE);
// // 再拷贝密文到IV的后面
// memcpy(final_data + AES_BLOCK_SIZE, ciphertext, ciphertext_len);
// my_zlog_debug("--- 加密完成 ---");
// mqtt_send_verify(final_data, final_data_len);//发送mqtt给服务端
// // ********** 重要: 释放所有动态分配的内存 **********
// free(json_to_encrypt);
// free(ciphertext);
// free(final_data);
// return 0;
// }
// //解密函数
// // base64解码函数
// unsigned char *base64_decode(const char *base64_str, int *out_len) {
// BIO *bio, *b64;
// int decode_len = strlen(base64_str) * 3 / 4;
// unsigned char *buffer = (unsigned char *)malloc(decode_len + 1);
// if (buffer == NULL) {
// fprintf(stderr, "内存分配失败\n");
// return NULL;
// }
// bio = BIO_new_mem_buf((void *)base64_str, -1);
// b64 = BIO_new(BIO_f_base64());
// bio = BIO_push(b64, bio);
// // 不使用换行符
// BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
// *out_len = BIO_read(bio, buffer, strlen(base64_str));
// buffer[*out_len] = '\0';
// BIO_free_all(bio);
// return buffer;
// }
// // AES-128-CBC 解密
// int aes_decrypt(const unsigned char *ciphertext, int ciphertext_len, const unsigned char *key, const unsigned char *iv, unsigned char **plaintext) {
// EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
// if (!ctx) {
// fprintf(stderr, "EVP_CIPHER_CTX_new 失败\n");
// return -1;
// }
// if (1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv)) {
// fprintf(stderr, "EVP_DecryptInit_ex 失败\n");
// EVP_CIPHER_CTX_free(ctx);
// return -1;
// }
// *plaintext = (unsigned char *)malloc(ciphertext_len + AES_BLOCK_SIZE);
// if (*plaintext == NULL) {
// fprintf(stderr, "内存分配失败\n");
// EVP_CIPHER_CTX_free(ctx);
// return -1;
// }
// int len, plaintext_len;
// if (1 != EVP_DecryptUpdate(ctx, *plaintext, &len, ciphertext, ciphertext_len)) {
// fprintf(stderr, "EVP_DecryptUpdate 失败\n");
// EVP_CIPHER_CTX_free(ctx);
// free(*plaintext);
// return -1;
// }
// plaintext_len = len;
// if (1 != EVP_DecryptFinal_ex(ctx, *plaintext + len, &len)) {
// fprintf(stderr, "EVP_DecryptFinal_ex 失败,可能是密钥或IV错误,或者填充不正确\n");
// EVP_CIPHER_CTX_free(ctx);
// free(*plaintext);
// return -1;
// }
// plaintext_len += len;
// (*plaintext)[plaintext_len] = '\0';
// EVP_CIPHER_CTX_free(ctx);
// return plaintext_len;
// }
// //总解密函数,将base64位进行解密
// int aes_decrypt_base64_cbc(const char *base64_input) {
// // 密钥 (必须与加密端一致)
// const unsigned char *key = (const unsigned char *)"gds-dfgbcvdfgghj";
// // 1. Base64 解码
// int binary_len = 0;
// unsigned char *binary_data = base64_decode(base64_input, &binary_len);
// if (binary_data == NULL) {
// fprintf(stderr, "Base64 解码失败\n");
// my_zlog_warn("Base64 解码失败");
// return 1;
// }
// // 2. 提取 IV 和密文
// if (binary_len <= AES_BLOCK_SIZE) {
// fprintf(stderr, "数据长度不足,无法提取 IV\n");
// my_zlog_warn("数据长度不足,无法提取 IV");
// free(binary_data);
// return 1;
// }
// unsigned char iv[AES_BLOCK_SIZE];
// memcpy(iv, binary_data, AES_BLOCK_SIZE);
// unsigned char *ciphertext = binary_data + AES_BLOCK_SIZE;
// int ciphertext_len = binary_len - AES_BLOCK_SIZE;
// // 3. 解密
// unsigned char *plaintext = NULL;
// int plaintext_len = aes_decrypt(ciphertext, ciphertext_len, key, iv, &plaintext);
// if (plaintext_len < 0) {
// fprintf(stderr, "解密失败\n");
// my_zlog_error("解密失败");
// free(binary_data);
// return 1;
// }
// my_zlog_debug("解密结果: %s", plaintext);//解密出来的基本为json字符串,到时候可用
// // 释放内存
// free(binary_data);
// free(plaintext);
// return 0;
// }
\ No newline at end of file
src/thread_main.c
View file @
c380ff23
...
...
@@ -138,7 +138,7 @@ void *delay_count(void *arg) {
Delay_Ms
(
0
,
5
);
device_delay_count
++
;
//设备计时,坦克打击倒退逻辑
gverify_count
++
;
//验证计时,每15s一次
if
(
gverify_count
>=
5000
)
gverify_count
=
5
000
;
if
(
gverify_count
>=
20000
)
gverify_count
=
20
000
;
if
(
device_delay_count
>=
5000
)
device_delay_count
=
5000
;
}
return
NULL
;
...
...
system/gpio/gpio_pwm_car0102.c
View file @
c380ff23
...
...
@@ -70,19 +70,19 @@ void car0102_mode_2_back(unsigned char gval) {
if
(
gval
<
50
)
{
pwmWrite
(
PWM_PIN_SPEED
,
0
);
}
else
if
(
gval
<=
55
)
{
pwmWrite
(
PWM_PIN_SPEED
,
b
+
3
0
*
k
);
pwmWrite
(
PWM_PIN_SPEED
,
b
+
4
0
*
k
);
}
else
if
(
gval
<=
60
)
{
pwmWrite
(
PWM_PIN_SPEED
,
b
+
3
0
*
k
);
pwmWrite
(
PWM_PIN_SPEED
,
b
+
4
0
*
k
);
}
else
if
(
gval
<=
65
)
{
pwmWrite
(
PWM_PIN_SPEED
,
b
+
30
*
k
);
pwmWrite
(
PWM_PIN_SPEED
,
b
+
40
*
k
);
}
else
if
(
gval
<=
70
)
{
pwmWrite
(
PWM_PIN_SPEED
,
b
+
3
0
*
k
);
pwmWrite
(
PWM_PIN_SPEED
,
b
+
4
0
*
k
);
}
else
if
(
gval
<=
75
)
{
pwmWrite
(
PWM_PIN_SPEED
,
b
+
3
0
*
k
);
pwmWrite
(
PWM_PIN_SPEED
,
b
+
4
0
*
k
);
}
else
if
(
gval
<=
90
)
{
pwmWrite
(
PWM_PIN_SPEED
,
b
+
3
0
*
k
);
pwmWrite
(
PWM_PIN_SPEED
,
b
+
4
0
*
k
);
}
else
if
(
gval
<=
100
)
{
pwmWrite
(
PWM_PIN_SPEED
,
b
+
35
*
k
);
pwmWrite
(
PWM_PIN_SPEED
,
b
+
40
*
k
);
}
else
if
(
gval
<=
110
)
{
pwmWrite
(
PWM_PIN_SPEED
,
b
+
40
*
k
);
}
else
if
(
gval
<=
120
)
{
...
...
system/sensor/heat.c
View file @
c380ff23
...
...
@@ -5,6 +5,7 @@
char
temperature
[
20
];
float
temp_str
;
//温度获取
int
heat_tem
()
{
FILE
*
file
;
char
line
[
MAX_LINE_LENGTH
];
...
...
system/sensor/warm.c
View file @
c380ff23
...
...
@@ -4,7 +4,8 @@
#include "gpio_pwm_carship.h"
#include "request.h"
int
alarm_highest
(
int
index
)
{
//最高警报,最低电压报警
//最高警报,最低电压报警
int
alarm_highest
(
int
index
)
{
if
(
index
==
1
)
{
pin_value
(
20
,
1
);
//紫灯
if
(
enable_buzzer_value
)
{
...
...
@@ -18,7 +19,8 @@ int alarm_highest(int index) {//最高警报,最低电压报警
return
index
;
}
int
alarm_low
(
int
index
)
{
//比较小警报
//比较小警报
int
alarm_low
(
int
index
)
{
if
(
index
==
1
)
{
pin_value
(
16
,
1
);
//黄灯
}
else
if
(
index
==
0
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment