123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435 |
- /******************************************************************
- ** Copyright (c) 2009 Wuhan xiyun Technology Co., Ltd .
- ** FileName: handle.ack.c
- ** Author: chw
- ** Mail:
- ** Editor: chw
- ** Date: 2020-12-03 13:34
- ** Version: 2020-12-03
- ** File Description: 处理mqtt的消息确认 包含:1.控制类消息确认 2.配置类消息确认
- ** Param explain: char* mac : 网关MAC地址
- char* subMac :子节点MAC地址
- MQTTAsync_message *pubmsg : 消息结构体
- MYSQL *_db :数据库连接
- char *topicName : 消息主题
- ******************************************************************/
- //------ 控制指令确认 ------------------------------------------------------
- //远程开关控制确认
- int do_ACK_CTR_RSC(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
- //校验长度
- if(CheckMsgLength(topicName, pubmsg,20))
- return 1;
- char update_sql[256] = {0};
- char update_sql2[256] = {0};
- char mac[25] = {0}; //网关mac
- char subMac[13] = {0}; //节点mac
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- Hex2Str((const char*)(data+12),subMac,6);
-
- if(strcmp(subMac,"0F0000000001")==0)//网关
- {
- log("↑ 收到远程开关控制确认,网关:%s,类型:%d,动作:%d \n",mac,data[18],data[19]);
- sprintf(update_sql,"update dev_info_gateway set ack_switch = 1 where device_mac = '%s'",mac);
- //更新dev_status表网关开关状态
- sprintf(update_sql2,"update dev_status set current_on_off = %d,update_time = now() where device_mac = '%s'",data[19],mac);
- }
- else //节点
- {
- log("↑ 收到远程开关控制确认,网关:%s,节点:%s,节点类型:%d,动作:%d \n",mac,subMac,data[18],data[19]);
- sprintf(update_sql,"update dev_info_node set ack_switch = 1 where device_mac = '%s'",subMac);
- //更新dev_status表节点开关状态
- sprintf(update_sql2,"update dev_status set current_on_off = %d,update_time = now() where device_mac = '%s'",data[19],subMac);
- }
- excuteSql(_db,update_sql);
- excuteSql(_db,update_sql2);
-
- return 0;
- }
- //远程开关编组控制确认
- int do_ACK_CTR_RGC(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
- //校验长度
- if(CheckMsgLength(topicName, pubmsg,15))
- return 1;
- char update_sql[256] = {0};
- char update_sql2[256] = {0};
- char mac[25] = {0}; //网关mac
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- log("↑ 收到远程开关编组控制确认,网关:%s,组号:%d,类型:%d,动作:%d \n",mac,data[12],data[13],data[14]);
- //更新dev_status表节点开关状态
- sprintf(update_sql,"update dev_status set current_on_off = %d,update_time = now() where "
- "device_mac in(select device_mac from dev_info_node where gateway_mac = '%s' and device_group = %d)",data[14],mac,data[12]);
- sprintf(update_sql2,"update dev_info_gateway set ack_group_switch = 1 where device_mac = '%s'",mac);
- excuteSql(_db,update_sql);
- excuteSql(_db,update_sql2);
-
- return 0;
- }
- //------ 配置指令确认 ------------------------------------------------------
- //备份服务器配置确认
- int do_ACK_CFG_BKS(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
- //校验长度
- if(CheckMsgLength(topicName, pubmsg,18))
- return 1;
- char update_sql[512] = {0};
- char mac[25] = {0};
- char ip[4] = {0};
- int port = 0;
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- memcpy(ip,data+12,4);
-
- port = (data[16]<<16) + (data[17]<<24);
- log("↑ 收到备份服务器配置确认,网关:%s \n",mac);
- sprintf(update_sql,"update dev_info_gateway set ack_ip = 1 where device_mac = '%s'",
- mac);
- excuteSql(_db,update_sql);
- return 0;
- }
- //上传间隔配置确认
- int do_ACK_CFG_ULI(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
- //校验长度
- if(CheckMsgLength(topicName, pubmsg,14))
- return 1;
- char update_sql[512] = {0};
- char mac[25] = {0};
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- log("↑ 收到上传间隔配置确认,网关:%s,单位:%d,数值:%d \n",mac,data[12],data[13]);
- sprintf(update_sql,"update dev_info_gateway set ack_upload_interval = 1 where device_mac = '%s'",
- mac);
- excuteSql(_db,update_sql);
- return 0;
- }
- //开关时间段确认
- int do_ACK_CFG_STS(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
- //校验长度
- if(CheckMsgLength(topicName, pubmsg,23))
- return 1;
- char update_sql[512] = {0};
- char mac[25] = {0}; //网关mac
- char subMac[13] = {0}; //节点mac
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- Hex2Str((const char*)(data+12),subMac,6);
-
- if(strcmp(subMac,"0F0000000001")==0)//网关
- {
- log("↑ 收到开关时间段确认,网关:%s,类型:%d \n",mac,data[18]);
- sprintf(update_sql,"update dev_info_gateway set ack_switch_time = 1 where device_mac = '%s'",
- mac);
- }
- else //节点
- {
- log("↑ 收到开关时间段确认,网关:%s,节点:%s,节点类型:%d \n",mac,subMac,data[18]);
- sprintf(update_sql,"update dev_info_node set ack_switch_time = 1 where device_mac = '%s'",
- subMac);
- }
- excuteSql(_db,update_sql);
-
- return 0;
- }
- //额定电压设置确认
- int do_ACK_CFG_SRV(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
-
- //校验长度
- if(CheckMsgLength(topicName, pubmsg,21))
- return 1;
- char update_sql[512] = {0};
- char mac[25] = {0}; //网关mac
- char subMac[13] = {0}; //节点mac
- int rate_voltage = 0;
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- Hex2Str((const char*)(data+12),subMac,6);
- ((char*)&rate_voltage)[0] = data[20];
- ((char*)&rate_voltage)[1] = data[19];
- if(strcmp(subMac,"0F0000000001")==0)//网关
- {
- log("↑ 收到额定电压设置确认,网关:%s,类型:%d,阈值:%d \n",mac,data[18],rate_voltage);
- sprintf(update_sql,"update dev_info_gateway set ack_rated_voltage = 1 where device_mac = '%s'",mac);
- }
- else //节点
- {
- log("↑ 收到额定电压设置确认,网关:%s,节点:%s,节点类型:%d,阈值:%d \n",mac,subMac,data[18],rate_voltage);
- sprintf(update_sql,"update dev_info_node set ack_rated_voltage = 1 where device_mac = '%s'",subMac);
- }
- excuteSql(_db,update_sql);
-
- return 0;
- }
- //额定电流配置确认
- int do_ACK_CFG_SRC(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
- //校验长度
- if(CheckMsgLength(topicName, pubmsg,23))
- return 1;
- char update_sql[512] = {0};
- char mac[25] = {0}; //网关mac
- char subMac[13] = {0}; //节点mac
- int rate_current = 0;
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- Hex2Str((const char*)(data+12),subMac,6);
- ((char*)&rate_current)[0] = data[22];
- ((char*)&rate_current)[1] = data[21];
- ((char*)&rate_current)[2] = data[20];
- ((char*)&rate_current)[3] = data[19];
-
- if(strcmp(subMac,"0F0000000001")==0)//网关
- {
- log("↑ 收到额定电流设置确认,网关:%s,类型:%d,阈值:%d \n",mac,data[18],rate_current);
- sprintf(update_sql,"update dev_info_gateway set ack_rated_current = 1 where device_mac = '%s'",mac);
- }
- else //节点
- {
- log("↑ 收到额定电流设置确认,网关:%s,节点:%s,节点类型:%d,阈值:%d \n",mac,subMac,data[18],rate_current);
- sprintf(update_sql,"update dev_info_node set ack_rated_current = 1 where device_mac = '%s'",subMac);
- }
- excuteSql(_db,update_sql);
-
- return 0;
- }
- //开关控制模式确认
- int do_ACK_CFG_SCM(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
- //校验长度
- if(CheckMsgLength(topicName, pubmsg,20))
- return 1;
- char update_sql[512] = {0};
- char mac[25] = {0}; //网关mac
- char subMac[13] = {0}; //节点mac
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- Hex2Str((const char*)(data+12),subMac,6);
- if(strcmp(subMac,"0F0000000001")==0)//网关
- {
- log("↑ 收到开关控制模式设置确认,网关:%s,类型:%d,控制模式:%d \n",mac,data[18],data[19]);
- sprintf(update_sql,"update dev_info_gateway set ack_switch_mode = 1 where device_mac = '%s'",mac);
- }
- else //节点
- {
- log("↑ 收到开关控制模式设置确认,网关:%s,节点:%s,节点类型:%d,控制模式:%d \n",mac,subMac,data[18],data[19]);
- sprintf(update_sql,"update dev_info_node set ack_switch_mode = 1 where device_mac = '%s'",subMac);
- }
- excuteSql(_db,update_sql);
-
- return 0;
- }
- //传感器阈值配置确认
- int do_ACK_CFG_SAT(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- UNUSED(topicName);
- char update_sql[512] = {0};
- char mac[25] = {0};
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- log("↑ 收到传感器阈值配置确认,网关:%s \n",mac);
- sprintf(update_sql,"update dev_info_gateway set ack_sensor_threshold = 1 where device_mac = '%s'",
- mac);
- excuteSql(_db,update_sql);
- return 0;
- }
- //调光节点分组设置确认
- int do_ACK_CFG_DGS(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
- //校验长度
- if(CheckMsgLength(topicName, pubmsg,34))
- return 1;
- char update_sql[512] = {0};
- char mac[25] = {0}; //网关mac
- char subMac[13] = {0}; //节点mac
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- Hex2Str((const char*)(data+12),subMac,6);
- log("↑ 收到调光节点分组设置确认,网关:%s,节点mac:%s,组号:%d \n",mac,subMac,data[19]);
- sprintf(update_sql,"update dev_info_node set ack_group_set = 1 where device_mac = '%s'",subMac);
- excuteSql(_db,update_sql);
-
- return 0;
- }
- //子节点版本号回复
- int do_ACK_CFG_GNV(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
- //校验长度
- if(CheckMsgLength(topicName, pubmsg,23))
- return 1;
- char update_sql[512] = {0};
- char mac[25] = {0}; //网关mac
- char subMac[13] = {0}; //节点mac
- char node_version[10] = {0};
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- Hex2Str((const char*)(data+12),subMac,6);
- memcpy(node_version,data+18,5);
- log("↑ 收到子节点版本号回复,网关:%s,节点:%s,版本号:%s \n",mac,subMac,node_version);
- sprintf(update_sql,"update dev_info_node set device_version = '%s',version_update_time = now() where device_mac = '%s'",node_version,subMac);
- excuteSql(_db,update_sql);
-
- return 0;
- }
- //远程手动调光确认
- int do_ACK_CTR_RDC(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
- //校验长度
- if(CheckMsgLength(topicName, pubmsg,15))
- return 1;
- char update_sql[512] = {0};
- char mac[25] = {0}; //网关mac
- int group,luminuance,dimming_type;
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- group = data[12];
- luminuance = data[13];
- dimming_type = data[14];
- log("↑ 收到远程手动调光确认,网关:%s,组号:%d,亮度:%d,调光类型:%d \n",mac,group,luminuance,dimming_type);
- sprintf(update_sql,"update dev_dimming_group set current_brightness = %d,ack_group_dimming = 1 where gateway_mac = '%s' and device_group = %d",luminuance,mac,group);
- excuteSql(_db,update_sql);
-
- return 0;
- }
- //远程升级返回确认
- int do_ACK_OTA(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
- {
- //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
- //校验长度
- UNUSED(topicName);
-
- char update_sql[512] = {0};
- char mac[25] = {0}; //网关mac
- char error_code; //错误码 00:文件接收OK,FE:旧文件不对,01:文件长度不对,02:文件crc32值不对
- char app_name[256] = {0}; //本地当前APP 名称 只有在旧文件错误(FE)时,才有这部分
- int status = 0;
- char comment[256] = {0};
- unsigned char* data = pubmsg->payload;
- Hex2Str((const char*)data,mac,12);
- error_code = (char)data[12];
- status = (int)error_code;
- if(error_code == (char)0xFE)//旧文件不对
- {
- strcpy(app_name,(char*)data+13);
- sprintf(comment,"error_code:0xFE,app_name:%s",app_name);
- status = 3;
- }
- else if(error_code == (char)0x00)//文件接收OK
- {
- sprintf(comment,"error_code:0x00,文件接收ok");
- status = 2;
- }
- else if(error_code == (char)0x01)//文件长度不对
- {
- sprintf(comment,"error_code:0x01,文件长度不对");
- status = 3;
- }
- else if(error_code == (char)0x02)//文件crc32值不对
- {
- sprintf(comment,"error_code:0x02,文件crc32值不对");
- status = 3;
- }
- log("↑ 收到远程升级返回确认,网关:%s,状态or错误码:%02x,本地当前APP:%s \n",mac,error_code,app_name);
- sprintf(update_sql,"update dev_status_upgrade set status = %d,comment = '%s',update_time = now() where gateway_mac = '%s'",status,comment,mac);
- log(update_sql);
- excuteSql(_db,update_sql);
-
- return 0;
- }
|