Merge branch 'tuxi' into hebao

This commit is contained in:
zzh 2025-06-24 09:47:53 +08:00
commit 8da855cd53
3 changed files with 198 additions and 36 deletions

View File

@ -60,11 +60,13 @@ int debug_print(const char *__restrict format, ...)
va_end(valist);
printf("%s", buffer);
/*
char opTime[16]={0};
char logFileName[32]={0};
getDayStr(opTime,16);
sprintf(logFileName,"Log.%s",opTime);
buffer_to_file(logFileName,buffer,strlen(buffer),"a");
*/
return ret;
}
#endif

224
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.12";
char softwareVersion[16]="1.1.17";
char stationsn[16]="TJ251372224247";//TJ250995217957
char productid[8]="10045";
char appKey[32]="fdhQmhqhvbL1cf1K9mUqt";
@ -107,6 +107,12 @@ int searchTimeNew=0;
int lightsnNum=0;
int mqtt_port=1883;
static time_t last_2323_time = 0; // 记录上次收到0x2323的时间
static bool waiting_for_4646 = false; // 是否在等待0x4646
// 函数声明
void *thread_timeout_check(void *arg);
int getLedOtaVersion(char *filename);
int getApOtaVersion(char *filename,char *modename);
void hmacsha1(char *key,char* data,char *signbase64,int signbase64_len);
@ -367,24 +373,84 @@ void otaAp(){
}
}
void enableWatchDog(){
system("echo 1 > /sys/class/gpio/export");//watchdog enable pin SGM820
system("echo 112 > /sys/class/gpio/export");//feed watchdog pin 112
system("echo out > /sys/class/gpio/gpio1/direction");
system("echo out > /sys/class/gpio/gpio112/direction");
system("echo 1 > /sys/class/gpio/gpio1/value");
void enableWatchDog() {
int fd;
char path[64];
char value[2];
// Enable watchdog pin SGM820
fd = open("/sys/class/gpio/export", O_WRONLY);
if (fd < 0) {
LOG_I("Failed to open gpio export: %s\n", strerror(errno));
return;
}
write(fd, "1", 1);
close(fd);
// Enable feed watchdog pin
fd = open("/sys/class/gpio/export", O_WRONLY);
if (fd < 0) {
LOG_I("Failed to open gpio export: %s\n", strerror(errno));
return;
}
write(fd, "112", 3);
close(fd);
// Set gpio1 direction
fd = open("/sys/class/gpio/gpio1/direction", O_WRONLY);
if (fd < 0) {
LOG_I("Failed to open gpio1 direction: %s\n", strerror(errno));
return;
}
write(fd, "out", 3);
close(fd);
// Set gpio112 direction
fd = open("/sys/class/gpio/gpio112/direction", O_WRONLY);
if (fd < 0) {
LOG_I("Failed to open gpio112 direction: %s\n", strerror(errno));
return;
}
write(fd, "out", 3);
close(fd);
// Set gpio1 value
fd = open("/sys/class/gpio/gpio1/value", O_WRONLY);
if (fd < 0) {
LOG_I("Failed to open gpio1 value: %s\n", strerror(errno));
return;
}
write(fd, "1", 1);
close(fd);
LOG_I("enable watchdog\n");
system("echo 1 > /sys/class/gpio/gpio112/value");
// Set gpio112 value
fd = open("/sys/class/gpio/gpio112/value", O_WRONLY);
if (fd < 0) {
LOG_I("Failed to open gpio112 value: %s\n", strerror(errno));
return;
}
write(fd, "1", 1);
close(fd);
}
void feedWatchDog(){
while(1){
//LOG_I("feed watchdog\n");
system("echo 0 > /sys/class/gpio/gpio112/value");
void feedWatchDog() {
int fd = open("/sys/class/gpio/gpio112/value", O_WRONLY);
if (fd < 0) {
LOG_I("can not open watchdog gpio112\n");
return;
}
while(1) {
write(fd, "0", 1);
usleep(100*1000);
system("echo 1 > /sys/class/gpio/gpio112/value");
write(fd, "1", 1);
sleep(1);
}
close(fd);
return;
}
void rebootSystem(void){
@ -394,7 +460,6 @@ void rebootSystem(void){
time_t timep;
time (&timep);
result = localtime(&timep);
//printf("%d:%d:%d\n",result->tm_hour, result->tm_min, result->tm_sec);
if(result->tm_hour==0 && result->tm_min==0 && result->tm_sec==10){
isTimeToReboot=true;
LOG_I("prepare to reboot\n");
@ -402,7 +467,7 @@ void rebootSystem(void){
}
sleep(1);
}
system("sync");
system("reboot");
}
@ -655,7 +720,6 @@ int readQrcode()
ret = pthread_create(&pt_handleqrcode,NULL,actHandleQrcode,input_value_copy);
if(ret!=0){
LOG_I("pthread_create handleqrcode fail\n");
system("reboot");
}else{
pthread_detach(pt_handleqrcode);
}
@ -1305,11 +1369,15 @@ void *thread_uart_recv_ack(void *arg){
prctl(PR_SET_NAME, "uart_ack");
uint16_t parm_ack;
int ret=0;
while(1){
ret=uart_data_receive_ack(&uartSend,&parm_ack);
if(ret>0){
LOG_I("ack:%x\n",parm_ack);
if(parm_ack==0x2323){
// 记录收到0x2323的时间并设置等待0x4646标志
time(&last_2323_time);
waiting_for_4646 = true;
if(isLightOn){
char *flash=mqtt_parm.msg_flash;
char *light=mqtt_parm.msg_lightDuration;
@ -1464,8 +1532,12 @@ void *thread_uart_recv_ack(void *arg){
isLabelUp=false;
}
}else if(parm_ack==0x4646){
last_2323_time = 0; // 重置时间
waiting_for_4646 = false; // 重置等待状态
isSendComEnd=true;
}else if(parm_ack==0x4f4f){
last_2323_time = 0; // 重置时间
waiting_for_4646 = false; // 重置等待状态
isSendComEnd=true;
if(isOtaEnable){
otaCount++;
@ -1477,12 +1549,18 @@ void *thread_uart_recv_ack(void *arg){
}
}
}else if(parm_ack==0x5252){
last_2323_time = 0; // 重置时间
waiting_for_4646 = false; // 重置等待状态
uart_data_receive_version(&uartSend);
isSendComEnd=true;
isAPOtaSuccess=true;
}else if(parm_ack==0x5454){
last_2323_time = 0; // 重置时间
waiting_for_4646 = false; // 重置等待状态
isSendComEnd=true;
}else if(parm_ack==0x4848){
last_2323_time = 0; // 重置时间
waiting_for_4646 = false; // 重置等待状态
isAPBack=true;
}
}
@ -1781,8 +1859,7 @@ void *thread_mqtt_recv(void *arg){
system("reboot");
}else if(strcmp(mqtt_parm.msg_type,"1014")==0){
LOG_I("1014 update fw\n");
system("rm -fr ota");
system("mkdir ota");
isSendComEnd=false;
get_int_from_json_string_by_key(msg_data, "needWifi", &mqtt_parm.msg_needWifi);
LOG_I("needWifi:%d\n",mqtt_parm.msg_needWifi);
get_string_from_json_string_by_key_unescape(msg_data, "zipPath", mqtt_parm.msg_zipPath, sizeof(mqtt_parm.msg_zipPath));
@ -1797,14 +1874,16 @@ void *thread_mqtt_recv(void *arg){
LOG_I("version:%s\n",mqtt_parm.msg_version);
mqtt_service_reply(stationsn,mqtt_parm.msg_messageId,"ok",1,productid);
char otaCmd[256]={0};
sprintf(otaCmd,"curl -o /root/ota/tx_ota.zip %s",mqtt_parm.msg_zipPath);
sprintf(otaCmd,"curl -o /userdata/tx_ota.zip %s",mqtt_parm.msg_zipPath);
//sprintf(otaCmd,"curl -o /root/tx_server https://fscdn.zto.com/cloudm/iot-device-package/7d609af2165b4d14ae318f17659b2fbf.bin");
system(otaCmd);
sleep(15);
system("unzip ota/tx_ota.zip");
system("mv tx_ota/* ota");
system("rm -fr tx_ota");
system("mv ota/start.sh /root");
system("unzip /userdata/tx_ota.zip");
//system("mv ../tx_ota/* /userdata/ota");
//system("rm -fr /userdata/ota/tx_ota");
system("rm -fr /userdata/ota");
system("mv /userdata/tx_ota /userdata/ota");
system("mv /userdata/ota/ustart.sh /userdata");
system("sync");
sleep(1);
system("reboot");
@ -2255,21 +2334,68 @@ int main(int argc, char *argv[])
int getTimeCount=0;
char *readresult=NULL;
char networktype[32]={0};
pthread_t timeout_thread; // 添加超时检测线程变量
char syscmd[256]={0};
LOG_I("version:%s\n",softwareVersion);
#if 1
system("insmod /system/lib/modules/wk2xxx_spi.ko");
//system("busybox udhcpc -i eth0");
snprintf(syscmd, sizeof(syscmd), "ls Log.*|xargs rm -fr");
system(syscmd);
// 设置时区为 Asia/Shanghai直接修改 /etc/localtime 软链接
unlink("/etc/localtime");
symlink("/usr/share/zoneinfo/Asia/Shanghai", "/etc/localtime");
// 导出 GPIO 63
{
int fd = open("/sys/class/gpio/export", O_WRONLY);
if (fd >= 0) {
write(fd, "63", 2);
close(fd);
}
}
// 设置 GPIO 63 方向为 in
{
int fd = open("/sys/class/gpio/gpio63/direction", O_WRONLY);
if (fd >= 0) {
write(fd, "in", 2);
close(fd);
}
}
// 导出 GPIO 113
{
int fd = open("/sys/class/gpio/export", O_WRONLY);
if (fd >= 0) {
write(fd, "113", 3);
close(fd);
}
}
// 设置 GPIO 113 方向为 out
{
int fd = open("/sys/class/gpio/gpio113/direction", O_WRONLY);
if (fd >= 0) {
write(fd, "out", 3);
close(fd);
}
}
#endif
#if 0
system("insmod /system/lib/modules/wk2xxx_spi.ko");
system("busybox udhcpc -i eth0");
system("timedatectl set-timezone Asia/Shanghai");
system("echo 63 > /sys/class/gpio/export");//reset key
system("echo in > /sys/class/gpio/gpio63/direction");
system("echo 113 > /sys/class/gpio/export");//pin 113 yellow
system("echo out > /sys/class/gpio/gpio113/direction");
#endif
uart_open(&uartSend,"/dev/ttyS0");//GT U12 ttyS0,U14 ttyS4,U21 ttysWK0 U13 ttysWK1 U15 ttysWK2 U22 ttysWK3 U20 ttyS1
uart_init(&uartSend,115200,8,1,'N',0);
uart_open(&uartRecvData,"/dev/ttyS4");//DT
uart_init(&uartRecvData,115200,8,1,'N',0);
uart_open(&uartRecvBack,"/dev/ttysWK0");//HT
uart_init(&uartRecvBack,115200,8,1,'N',0);
#if 0
struct dma_config cfg = {
.buf = malloc(256),
@ -2286,25 +2412,25 @@ int main(int argc, char *argv[])
ret = pthread_create(&pt_watchdog,NULL,thread_feed_watchdog,NULL);
if(ret!=0){
LOG_I("pthread_create watchdog fail\n");
system("reboot");
}else{
LOG_I("pthread_create watchdog success\n");
pthread_detach(pt_watchdog);
}
#endif
#if 0
ret = pthread_create(&pt_reboot,NULL,thread_reboot,NULL);
if(ret!=0){
LOG_I("pthread_create reboot fail\n");
system("reboot");
}else{
LOG_I("pthread_create reboot success\n");
pthread_detach(pt_reboot);
}
#endif
ret = pthread_create(&pt_uart_recv_ack,NULL,thread_uart_recv_ack,NULL);
if(ret!=0){
LOG_I("pthread_create uart_recv_ack fail\n");
system("reboot");
}else{
pthread_detach(pt_uart_recv_ack);
LOG_I("pthread_create uart_recv_ack success\n");
@ -2313,7 +2439,6 @@ int main(int argc, char *argv[])
ret = pthread_create(&pt_uart_recv_data,NULL,thread_uart_recv_data,NULL);
if(ret!=0){
LOG_I("pthread_create uart_recv_data fail\n");
system("reboot");
}else{
pthread_detach(pt_uart_recv_data);
LOG_I("pthread_create uart_recv_data success\n");
@ -2322,7 +2447,6 @@ int main(int argc, char *argv[])
ret = pthread_create(&pt_uart_recv_back,NULL,thread_uart_recv_back,NULL);
if(ret!=0){
LOG_I("pthread_create uart_recv_back fail\n");
system("reboot");
}else{
pthread_detach(pt_uart_recv_back);
LOG_I("pthread_create uart_recv_back success\n");
@ -2331,7 +2455,6 @@ int main(int argc, char *argv[])
ret = pthread_create(&pt_mqtt_recv,NULL,thread_mqtt_recv,NULL);
if(ret!=0){
LOG_I("pthread_create mqtt_recv fail\n");
system("reboot");
}else{
pthread_detach(pt_mqtt_recv);
LOG_I("pthread_create mqtt_recv success\n");
@ -2340,7 +2463,6 @@ int main(int argc, char *argv[])
ret = pthread_create(&pt_tagsearch,NULL,thread_tag_search_send,NULL);
if(ret!=0){
LOG_I("pthread_create tag search send fail\n");
system("reboot");
}else{
LOG_I("pthread_create tag search success\n");
pthread_detach(pt_tagsearch);
@ -2349,12 +2471,12 @@ int main(int argc, char *argv[])
ret = pthread_create(&pt_removeduplicatetag,NULL,thread_remove_duplicate_tag,NULL);
if(ret!=0){
LOG_I("pthread_create remove duplicate tag send fail\n");
system("reboot");
}else{
LOG_I("pthread_create remove duplicate tag success\n");
pthread_detach(pt_removeduplicatetag);
}
#if 0
ret = pthread_create(&pt_removelog,NULL,thread_removelog,NULL);
if(ret!=0){
LOG_I("pthread_create removelog fail\n");
@ -2363,11 +2485,20 @@ int main(int argc, char *argv[])
LOG_I("pthread_create removelog success\n");
pthread_detach(pt_removelog);
}
#endif
// 创建超时检测线程
ret = pthread_create(&timeout_thread, NULL, thread_timeout_check, NULL);
if(ret!=0){
LOG_I("pthread_create timeout_check fail\n");
}else{
LOG_I("pthread_create timeout_check success\n");
pthread_detach(timeout_thread);
}
ret = pthread_create(&pt_ota,NULL,thread_ota,NULL);
if(ret!=0){
LOG_I("pthread_create ota fail\n");
system("reboot");
}else{
LOG_I("pthread_create ota success\n");
pthread_detach(pt_ota);
@ -2376,7 +2507,6 @@ int main(int argc, char *argv[])
ret = pthread_create(&pt_doota,NULL,thread_do_ota,NULL);
if(ret!=0){
LOG_I("pthread_create doota fail\n");
system("reboot");
}else{
LOG_I("pthread_create doota success\n");
pthread_detach(pt_doota);
@ -2439,7 +2569,6 @@ int main(int argc, char *argv[])
ret = pthread_create(&pt_mqtt,NULL,thread_mqtt,NULL);
if(ret!=0){
LOG_I("pthread_create mqtt fail\n");
system("reboot");
}else{
pthread_detach(pt_mqtt);
LOG_I("pthread_create mqtt success\n");
@ -2461,6 +2590,31 @@ int main(int argc, char *argv[])
}
}
#endif
return 0;
}
// 超时检测线程
void *thread_timeout_check(void *arg) {
prctl(PR_SET_NAME, "timeout_check");
while(1) {
if(last_2323_time != 0 && waiting_for_4646) { // 只有在等待0x4646时才检查超时
time_t current_time;
time(&current_time);
if(difftime(current_time, last_2323_time) >= 10.0) { // 超过10秒
LOG_I("thread_timeout_check: Timeout after receiving 0x2323, no 0x4646 received, setting isSendComEnd to 1\n");
isSendComEnd = 1;
last_2323_time = 0; // 重置时间
waiting_for_4646 = false; // 重置等待状态
isLightEnable = 1; // 重置点亮使能标志
isLightOn = false; // 重置点亮状态
isLightOnByRule = false; // 重置规则点亮状态
isLabelUp = false; // 重置标签更新状态
}
}
usleep(100*1000); // 每100ms检查一次
}
return NULL;
}

View File

@ -192,7 +192,13 @@ json_error:
}
void mqtt_net_failure(int *failure_times){
system("echo 0 > /sys/class/gpio/gpio113/value");
int fd = open("/sys/class/gpio/gpio113/value", O_WRONLY);
if (fd < 0) {
LOG_I("Failed to open gpio113 value: %s\n", strerror(errno));
} else {
write(fd, "0", 1);
close(fd);
}
if(failure_times != NULL){
(*failure_times)++;
LOG_I("mqtt net failure_times = %d\n", *failure_times);