使用独立控制灯条来实现合包功能,客户端启动时增加版本号保存方便排查
This commit is contained in:
parent
8da855cd53
commit
d36a67e979
405
main.c
405
main.c
@ -59,7 +59,7 @@ int fd;
|
||||
int UPCASE=0;
|
||||
int count_value=0;
|
||||
int getPayloadTime=120*1000;//usecond
|
||||
char softwareVersion[16]="1.1.17";
|
||||
char softwareVersion[16]="1.1.18";
|
||||
char stationsn[16]="TJ251372224247";//TJ250995217957
|
||||
char productid[8]="10045";
|
||||
char appKey[32]="fdhQmhqhvbL1cf1K9mUqt";
|
||||
@ -110,8 +110,20 @@ int mqtt_port=1883;
|
||||
static time_t last_2323_time = 0; // 记录上次收到0x2323的时间
|
||||
static bool waiting_for_4646 = false; // 是否在等待0x4646
|
||||
|
||||
// ====== 3015合并点亮相关全局变量 ======
|
||||
#define MAX_LIGHTSN_BUFFER 30
|
||||
static char lightsn_buffer[MAX_LIGHTSN_BUFFER][32] = {0};
|
||||
static char color_buffer[MAX_LIGHTSN_BUFFER][8] = {0}; // 颜色缓冲区,与sn一一对应
|
||||
static char sound_buffer[MAX_LIGHTSN_BUFFER][8] = {0}; // 声音缓冲区
|
||||
static char flash_buffer[MAX_LIGHTSN_BUFFER][8] = {0}; // 闪光缓冲区
|
||||
static int lightsn_buffer_count = 0;
|
||||
static time_t first_3015_time = 0;
|
||||
static bool is_3015_collecting = false;
|
||||
static pthread_mutex_t lightsn_buffer_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
// 函数声明
|
||||
void *thread_timeout_check(void *arg);
|
||||
void *thread_3015_lighton_merge(void *arg);
|
||||
|
||||
int getLedOtaVersion(char *filename);
|
||||
int getApOtaVersion(char *filename,char *modename);
|
||||
@ -1379,74 +1391,82 @@ void *thread_uart_recv_ack(void *arg){
|
||||
time(&last_2323_time);
|
||||
waiting_for_4646 = true;
|
||||
if(isLightOn){
|
||||
char *flash=mqtt_parm.msg_flash;
|
||||
char *light=mqtt_parm.msg_lightDuration;
|
||||
uint32_t tag1=strtol(lightsn1,NULL,16);
|
||||
uint32_t tag2=strtol(lightsn2,NULL,16);
|
||||
uint32_t tag3=strtol(lightsn3,NULL,16);
|
||||
uint32_t tag4=strtol(lightsn4,NULL,16);
|
||||
uint32_t tag5=strtol(lightsn5,NULL,16);
|
||||
uint32_t tag6=strtol(lightsn6,NULL,16);
|
||||
uint32_t tag7=strtol(lightsn7,NULL,16);
|
||||
uint32_t tag8=strtol(lightsn8,NULL,16);
|
||||
uint32_t tag9=strtol(lightsn9,NULL,16);
|
||||
uint32_t tag10=strtol(lightsn10,NULL,16);
|
||||
uint32_t tag11=strtol(lightsn11,NULL,16);
|
||||
uint32_t tag12=strtol(lightsn12,NULL,16);
|
||||
uint32_t tag13=strtol(lightsn13,NULL,16);
|
||||
uint32_t tag14=strtol(lightsn14,NULL,16);
|
||||
uint32_t tag15=strtol(lightsn15,NULL,16);
|
||||
uint32_t tag16=strtol(lightsn16,NULL,16);
|
||||
uint32_t tag17=strtol(lightsn17,NULL,16);
|
||||
uint32_t tag18=strtol(lightsn18,NULL,16);
|
||||
uint32_t tag19=strtol(lightsn19,NULL,16);
|
||||
uint32_t tag20=strtol(lightsn20,NULL,16);
|
||||
uint32_t tag21=strtol(lightsn21,NULL,16);
|
||||
uint32_t tag22=strtol(lightsn22,NULL,16);
|
||||
uint32_t tag23=strtol(lightsn23,NULL,16);
|
||||
uint32_t tag24=strtol(lightsn24,NULL,16);
|
||||
uint32_t tag25=strtol(lightsn25,NULL,16);
|
||||
uint32_t tag26=strtol(lightsn26,NULL,16);
|
||||
uint32_t tag27=strtol(lightsn27,NULL,16);
|
||||
uint32_t tag28=strtol(lightsn28,NULL,16);
|
||||
uint32_t tag29=strtol(lightsn29,NULL,16);
|
||||
uint32_t tag30=strtol(lightsn30,NULL,16);
|
||||
uint8_t changecolor=0;
|
||||
//8灭 1红 2黄 3蓝 4绿 5青 6白 7紫 xitu
|
||||
//0灭 1蓝 2绿 3青 4红 5紫 6黄 7白 yitaile
|
||||
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;
|
||||
uint32_t tags[30] = {0};
|
||||
uint8_t tag_leds[30] = {0};
|
||||
int valid_count = 0;
|
||||
for (int i = 0; i < lightsn_buffer_count; ++i) {
|
||||
// 1. SN转MAC(HEX字符串转uint32_t)
|
||||
if (strlen(lightsn_buffer[i]) == 8) {
|
||||
tags[valid_count] = (uint32_t)strtoul(lightsn_buffer[i], NULL, 16);
|
||||
} else {
|
||||
LOG_I("[WARN] tag[%d] sn格式非法: %s, 跳过", i, lightsn_buffer[i]);
|
||||
continue;
|
||||
}
|
||||
// 2. 颜色+闪光+声音合成LED控制字节(协议格式)
|
||||
int flash = (strlen(flash_buffer[i]) > 0) ? atoi(flash_buffer[i]) : atoi(mqtt_parm.msg_flash); // "1"=闪光, "0"=常亮
|
||||
int sound = (strlen(sound_buffer[i]) > 0) ? atoi(sound_buffer[i]) : atoi(mqtt_parm.msg_sound); // "1"=有声, "0"=无声
|
||||
int changecolor = 0;
|
||||
if(strcmp(color_buffer[i],"1")==0){
|
||||
changecolor=4;
|
||||
}else if(strcmp(color_buffer[i],"2")==0){
|
||||
changecolor=6;
|
||||
}else if(strcmp(color_buffer[i],"3")==0){
|
||||
changecolor=1;
|
||||
}else if(strcmp(color_buffer[i],"4")==0){
|
||||
changecolor=2;
|
||||
}else if(strcmp(color_buffer[i],"5")==0){
|
||||
changecolor=3;
|
||||
}else if(strcmp(color_buffer[i],"6")==0){
|
||||
changecolor=7;
|
||||
}else if(strcmp(color_buffer[i],"7")==0){
|
||||
changecolor=5;
|
||||
}else if(strcmp(color_buffer[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[valid_count] = led_val;
|
||||
LOG_I("tag[%d]: sn=%s, color=%s, led=0x%02X ",
|
||||
valid_count, lightsn_buffer[i], color_buffer[i], tag_leds[valid_count]);
|
||||
valid_count++;
|
||||
}
|
||||
if (valid_count > 0) {
|
||||
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_lightband(&uartSend, led_ctrl.ch, atoi(mqtt_parm.msg_flash), atoi(mqtt_parm.msg_lightDuration), tags, tag_leds, valid_count);
|
||||
}
|
||||
|
||||
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_lighton(&uartSend, 5, lightsnNum);
|
||||
uart_data_send_lighton(&uartSend, led_ctrl.ch, atoi(flash), atoi(light),
|
||||
tag1, tag2, tag3, tag4, tag5,
|
||||
tag6, tag7, tag8, tag9, tag10,
|
||||
tag11, tag12, tag13, tag14, tag15,
|
||||
tag16, tag17, tag18, tag19, tag20,
|
||||
tag21, tag22, tag23, tag24, tag25,
|
||||
tag26, tag27, tag28, tag29, tag30,
|
||||
lightsnNum);
|
||||
isLightOn=false;
|
||||
// 处理完成后清空buffer
|
||||
pthread_mutex_lock(&lightsn_buffer_mutex);
|
||||
lightsn_buffer_count = 0;
|
||||
memset(lightsn_buffer, 0, sizeof(lightsn_buffer));
|
||||
memset(color_buffer, 0, sizeof(color_buffer));
|
||||
memset(sound_buffer, 0, sizeof(sound_buffer));
|
||||
memset(flash_buffer, 0, sizeof(flash_buffer));
|
||||
pthread_mutex_unlock(&lightsn_buffer_mutex);
|
||||
}
|
||||
#if 0
|
||||
if(isSearchLabel){
|
||||
@ -1554,7 +1574,7 @@ void *thread_uart_recv_ack(void *arg){
|
||||
uart_data_receive_version(&uartSend);
|
||||
isSendComEnd=true;
|
||||
isAPOtaSuccess=true;
|
||||
}else if(parm_ack==0x5454){
|
||||
}else if(parm_ack==0x6464){
|
||||
last_2323_time = 0; // 重置时间
|
||||
waiting_for_4646 = false; // 重置等待状态
|
||||
isSendComEnd=true;
|
||||
@ -1907,138 +1927,52 @@ void *thread_mqtt_recv(void *arg){
|
||||
LOG_I("searchTimeOld:%d\n",searchTimeOld);
|
||||
isSearchLabelOn=true;
|
||||
}else if(strcmp(mqtt_parm.msg_type,"3015")==0){
|
||||
LOG_I("3015 light on\n");
|
||||
LOG_I("3015 light on (merge mode)\n");
|
||||
get_string_from_json_string_by_key_unescape(msg_data, "scene", mqtt_parm.msg_scene, sizeof(mqtt_parm.msg_scene));
|
||||
LOG_I("scene:%s\n",mqtt_parm.msg_scene);
|
||||
|
||||
LOG_I("scene:%s\n",mqtt_parm.msg_scene);
|
||||
get_string_from_json_string_by_key_unescape(msg_data, "lights", mqtt_parm.msg_lights, sizeof(mqtt_parm.msg_lights));
|
||||
LOG_I("lights:%s\n",mqtt_parm.msg_lights);
|
||||
|
||||
LOG_I("lights:%s\n",mqtt_parm.msg_lights);
|
||||
get_size_from_json_string_arry_by_key(msg_data, "lights", &mqtt_parm.msg_opNumber);
|
||||
LOG_I("lights size = %d\n", mqtt_parm.msg_opNumber);
|
||||
lightsnNum=mqtt_parm.msg_opNumber;
|
||||
for(int i = 0; i < mqtt_parm.msg_opNumber; i++){
|
||||
get_string_from_json_string_arry_by_key(msg_data,"lights",msg_lightsn_value,128,i);
|
||||
snprintf(msg_lightsn, sizeof(msg_lightsn), "{%s}", msg_lightsn_value);
|
||||
get_string_from_json_string_by_key_unescape(msg_lightsn, "sn", mqtt_parm.msg_sn,sizeof(mqtt_parm.msg_sn));
|
||||
LOG_I("sn:%s\n",mqtt_parm.msg_sn);
|
||||
if(i==0){
|
||||
memset(lightsn1,0,32);
|
||||
memcpy(lightsn1,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==1){
|
||||
memset(lightsn2,0,32);
|
||||
memcpy(lightsn2,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==2){
|
||||
memset(lightsn3,0,32);
|
||||
memcpy(lightsn3,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==3){
|
||||
memset(lightsn4,0,32);
|
||||
memcpy(lightsn4,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==4){
|
||||
memset(lightsn5,0,32);
|
||||
memcpy(lightsn5,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==5){
|
||||
memset(lightsn6,0,32);
|
||||
memcpy(lightsn6,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==6){
|
||||
memset(lightsn7,0,32);
|
||||
memcpy(lightsn7,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==7){
|
||||
memset(lightsn8,0,32);
|
||||
memcpy(lightsn8,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==8){
|
||||
memset(lightsn9,0,32);
|
||||
memcpy(lightsn9,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==9){
|
||||
memset(lightsn10,0,32);
|
||||
memcpy(lightsn10,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==10){
|
||||
memset(lightsn11,0,32);
|
||||
memcpy(lightsn11,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==11){
|
||||
memset(lightsn12,0,32);
|
||||
memcpy(lightsn12,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==12){
|
||||
memset(lightsn13,0,32);
|
||||
memcpy(lightsn13,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==13){
|
||||
memset(lightsn14,0,32);
|
||||
memcpy(lightsn14,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==14){
|
||||
memset(lightsn15,0,32);
|
||||
memcpy(lightsn15,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==15){
|
||||
memset(lightsn16,0,32);
|
||||
memcpy(lightsn16,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==16){
|
||||
memset(lightsn17,0,32);
|
||||
memcpy(lightsn17,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==17){
|
||||
memset(lightsn18,0,32);
|
||||
memcpy(lightsn18,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==18){
|
||||
memset(lightsn19,0,32);
|
||||
memcpy(lightsn19,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==19){
|
||||
memset(lightsn20,0,32);
|
||||
memcpy(lightsn20,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==20){
|
||||
memset(lightsn21,0,32);
|
||||
memcpy(lightsn21,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==21){
|
||||
memset(lightsn22,0,32);
|
||||
memcpy(lightsn22,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==22){
|
||||
memset(lightsn23,0,32);
|
||||
memcpy(lightsn23,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==23){
|
||||
memset(lightsn24,0,32);
|
||||
memcpy(lightsn24,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==24){
|
||||
memset(lightsn25,0,32);
|
||||
memcpy(lightsn25,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==25){
|
||||
memset(lightsn26,0,32);
|
||||
memcpy(lightsn26,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==26){
|
||||
memset(lightsn27,0,32);
|
||||
memcpy(lightsn27,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==27){
|
||||
memset(lightsn28,0,32);
|
||||
memcpy(lightsn28,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==28){
|
||||
memset(lightsn29,0,32);
|
||||
memcpy(lightsn29,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}else if(i==29){
|
||||
memset(lightsn30,0,32);
|
||||
memcpy(lightsn30,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn));
|
||||
}
|
||||
}
|
||||
|
||||
get_string_from_json_string_by_key_unescape(msg_data, "color", mqtt_parm.msg_color, sizeof(mqtt_parm.msg_color));
|
||||
LOG_I("color:%s\n",mqtt_parm.msg_color);
|
||||
LOG_I("color:%s\n",mqtt_parm.msg_color);
|
||||
get_string_from_json_string_by_key_unescape(msg_data, "sound", mqtt_parm.msg_sound, sizeof(mqtt_parm.msg_sound));
|
||||
LOG_I("sound:%s\n",mqtt_parm.msg_sound);
|
||||
LOG_I("sound:%s\n",mqtt_parm.msg_sound);
|
||||
get_string_from_json_string_by_key_unescape(msg_data, "flash", mqtt_parm.msg_flash, sizeof(mqtt_parm.msg_flash));
|
||||
LOG_I("flash:%s\n",mqtt_parm.msg_flash);
|
||||
get_string_from_json_string_by_key_unescape(msg_data, "flashInterval", mqtt_parm.msg_flashInterval,
|
||||
sizeof(mqtt_parm.msg_flashInterval));
|
||||
LOG_I("flashInterval:%s\n",mqtt_parm.msg_flashInterval);
|
||||
get_string_from_json_string_by_key_unescape(msg_data, "lightDuration", mqtt_parm.msg_lightDuration,
|
||||
sizeof(mqtt_parm.msg_lightDuration));
|
||||
LOG_I("lightDuration:%s\n",mqtt_parm.msg_lightDuration);
|
||||
|
||||
if(isLightEnable && (mqtt_parm.msg_opNumber>0)){
|
||||
mqtt_service_reply(stationsn,mqtt_parm.msg_messageId,"ok",1,productid);
|
||||
isSendComEnd=false;
|
||||
isLightOn=true;
|
||||
isLightOnByRule=false;
|
||||
isLabelUp=false;
|
||||
//isSearchLabel=false;
|
||||
uart_data_send_head_lighton(&uartSend,5,lightsnNum);
|
||||
}else{
|
||||
mqtt_service_reply(stationsn,mqtt_parm.msg_messageId,"light disabled or sn is null",0,productid);
|
||||
LOG_I("flash:%s\n",mqtt_parm.msg_flash);
|
||||
get_string_from_json_string_by_key_unescape(msg_data, "flashInterval", mqtt_parm.msg_flashInterval, sizeof(mqtt_parm.msg_flashInterval));
|
||||
LOG_I("flashInterval:%s\n",mqtt_parm.msg_flashInterval);
|
||||
get_string_from_json_string_by_key_unescape(msg_data, "lightDuration", mqtt_parm.msg_lightDuration, sizeof(mqtt_parm.msg_lightDuration));
|
||||
LOG_I("lightDuration:%s\n",mqtt_parm.msg_lightDuration);
|
||||
pthread_mutex_lock(&lightsn_buffer_mutex);
|
||||
if (!is_3015_collecting) {
|
||||
is_3015_collecting = true;
|
||||
first_3015_time = time(NULL);
|
||||
lightsn_buffer_count = 0;
|
||||
memset(lightsn_buffer, 0, sizeof(lightsn_buffer));
|
||||
memset(color_buffer, 0, sizeof(color_buffer));
|
||||
memset(sound_buffer, 0, sizeof(sound_buffer));
|
||||
memset(flash_buffer, 0, sizeof(flash_buffer));
|
||||
}
|
||||
int i;
|
||||
char msg_lightsn_value[128] = {0};
|
||||
char msg_lightsn[128] = {0};
|
||||
for (i = 0; i < mqtt_parm.msg_opNumber && lightsn_buffer_count < MAX_LIGHTSN_BUFFER; i++) {
|
||||
get_string_from_json_string_arry_by_key(msg_data, "lights", msg_lightsn_value, 128, i);
|
||||
snprintf(msg_lightsn, sizeof(msg_lightsn), "{%s}", msg_lightsn_value);
|
||||
get_string_from_json_string_by_key_unescape(msg_lightsn, "sn", lightsn_buffer[lightsn_buffer_count], 32);
|
||||
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, "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(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);
|
||||
LOG_I("buffered sn: %s, color: %s, sound: %s, flash: %s\n", lightsn_buffer[lightsn_buffer_count], color_buffer[lightsn_buffer_count], sound_buffer[lightsn_buffer_count], flash_buffer[lightsn_buffer_count]);
|
||||
lightsn_buffer_count++;
|
||||
}
|
||||
pthread_mutex_unlock(&lightsn_buffer_mutex);
|
||||
mqtt_service_reply(stationsn, mqtt_parm.msg_messageId, "ok", 1, productid);
|
||||
}else if(strcmp(mqtt_parm.msg_type,"3022")==0){
|
||||
LOG_I("3022 updata lable\n");
|
||||
get_string_from_json_string_by_key_unescape(msg_data, "label1", mqtt_parm.msg_label1, sizeof(mqtt_parm.msg_label1));
|
||||
@ -2338,6 +2272,15 @@ int main(int argc, char *argv[])
|
||||
char syscmd[256]={0};
|
||||
|
||||
LOG_I("version:%s\n",softwareVersion);
|
||||
|
||||
FILE *fp = fopen("/userdata/tx_version", "w");
|
||||
if (fp) {
|
||||
fprintf(fp, "%s\n", softwareVersion);
|
||||
fclose(fp);
|
||||
} else {
|
||||
LOG_I("Failed to write /userdata/tx_version\n");
|
||||
}
|
||||
|
||||
#if 1
|
||||
system("insmod /system/lib/modules/wk2xxx_spi.ko");
|
||||
snprintf(syscmd, sizeof(syscmd), "ls Log.*|xargs rm -fr");
|
||||
@ -2496,6 +2439,16 @@ int main(int argc, char *argv[])
|
||||
pthread_detach(timeout_thread);
|
||||
}
|
||||
|
||||
// 创建3015合并点亮线程
|
||||
pthread_t pt_3015_merge;
|
||||
ret = pthread_create(&pt_3015_merge, NULL, thread_3015_lighton_merge, NULL);
|
||||
if (ret != 0) {
|
||||
LOG_I("pthread_create 3015_merge fail\n");
|
||||
} else {
|
||||
pthread_detach(pt_3015_merge);
|
||||
LOG_I("pthread_create 3015_merge success\n");
|
||||
}
|
||||
|
||||
ret = pthread_create(&pt_ota,NULL,thread_ota,NULL);
|
||||
if(ret!=0){
|
||||
LOG_I("pthread_create ota fail\n");
|
||||
@ -2618,3 +2571,71 @@ void *thread_timeout_check(void *arg) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// 合并点亮线程
|
||||
void *thread_3015_lighton_merge(void *arg) {
|
||||
while (1) {
|
||||
pthread_mutex_lock(&lightsn_buffer_mutex);
|
||||
if (is_3015_collecting) {
|
||||
time_t now = time(NULL);
|
||||
if ((now - first_3015_time >= 5) || (lightsn_buffer_count >= MAX_LIGHTSN_BUFFER)) {
|
||||
int i;
|
||||
lightsnNum = lightsn_buffer_count;
|
||||
for (i = 0; i < lightsn_buffer_count; i++) {
|
||||
switch(i) {
|
||||
case 0: memcpy(lightsn1, lightsn_buffer[i], 32); break;
|
||||
case 1: memcpy(lightsn2, lightsn_buffer[i], 32); break;
|
||||
case 2: memcpy(lightsn3, lightsn_buffer[i], 32); break;
|
||||
case 3: memcpy(lightsn4, lightsn_buffer[i], 32); break;
|
||||
case 4: memcpy(lightsn5, lightsn_buffer[i], 32); break;
|
||||
case 5: memcpy(lightsn6, lightsn_buffer[i], 32); break;
|
||||
case 6: memcpy(lightsn7, lightsn_buffer[i], 32); break;
|
||||
case 7: memcpy(lightsn8, lightsn_buffer[i], 32); break;
|
||||
case 8: memcpy(lightsn9, lightsn_buffer[i], 32); break;
|
||||
case 9: memcpy(lightsn10, lightsn_buffer[i], 32); break;
|
||||
case 10: memcpy(lightsn11, lightsn_buffer[i], 32); break;
|
||||
case 11: memcpy(lightsn12, lightsn_buffer[i], 32); break;
|
||||
case 12: memcpy(lightsn13, lightsn_buffer[i], 32); break;
|
||||
case 13: memcpy(lightsn14, lightsn_buffer[i], 32); break;
|
||||
case 14: memcpy(lightsn15, lightsn_buffer[i], 32); break;
|
||||
case 15: memcpy(lightsn16, lightsn_buffer[i], 32); break;
|
||||
case 16: memcpy(lightsn17, lightsn_buffer[i], 32); break;
|
||||
case 17: memcpy(lightsn18, lightsn_buffer[i], 32); break;
|
||||
case 18: memcpy(lightsn19, lightsn_buffer[i], 32); break;
|
||||
case 19: memcpy(lightsn20, lightsn_buffer[i], 32); break;
|
||||
case 20: memcpy(lightsn21, lightsn_buffer[i], 32); break;
|
||||
case 21: memcpy(lightsn22, lightsn_buffer[i], 32); break;
|
||||
case 22: memcpy(lightsn23, lightsn_buffer[i], 32); break;
|
||||
case 23: memcpy(lightsn24, lightsn_buffer[i], 32); break;
|
||||
case 24: memcpy(lightsn25, lightsn_buffer[i], 32); break;
|
||||
case 25: memcpy(lightsn26, lightsn_buffer[i], 32); break;
|
||||
case 26: memcpy(lightsn27, lightsn_buffer[i], 32); break;
|
||||
case 27: memcpy(lightsn28, lightsn_buffer[i], 32); break;
|
||||
case 28: memcpy(lightsn29, lightsn_buffer[i], 32); break;
|
||||
case 29: memcpy(lightsn30, lightsn_buffer[i], 32); break;
|
||||
}
|
||||
}
|
||||
|
||||
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处理完成
|
||||
// lightsn_buffer_count = 0;
|
||||
// memset(lightsn_buffer, 0, sizeof(lightsn_buffer));
|
||||
is_3015_collecting = false;
|
||||
first_3015_time = 0;
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&lightsn_buffer_mutex);
|
||||
usleep(100*1000);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@ -188,68 +188,7 @@ error:
|
||||
|
||||
int uart_data_send_head_lighton(uart_utils_t *uart,uint8_t wakeup_time,uint16_t tag_num){
|
||||
int ret = 0;
|
||||
uint8_t data_len=0;
|
||||
if(tag_num==1){
|
||||
data_len=14;
|
||||
}else if(tag_num==2){
|
||||
data_len=18;
|
||||
}else if(tag_num==3){
|
||||
data_len=22;
|
||||
}else if(tag_num==4){
|
||||
data_len=26;
|
||||
}else if(tag_num==5){
|
||||
data_len=30;
|
||||
}else if(tag_num==6){
|
||||
data_len=34;
|
||||
}else if(tag_num==7){
|
||||
data_len=38;
|
||||
}else if(tag_num==8){
|
||||
data_len=42;
|
||||
}else if(tag_num==9){
|
||||
data_len=46;
|
||||
}else if(tag_num==10){
|
||||
data_len=50;
|
||||
}else if(tag_num==11){
|
||||
data_len=54;
|
||||
}else if(tag_num==12){
|
||||
data_len=58;
|
||||
}else if(tag_num==13){
|
||||
data_len=62;
|
||||
}else if(tag_num==14){
|
||||
data_len=66;
|
||||
}else if(tag_num==15){
|
||||
data_len=70;
|
||||
}else if(tag_num==16){
|
||||
data_len=74;
|
||||
}else if(tag_num==17){
|
||||
data_len=78;
|
||||
}else if(tag_num==18){
|
||||
data_len=82;
|
||||
}else if(tag_num==19){
|
||||
data_len=86;
|
||||
}else if(tag_num==20){
|
||||
data_len=90;
|
||||
}else if(tag_num==21){
|
||||
data_len=94;
|
||||
}else if(tag_num==22){
|
||||
data_len=98;
|
||||
}else if(tag_num==23){
|
||||
data_len=102;
|
||||
}else if(tag_num==24){
|
||||
data_len=106;
|
||||
}else if(tag_num==25){
|
||||
data_len=110;
|
||||
}else if(tag_num==26){
|
||||
data_len=114;
|
||||
}else if(tag_num==27){
|
||||
data_len=118;
|
||||
}else if(tag_num==28){
|
||||
data_len=122;
|
||||
}else if(tag_num==29){
|
||||
data_len=126;
|
||||
}else if(tag_num==30){
|
||||
data_len=130;
|
||||
}
|
||||
uint8_t data_len = 8 + tag_num * 4 + 2;
|
||||
jt_head_package_t jt_head_package ={
|
||||
.pre=0x2323,//# 0x23 $ 0x24
|
||||
.wakeupTime=wakeup_time,//5s,<120s
|
||||
@ -774,7 +713,7 @@ int uart_data_send_lighton(uart_utils_t *uart,uint8_t ledctl,uint16_t flash_i,ui
|
||||
uint8_t light_d_h=(light_d>>8)&0xFF;
|
||||
uint8_t light_d_l=(light_d)&0xFF;
|
||||
|
||||
// 计算数据包长度:基础长度(8) + tag数量 * 4 + CRC(2)
|
||||
// 计算数据包长度:基础长度(7) + tag数量 * 4 + CRC(2)
|
||||
uint8_t data_len = 8 + tag_num * 4 + 2;
|
||||
uint8_t *buf = (uint8_t *)malloc(data_len);
|
||||
if (buf == NULL) {
|
||||
@ -786,7 +725,7 @@ int uart_data_send_lighton(uart_utils_t *uart,uint8_t ledctl,uint16_t flash_i,ui
|
||||
|
||||
// 填充基础数据
|
||||
buf[0] = 0x00; buf[1] = 0x00; // len1
|
||||
buf[2] = data_len - 2; // len2 (修改:减去2而不是3,因为len2不包含CRC)
|
||||
buf[2] = data_len - 3; // len2 (修改:减去3,因为len2不包含CRC和len1、len2本身)
|
||||
buf[3] = ledctl; // ledCtr
|
||||
buf[4] = flash_i_h; // flashInterval
|
||||
buf[5] = flash_i_l;
|
||||
@ -805,24 +744,29 @@ int uart_data_send_lighton(uart_utils_t *uart,uint8_t ledctl,uint16_t flash_i,ui
|
||||
buf[11 + i * 4] = tags[i] & 0xFF;
|
||||
}
|
||||
|
||||
// 计算CRC
|
||||
// 计算CRC - 计算除了CRC本身之外的所有数据
|
||||
uint16_t crc_c = CRC16_XMODEM(buf, data_len - 2);
|
||||
buf[data_len - 2] = (crc_c >> 8) & 0xFF;
|
||||
buf[data_len - 1] = crc_c & 0xFF;
|
||||
|
||||
// 打印调试信息
|
||||
for (int i = 0; i < data_len; i++) {
|
||||
printf("%02x ", buf[i]);
|
||||
// 打印CRC计算详情
|
||||
printf("[uart_data_send_lighton] CRC calculation: ");
|
||||
for (int i = 0; i < data_len - 2; ++i) {
|
||||
printf("%02X ", buf[i]);
|
||||
}
|
||||
DEBUG_TX("\r\n");
|
||||
DEBUG_TX("%s XModem_CRC16 = %04x\r\n", __func__, crc_c);
|
||||
printf(" -> CRC: %04X\n", crc_c);
|
||||
|
||||
// 打印发送数据内容
|
||||
printf("[uart_data_send_lighton] send: ");
|
||||
for (int i = 0; i < data_len; ++i) {
|
||||
printf("%02X ", buf[i]);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
// 发送数据
|
||||
if (data_len == write(uart->uart_fd, buf, data_len)) {
|
||||
ret = 0;
|
||||
} else {
|
||||
ret = -4;
|
||||
}
|
||||
int write_ret = write(uart->uart_fd, buf, data_len);
|
||||
LOG_I("[uart_data_send_lighton] write_ret=%d, data_len=%d", write_ret, data_len);
|
||||
if (write_ret == data_len) ret = 0; else ret = -4;
|
||||
free(buf);
|
||||
|
||||
DEBUG_TX("lightsnNum = %d\n", tag_num);
|
||||
@ -932,3 +876,105 @@ int uart_data_receive_data_back(uart_utils_t *uart,uint16_t *parmAck,uint32_t *t
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// 修正版:点亮灯带下行帧头,严格按协议示例
|
||||
int uart_data_send_head_lightband(uart_utils_t *uart, uint8_t wakeup_time, uint16_t tag_num) {
|
||||
int ret = 0;
|
||||
// 帧头中的len2 = tag_num * 9 + 5
|
||||
uint8_t data_len = tag_num * 9 + 5;
|
||||
jt_head_package_t jt_head_package = {
|
||||
.pre = 0x2323, // ##
|
||||
.wakeupTime = wakeup_time, // 5s,<120s
|
||||
.func = 'E', // 功能码E
|
||||
.len1 = 0x0000, // 固定为0
|
||||
.len2 = data_len, // tag_num*9+5
|
||||
.reserve = htons(0x0003),
|
||||
.lableNum = htons(tag_num),
|
||||
};
|
||||
|
||||
LOG_I("%s:HEAD:%04x,%02x,%02x,%04x,%02x,%04x,%04x\r\n", __func__,
|
||||
jt_head_package.pre, jt_head_package.wakeupTime, jt_head_package.func,
|
||||
jt_head_package.len1, jt_head_package.len2, jt_head_package.reserve, jt_head_package.lableNum);
|
||||
|
||||
if (uart == NULL) {
|
||||
LOG_I("uart NULL pointer\n");
|
||||
ret = -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (sizeof(jt_head_package) == write(uart->uart_fd, &jt_head_package, sizeof(jt_head_package))) {
|
||||
ret = 0;
|
||||
LOG_I("!!%s:HEAD:%04x,%02x,%02x,%04x,%02x,%04x,%04x\r\n", __func__,
|
||||
jt_head_package.pre, jt_head_package.wakeupTime, jt_head_package.func,
|
||||
jt_head_package.len1, jt_head_package.len2, jt_head_package.reserve, jt_head_package.lableNum);
|
||||
//LOG_I("%s success\n",__func__);
|
||||
} else {
|
||||
//LOG_I("%s fail\n", __func__);
|
||||
ret = -2;
|
||||
goto error;
|
||||
}
|
||||
error:
|
||||
return ret;
|
||||
}
|
||||
|
||||
// 修正版:点亮灯带下行数据,严格按协议示例
|
||||
int uart_data_send_lightband(uart_utils_t *uart, uint8_t ledctl, uint16_t flash_i, uint16_t light_d, uint32_t tags[], uint8_t tag_leds[], uint16_t tag_num) {
|
||||
int ret = 0;
|
||||
|
||||
// 检查tag数量限制
|
||||
if (tag_num > 30) {
|
||||
LOG_I("[uart_data_send_lightband] tag_num too large: %d, max 30\n", tag_num);
|
||||
return -4;
|
||||
}
|
||||
|
||||
// 数据包总长度: 3字节头 + tag_num * 9字节 + 2字节CRC
|
||||
int data_len = 3 + tag_num * 9 + 2;
|
||||
uint8_t *buf = malloc(data_len);
|
||||
if (!buf) return -2;
|
||||
memset(buf, 0, data_len);
|
||||
|
||||
buf[0] = 0x00; // len1
|
||||
buf[1] = 0x00; // len2
|
||||
buf[2] = tag_num * 9 + 2; // 数据区长度(含CRC)
|
||||
|
||||
// 填充tag数据 - 每个tag 9字节
|
||||
for (int i = 0; i < tag_num; ++i) {
|
||||
int base = 3 + i * 9;
|
||||
buf[base + 0] = (tags[i] >> 24) & 0xFF; // MAC高字节
|
||||
buf[base + 1] = (tags[i] >> 16) & 0xFF; // MAC次高字节
|
||||
buf[base + 2] = (tags[i] >> 8) & 0xFF; // MAC次低字节
|
||||
buf[base + 3] = tags[i] & 0xFF; // MAC低字节
|
||||
buf[base + 4] = tag_leds[i]; // LED控制
|
||||
buf[base + 5] = (flash_i >> 8) & 0xFF; // 闪烁间隔高字节
|
||||
buf[base + 6] = flash_i & 0xFF; // 闪烁间隔低字节
|
||||
buf[base + 7] = (light_d >> 8) & 0xFF; // 点灯时长高字节
|
||||
buf[base + 8] = light_d & 0xFF; // 点灯时长低字节
|
||||
}
|
||||
|
||||
// CRC16(XMODEM),不含最后2字节
|
||||
uint16_t crc = CRC16_XMODEM(buf, data_len - 2);
|
||||
buf[data_len - 2] = (crc >> 8) & 0xFF;
|
||||
buf[data_len - 1] = crc & 0xFF;
|
||||
|
||||
// 打印CRC计算详情
|
||||
printf("[uart_data_send_lightband] tag_num=%d, data_len=%d\n", tag_num, data_len);
|
||||
printf("[uart_data_send_lightband] CRC calculation: ");
|
||||
for (int i = 0; i < data_len - 2; ++i) {
|
||||
printf("%02X ", buf[i]);
|
||||
}
|
||||
printf(" -> CRC: %04X\n", crc);
|
||||
|
||||
// 打印发送数据内容
|
||||
printf("[uart_data_send_lightband] send: ");
|
||||
for (int i = 0; i < data_len; ++i) {
|
||||
printf("%02X ", buf[i]);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
if (uart == NULL) { free(buf); return -1; }
|
||||
int write_ret = write(uart->uart_fd, buf, data_len);
|
||||
LOG_I("[uart_data_send_lightband] write_ret=%d, data_len=%d", write_ret, data_len);
|
||||
if (write_ret == data_len) ret = 0; else ret = -3;
|
||||
free(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -329,4 +329,7 @@ int uart_data_send_ledota(uart_utils_t *uart,char *data,int size);
|
||||
int uart_data_send_head_apota(uart_utils_t *uart,uint32_t datalen,uint16_t packagenum);
|
||||
int uart_data_send_apota(uart_utils_t *uart,uint8_t dataori[],int datalen,uint16_t pnum,uint16_t datacrc);
|
||||
int uart_data_receive_version(uart_utils_t *uart);
|
||||
|
||||
int uart_data_send_head_lightband(uart_utils_t *uart, uint8_t wakeup_time, uint16_t tag_num);
|
||||
int uart_data_send_lightband(uart_utils_t *uart, uint8_t ledctl, uint16_t flash_i, uint16_t light_d, uint32_t tags[], uint8_t tag_leds[], uint16_t tag_num);
|
||||
#endif
|
||||
|
||||
Loading…
Reference in New Issue
Block a user