Commit 289587b0 authored by 957dd's avatar 957dd

Merge branch 'feature/wifi_change' into 'master'

Feature/wifi change See merge request !43
parents a9560b46 a80c5b31
cmake_minimum_required(VERSION 3.10) cmake_minimum_required(VERSION 3.10)
project(DeviceControlSystem project(DeviceControlSystem
VERSION 1.1.6 VERSION 1.1.7
LANGUAGES C LANGUAGES C
) )
......
...@@ -640,6 +640,30 @@ src/thread_main.c.s: ...@@ -640,6 +640,30 @@ src/thread_main.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/thread_main.c.s $(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/thread_main.c.s
.PHONY : src/thread_main.c.s .PHONY : src/thread_main.c.s
src/wifichange.o: src/wifichange.c.o
.PHONY : src/wifichange.o
# target to build an object file
src/wifichange.c.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/wifichange.c.o
.PHONY : src/wifichange.c.o
src/wifichange.i: src/wifichange.c.i
.PHONY : src/wifichange.i
# target to preprocess a source file
src/wifichange.c.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/wifichange.c.i
.PHONY : src/wifichange.c.i
src/wifichange.s: src/wifichange.c.s
.PHONY : src/wifichange.s
# target to generate assembly for a file
src/wifichange.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/wifichange.c.s
.PHONY : src/wifichange.c.s
system/gpio/gpio_common.o: system/gpio/gpio_common.c.o system/gpio/gpio_common.o: system/gpio/gpio_common.c.o
.PHONY : system/gpio/gpio_common.o .PHONY : system/gpio/gpio_common.o
...@@ -1503,6 +1527,9 @@ help: ...@@ -1503,6 +1527,9 @@ help:
@echo "... src/thread_main.o" @echo "... src/thread_main.o"
@echo "... src/thread_main.i" @echo "... src/thread_main.i"
@echo "... src/thread_main.s" @echo "... src/thread_main.s"
@echo "... src/wifichange.o"
@echo "... src/wifichange.i"
@echo "... src/wifichange.s"
@echo "... system/gpio/gpio_common.o" @echo "... system/gpio/gpio_common.o"
@echo "... system/gpio/gpio_common.i" @echo "... system/gpio/gpio_common.i"
@echo "... system/gpio/gpio_common.s" @echo "... system/gpio/gpio_common.s"
......
#define PROJECT_VERSION_MAJOR 1 #define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 1 #define PROJECT_VERSION_MINOR 1
#define PROJECT_VERSION_PATCH 6 #define PROJECT_VERSION_PATCH 7
#define GIT_HASH "" #define GIT_HASH ""
#define BUILD_TIMESTAMP "2025-06-03T10:33:26" #define BUILD_TIMESTAMP "2025-06-06T09:12:32"
#define BUILD_USER "orangepi" #define BUILD_USER "orangepi"
No preview for this file type
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
char TOPIC_middle[23]; char TOPIC_middle[23];
char TOPIC2_middle[23]; char TOPIC2_middle[23];
char TOPIC3_middle[15]; char TOPIC3_middle[15];
char TOPIC4_middle[23];
bool device_name_exists=0; bool device_name_exists=0;
...@@ -24,6 +25,7 @@ void topic_middle_value() {//指针中转函数,在使用指针前调用 ...@@ -24,6 +25,7 @@ void topic_middle_value() {//指针中转函数,在使用指针前调用
TOPIC=TOPIC_middle; TOPIC=TOPIC_middle;
TOPIC2=TOPIC2_middle; TOPIC2=TOPIC2_middle;
TOPIC3=TOPIC3_middle; TOPIC3=TOPIC3_middle;
TOPIC4=TOPIC4_middle;
} }
// void topic_back_middle_value() {//指针中转函数,在使用指针前调用 // void topic_back_middle_value() {//指针中转函数,在使用指针前调用
...@@ -145,10 +147,12 @@ int Device_File_Init() {//设备文件读取函数 ...@@ -145,10 +147,12 @@ int Device_File_Init() {//设备文件读取函数
sprintf(TOPIC2_middle,"dev2app/%s",readbuf); sprintf(TOPIC2_middle,"dev2app/%s",readbuf);
sprintf(TOPIC_middle,"app2dev/%s",readbuf); sprintf(TOPIC_middle,"app2dev/%s",readbuf);
sprintf(TOPIC3_middle,"%s",readbuf); sprintf(TOPIC3_middle,"%s",readbuf);
sprintf(TOPIC4_middle,"ser2dev/%s",readbuf);
} else { } else {
sprintf(TOPIC2_middle,"dev2app/%s","00000000000000"); sprintf(TOPIC2_middle,"dev2app/%s","00000000000000");
sprintf(TOPIC_middle,"app2dev/%s","00000000000000"); sprintf(TOPIC_middle,"app2dev/%s","00000000000000");
sprintf(TOPIC3_middle,"%s","00000000000000"); sprintf(TOPIC3_middle,"%s","00000000000000");
sprintf(TOPIC4_middle,"ser2dev/%s","00000000000000");
} }
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
#define AUDIOPLAY_H #define AUDIOPLAY_H
#include <cjson/cJSON.h> #include <cjson/cJSON.h>
extern int audio_status; // extern int audio_status;
void audioplay_mqtt_receive(cJSON *json) ; void audioplay_mqtt_receive(cJSON *body); //接收音频mqtt播放函数
void audioplay_cycle(); void audioplay_cycle();//音频播放线程中函数
#endif #endif
\ No newline at end of file
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
extern char* TOPIC; extern char* TOPIC;
extern char* TOPIC2; extern char* TOPIC2;
extern char* TOPIC3; extern char* TOPIC3;
extern char* TOPIC4;
extern char* TOPIC_BACK; extern char* TOPIC_BACK;
extern char* TOPIC2_BACK; extern char* TOPIC2_BACK;
...@@ -27,11 +28,11 @@ extern int gPwmCount; // 计数 ...@@ -27,11 +28,11 @@ extern int gPwmCount; // 计数
extern int gmessage_type;//message消息值 extern int gmessage_type;//message消息值
int mqtt_init();//mqtt初始化 int mqtt_init();//mqtt初始化
void mqtt_create(struct mosquitto *mosq);//创建mqtt客服端 int mqtt_create(struct mosquitto *mosq);//创建mqtt客服端
void on_connect(struct mosquitto *mosq, void *obj, int rc);//回调函数 void on_connect(struct mosquitto *mosq, void *obj, int rc);//回调函数
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);//消息回调函数
void mqtt_wirte();//发送mqtt,现为心跳 void mqtt_wirte();//发送mqtt,现为心跳
void mqtt_cycle(struct mosquitto *mosq);//循环 int mqtt_cycle(struct mosquitto *mosq);//循环
void mqtt_clean(struct mosquitto *mosq);//清理 void mqtt_clean(struct mosquitto *mosq);//清理
#endif #endif
\ No newline at end of file
...@@ -11,7 +11,7 @@ void *Mqttbeat(void *arg) ;//心跳线程 ...@@ -11,7 +11,7 @@ void *Mqttbeat(void *arg) ;//心跳线程
void *opensh(void *arg) ;//启动游览器线程 void *opensh(void *arg) ;//启动游览器线程
void *Mqtt_onnect(void *arg) ;//mqtt自带重连线程 void *Mqtt_onnect(void *arg) ;//mqtt自带重连线程
void *delay_count(void *arg) ;//延时计算延迟 void *delay_count(void *arg) ;//延时计算延迟
void *play_mp3_thread(void* arg); void *play_mp3_thread(void* arg);//等待播放音频线程
void thread_end() ; void thread_end() ;
#endif #endif
\ No newline at end of file
#ifndef WIFICHANGE_H__
#define WIFICHANGE_H__
#define SSID_MAX_LEN 128
#define PASS_MAX_LEN 128
#define CMD_BUFFER_SIZE 256
#define MAX_WIFI_LIST 100
#define default_SSID "jking"
#define default_password "12345678"
#define WIFI_CONF_PATH "/home/orangepi/car/master/device_wifi.conf"
#define WIFI_CONF_DIR "/home/orangepi/car/master"
typedef struct {
char ssid[SSID_MAX_LEN];
int signal;
} wifi_info_t;
void scan_wifi_json();//显示以连接WiFi名称和周围已有的WiFi和过滤信号强度低于50的WiFi
int wifi_change_sendmqtt_init();//wifi改变初始化,放在main开头,必须要等mqtt直播就绪才行
void wifi_change_recmqtt(cJSON *body);//接收到修改WiFi指令
#endif
\ No newline at end of file
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include "mqtt.h" #include "mqtt.h"
#include "judg.h" #include "judg.h"
int audio_status=3; int audio_status=7;
char urlbuf[512]; char urlbuf[512];
char keybuf[256]; char keybuf[256];
double audio_volume=0.8; double audio_volume=0.8;
...@@ -26,7 +26,8 @@ void audioplay_mqtt_receive(cJSON *json) { ...@@ -26,7 +26,8 @@ void audioplay_mqtt_receive(cJSON *json) {
char *key=key_char->valuestring; char *key=key_char->valuestring;
snprintf(keybuf, sizeof(keybuf), "%s", key); snprintf(keybuf, sizeof(keybuf), "%s", key);
} else { } else {
my_zlog_warn("错误:无法解析密钥字段\n"); my_zlog_warn("错误:无法解析音频链接");
audio_status=5;
} }
// 解析"status"字段 // 解析"status"字段
...@@ -48,16 +49,21 @@ void audioplay_mqtt_receive(cJSON *json) { ...@@ -48,16 +49,21 @@ void audioplay_mqtt_receive(cJSON *json) {
} }
} }
void audioplay_send_mqtt() { void audioplay_send_mqtt() {//发送音频播放是否完毕
cJSON* root = cJSON_CreateObject(); cJSON *root = cJSON_CreateObject();
cJSON *body = cJSON_CreateObject();
cJSON *head = cJSON_CreateObject();
// 添加各个字段到 JSON 对象 // 添加各个字段到 JSON 对象
cJSON_AddStringToObject(root, "type", "audio"); cJSON_AddStringToObject(body, "type", "audio");
cJSON_AddStringToObject(root, "audioLink", urlbuf); cJSON_AddStringToObject(body, "audioLink", urlbuf);
cJSON_AddStringToObject(root, "key", keybuf); cJSON_AddStringToObject(body, "key", keybuf);
cJSON_AddNumberToObject(root, "status", audio_status); cJSON_AddNumberToObject(body, "status", audio_status);
cJSON_AddNumberToObject(root, "volume", audio_volume); cJSON_AddNumberToObject(body, "volume", audio_volume);
cJSON_AddNumberToObject(head, "message_type",3001);
cJSON_AddItemToObject(root, "body", body);
cJSON_AddItemToObject(root, "head",head);
// 将 JSON 对象转换为字符串 // 将 JSON 对象转换为字符串
char* json_string = cJSON_PrintUnformatted(root); char* json_string = cJSON_PrintUnformatted(root);
my_zlog_debug("%s",json_string); my_zlog_debug("%s",json_string);
...@@ -85,15 +91,14 @@ void audioplay_cycle(){ ...@@ -85,15 +91,14 @@ void audioplay_cycle(){
} }
if (WIFEXITED(ret) && WEXITSTATUS(ret) == 0) { if (WIFEXITED(ret) && WEXITSTATUS(ret) == 0) {
my_zlog_debug("播放已成功完成 : %s \n", urlbuf); my_zlog_debug("播放已成功完成 : %s ", urlbuf);
audio_status=1;
audio_status=1;
audioplay_send_mqtt();
} else { } else {
my_zlog_warn("播放失败或中断: %s \n", urlbuf); my_zlog_warn("播放失败或中断: %s ", urlbuf);
audio_status=2; audio_status=2;
} }
audioplay_send_mqtt(); audioplay_send_mqtt();
} }
} }
} }
\ No newline at end of file
...@@ -15,7 +15,7 @@ static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, voi ...@@ -15,7 +15,7 @@ static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, voi
char *ptr = realloc(mem->memory, mem->size + realsize + 1); char *ptr = realloc(mem->memory, mem->size + realsize + 1);
if(!ptr) { if(!ptr) {
my_zlog_warn("not enough memory (realloc returned NULL)\n"); my_zlog_warn("not enough memory (realloc returned NULL)");
return 0; return 0;
} }
......
This diff is collapsed.
...@@ -10,9 +10,14 @@ ...@@ -10,9 +10,14 @@
#include "common.h" #include "common.h"
#include "device_exit.h" #include "device_exit.h"
#include "thread_main.h" #include "thread_main.h"
#include "wifichange.h"
pthread_t thread[6]; // 全局线程句柄数组(或传参) pthread_t thread[6]; // 全局线程句柄数组(或传参)
int gwebrtc_index=0;
int grc=0;
void* args[6] = { NULL, NULL, NULL, NULL, NULL, NULL }; void* args[6] = { NULL, NULL, NULL, NULL, NULL, NULL };
int thread_start(ThreadFunc AppExit, ThreadFunc Mqttbeat, int thread_start(ThreadFunc AppExit, ThreadFunc Mqttbeat,
...@@ -37,7 +42,8 @@ int thread_start(ThreadFunc AppExit, ThreadFunc Mqttbeat, ...@@ -37,7 +42,8 @@ int thread_start(ThreadFunc AppExit, ThreadFunc Mqttbeat,
return 0; return 0;
} }
void *AppExit(void *arg) { //出现意外自动停止 //出现意外自动停止
void *AppExit(void *arg) {
while(1){ while(1){
Delay_Ms(0,100); Delay_Ms(0,100);
gPwmCount++; gPwmCount++;
...@@ -58,15 +64,18 @@ void *AppExit(void *arg) { //出现意外自动停止 ...@@ -58,15 +64,18 @@ void *AppExit(void *arg) { //出现意外自动停止
void *Mqttbeat(void *arg) { void *Mqttbeat(void *arg) {
//printf("Mqttbeat start\n"); //printf("Mqttbeat start\n");
my_zlog_info("Mqttbeat start"); my_zlog_info("Mqttbeat start");
Delay_Ms(15,0); Delay_Ms(5,0);
wifi_change_sendmqtt_init();
gwebrtc_index=1;
while(1) { while(1) {
ipaddr();//获取ip
if( AppExit_pin_pwm == 202) Delay_Ms(0,45); if( AppExit_pin_pwm == 202) Delay_Ms(0,45);
if( AppExit_pin_pwm != 202) Delay_Ms(0,100); if( AppExit_pin_pwm != 202) Delay_Ms(0,100);
heartbeat_count++; heartbeat_count++;
mqtt_wirte();//心跳,3s一个 if(grc == 0){
if(heartbeat_count>=30) heartbeat_count=0; ipaddr();//获取ip
mqtt_wirte();//心跳,3s一个
}
if(heartbeat_count>=30) heartbeat_count=0;
} }
return NULL; return NULL;
} }
...@@ -74,24 +83,56 @@ void *Mqttbeat(void *arg) { ...@@ -74,24 +83,56 @@ void *Mqttbeat(void *arg) {
void *opensh(void *arg) { void *opensh(void *arg) {
Delay_Ms(5,0); Delay_Ms(5,0);
//printf("open cam\n"); //printf("open cam\n");
my_zlog_info("open cam"); while(1){
opencamsh();//10s后打开游览器并且进入网址 if(gwebrtc_index==1) {
my_zlog_info("open cam");
opencamsh();//10s后打开游览器并且进入网址
}
}
return NULL; return NULL;
} }
void *Mqtt_onnect(void *arg) {//mqtt异常处理,断开自动重连,简单粗暴 //mqtt异常处理,断开自动重连,简单粗暴
void *Mqtt_onnect(void *arg) {
Delay_Ms(5,0); Delay_Ms(5,0);
mqtt_init();//mqtt初始化
mqtt_create(mosq);//创建mqtt客户端 if (mqtt_init() != 0) {
while(1){ my_zlog_fatal("mqtt_init failed");
mqtt_create(mosq);//创建mqtt客户端 return NULL;
mqtt_cycle(mosq); //进入mqtt死循环,异常退出继续执行while }
while (1) {
if (mosq == NULL) {
mqtt_init();
if (!mosq) {
mqtt_clean(mosq);
my_zlog_error("Failed to create mosquitto client");
continue;
}
}
grc = mqtt_create(mosq);
if (grc != 0) {
mqtt_clean(mosq);
mosq = NULL;
continue;
}
grc = mqtt_cycle(mosq); // 阻塞直到断开
if(grc !=0 ){
mqtt_clean(mosq);
mosq = NULL;
}
my_zlog_warn("mqtt disconnected ...");
} }
mqtt_clean(mosq); mqtt_clean(mosq);
return NULL; return NULL;
} }
void *delay_count(void *arg) {//专门用于计时的线程 //专门用于计时的线程
void *delay_count(void *arg) {
while (1) { while (1) {
Delay_Ms(0,5); Delay_Ms(0,5);
device_delay_count++; device_delay_count++;
...@@ -100,7 +141,8 @@ void *delay_count(void *arg) {//专门用于计时的线程 ...@@ -100,7 +141,8 @@ void *delay_count(void *arg) {//专门用于计时的线程
return NULL; return NULL;
} }
void *play_mp3_thread(void* arg) {//专门处理MP3播放 //专门处理MP3播放
void *play_mp3_thread(void* arg) {
audioplay_cycle(); audioplay_cycle();
return NULL; return NULL;
} }
......
This diff is collapsed.
...@@ -11,10 +11,6 @@ extern int device_delay_count;//延时计算函数,使用前必须置0 ...@@ -11,10 +11,6 @@ extern int device_delay_count;//延时计算函数,使用前必须置0
#define PWM_PIN_SPEED 21 #define PWM_PIN_SPEED 21
#define PWM_PIN_CHANGE 2 #define PWM_PIN_CHANGE 2
void Device_exit_end();//main最后结束需要调用的函数
void init_gpioWPi(int *values_pin);//gpio引脚初始化 void init_gpioWPi(int *values_pin);//gpio引脚初始化
void init_gpioPwm(int *values_pwm); void init_gpioPwm(int *values_pwm);
...@@ -27,4 +23,6 @@ void pin_value(int pin,int value); ...@@ -27,4 +23,6 @@ void pin_value(int pin,int value);
void pwm_init_speed(); void pwm_init_speed();
void pwm_value(int pin,int value); //软件陪我们控制调速 void pwm_value(int pin,int value); //软件陪我们控制调速
void Device_exit_end();//main最后结束需要调用的函数
#endif #endif
...@@ -212,7 +212,7 @@ long long get_current_time_millis() { ...@@ -212,7 +212,7 @@ long long get_current_time_millis() {
return (long long)tv.tv_sec * 1000 + tv.tv_usec / 1000; return (long long)tv.tv_sec * 1000 + tv.tv_usec / 1000;
} }
void tank_shot_back_stop_task_function(void *arg) { void tank_shot_back_stop_task_function(void *arg) {//多线程处理坦克发射后退线程池
while(1){ while(1){
long long interval=shot_device_time_start-shot_device_time_end; long long interval=shot_device_time_start-shot_device_time_end;
if(device_delay_count>10&&device_delay_count<=25) mode_right_back(0); if(device_delay_count>10&&device_delay_count<=25) mode_right_back(0);
...@@ -224,6 +224,7 @@ void tank_shot_back_stop_task_function(void *arg) { ...@@ -224,6 +224,7 @@ void tank_shot_back_stop_task_function(void *arg) {
} }
} }
free(arg);
} }
ThreadPool *pool_tank; ThreadPool *pool_tank;
...@@ -231,6 +232,14 @@ void tank_shot_back_stop_task_end(){ ...@@ -231,6 +232,14 @@ void tank_shot_back_stop_task_end(){
thread_pool_destroy(pool_tank); thread_pool_destroy(pool_tank);
} }
void tank_shot_pthrpoll_task_init(){
int *arg = malloc(sizeof(int));
*arg = 1;
pool_tank=thread_pool_init(1,1);
thread_pool_add_task(pool_tank, tank_shot_back_stop_task_function, &arg);
my_zlog_debug("线程池打开");
}
int tank_shot_back_stop(int pin,int val){ int tank_shot_back_stop(int pin,int val){
static int shot_count=0; static int shot_count=0;
shot_device_time_start=get_current_time_millis(); shot_device_time_start=get_current_time_millis();
...@@ -246,10 +255,7 @@ int tank_shot_back_stop(int pin,int val){ ...@@ -246,10 +255,7 @@ int tank_shot_back_stop(int pin,int val){
} }
if(val != 0) { if(val != 0) {
if(shot_count == 0){ if(shot_count == 0){
int arg =1; tank_shot_pthrpoll_task_init();
pool_tank=thread_pool_init(1,1);
thread_pool_add_task(pool_tank, tank_shot_back_stop_task_function, &arg);
my_zlog_debug("线程池打开");
shot_count=1; shot_count=1;
} }
shot_count=1; shot_count=1;
......
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