Commit 5ad47074 authored by 学习的菜鸟's avatar 学习的菜鸟

2

parent b7cc22de
cmake_minimum_required(VERSION 3.10)
project(car
VERSION 1.1.3
VERSION 1.2.0
LANGUAGES C
)
......@@ -41,8 +41,15 @@ include_directories(
app/main
app/device_change
drivers/common
drivers/gpio
drivers/network
drivers/sensors
modules/logger
modules/delay
modules/thread_pool
modules/mqtt
modules/http
modules/brower
third_party/zlog/src
third_party/mosquitto/include
third_party/mosquitto/lib
......@@ -50,8 +57,15 @@ include_directories(
# 源文件收集
file(GLOB_RECURSE SOURCES
drivers/gpio/*.c
drivers/network/*.c
drivers/sensors/*.c
modules/logger/*.c
modules/delay/*.c
modules/thread_pool/*.c
modules/mqtt/*.c
modules/http/*.c
modules/brower/*.c
app/device_identity/*.c
app/device_change/*.c
app/main/*.c
......
......@@ -159,13 +159,13 @@ int device_mqtt_topic_init() {
delay_s(20);
if(g_device_name_exists == 0) {
sprintf(g_app2dev_topic,"dev2app/%s",readbuf);
sprintf(g_dev2app_topic,"app2dev/%s",readbuf);
sprintf(g_app2dev_topic,"app2dev/%s",readbuf);
sprintf(g_dev2app_topic,"dev2app/%s",readbuf);
sprintf(g_pure_topic,"%s",readbuf);
sprintf(g_ser2dev_topic,"ser2dev/%s",readbuf);
} else {
sprintf(g_app2dev_topic,"dev2app/%s","00000000000000");
sprintf(g_dev2app_topic,"app2dev/%s","00000000000000");
sprintf(g_app2dev_topic,"app2dev/%s","00000000000000");
sprintf(g_dev2app_topic,"dev2app/%s","00000000000000");
sprintf(g_pure_topic,"%s","00000000000000");
sprintf(g_ser2dev_topic,"ser2dev/%s","00000000000000");
}
......
......@@ -37,6 +37,16 @@ typedef struct {
*/
int device_mqtt_topic_init();
/*纯设备号*/
char *mqtt_topic_pure_number();
/*app2dev设备号*/
char *mqtt_topic_app2dev_number();
/*dev2app设备号*/
char *mqtt_topic_dev2app_number();
/*ser2dev设备号*/
char *mqtt_topic_ser2dev_number();
#endif
\ No newline at end of file
......@@ -15,9 +15,11 @@ int main(){
my_zlog_error("mqtt的topic读取失败");
return -2;
}
my_zlog_info("程序关闭成功");
int thread_rc=thread_start_init( thread_exit_time,thread_mqtt_beat,thread_open_browser,thread_mqtt_reconnect,thread_time_calculation,thread_play_mp3);
thread_end_close();
my_log_close();//关闭日志
my_zlog_info("程序关闭成功");
return 0;
}
\ No newline at end of file
......@@ -5,6 +5,7 @@
#include "device_fileopen.h"
#include "mylog.h"
#include "device_identity.h"
#include "pthread_open.h"
/*设备id读取初始化*/
int device_id_file_init();
......@@ -15,6 +16,14 @@ int mylog_init();
/*mqtt的topic初始化*/
int device_mqtt_topic_init();
/*线程初始化函数*/
int thread_start_init(ThreadFunc thread_exit_time, ThreadFunc thread_mqtt_beat,
ThreadFunc thread_open_browser, ThreadFunc thread_mqtt_reconnect,
ThreadFunc thread_time_calculation, ThreadFunc thread_play_mp3);
/*线程关闭函数*/
void thread_end_close() ;
/*关闭log日志记录*/
void my_log_close();
#endif
#include "common.h"
#include "delay.h"
#include "pthread_open.h"
#include "mylog.h"
#include "mqtt_init.h"
#include "mqtt_infor_handle.h"
#include "mqtt_verify.h"
pthread_t g_thread[6]; // 全局线程句柄数组(或传参)
int g_webrtc_index=0;
int g_mqtt_grc=0;
void* g_args[6] = { NULL, NULL, NULL, NULL, NULL, NULL };
int thread_start_init(ThreadFunc thread_exit_time, ThreadFunc thread_mqtt_beat,
ThreadFunc thread_open_browser, ThreadFunc thread_mqtt_reconnect,
ThreadFunc thread_time_calculation, ThreadFunc thread_play_mp3) {
ThreadFunc thread_funcs[] = {
thread_exit_time,
thread_mqtt_beat,
thread_open_browser,
thread_mqtt_reconnect,
thread_time_calculation,
thread_play_mp3
};
for (int i = 0; i < 6; i++) {
if (pthread_create(&g_thread[i], NULL, thread_funcs[i], g_args[i]) != 0) {
my_zlog_error("创建线程 %d 失败", i);
return i + 1;
}
}
return 0;
}
//出现意外自动停止
void *thread_exit_time(void *arg) {
// while(1){
// delay_ms(100);
// gPwmCount++;
// if(gPwmCount>=5) {
// device_warn_exit();
// gPwmCount=6;
// }
// }
return NULL;
}
void *thread_mqtt_beat(void *arg) {
my_zlog_info("thread_mqtt_beat start");
//wifi_change_sendmqtt_init();
delay_s(5);
g_webrtc_index=1;
while(1) {
//if( AppExit_pin_pwm == 202) delay_ms(45);
//if( AppExit_pin_pwm != 202)
delay_ms(100);
g_heartbeat_count++;
if(g_mqtt_grc == 0){
mqtt_wirte();//心跳,3s一个
}
}
return NULL;
}
void *thread_open_browser(void *arg) {
// while(1){
// if(g_webrtc_index==1) {
// my_zlog_info("open cam");
// opencamsh();//10s后打开游览器并且进入网址
// }
// delay_ms(200);
// }
return NULL;
}
//mqtt异常处理,断开自动重连,简单粗暴
void *thread_mqtt_reconnect(void *arg) {
delay_s(5);
if (mqtt_init() != 0) {
my_zlog_fatal("mqtt_init failed");
return NULL;
}
while (1) {
if (mosq == NULL) {
mqtt_init();
if (!mosq) {
mqtt_clean(mosq);
my_zlog_error("Failed to create mosquitto client");
continue;
}
}
g_mqtt_grc = mqtt_create(mosq);
if (g_mqtt_grc != 0) {
mqtt_clean(mosq);
mosq = NULL;
continue;
}
g_mqtt_grc = mqtt_cycle(mosq); // 阻塞直到断开
if(g_mqtt_grc !=0 ){
mqtt_clean(mosq);
mosq = NULL;
}
my_zlog_warn("mqtt disconnected ...");
}
mqtt_clean(mosq);
return NULL;
}
//专门用于计时的线程
void *thread_time_calculation(void *arg) {
while (1) {
delay_ms(5);
//device_delay_count++;//设备计时,坦克打击倒退逻辑
g_verify_count++;//验证计时,每15s一次
if(g_verify_count >= 20000) g_verify_count = 20000;
//if(device_delay_count >= 5000) device_delay_count = 5000;
}
return NULL;
}
//专门处理MP3播放
void *thread_play_mp3(void* arg) {
//audioplay_cycle();
return NULL;
}
// 等待线程结束
void thread_end_close() {
for (int i = 0; i < 6; i++) {
if (g_thread[i]) pthread_join(g_thread[i], NULL);
}
}
#ifndef PTHREAD_OPEN_H__
#define PTHREAD_OPEN_H__
typedef void *(*ThreadFunc)(void *);
int thread_start_init(ThreadFunc thread_exit_time, ThreadFunc thread_mqtt_beat,
ThreadFunc thread_open_browser, ThreadFunc thread_mqtt_reconnect,
ThreadFunc thread_time_calculation, ThreadFunc thread_play_mp3);
void *thread_exit_time(void *arg) ;//异常停止线程
void *thread_mqtt_beat(void *arg) ;//心跳线程
void *thread_open_browser(void *arg) ;//启动游览器线程
void *thread_mqtt_reconnect(void *arg) ;//mqtt自带重连线程
void *thread_time_calculation(void *arg) ;//延时计算延迟
void *thread_play_mp3(void* arg);//等待播放音频线程
void thread_end_close() ;
#endif
\ No newline at end of file
......@@ -486,6 +486,78 @@ app/main/main.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/app/main/main.c.s
.PHONY : app/main/main.c.s
app/main/pthread_open.o: app/main/pthread_open.c.o
.PHONY : app/main/pthread_open.o
# target to build an object file
app/main/pthread_open.c.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/app/main/pthread_open.c.o
.PHONY : app/main/pthread_open.c.o
app/main/pthread_open.i: app/main/pthread_open.c.i
.PHONY : app/main/pthread_open.i
# target to preprocess a source file
app/main/pthread_open.c.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/app/main/pthread_open.c.i
.PHONY : app/main/pthread_open.c.i
app/main/pthread_open.s: app/main/pthread_open.c.s
.PHONY : app/main/pthread_open.s
# target to generate assembly for a file
app/main/pthread_open.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/app/main/pthread_open.c.s
.PHONY : app/main/pthread_open.c.s
drivers/network/ip_reader.o: drivers/network/ip_reader.c.o
.PHONY : drivers/network/ip_reader.o
# target to build an object file
drivers/network/ip_reader.c.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/drivers/network/ip_reader.c.o
.PHONY : drivers/network/ip_reader.c.o
drivers/network/ip_reader.i: drivers/network/ip_reader.c.i
.PHONY : drivers/network/ip_reader.i
# target to preprocess a source file
drivers/network/ip_reader.c.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/drivers/network/ip_reader.c.i
.PHONY : drivers/network/ip_reader.c.i
drivers/network/ip_reader.s: drivers/network/ip_reader.c.s
.PHONY : drivers/network/ip_reader.s
# target to generate assembly for a file
drivers/network/ip_reader.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/drivers/network/ip_reader.c.s
.PHONY : drivers/network/ip_reader.c.s
drivers/sensors/temperature.o: drivers/sensors/temperature.c.o
.PHONY : drivers/sensors/temperature.o
# target to build an object file
drivers/sensors/temperature.c.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/drivers/sensors/temperature.c.o
.PHONY : drivers/sensors/temperature.c.o
drivers/sensors/temperature.i: drivers/sensors/temperature.c.i
.PHONY : drivers/sensors/temperature.i
# target to preprocess a source file
drivers/sensors/temperature.c.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/drivers/sensors/temperature.c.i
.PHONY : drivers/sensors/temperature.c.i
drivers/sensors/temperature.s: drivers/sensors/temperature.c.s
.PHONY : drivers/sensors/temperature.s
# target to generate assembly for a file
drivers/sensors/temperature.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/drivers/sensors/temperature.c.s
.PHONY : drivers/sensors/temperature.c.s
modules/delay/delay.o: modules/delay/delay.c.o
.PHONY : modules/delay/delay.o
......@@ -534,6 +606,102 @@ modules/logger/mylog.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/logger/mylog.c.s
.PHONY : modules/logger/mylog.c.s
modules/mqtt/mqtt_infor_handle.o: modules/mqtt/mqtt_infor_handle.c.o
.PHONY : modules/mqtt/mqtt_infor_handle.o
# target to build an object file
modules/mqtt/mqtt_infor_handle.c.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/mqtt/mqtt_infor_handle.c.o
.PHONY : modules/mqtt/mqtt_infor_handle.c.o
modules/mqtt/mqtt_infor_handle.i: modules/mqtt/mqtt_infor_handle.c.i
.PHONY : modules/mqtt/mqtt_infor_handle.i
# target to preprocess a source file
modules/mqtt/mqtt_infor_handle.c.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/mqtt/mqtt_infor_handle.c.i
.PHONY : modules/mqtt/mqtt_infor_handle.c.i
modules/mqtt/mqtt_infor_handle.s: modules/mqtt/mqtt_infor_handle.c.s
.PHONY : modules/mqtt/mqtt_infor_handle.s
# target to generate assembly for a file
modules/mqtt/mqtt_infor_handle.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/mqtt/mqtt_infor_handle.c.s
.PHONY : modules/mqtt/mqtt_infor_handle.c.s
modules/mqtt/mqtt_init.o: modules/mqtt/mqtt_init.c.o
.PHONY : modules/mqtt/mqtt_init.o
# target to build an object file
modules/mqtt/mqtt_init.c.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/mqtt/mqtt_init.c.o
.PHONY : modules/mqtt/mqtt_init.c.o
modules/mqtt/mqtt_init.i: modules/mqtt/mqtt_init.c.i
.PHONY : modules/mqtt/mqtt_init.i
# target to preprocess a source file
modules/mqtt/mqtt_init.c.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/mqtt/mqtt_init.c.i
.PHONY : modules/mqtt/mqtt_init.c.i
modules/mqtt/mqtt_init.s: modules/mqtt/mqtt_init.c.s
.PHONY : modules/mqtt/mqtt_init.s
# target to generate assembly for a file
modules/mqtt/mqtt_init.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/mqtt/mqtt_init.c.s
.PHONY : modules/mqtt/mqtt_init.c.s
modules/mqtt/mqtt_verify.o: modules/mqtt/mqtt_verify.c.o
.PHONY : modules/mqtt/mqtt_verify.o
# target to build an object file
modules/mqtt/mqtt_verify.c.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/mqtt/mqtt_verify.c.o
.PHONY : modules/mqtt/mqtt_verify.c.o
modules/mqtt/mqtt_verify.i: modules/mqtt/mqtt_verify.c.i
.PHONY : modules/mqtt/mqtt_verify.i
# target to preprocess a source file
modules/mqtt/mqtt_verify.c.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/mqtt/mqtt_verify.c.i
.PHONY : modules/mqtt/mqtt_verify.c.i
modules/mqtt/mqtt_verify.s: modules/mqtt/mqtt_verify.c.s
.PHONY : modules/mqtt/mqtt_verify.s
# target to generate assembly for a file
modules/mqtt/mqtt_verify.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/mqtt/mqtt_verify.c.s
.PHONY : modules/mqtt/mqtt_verify.c.s
modules/thread_pool/pthrpoll.o: modules/thread_pool/pthrpoll.c.o
.PHONY : modules/thread_pool/pthrpoll.o
# target to build an object file
modules/thread_pool/pthrpoll.c.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/thread_pool/pthrpoll.c.o
.PHONY : modules/thread_pool/pthrpoll.c.o
modules/thread_pool/pthrpoll.i: modules/thread_pool/pthrpoll.c.i
.PHONY : modules/thread_pool/pthrpoll.i
# target to preprocess a source file
modules/thread_pool/pthrpoll.c.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/thread_pool/pthrpoll.c.i
.PHONY : modules/thread_pool/pthrpoll.c.i
modules/thread_pool/pthrpoll.s: modules/thread_pool/pthrpoll.c.s
.PHONY : modules/thread_pool/pthrpoll.s
# target to generate assembly for a file
modules/thread_pool/pthrpoll.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/modules/thread_pool/pthrpoll.c.s
.PHONY : modules/thread_pool/pthrpoll.c.s
third_party/cjson/cJSON.o: third_party/cjson/cJSON.c.o
.PHONY : third_party/cjson/cJSON.o
......@@ -1105,12 +1273,33 @@ help:
@echo "... app/main/main.o"
@echo "... app/main/main.i"
@echo "... app/main/main.s"
@echo "... app/main/pthread_open.o"
@echo "... app/main/pthread_open.i"
@echo "... app/main/pthread_open.s"
@echo "... drivers/network/ip_reader.o"
@echo "... drivers/network/ip_reader.i"
@echo "... drivers/network/ip_reader.s"
@echo "... drivers/sensors/temperature.o"
@echo "... drivers/sensors/temperature.i"
@echo "... drivers/sensors/temperature.s"
@echo "... modules/delay/delay.o"
@echo "... modules/delay/delay.i"
@echo "... modules/delay/delay.s"
@echo "... modules/logger/mylog.o"
@echo "... modules/logger/mylog.i"
@echo "... modules/logger/mylog.s"
@echo "... modules/mqtt/mqtt_infor_handle.o"
@echo "... modules/mqtt/mqtt_infor_handle.i"
@echo "... modules/mqtt/mqtt_infor_handle.s"
@echo "... modules/mqtt/mqtt_init.o"
@echo "... modules/mqtt/mqtt_init.i"
@echo "... modules/mqtt/mqtt_init.s"
@echo "... modules/mqtt/mqtt_verify.o"
@echo "... modules/mqtt/mqtt_verify.i"
@echo "... modules/mqtt/mqtt_verify.s"
@echo "... modules/thread_pool/pthrpoll.o"
@echo "... modules/thread_pool/pthrpoll.i"
@echo "... modules/thread_pool/pthrpoll.s"
@echo "... third_party/cjson/cJSON.o"
@echo "... third_party/cjson/cJSON.i"
@echo "... third_party/cjson/cJSON.s"
......
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 2
#define PROJECT_VERSION_PATCH 0
#define GIT_HASH ""
#define BUILD_TIMESTAMP ""
#define BUILD_USER ""
No preview for this file type
CMAKE_PROGRESS_1 = 78
CMAKE_PROGRESS_1 =
CMAKE_PROGRESS_2 =
CMAKE_PROGRESS_3 =
CMAKE_PROGRESS_4 = 79
CMAKE_PROGRESS_5 =
CMAKE_PROGRESS_6 = 80
CMAKE_PROGRESS_3 = 79
CMAKE_PROGRESS_4 =
CMAKE_PROGRESS_5 = 80
CMAKE_PROGRESS_6 =
CMAKE_PROGRESS_7 =
CMAKE_PROGRESS_8 =
CMAKE_PROGRESS_9 = 81
CMAKE_PROGRESS_10 =
CMAKE_PROGRESS_11 = 82
CMAKE_PROGRESS_8 = 81
CMAKE_PROGRESS_9 =
CMAKE_PROGRESS_10 = 82
CMAKE_PROGRESS_11 =
CMAKE_PROGRESS_12 =
CMAKE_PROGRESS_13 =
CMAKE_PROGRESS_13 = 83
CMAKE_PROGRESS_1 =
CMAKE_PROGRESS_2 = 89
CMAKE_PROGRESS_1 = 89
CMAKE_PROGRESS_2 =
CMAKE_PROGRESS_3 =
CMAKE_PROGRESS_4 = 90
CMAKE_PROGRESS_5 =
CMAKE_PROGRESS_6 =
CMAKE_PROGRESS_7 = 91
CMAKE_PROGRESS_6 = 91
CMAKE_PROGRESS_7 =
CMAKE_PROGRESS_1 = 1
CMAKE_PROGRESS_2 =
CMAKE_PROGRESS_3 = 2
CMAKE_PROGRESS_4 =
CMAKE_PROGRESS_3 =
CMAKE_PROGRESS_4 = 2
CMAKE_PROGRESS_5 =
CMAKE_PROGRESS_6 = 3
CMAKE_PROGRESS_7 =
CMAKE_PROGRESS_8 = 4
CMAKE_PROGRESS_9 =
CMAKE_PROGRESS_8 =
CMAKE_PROGRESS_9 = 4
CMAKE_PROGRESS_10 =
CMAKE_PROGRESS_11 = 5
CMAKE_PROGRESS_12 =
CMAKE_PROGRESS_13 = 6
CMAKE_PROGRESS_14 =
CMAKE_PROGRESS_13 =
CMAKE_PROGRESS_14 = 6
CMAKE_PROGRESS_15 =
CMAKE_PROGRESS_16 = 7
CMAKE_PROGRESS_17 =
CMAKE_PROGRESS_18 = 8
CMAKE_PROGRESS_19 =
CMAKE_PROGRESS_18 =
CMAKE_PROGRESS_19 = 8
CMAKE_PROGRESS_20 =
CMAKE_PROGRESS_21 = 9
CMAKE_PROGRESS_22 =
CMAKE_PROGRESS_23 = 10
CMAKE_PROGRESS_24 =
CMAKE_PROGRESS_21 =
CMAKE_PROGRESS_22 = 9
CMAKE_PROGRESS_23 =
CMAKE_PROGRESS_24 = 10
CMAKE_PROGRESS_25 =
CMAKE_PROGRESS_26 = 11
CMAKE_PROGRESS_27 =
CMAKE_PROGRESS_28 = 12
CMAKE_PROGRESS_29 =
CMAKE_PROGRESS_26 =
CMAKE_PROGRESS_27 = 11
CMAKE_PROGRESS_28 =
CMAKE_PROGRESS_29 = 12
CMAKE_PROGRESS_30 =
CMAKE_PROGRESS_31 = 13
CMAKE_PROGRESS_32 =
CMAKE_PROGRESS_33 = 14
CMAKE_PROGRESS_34 =
CMAKE_PROGRESS_31 =
CMAKE_PROGRESS_32 = 13
CMAKE_PROGRESS_33 =
CMAKE_PROGRESS_34 = 14
CMAKE_PROGRESS_35 =
CMAKE_PROGRESS_36 = 15
CMAKE_PROGRESS_37 =
CMAKE_PROGRESS_38 = 16
CMAKE_PROGRESS_36 =
CMAKE_PROGRESS_37 = 15
CMAKE_PROGRESS_38 =
CMAKE_PROGRESS_39 =
CMAKE_PROGRESS_40 =
CMAKE_PROGRESS_41 = 17
CMAKE_PROGRESS_42 =
CMAKE_PROGRESS_43 = 18
CMAKE_PROGRESS_40 = 16
CMAKE_PROGRESS_41 =
CMAKE_PROGRESS_42 = 17
CMAKE_PROGRESS_43 =
CMAKE_PROGRESS_44 =
CMAKE_PROGRESS_1 =
CMAKE_PROGRESS_2 = 19
CMAKE_PROGRESS_3 =
CMAKE_PROGRESS_4 = 20
CMAKE_PROGRESS_1 = 18
CMAKE_PROGRESS_2 =
CMAKE_PROGRESS_3 = 19
CMAKE_PROGRESS_4 =
CMAKE_PROGRESS_5 =
CMAKE_PROGRESS_6 =
CMAKE_PROGRESS_7 = 21
CMAKE_PROGRESS_8 =
CMAKE_PROGRESS_9 = 22
CMAKE_PROGRESS_6 = 20
CMAKE_PROGRESS_7 =
CMAKE_PROGRESS_8 = 21
CMAKE_PROGRESS_9 =
CMAKE_PROGRESS_10 =
CMAKE_PROGRESS_11 =
CMAKE_PROGRESS_12 = 23
CMAKE_PROGRESS_11 = 22
CMAKE_PROGRESS_12 =
CMAKE_PROGRESS_13 =
CMAKE_PROGRESS_14 = 24
CMAKE_PROGRESS_14 = 23
CMAKE_PROGRESS_15 =
CMAKE_PROGRESS_16 =
CMAKE_PROGRESS_17 = 25
CMAKE_PROGRESS_16 = 24
CMAKE_PROGRESS_17 =
CMAKE_PROGRESS_18 =
CMAKE_PROGRESS_19 = 26
CMAKE_PROGRESS_19 = 25
CMAKE_PROGRESS_20 =
CMAKE_PROGRESS_21 =
CMAKE_PROGRESS_22 = 27
CMAKE_PROGRESS_21 = 26
CMAKE_PROGRESS_22 =
CMAKE_PROGRESS_23 =
CMAKE_PROGRESS_24 = 28
CMAKE_PROGRESS_24 = 27
CMAKE_PROGRESS_25 =
CMAKE_PROGRESS_26 =
CMAKE_PROGRESS_27 = 29
CMAKE_PROGRESS_26 = 28
CMAKE_PROGRESS_27 =
CMAKE_PROGRESS_28 =
CMAKE_PROGRESS_29 = 30
CMAKE_PROGRESS_29 = 29
CMAKE_PROGRESS_30 =
CMAKE_PROGRESS_31 =
CMAKE_PROGRESS_32 = 31
CMAKE_PROGRESS_32 = 30
CMAKE_PROGRESS_33 =
CMAKE_PROGRESS_34 = 32
CMAKE_PROGRESS_34 = 31
CMAKE_PROGRESS_35 =
CMAKE_PROGRESS_36 =
CMAKE_PROGRESS_37 = 33
CMAKE_PROGRESS_37 = 32
CMAKE_PROGRESS_38 =
CMAKE_PROGRESS_39 = 34
CMAKE_PROGRESS_39 = 33
CMAKE_PROGRESS_40 =
CMAKE_PROGRESS_41 =
CMAKE_PROGRESS_42 = 35
CMAKE_PROGRESS_42 = 34
CMAKE_PROGRESS_43 =
CMAKE_PROGRESS_44 = 36
CMAKE_PROGRESS_44 = 35
CMAKE_PROGRESS_1 = 83
CMAKE_PROGRESS_2 =
CMAKE_PROGRESS_3 = 84
CMAKE_PROGRESS_1 =
CMAKE_PROGRESS_2 = 84
CMAKE_PROGRESS_3 =
CMAKE_PROGRESS_4 =
CMAKE_PROGRESS_5 =
CMAKE_PROGRESS_6 = 85
CMAKE_PROGRESS_5 = 85
CMAKE_PROGRESS_6 =
CMAKE_PROGRESS_7 =
CMAKE_PROGRESS_8 = 86
CMAKE_PROGRESS_9 =
CMAKE_PROGRESS_10 =
CMAKE_PROGRESS_11 = 87
CMAKE_PROGRESS_10 = 87
CMAKE_PROGRESS_11 =
CMAKE_PROGRESS_12 =
CMAKE_PROGRESS_1 = 48
CMAKE_PROGRESS_1 =
CMAKE_PROGRESS_2 =
CMAKE_PROGRESS_3 =
CMAKE_PROGRESS_4 = 49
CMAKE_PROGRESS_3 = 50
CMAKE_PROGRESS_4 =
CMAKE_PROGRESS_5 =
CMAKE_PROGRESS_6 = 50
CMAKE_PROGRESS_6 = 51
CMAKE_PROGRESS_7 =
CMAKE_PROGRESS_8 =
CMAKE_PROGRESS_9 = 51
CMAKE_PROGRESS_8 = 52
CMAKE_PROGRESS_9 =
CMAKE_PROGRESS_10 =
CMAKE_PROGRESS_11 = 52
CMAKE_PROGRESS_11 = 53
CMAKE_PROGRESS_12 =
CMAKE_PROGRESS_13 =
CMAKE_PROGRESS_14 = 53
CMAKE_PROGRESS_13 = 54
CMAKE_PROGRESS_14 =
CMAKE_PROGRESS_15 =
CMAKE_PROGRESS_16 = 54
CMAKE_PROGRESS_16 = 55
CMAKE_PROGRESS_17 =
CMAKE_PROGRESS_18 =
CMAKE_PROGRESS_19 = 55
CMAKE_PROGRESS_18 = 56
CMAKE_PROGRESS_19 =
CMAKE_PROGRESS_20 =
CMAKE_PROGRESS_21 = 56
CMAKE_PROGRESS_21 = 57
CMAKE_PROGRESS_22 =
CMAKE_PROGRESS_23 =
CMAKE_PROGRESS_24 = 57
CMAKE_PROGRESS_24 = 58
CMAKE_PROGRESS_25 =
CMAKE_PROGRESS_26 = 58
CMAKE_PROGRESS_26 = 59
CMAKE_PROGRESS_27 =
CMAKE_PROGRESS_28 =
CMAKE_PROGRESS_29 = 59
CMAKE_PROGRESS_29 = 60
CMAKE_PROGRESS_30 =
CMAKE_PROGRESS_31 = 60
CMAKE_PROGRESS_31 = 61
CMAKE_PROGRESS_32 =
CMAKE_PROGRESS_33 =
CMAKE_PROGRESS_34 = 61
CMAKE_PROGRESS_34 = 62
CMAKE_PROGRESS_35 =
CMAKE_PROGRESS_36 = 62
CMAKE_PROGRESS_36 = 63
CMAKE_PROGRESS_37 =
CMAKE_PROGRESS_38 =
CMAKE_PROGRESS_39 = 63
CMAKE_PROGRESS_39 = 64
CMAKE_PROGRESS_40 =
CMAKE_PROGRESS_41 = 64
CMAKE_PROGRESS_42 =
CMAKE_PROGRESS_41 =
CMAKE_PROGRESS_42 = 65
CMAKE_PROGRESS_43 =
CMAKE_PROGRESS_44 = 65
CMAKE_PROGRESS_44 = 66
CMAKE_PROGRESS_45 =
CMAKE_PROGRESS_46 = 66
CMAKE_PROGRESS_47 =
CMAKE_PROGRESS_46 =
CMAKE_PROGRESS_47 = 67
CMAKE_PROGRESS_48 =
CMAKE_PROGRESS_49 = 67
CMAKE_PROGRESS_49 = 68
CMAKE_PROGRESS_50 =
CMAKE_PROGRESS_51 = 68
CMAKE_PROGRESS_52 =
CMAKE_PROGRESS_51 =
CMAKE_PROGRESS_52 = 69
CMAKE_PROGRESS_53 =
CMAKE_PROGRESS_54 = 69
CMAKE_PROGRESS_54 = 70
CMAKE_PROGRESS_55 =
CMAKE_PROGRESS_56 = 70
CMAKE_PROGRESS_57 =
CMAKE_PROGRESS_56 =
CMAKE_PROGRESS_57 = 71
CMAKE_PROGRESS_58 =
CMAKE_PROGRESS_59 = 71
CMAKE_PROGRESS_60 =
CMAKE_PROGRESS_61 = 72
CMAKE_PROGRESS_62 =
CMAKE_PROGRESS_59 =
CMAKE_PROGRESS_60 = 72
CMAKE_PROGRESS_61 =
CMAKE_PROGRESS_62 = 73
CMAKE_PROGRESS_63 =
CMAKE_PROGRESS_64 = 73
CMAKE_PROGRESS_65 =
CMAKE_PROGRESS_66 = 74
CMAKE_PROGRESS_67 =
CMAKE_PROGRESS_64 =
CMAKE_PROGRESS_65 = 74
CMAKE_PROGRESS_66 =
CMAKE_PROGRESS_67 = 75
CMAKE_PROGRESS_68 =
CMAKE_PROGRESS_69 = 75
CMAKE_PROGRESS_70 =
CMAKE_PROGRESS_71 = 76
CMAKE_PROGRESS_72 =
CMAKE_PROGRESS_69 =
CMAKE_PROGRESS_70 = 76
CMAKE_PROGRESS_71 =
CMAKE_PROGRESS_72 = 77
CMAKE_PROGRESS_73 =
CMAKE_PROGRESS_74 = 77
CMAKE_PROGRESS_75 =
CMAKE_PROGRESS_74 =
CMAKE_PROGRESS_75 = 78
......@@ -9,6 +9,7 @@
#include <string.h>
#include <errno.h>
// ========== 硬件相关 ==========
#include <wiringPi.h> // GPIO控制
#include <softPwm.h> // PWM控制
......@@ -28,11 +29,13 @@
#include <math.h> // 数学函数
#include <time.h> // 时间处理
#include <mosquitto.h>
#include <cjson/cJSON.h>
// ========== 香橙派优化宏 ==========
#define ORANGE_GPIO_SET(pin, val) { \
pinMode(pin, OUTPUT); \
digitalWrite(pin, val); \
}
// #define ORANGE_GPIO_SET(pin, val) { \
// pinMode(pin, OUTPUT); \
// digitalWrite(pin, val); \
// }
#endif // COMMON_H
\ No newline at end of file
#include <sys/socket.h>
#include <netinet/in.h>
#include <ifaddrs.h>
#include "common.h"
#include "ip_reader.h"
#include "mylog.h"
struct ifaddrs *ifap, *ifa;
struct sockaddr_in *sa;
char g_ip_address[INET_ADDRSTRLEN];
/*获取ip*/
int ipaddr_obtain() {
if (getifaddrs(&ifap) == -1) {
//perror("getifaddrs() error");
my_zlog_error("getifaddrs() error");
return -1;
}
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr != NULL && ifa->ifa_addr->sa_family == AF_INET) {
sa = (struct sockaddr_in *) ifa->ifa_addr;
inet_ntop(AF_INET, &sa->sin_addr, g_ip_address, sizeof(g_ip_address));
}
}
freeifaddrs(ifap);
return 0;
}
#ifndef IP_READER_H__
#define IP_READER_H__
#include <arpa/inet.h>
extern char g_ip_address[INET_ADDRSTRLEN];//读到的ip地址
int ipaddr_obtain();//ip地址函数
#endif
#include "common.h"
#include "temperature.h"
#include "mylog.h"
#define MAX_LINE_LENGTH 20
char g_temperature[20];
/*温度获取*/
int heat_tem() {
FILE *file;
float temp_str;
char line[MAX_LINE_LENGTH];
file = fopen("/sys/class/thermal/thermal_zone0/temp", "r");
if (file == NULL) {
perror("无法打开温度文件");
return 1;
}
if (fgets(line, sizeof(line), file) != NULL) {
temp_str = (float)atof(line) / 1000.0;
sprintf(g_temperature, "%.2f°C", temp_str);
my_zlog_debug("CPU 温度: %.2f°C", temp_str);
}else {
temp_str =0;
sprintf(g_temperature, "%.2f°C", temp_str);
my_zlog_debug("CPU 温度: %.2f°C", temp_str);
}
fclose(file);
return 0;
}
\ No newline at end of file
#ifndef TEMPERATURE_H__
#define TEMPERATURE_H__
int heat_tem();//获取CPU温度
extern char g_temperature[];//温度存储
#endif
\ No newline at end of file
#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
#define PROJECT_VERSION_PATCH @PROJECT_VERSION_PATCH@
#define GIT_HASH "@GIT_HASH@"
#define BUILD_TIMESTAMP "@BUILD_TIMESTAMP@"
#define BUILD_USER "@BUILD_USER@"
\ No newline at end of file
#include "mqtt_infor_handle.h"
#include "mqtt_init.h"
#include "ip_reader.h"
#include "mqtt_verify.h"
#include "device_fileopen.h"
#include "device_identity.h"
#include "temperature.h"
#include "common.h"
#include "mylog.h"
int g_heartbeat_count=0;
unsigned char g_valt[4];//存放mqtt接收的tpye,mode等
//心跳发送格式*5/2
void heartbeat_send() {
float voltage = 0;//INA226_readBusVoltage();
float current = 0;//INA226_readCurrent();
//my_zlog_debug("%.2f\n", voltage);
// if(voltage<=0.5){
// voltage=ads1115_read_channel(0)*5/2;
// current=ads1115_read_channel(1)*5/2;
// //my_zlog_debug("%.2f\n", voltage);
// current=(current-voltage)*100;
// }
char voltage_str[20]; // 足够存储转换后的字符串的缓冲区
sprintf(voltage_str, "%.2f", voltage);
char current_str[20]; // 足够存储转换后的字符串的缓冲区
sprintf(current_str, "%.2f", current);
//alarm_control(voltage);//判断电压警报,在不动时候才判断
/*读取程序版本号*/
char *version_num = program_version();
if(heat_tem() !=0 ) {//获取CPU温度
my_zlog_debug("获取cpu温度失败");
}
ipaddr_obtain();//获取ip
int message=1;
cJSON *root = cJSON_CreateObject();
cJSON *body = cJSON_CreateObject();
cJSON *head = cJSON_CreateObject();
cJSON_AddStringToObject(body, "ip", g_ip_address);//发送设备ip
cJSON_AddStringToObject(body, "ID", mqtt_topic_pure_number());//发送设备号
cJSON_AddStringToObject(body, "V", voltage_str);//心跳发送电压
cJSON_AddStringToObject(body, "I", current_str);//心跳发送电流
cJSON_AddStringToObject(body,"Tem",g_temperature);//发送温度
cJSON_AddStringToObject(body, "version", version_num);//版本号
cJSON_AddNumberToObject(head, "message_type",message);
cJSON_AddItemToObject(root, "body", body);
cJSON_AddItemToObject(root, "head",head);
char *payload = cJSON_PrintUnformatted(root);
my_zlog_debug("%s",payload);
mosquitto_publish(mosq, NULL, mqtt_topic_dev2app_number(), strlen(payload), payload, 0, false);
mosquitto_publish(mosq, NULL, mqtt_topic_pure_number(), strlen(payload), payload, 0, false);
cJSON_Delete(root); // 释放 cJSON 对象
}
//mqtt设备行走驱动函数
void device_driver(){
// if(AppExit_pin_pwm == 101) speed_change(valt) ;
// if(AppExit_pin_pwm == 102) car0102_speed_change(valt) ;
// if(AppExit_pin_pwm == 103 ) car0103_change(valt) ;
// if(AppExit_pin_pwm == 104 ) car0104_change(valt) ;
// if(AppExit_pin_pwm == 202) tank0202_change(valt);
// if(AppExit_pin_pwm == 301) ship_speed_change(valt) ;
// if(AppExit_pin_pwm == 401) PTZ_pwm_change(valt);
}
//角度发送
void angle_mqtt_send() {
// float angle_shot=ads1115_read_channel(2);
// if(angle_shot>0){
// angle_shot=angle_shot*360/5;
// //my_zlog_debug("%.2f",angle_shot);
// topic_middle_value();
// cJSON *root = cJSON_CreateObject();
// char TOPIC_send_angle[26];
// double rounded_angle = round(angle_shot * 100) / 100;
// sprintf(TOPIC_send_angle,"dev_rtinfo/%s",TOPIC3);
// cJSON_AddStringToObject(root, "type","tank_angle");
// cJSON_AddNumberToObject(root, "angle",rounded_angle);
// char *payload = cJSON_PrintUnformatted(root);
// my_zlog_debug("%s",payload);
// mosquitto_publish(mosq, NULL, TOPIC_send_angle, strlen(payload), payload, 0, false);
// cJSON_Delete(root); // 释放 cJSON 对象
// }
}
//心跳格式,每5s一次心跳
void mqtt_wirte(){
if( g_heartbeat_count >= 30) {
heartbeat_send();
g_heartbeat_count=0;
}
// if( AppExit_pin_pwm == 202) angle_mqtt_send();
}
//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){
return ;
}
cJSON *mode = cJSON_GetObjectItem(pwm_ctrl, "mode"); //mode=1 速度,mode=2 转向(unsigned char)
cJSON *type = cJSON_GetObjectItem(pwm_ctrl, "type");
cJSON *val = cJSON_GetObjectItem(pwm_ctrl, "val"); //val为pwm的值 0~100(unsigned char)(unsigned char)
unsigned char modeTemp= mode->valueint;
unsigned char typeTemp=type->valueint;
unsigned char valTemp= val->valueint;
g_valt[0]=typeTemp;
g_valt[1]=modeTemp;
g_valt[2]=valTemp;
gPwmCount = 0;
my_zlog_debug("typeTemp:%d",g_valt[0]);
my_zlog_debug("modeTemp:%d",g_valt[1]);
my_zlog_debug("valTemp:%d",g_valt[2]);
device_driver();
}
void message_4(cJSON *body){//message 为4时候
cJSON *pwm_ctrl = cJSON_GetObjectItem(body, "pwm_ctrl");
cJSON *pin_setctrl = cJSON_GetObjectItem(body, "pin_setctrl");
if(pwm_ctrl==NULL||pin_setctrl==NULL){
return ;
}
cJSON *pin = cJSON_GetObjectItem(pin_setctrl, "pin");
cJSON *val = cJSON_GetObjectItem(pin_setctrl, "val"); //val为pwm的值 0~100(unsigned char)(unsigned char)
unsigned char pinTemp =pin->valueint;
unsigned char valTemp = val->valueint;
if(valTemp>=1){
valTemp=1;
}
gPwmCount=0;
g_valt[0]=0;
g_valt[1]=pinTemp;
g_valt[2]=valTemp;
my_zlog_debug("pinTemp:%d",g_valt[1]);
my_zlog_debug("valTemp:%d",g_valt[2]);
//pin_value(g_valt[1],g_valt[2]);
//pwm_value(g_valt[1],g_valt[2]);
//if(AppExit_pin_pwm == 202 ) tank_shot_back_stop(g_valt[1],g_valt[2]);
}
//当接收到2时候验证
void message_2_judyverify(cJSON *body){
receive_jwt(body);
if(g_verify_index == 0) {
//refresh_cam();
} else {
my_zlog_warn("验证不通过");
}
}
//当接收到3时候验证
void message_3_judyverify(cJSON *body){
receive_jwt(body);
if(g_verify_index == 0) {
message_3(body);
} else {
my_zlog_warn("验证不通过");
}
}
//当接收到4时候验证
void message_4_judyverify(cJSON *body){
receive_jwt(body);
if(g_verify_index == 0) {
message_4(body);
} else {
my_zlog_warn("验证不通过");
}
}
//接收到设备改名函数
int device_mqttchange_name(cJSON *device_id){
// cJSON *id = cJSON_GetObjectItem(device_id, "id");// 提取ID
// cJSON *date = cJSON_GetObjectItem(device_id, "date");// 提取日期
// char *device_change_id=id->valuestring;
// char *device_change_date=date->valuestring;
// device_changename_back(device_change_date,device_change_id);
// // 输出提取的数据
// my_zlog_debug("设备ID: %s", device_change_id);
// my_zlog_debug("日期: %s", device_change_date);
return 0;
}
int device_message_receive(cJSON *json){//接收到的控制设备的mqtt消息
cJSON *head = cJSON_GetObjectItem(json, "head");
cJSON *message_type = cJSON_GetObjectItem(head, "message_type");
if (cJSON_IsObject(head)&&cJSON_IsNumber(message_type)) {;
cJSON *body = cJSON_GetObjectItem(json, "body");//提取 body数据段
if (!cJSON_IsObject(body)) {
return 1;
}
gmessage_type=message_type->valueint;
my_zlog_debug("message_type: %d",message_type->valueint);
switch(gmessage_type){
case 2:
//message_2_judyverify(body);
my_zlog_debug("进入刷新");
break;
case 3:
message_3_judyverify(body);
my_zlog_debug("进入pwm控制");
break;
case 4:
message_4_judyverify(body);
my_zlog_debug("进入引脚控制");
break;
case 2001:
//audioplay_mqtt_receive(body);
my_zlog_debug("进入音频播放");
break;
case 2002:
//device_mqttchange_name(body);
my_zlog_debug("进入修改设备号");
break;
case 2003:
//scan_wifi_json();
my_zlog_debug("进入查询WiFi");
break;
case 2004:
//wifi_change_recmqtt(body);
my_zlog_debug("进入修改WiFi");
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;
}
}else return 3;
return 0;
}
#ifndef MQTT_INFOR_HANDLE_H__
#define MQTT_INFOR_HANDLE_H__
#include <cjson/cJSON.h>
extern int g_heartbeat_count;
void mqtt_wirte();
int device_message_receive(cJSON *json);
#endif
\ No newline at end of file
#include "common.h"
#include "mqtt_verify.h"
#include "mqtt_init.h"
#include "device_identity.h"
#include "mqtt_infor_handle.h"
#include "mylog.h"
struct mosquitto *mosq;
int gPwmCount = 0; // 计数
int gmessage_type=10086;
uint16_t AppExit_pin_pwm=0;//判断坦克或者车的退出
//mqtt初始化
int mqtt_init() {
mosquitto_lib_init();
// 这里创建mosq可以保留,也可以删除这一行,让创建放到 Mqtt_onnect 里
mosq = mosquitto_new(NULL, true, NULL);
if (!mosq) {
my_zlog_fatal("Failed to create Mosquitto client");
return -1;
}
mosquitto_int_option(mosq, MOSQ_OPT_PROTOCOL_VERSION, MQTT_PROTOCOL_V5);
return 0;
}
//回调函数
void on_connect(struct mosquitto *mosq, void *obj, int rc) {
if (rc == 0) {
my_zlog_debug("Connected to broker");
mosquitto_subscribe(mosq, NULL, mqtt_topic_app2dev_number(), 0);
mosquitto_subscribe(mosq, NULL, mqtt_topic_ser2dev_number(), 0);
} else {
fprintf(stderr, "Connection failed with code %d\n", rc);
my_zlog_fatal("Connection failed");
}
}
//消息回环函数
void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) {
// 确保消息有效
if (message->payload && message->payloadlen) { // 将消息内容转换为字符串
char *payload_str = (char *)malloc(message->payloadlen + 1);
if (!payload_str) {
return;
}
memcpy(payload_str, message->payload, message->payloadlen);
payload_str[message->payloadlen] = '\0';
// 解析 JSON
cJSON *json = cJSON_Parse(payload_str);
if(json != NULL){
if(device_message_receive(json)==0) my_zlog_debug("进入设备接收mqtt");
}
// 释放 payload 字符串
free(payload_str);
cJSON_Delete(json);
}
}
// 返回连接结果,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);
mosquitto_username_pw_set(mosq, USERNAME, PASSWORD);
int rc = mosquitto_connect(mosq, BROKER_ADDRESS, BROKER_PORT, 60);
if (rc != MOSQ_ERR_SUCCESS) {
my_zlog_warn("Failed to connect to broker: %s", mosquitto_strerror(rc));
// 不销毁 mosq,等待调用者处理重连
return rc;
}
return 0; // 成功
}
//阻塞型
int mqtt_cycle(struct mosquitto *mosq) {
// 这个函数会阻塞直到连接断开或错误返回
int rc = mosquitto_loop_forever(mosq, -1, 1);
if (rc != MOSQ_ERR_SUCCESS) {
my_zlog_warn("mqtt loop error: %s", mosquitto_strerror(rc));
return rc;
}
}
// int mqtt_cycle(struct mosquitto *mosq) {//非阻塞型
// int rc;
// while (1) {
// rc = mosquitto_loop(mosq, 100, 1); // 每秒检查一次
// if (rc != MOSQ_ERR_SUCCESS) {
// my_zlog_warn("mosquitto loop error: %s,(code: %d)", mosquitto_strerror(rc),rc);
// return -1; // 跳出循环,重新连接
// }
// Delay_Ms(0, 3); // 防止空转
// }
// }
//mqtt清理
void mqtt_clean(struct mosquitto *mosq){
// 清理
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
my_zlog_notice("清理成功");
}
\ No newline at end of file
#ifndef MQTT_INIT_H__
#define MQTT_INIT_H__
#include <time.h>
#include <mosquitto.h>
#include <cjson/cJSON.h>
extern int heartbeat_count;//心跳计时
//extern ThreadPool *pool;
#define BROKER_ADDRESS "119.45.167.177"
#define BROKER_PORT 1883
#define USERNAME "admin" // 替换为你的用户名
#define PASSWORD "admin" // 替换为你的密码
extern struct mosquitto *mosq;//创建客服端
extern int gPwmCount; // 计数
extern int gmessage_type;//message消息值
int mqtt_init();//mqtt初始化
int mqtt_create(struct mosquitto *mosq);//创建mqtt客服端
void on_connect(struct mosquitto *mosq, void *obj, int rc);//回调函数
void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message);//消息回调函数
int mqtt_cycle(struct mosquitto *mosq);//循环
void mqtt_clean(struct mosquitto *mosq);//清理
#endif
\ No newline at end of file
#include <time.h>
#include <cjson/cJSON.h>
#include "mqtt_verify.h"
#include "common.h"
#include <openssl/evp.h>
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <openssl/err.h>
#include "device_identity.h"
#include "mqtt_init.h"
#include "mylog.h"
bool g_service_verify=TRUE;//验证判断
int g_verify_count =12000;//判断是否有一分钟
char g_only_id_middle[11];
char g_secret_key[1024];//存储上一次的topic
bool g_secret_key_index = TRUE;//用于判断是否对比topic
int g_verify_index =0;//判断是否验证成功
pthread_mutex_t g_verify_mutex = PTHREAD_MUTEX_INITIALIZER;//线程锁
char *generate_random_id() {
char *id_buffer=malloc(11);
// 1. 定义字符池:包含所有小写字母、大写字母和数字
const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
const int charset_size = sizeof(charset) - 1; // 减去末尾的 '\0'
// 2. 循环生成每个字符
for (int i = 0; i < 10; ++i) {
// 从字符池中随机选择一个字符
int key = rand() % charset_size;
id_buffer[i] = charset[key];
}
// 3. 在字符串末尾添加空字符终止符
id_buffer[10] = '\0';
return id_buffer;
}
//发送用户获取jwt给服务端验证
int send_jwtser(const char *token){
cJSON *root = cJSON_CreateObject();
cJSON *body = cJSON_CreateObject();
cJSON *head = cJSON_CreateObject();
char *only_Id =generate_random_id();
my_zlog_debug("%s",only_Id);
strcpy(g_only_id_middle,only_Id);
cJSON_AddStringToObject(body, "data", token);//为0成功
cJSON_AddStringToObject(body, "only_id", only_Id);
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, mqtt_topic_pure_number(), strlen(payload), payload, 0, false);
free(only_Id);
cJSON_Delete(root); // 释放 cJSON 对象
}
//jwt验证函数
int receive_jwt(cJSON *body) {
char *token=NULL;
char *token_time=NULL;
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("验证为空");
g_verify_index=1;
return 1;
}
token=json_token->valuestring;
token_time=json_token_time->valuestring;
if(g_secret_key_index == FALSE) {
if(strcmp(token,g_secret_key)!=0){
send_jwtser(token);
g_secret_key_index = TRUE;
pthread_mutex_lock(&g_verify_mutex);
g_verify_count=0;
pthread_mutex_unlock(&g_verify_mutex);
my_zlog_notice("topic不同,验证完成");
}
}else {
my_zlog_notice("topic相同");
strcpy(g_secret_key,token);
g_secret_key_index = FALSE;
}
unsigned long long token_time_s = strtoull(token_time, NULL, 10);
// 转换为秒级时间戳
time_t token_time_sec = (time_t)(token_time_s );//后端给的时间戳
time_t current_verify_time=time(NULL);//当前时间戳
my_zlog_debug("目前时间戳:%1d",(long)current_verify_time);
my_zlog_debug("token时间戳:%1d",(long)token_time_sec);
if(token_time_sec>current_verify_time){
if(g_service_verify == TRUE) g_verify_index=0;//验证默认为正确
my_zlog_debug("g_verify_index= %d ",g_verify_index);
if(g_verify_count>12000){
send_jwtser(token);
my_zlog_debug("在有效期内");
pthread_mutex_lock(&g_verify_mutex);
g_verify_count=0;
my_zlog_info("count: %s", g_verify_count);
pthread_mutex_unlock(&g_verify_mutex);
my_zlog_debug("g_verify_count=%d",g_verify_count);
}
}else {
my_zlog_debug("不在有效期内");
g_verify_index=1;
my_zlog_debug("g_verify_index= %d ",g_verify_index);
}
my_zlog_info("token: %s", token);
my_zlog_info("token_time: %s", token_time);
return 0;
}
//当接收到2006判断是否验证成功
int message2006_verify(cJSON *body){
char *status=NULL;
char *onlyid=NULL;
cJSON *json_status = cJSON_GetObjectItem(body, "status");
cJSON *json_onlyid = cJSON_GetObjectItem(body, "only_id");
if(json_status == NULL || json_onlyid==NULL) {
my_zlog_debug("验证为空");
g_service_verify = FALSE;
g_verify_index=1;
my_zlog_debug("g_verify_index= %d ",g_verify_index);
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,g_only_id_middle) == 0 && strcmp(status, "1") == 0){
my_zlog_debug("获得验证正确");
g_service_verify = TRUE;
}else {
my_zlog_debug("获得验证c错误,禁止使用");
g_verify_index=1;
my_zlog_debug("g_verify_index= %d ",g_verify_index);
g_service_verify = FALSE;
return 2;
}
return 0;
}
#ifndef MQTT_VERIFY_H__
#define MQTT_VERIFY_H__
#include <cjson/cJSON.h>
#define AES_BLOCK_SIZE 16
extern int g_verify_count;//验证计时
extern int g_verify_index;//判断是否验证成功
int receive_jwt(cJSON *body);//jwt验证
int message2006_verify(cJSON *body);
#endif
\ No newline at end of file
#include "pthrpoll.h"
// 初始化任务队列
static int task_queue_init(TaskQueue *queue) {
queue->head = NULL;
queue->tail = NULL;
queue->size = 0;
if (pthread_mutex_init(&queue->mutex, NULL) != 0) {
return -1;
}
if (pthread_cond_init(&queue->cond, NULL) != 0) {
pthread_mutex_destroy(&queue->mutex);
return -1;
}
return 0;
}
// 向任务队列中添加任务
static int task_queue_add(TaskQueue *queue, void (*function)(void *), void *argument) {
Task *task = (Task *)malloc(sizeof(Task));
if (task == NULL) {
return -1;
}
task->function = function;
task->argument = argument;
task->next = NULL;
pthread_mutex_lock(&queue->mutex);
if (queue->tail == NULL) {
queue->head = queue->tail = task;
} else {
queue->tail->next = task;
queue->tail = task;
}
queue->size++;
pthread_cond_signal(&queue->cond);
pthread_mutex_unlock(&queue->mutex);
return 0;
}
// 从任务队列中取出任务
static Task *task_queue_remove(TaskQueue *queue, ThreadPool_t *pool) {
pthread_mutex_lock(&queue->mutex);
while (queue->size == 0 && !pool->shutdown) {
pthread_cond_wait(&queue->cond, &queue->mutex);
}
if (pool->shutdown && queue->size == 0) {
pthread_mutex_unlock(&queue->mutex);
return NULL;
}
Task *task = queue->head;
queue->head = queue->head->next;
if (queue->head == NULL) {
queue->tail = NULL;
}
queue->size--;
pthread_mutex_unlock(&queue->mutex);
return task;
}
// 工作线程函数
static void *worker_thread(void *arg) {
ThreadPool_t *pool = (ThreadPool_t *)arg;
pthread_mutex_lock(&pool->mutex);
pool->active_threads++;
pthread_mutex_unlock(&pool->mutex);
while (1) {
Task *task = task_queue_remove(&pool->task_queue, pool);
if (task == NULL) {
break; // 收到关闭信号且队列为空
}
task->function(task->argument);
free(task->argument); // 释放任务参数
free(task); // 释放任务本身
// 通知回收线程可能有空闲线程
pthread_cond_signal(&pool->reaper_cond);
}
pthread_mutex_lock(&pool->mutex);
pool->active_threads--;
pthread_mutex_unlock(&pool->mutex);
return NULL;
}
// 回收线程函数
static void *reaper_thread(void *arg) {
ThreadPool_t *pool = (ThreadPool_t *)arg;
while (!pool->shutdown) {
pthread_mutex_lock(&pool->mutex);
// 检查是否需要回收线程
while (pool->active_threads <= pool->min_threads ||
(pool->task_queue.size > 0 && pool->active_threads <= pool->task_queue.size)) {
pthread_cond_wait(&pool->reaper_cond, &pool->mutex);
if (pool->shutdown) {
pthread_mutex_unlock(&pool->mutex);
return NULL;
}
}
// 计算可以回收的线程数量
int excess_threads = pool->active_threads - pool->min_threads;
if (excess_threads > 0 && pool->active_threads > pool->min_threads) {
// 通过添加空任务来让工作线程退出
for (int i = 0; i < excess_threads; i++) {
task_queue_add(&pool->task_queue, NULL, NULL);
}
}
pthread_mutex_unlock(&pool->mutex);
sleep(1); // 避免过于频繁检查
}
return NULL;
}
// 初始化线程池
ThreadPool_t *thread_pool_init(int min_threads, int max_threads) {
if (min_threads <= 0 || max_threads <= 0 || min_threads > max_threads) {
errno = EINVAL;
return NULL;
}
ThreadPool_t *pool = (ThreadPool_t *)malloc(sizeof(ThreadPool_t));
if (pool == NULL) {
return NULL;
}
pool->threads = (pthread_t *)malloc(max_threads * sizeof(pthread_t));
if (pool->threads == NULL) {
free(pool);
return NULL;
}
if (task_queue_init(&pool->task_queue) != 0) {
free(pool->threads);
free(pool);
return NULL;
}
pool->min_threads = min_threads;
pool->max_threads = max_threads;
pool->thread_count = min_threads;
pool->active_threads = 0;
pool->shutdown = 0;
if (pthread_mutex_init(&pool->mutex, NULL) != 0 ||
pthread_cond_init(&pool->reaper_cond, NULL) != 0) {
pthread_mutex_destroy(&pool->task_queue.mutex);
pthread_cond_destroy(&pool->task_queue.cond);
free(pool->threads);
free(pool);
return NULL;
}
// 创建工作线程
for (int i = 0; i < min_threads; i++) {
if (pthread_create(&pool->threads[i], NULL, worker_thread, pool) != 0) {
// 创建线程失败,关闭已创建的线程
pool->shutdown = 1;
pthread_cond_broadcast(&pool->task_queue.cond);
for (int j = 0; j < i; j++) {
pthread_join(pool->threads[j], NULL);
}
pthread_mutex_destroy(&pool->mutex);
pthread_cond_destroy(&pool->reaper_cond);
pthread_mutex_destroy(&pool->task_queue.mutex);
pthread_cond_destroy(&pool->task_queue.cond);
free(pool->threads);
free(pool);
return NULL;
}
}
// 创建回收线程
if (pthread_create(&pool->reaper_thread, NULL, reaper_thread, pool) != 0) {
pool->shutdown = 1;
pthread_cond_broadcast(&pool->task_queue.cond);
for (int i = 0; i < min_threads; i++) {
pthread_join(pool->threads[i], NULL);
}
pthread_mutex_destroy(&pool->mutex);
pthread_cond_destroy(&pool->reaper_cond);
pthread_mutex_destroy(&pool->task_queue.mutex);
pthread_cond_destroy(&pool->task_queue.cond);
free(pool->threads);
free(pool);
return NULL;
}
return pool;
}
// 向线程池添加任务
int thread_pool_add_task(ThreadPool_t *pool, void (*function)(void *), void *argument) {
if (pool == NULL || function == NULL) {
return -1;
}
pthread_mutex_lock(&pool->mutex);
if (pool->shutdown) {
pthread_mutex_unlock(&pool->mutex);
return -1;
}
// 如果任务队列过长且可以创建更多线程,则创建新线程
if (pool->task_queue.size > pool->active_threads &&
pool->thread_count < pool->max_threads) {
if (pthread_create(&pool->threads[pool->thread_count], NULL, worker_thread, pool) == 0) {
pool->thread_count++;
}
}
pthread_mutex_unlock(&pool->mutex);
// 复制参数,确保生命周期
void *arg_copy = malloc(sizeof(*argument));
if (arg_copy == NULL) {
return -1;
}
*(int *)arg_copy = *(int *)argument;
return task_queue_add(&pool->task_queue, function, arg_copy);
}
// 销毁线程池
void thread_pool_destroy(ThreadPool_t *pool) {
if (pool == NULL) {
return;
}
pthread_mutex_lock(&pool->mutex);
pool->shutdown = 1;
pthread_mutex_unlock(&pool->mutex);
// 唤醒所有线程
pthread_cond_broadcast(&pool->task_queue.cond);
pthread_cond_signal(&pool->reaper_cond);
// 等待所有线程退出
for (int i = 0; i < pool->thread_count; i++) {
pthread_join(pool->threads[i], NULL);
}
pthread_join(pool->reaper_thread, NULL);
// 清理剩余任务
Task *task = pool->task_queue.head;
while (task != NULL) {
Task *next = task->next;
if (task->argument) free(task->argument);
free(task);
task = next;
}
// 释放资源
free(pool->threads);
pthread_mutex_destroy(&pool->task_queue.mutex);
pthread_cond_destroy(&pool->task_queue.cond);
pthread_mutex_destroy(&pool->mutex);
pthread_cond_destroy(&pool->reaper_cond);
free(pool);
}
\ No newline at end of file
#ifndef THREAD_POOL_H
#define THREAD_POOL_H
#include "common.h"
// 任务结构体
typedef struct Task {
void (*function)(void *);
void *argument;
struct Task *next;
} Task;
// 任务队列结构体
typedef struct {
Task *head;
Task *tail;
int size;
pthread_mutex_t mutex;
pthread_cond_t cond;
} TaskQueue;
// 线程池结构体
typedef struct {
pthread_t *threads;
pthread_t reaper_thread; // 新增:回收线程
int thread_count;
int min_threads; // 新增:最小线程数
int max_threads; // 新增:最大线程数
int active_threads; // 新增:活跃线程数
TaskQueue task_queue;
int shutdown;
pthread_mutex_t mutex;
pthread_cond_t reaper_cond; // 新增:回收线程条件变量
} ThreadPool_t;
// 初始化线程池
ThreadPool_t *thread_pool_init(int min_threads, int max_threads);
// 向线程池添加任务
int thread_pool_add_task(ThreadPool_t *pool, void (*function)(void *), void *argument);
// 销毁线程池
void thread_pool_destroy(ThreadPool_t *pool);
#endif //THREAD_POOL_H
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment