完成亮灯合包的功能,增加mqtt消息返回接口,解决一个主线程cpu会占用100%的问题

This commit is contained in:
zzh 2025-07-03 10:01:28 +08:00
parent d36a67e979
commit 876f563492
3 changed files with 218 additions and 53 deletions

165
main.c
View File

@ -59,7 +59,7 @@ int fd;
int UPCASE=0; int UPCASE=0;
int count_value=0; int count_value=0;
int getPayloadTime=120*1000;//usecond int getPayloadTime=120*1000;//usecond
char softwareVersion[16]="1.1.18"; char softwareVersion[16]="1.1.19";
char stationsn[16]="TJ251372224247";//TJ250995217957 char stationsn[16]="TJ251372224247";//TJ250995217957
char productid[8]="10045"; char productid[8]="10045";
char appKey[32]="fdhQmhqhvbL1cf1K9mUqt"; char appKey[32]="fdhQmhqhvbL1cf1K9mUqt";
@ -111,7 +111,7 @@ static time_t last_2323_time = 0; // 记录上次收到0x2323的时间
static bool waiting_for_4646 = false; // 是否在等待0x4646 static bool waiting_for_4646 = false; // 是否在等待0x4646
// ====== 3015合并点亮相关全局变量 ====== // ====== 3015合并点亮相关全局变量 ======
#define MAX_LIGHTSN_BUFFER 30 #define MAX_LIGHTSN_BUFFER 4096
static char lightsn_buffer[MAX_LIGHTSN_BUFFER][32] = {0}; static char lightsn_buffer[MAX_LIGHTSN_BUFFER][32] = {0};
static char color_buffer[MAX_LIGHTSN_BUFFER][8] = {0}; // 颜色缓冲区与sn一一对应 static char color_buffer[MAX_LIGHTSN_BUFFER][8] = {0}; // 颜色缓冲区与sn一一对应
static char sound_buffer[MAX_LIGHTSN_BUFFER][8] = {0}; // 声音缓冲区 static char sound_buffer[MAX_LIGHTSN_BUFFER][8] = {0}; // 声音缓冲区
@ -1390,6 +1390,7 @@ void *thread_uart_recv_ack(void *arg){
// 记录收到0x2323的时间并设置等待0x4646标志 // 记录收到0x2323的时间并设置等待0x4646标志
time(&last_2323_time); time(&last_2323_time);
waiting_for_4646 = true; waiting_for_4646 = true;
#if 0
if(isLightOn){ if(isLightOn){
uint32_t tags[30] = {0}; uint32_t tags[30] = {0};
uint8_t tag_leds[30] = {0}; uint8_t tag_leds[30] = {0};
@ -1468,6 +1469,7 @@ void *thread_uart_recv_ack(void *arg){
memset(flash_buffer, 0, sizeof(flash_buffer)); memset(flash_buffer, 0, sizeof(flash_buffer));
pthread_mutex_unlock(&lightsn_buffer_mutex); pthread_mutex_unlock(&lightsn_buffer_mutex);
} }
#endif
#if 0 #if 0
if(isSearchLabel){ if(isSearchLabel){
uart_data_send_search(&uartSend,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF); uart_data_send_search(&uartSend,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);
@ -1658,9 +1660,16 @@ void light_off_tag_report(uint32_t name,uint16_t batteryv){
json_object_object_add(light, "sn", json_object_new_string(tagName)); json_object_object_add(light, "sn", json_object_new_string(tagName));
json_object_object_add(light, "battery", json_object_new_string(battery)); json_object_object_add(light, "battery", json_object_new_string(battery));
json_object_array_add(lights,light); json_object_array_add(lights,light);
json_object *lights_2 = json_object_new_array();
json_object *light_2 = json_object_new_object();
json_object_object_add(light_2, "sn", json_object_new_string(tagName));
json_object_object_add(light_2, "battery", json_object_new_string(battery));
json_object_array_add(lights_2, light_2);
char myid[32]={0}; char myid[32]={0};
myrand(myid,19); myrand(myid,19);
mqtt_server_light_status_report(stationsn,myid,"2",lights); mqtt_server_light_status_report(stationsn,myid,"2",lights);
//mqtt_server_light_status_report_2(stationsn,myid,"2",lights_2);
} }
void search_tag_report(){ void search_tag_report(){
@ -1964,7 +1973,7 @@ void *thread_mqtt_recv(void *arg){
get_string_from_json_string_by_key_unescape(msg_lightsn, "color", color_buffer[lightsn_buffer_count], 8); get_string_from_json_string_by_key_unescape(msg_lightsn, "color", color_buffer[lightsn_buffer_count], 8);
get_string_from_json_string_by_key_unescape(msg_lightsn, "sound", sound_buffer[lightsn_buffer_count], 8); get_string_from_json_string_by_key_unescape(msg_lightsn, "sound", sound_buffer[lightsn_buffer_count], 8);
get_string_from_json_string_by_key_unescape(msg_lightsn, "flash", flash_buffer[lightsn_buffer_count], 8); get_string_from_json_string_by_key_unescape(msg_lightsn, "flash", flash_buffer[lightsn_buffer_count], 8);
// 如果没有单独字段,使用全局默认
if (strlen(color_buffer[lightsn_buffer_count]) == 0) strcpy(color_buffer[lightsn_buffer_count], mqtt_parm.msg_color); if (strlen(color_buffer[lightsn_buffer_count]) == 0) strcpy(color_buffer[lightsn_buffer_count], mqtt_parm.msg_color);
if (strlen(sound_buffer[lightsn_buffer_count]) == 0) strcpy(sound_buffer[lightsn_buffer_count], mqtt_parm.msg_sound); if (strlen(sound_buffer[lightsn_buffer_count]) == 0) strcpy(sound_buffer[lightsn_buffer_count], mqtt_parm.msg_sound);
if (strlen(flash_buffer[lightsn_buffer_count]) == 0) strcpy(flash_buffer[lightsn_buffer_count], mqtt_parm.msg_flash); if (strlen(flash_buffer[lightsn_buffer_count]) == 0) strcpy(flash_buffer[lightsn_buffer_count], mqtt_parm.msg_flash);
@ -2244,6 +2253,7 @@ void updateStationInfo(char *msg_id){
calculateStartUpTime(startTime); calculateStartUpTime(startTime);
LOG_I("Time:%s\n",startTime); LOG_I("Time:%s\n",startTime);
mqtt_server_station_status_report(msg_id,productid,stationsn,local_ip,softwareVersion,"1",startTime); mqtt_server_station_status_report(msg_id,productid,stationsn,local_ip,softwareVersion,"1",startTime);
mqtt_server_station_status_report_test(msg_id,productid,stationsn,local_ip,softwareVersion,"1",startTime);
} }
bool timeNew(){ bool timeNew(){
@ -2536,7 +2546,25 @@ int main(int argc, char *argv[])
#if 1 #if 1
while(1) while(1)
{ {
fgets(command_buffer, sizeof(command_buffer), stdin); // 先检查标准输入是否可用
if (feof(stdin) || ferror(stdin)) {
LOG_I("stdin error or EOF, sleeping for 1 second\n");
sleep(1);
continue;
}
memset(command_buffer, 0, sizeof(command_buffer));
if (fgets(command_buffer, sizeof(command_buffer), stdin) == NULL) {
usleep(100000);
continue;
}
command_buffer[strcspn(command_buffer, "\n")] = 0;
if (strlen(command_buffer) == 0) {
continue;
}
if(execute_command(command_buffer, (command_t *)&__start_command, (&__stop_command - &__start_command)/2) < 0) if(execute_command(command_buffer, (command_t *)&__start_command, (&__stop_command - &__start_command)/2) < 0)
{ {
LOG_I("unsupport command!\r\n"); LOG_I("unsupport command!\r\n");
@ -2577,58 +2605,89 @@ void *thread_3015_lighton_merge(void *arg) {
pthread_mutex_lock(&lightsn_buffer_mutex); pthread_mutex_lock(&lightsn_buffer_mutex);
if (is_3015_collecting) { if (is_3015_collecting) {
time_t now = time(NULL); time_t now = time(NULL);
if ((now - first_3015_time >= 5) || (lightsn_buffer_count >= MAX_LIGHTSN_BUFFER)) { if ((now - first_3015_time >= 3) || (lightsn_buffer_count >= MAX_LIGHTSN_BUFFER)) {
int i; int total = lightsn_buffer_count;
lightsnNum = lightsn_buffer_count; int batch_size = 10;
for (i = 0; i < lightsn_buffer_count; i++) { int sent = 0;
switch(i) { while (sent < total) {
case 0: memcpy(lightsn1, lightsn_buffer[i], 32); break; int this_batch = (total - sent > batch_size) ? batch_size : (total - sent);
case 1: memcpy(lightsn2, lightsn_buffer[i], 32); break; if (isLightEnable && this_batch > 0) {
case 2: memcpy(lightsn3, lightsn_buffer[i], 32); break; isLightOn = true;
case 3: memcpy(lightsn4, lightsn_buffer[i], 32); break; isLightOnByRule = false;
case 4: memcpy(lightsn5, lightsn_buffer[i], 32); break; isLabelUp = false;
case 5: memcpy(lightsn6, lightsn_buffer[i], 32); break; uint32_t tags[10] = {0};
case 6: memcpy(lightsn7, lightsn_buffer[i], 32); break; uint8_t tag_leds[10] = {0};
case 7: memcpy(lightsn8, lightsn_buffer[i], 32); break; for (int i = 0; i < this_batch; i++) {
case 8: memcpy(lightsn9, lightsn_buffer[i], 32); break; LOG_I("sn[%d]=%s\n", sent + i + 1, lightsn_buffer[sent + i]);
case 9: memcpy(lightsn10, lightsn_buffer[i], 32); break; // 1. SN转MACHEX字符串转uint32_t
case 10: memcpy(lightsn11, lightsn_buffer[i], 32); break; if (strlen(lightsn_buffer[sent + i]) == 8) {
case 11: memcpy(lightsn12, lightsn_buffer[i], 32); break; tags[i] = (uint32_t)strtoul(lightsn_buffer[sent + i], NULL, 16);
case 12: memcpy(lightsn13, lightsn_buffer[i], 32); break; } else {
case 13: memcpy(lightsn14, lightsn_buffer[i], 32); break; LOG_I("[WARN] tag[%d] sn格式非法: %s, 跳过", sent + i, lightsn_buffer[sent + i]);
case 14: memcpy(lightsn15, lightsn_buffer[i], 32); break; continue;
case 15: memcpy(lightsn16, lightsn_buffer[i], 32); break; }
case 16: memcpy(lightsn17, lightsn_buffer[i], 32); break; // 2. 颜色+闪光+声音合成LED控制字节协议格式
case 17: memcpy(lightsn18, lightsn_buffer[i], 32); break; int flash = (strlen(flash_buffer[sent + i]) > 0) ? atoi(flash_buffer[sent + i]) : atoi(mqtt_parm.msg_flash); // "1"=闪光, "0"=常亮
case 18: memcpy(lightsn19, lightsn_buffer[i], 32); break; int sound = (strlen(sound_buffer[sent + i]) > 0) ? atoi(sound_buffer[sent + i]) : atoi(mqtt_parm.msg_sound); // "1"=有声, "0"=无声
case 19: memcpy(lightsn20, lightsn_buffer[i], 32); break; int changecolor = 0;
case 20: memcpy(lightsn21, lightsn_buffer[i], 32); break; if(strcmp(color_buffer[sent + i],"1")==0){
case 21: memcpy(lightsn22, lightsn_buffer[i], 32); break; changecolor=4;
case 22: memcpy(lightsn23, lightsn_buffer[i], 32); break; }else if(strcmp(color_buffer[sent + i],"2")==0){
case 23: memcpy(lightsn24, lightsn_buffer[i], 32); break; changecolor=6;
case 24: memcpy(lightsn25, lightsn_buffer[i], 32); break; }else if(strcmp(color_buffer[sent + i],"3")==0){
case 25: memcpy(lightsn26, lightsn_buffer[i], 32); break; changecolor=1;
case 26: memcpy(lightsn27, lightsn_buffer[i], 32); break; }else if(strcmp(color_buffer[sent + i],"4")==0){
case 27: memcpy(lightsn28, lightsn_buffer[i], 32); break; changecolor=2;
case 28: memcpy(lightsn29, lightsn_buffer[i], 32); break; }else if(strcmp(color_buffer[sent + i],"5")==0){
case 29: memcpy(lightsn30, lightsn_buffer[i], 32); break; changecolor=3;
}else if(strcmp(color_buffer[sent + i],"6")==0){
changecolor=7;
}else if(strcmp(color_buffer[sent + i],"7")==0){
changecolor=5;
}else if(strcmp(color_buffer[sent + i],"8")==0){
changecolor=0;
}
uint8_t led_val = 0;
if (flash) led_val |= 0x40; // Bit6
if (sound) led_val |= 0x10; // Bit4
led_val |= (changecolor & 0x0F); // 低4位为颜色
tag_leds[i] = led_val;
}
uint8_t changecolor=0;
if(strcmp(mqtt_parm.msg_color,"1")==0){
changecolor=4;
}else if(strcmp(mqtt_parm.msg_color,"2")==0){
changecolor=6;
}else if(strcmp(mqtt_parm.msg_color,"3")==0){
changecolor=1;
}else if(strcmp(mqtt_parm.msg_color,"4")==0){
changecolor=2;
}else if(strcmp(mqtt_parm.msg_color,"5")==0){
changecolor=3;
}else if(strcmp(mqtt_parm.msg_color,"6")==0){
changecolor=7;
}else if(strcmp(mqtt_parm.msg_color,"7")==0){
changecolor=5;
}else if(strcmp(mqtt_parm.msg_color,"8")==0){
changecolor=0;
}
jt_ledctrl_package_t led_ctrl={
.s.color=changecolor,
.s.sound=atoi(mqtt_parm.msg_sound),
.s.flash=atoi(mqtt_parm.msg_flash),
};
uart_data_send_head_lightband(&uartSend, 2, this_batch);
usleep(50000);
uart_data_send_lightband(&uartSend, led_ctrl.ch, atoi(mqtt_parm.msg_flash), atoi(mqtt_parm.msg_lightDuration), tags, tag_leds, this_batch);
}
sent += this_batch;
if (sent < total) {
pthread_mutex_unlock(&lightsn_buffer_mutex); // 释放锁等待
sleep(3);
pthread_mutex_lock(&lightsn_buffer_mutex); // 重新加锁
} }
} }
if (isLightEnable && (lightsnNum > 0)) {
//isSendComEnd = false;
isLightOn = true;
isLightOnByRule = false;
isLabelUp = false;
for (int i = 0; i < lightsnNum; i++) {
LOG_I("sn[%d]=%s\n", i+1, lightsn_buffer[i]);
}
uart_data_send_head_lightband(&uartSend, 5, lightsnNum);
}
// 不要立即清空buffer等待isLightOn处理完成 // 不要立即清空buffer等待isLightOn处理完成
// lightsn_buffer_count = 0;
// memset(lightsn_buffer, 0, sizeof(lightsn_buffer));
is_3015_collecting = false; is_3015_collecting = false;
first_3015_time = 0; first_3015_time = 0;
} }

View File

@ -109,6 +109,56 @@ json_error:
json_object_put(root); json_object_put(root);
} }
void mqtt_server_light_status_report_2(char *sn,char *msg_id,char *scene,json_object *lights){
char topic[128] = "";
const char *payload = NULL;
char time_buffer[128] = "";
json_object *root = NULL;
json_object *data = NULL;
json_object *msg = NULL;
struct timeval tv;
gettimeofday(&tv, NULL);
snprintf(time_buffer,sizeof(time_buffer),"%ld",tv.tv_sec*1000+tv.tv_usec);
LOG_I("%s\n",__func__);
root = json_object_new_object();
if(root == NULL){
LOG_I("json_object_new_object error\n");
goto json_error;
}
msg = json_object_new_object();
if(msg == NULL){
LOG_I("msg: NULL\n");
goto json_error;
}
data = json_object_new_object();
if(msg == NULL){
LOG_I("msg: NULL\n");
goto json_error;
}
json_object_object_add(root, "deviceId", json_object_new_string(sn));
json_object_object_add(root, "messageId", json_object_new_string(msg_id));
json_object_object_add(root, "productId", json_object_new_string(mqtt_conf->productcode));
json_object_object_add(root, "timestamp", json_object_new_string(time_buffer));
json_object_object_add(data, "scene", json_object_new_string(scene));
json_object_object_add(data, "lights", lights);
json_object_object_add(msg, "data", data);
json_object_object_add(msg, "msgType", json_object_new_string("9007"));
json_object_object_add(root, "msg", msg);
snprintf(topic, sizeof(topic), "iot/%s/%s/message/report",mqtt_conf->productcode,mqtt_conf->username);
//LOG_I("publish topic:[%s]\n", topic);
payload = json_object_to_json_string(root);
//LOG_I("payload[%d][%s]\n", strlen(payload), payload);
mqtt_utils_publish(mqtt_conf, topic, 2, payload, strlen(payload));
json_error:
json_object_put(root);
}
void mqtt_server_station_status_report(char *msg_id,char *product_id,char *sn,char *local_ip, char *base_version, void mqtt_server_station_status_report(char *msg_id,char *product_id,char *sn,char *local_ip, char *base_version,
char *status, char *duration){ char *status, char *duration){
char topic[128] = ""; char topic[128] = "";
@ -162,6 +212,59 @@ json_error:
json_object_put(root); json_object_put(root);
} }
void mqtt_server_station_status_report_test(char *msg_id,char *product_id,char *sn,char *local_ip, char *base_version,
char *status, char *duration){
char topic[128] = "";
const char *payload = NULL;
char time_buffer[128] = "";
json_object *root = NULL;
json_object *msg = NULL;
json_object *data = NULL;
struct timeval tv;
gettimeofday(&tv, NULL);
snprintf(time_buffer,sizeof(time_buffer),"%ld",tv.tv_sec*1000+tv.tv_usec);
LOG_I("%s\n",__func__);
root = json_object_new_object();
if(root == NULL){
LOG_I("json_object_new_object error\n");
goto json_error;
}
msg = json_object_new_object();
if(msg == NULL){
LOG_I("msg: NULL\n");
goto json_error;
}
data = json_object_new_object();
if(msg == NULL){
LOG_I("msg: NULL\n");
goto json_error;
}
json_object_object_add(root, "deviceId", json_object_new_string(sn));
json_object_object_add(root, "messageId", json_object_new_string(msg_id));
json_object_object_add(root, "productId", json_object_new_string(mqtt_conf->productcode));
json_object_object_add(root, "timestamp", json_object_new_string(time_buffer));
json_object_object_add(data, "ip", json_object_new_string(local_ip));
json_object_object_add(data, "baseVersion", json_object_new_string(base_version));
json_object_object_add(data, "status", json_object_new_string(status));
json_object_object_add(data, "duration", json_object_new_string(duration));
json_object_object_add(msg, "data", data);
json_object_object_add(msg, "msgType", json_object_new_string("9008"));
json_object_object_add(root, "msg", msg);
snprintf(topic, sizeof(topic), "iot/%s/%s/station/report", mqtt_conf->productcode, mqtt_conf->username);
//LOG_I("publish topic:[%s]\n", topic);
payload = json_object_to_json_string(root);
//LOG_I("payload[%d][%s]\n", strlen(payload), payload);
mqtt_utils_publish(mqtt_conf, topic, 2, payload, strlen(payload));
json_error:
json_object_put(root);
}
void mqtt_service_reply(char *sn,char *msg_id,char *msg,int success,char *product_id) void mqtt_service_reply(char *sn,char *msg_id,char *msg,int success,char *product_id)
{ {
char topic[128] = ""; char topic[128] = "";

View File

@ -156,6 +156,9 @@ void mqtt_server_station_status_report(char *msg_id,char *product_id,char *sn,ch
char *status, char *duration); char *status, char *duration);
void mqtt_service_reply(char *sn,char *msg_id,char *msg,int success,char *product_id); void mqtt_service_reply(char *sn,char *msg_id,char *msg,int success,char *product_id);
void mqtt_server_light_status_report(char *sn,char *msg_id,char *scene,json_object *lights); void mqtt_server_light_status_report(char *sn,char *msg_id,char *scene,json_object *lights);
void mqtt_server_light_status_report_2(char *sn,char *msg_id,char *scene,json_object *lights);
void mqtt_server_station_status_report_test(char *msg_id,char *product_id,char *sn,char *local_ip, char *base_version,
char *status, char *duration);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif