使用独立控制灯条来实现合包功能,客户端启动时增加版本号保存方便排查

This commit is contained in:
zzh 2025-07-01 13:41:53 +08:00
parent 8da855cd53
commit d36a67e979
3 changed files with 337 additions and 267 deletions

405
main.c
View File

@ -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转MACHEX字符串转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;
}

View File

@ -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; // 点灯时长低字节
}
// CRC16XMODEM不含最后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;
}

View File

@ -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