handle.request.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. /******************************************************************
  2. ** Copyright (c) 2009 Wuhan xiyun Technology Co., Ltd .
  3. ** FileName: handle.request.c
  4. ** Author: chw
  5. ** Mail:
  6. ** Editor: chw
  7. ** Date: 2020-12-03 13:34
  8. ** Version: 2020-12-03
  9. ** File Description: 处理mqtt的设备配置请求
  10. ** Param explain: char* mac : 网关MAC地址
  11. char* subMac :子节点MAC地址
  12. MQTTAsync_message *pubmsg : 消息结构体
  13. MYSQL *_db :数据库连接
  14. char *topicName : 消息主题
  15. ******************************************************************/
  16. //备份服务器配置请求
  17. int do_SCR_BKS(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  18. {
  19. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  20. //校验长度
  21. if(CheckMsgLength(topicName, pubmsg,12))
  22. return 1;
  23. unsigned char* data = pubmsg->payload;
  24. char mac[25] = {0}; //网关mac
  25. Hex2Str((const char*)data,mac,12);
  26. log("↑ 收到备份服务器配置请求,网关:%s \n",mac);
  27. SendBakIP(mac , _db);
  28. return 0;
  29. }
  30. //节点信息表配置请求
  31. int do_SCR_NAT(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  32. {
  33. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  34. //校验长度
  35. if(CheckMsgLength(topicName, pubmsg,12))
  36. return 1;
  37. unsigned char* data = pubmsg->payload;
  38. char mac[25] = {0}; //网关mac
  39. Hex2Str((const char*)data,mac,12);
  40. log("↑ 收到节点信息表配置请求,网关:%s \n",mac);
  41. SendSubInfo(mac , _db);
  42. return 0;
  43. }
  44. //额定电压配置请求
  45. int do_SCR_SRV(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  46. {
  47. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  48. //校验长度
  49. if(CheckMsgLength(topicName, pubmsg,18))
  50. return 1;
  51. unsigned char* data = pubmsg->payload;
  52. char mac[25] = {0}; //网关mac
  53. char subMac[13] = {0}; //子节点
  54. Hex2Str((const char*)data,mac,12);
  55. Hex2Str((const char*)(data+12),subMac,6);
  56. if(strcmp(subMac,"0F0000000001") == 0)
  57. {
  58. log("↑ 收到额定电压配置请求,网关:%s \n",mac);
  59. SendRatedVoltage(mac,"",_db);
  60. }
  61. else
  62. {
  63. log("↑ 收到额定电压配置请求,网关:%s,节点:%s \n",mac,subMac);
  64. SendRatedVoltage(mac,subMac,_db);
  65. }
  66. return 0;
  67. }
  68. //额定电流配置请求
  69. int do_SCR_SRC(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  70. {
  71. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  72. //校验长度
  73. if(CheckMsgLength(topicName, pubmsg,18))
  74. return 1;
  75. unsigned char* data = pubmsg->payload;
  76. char mac[25] = {0}; //网关mac
  77. char subMac[13] = {0}; //子节点
  78. Hex2Str((const char*)data,mac,12);
  79. Hex2Str((const char*)(data+12),subMac,6);
  80. if(strcmp(subMac,"0F0000000001") == 0)
  81. {
  82. log("↑ 收到额定电流配置请求,网关:%s \n",mac);
  83. SendRatedCurrent(mac,"",_db);
  84. }
  85. else
  86. {
  87. log("↑ 收到额定电流配置请求,网关:%s,节点:%s \n",mac,subMac);
  88. SendRatedCurrent(mac,subMac,_db);
  89. }
  90. return 0;
  91. }
  92. //开关时间段配置请求
  93. int do_SCR_STS(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  94. {
  95. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  96. //校验长度
  97. if(CheckMsgLength(topicName, pubmsg,18))
  98. return 1;
  99. unsigned char* data = pubmsg->payload;
  100. char mac[25] = {0}; //网关mac
  101. char subMac[13] = {0}; //子节点
  102. Hex2Str((const char*)data,mac,12);
  103. Hex2Str((const char*)(data+12),subMac,6);
  104. if(strcmp(subMac,"0F0000000001") == 0)
  105. {
  106. log("↑ 收到开关时间段配置请求,网关:%s \n",mac);
  107. SendOnOffTimeMuilt(mac,"",_db);
  108. }
  109. else
  110. {
  111. log("↑ 收到开关时间段配置请求,网关:%s,节点:%s \n",mac,subMac);
  112. SendOnOffTimeMuilt(mac,subMac,_db);
  113. }
  114. return 0;
  115. }
  116. //开关控制模式请求
  117. int do_SCR_SCM(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  118. {
  119. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  120. //校验长度
  121. if(CheckMsgLength(topicName, pubmsg,18))
  122. return 1;
  123. unsigned char* data = pubmsg->payload;
  124. char mac[25] = {0}; //网关mac
  125. char subMac[13] = {0}; //子节点
  126. Hex2Str((const char*)data,mac,12);
  127. Hex2Str((const char*)(data+12),subMac,6);
  128. if(strcmp(subMac,"0F0000000001") == 0)
  129. {
  130. log("↑ 收到开关控制模式请求,网关:%s \n",mac);
  131. SendSwitchModeFromDB(mac,"",_db);
  132. }
  133. else
  134. {
  135. log("↑ 收到开关控制模式请求,网关:%s,节点:%s \n",mac,subMac);
  136. SendSwitchModeFromDB(mac,subMac,_db);
  137. }
  138. return 0;
  139. }
  140. //传感器阈值配置请求
  141. int do_SCR_SAT(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  142. {
  143. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  144. //校验长度
  145. if(CheckMsgLength(topicName, pubmsg,12))
  146. return 1;
  147. unsigned char* data = pubmsg->payload;
  148. char mac[25] = {0}; //网关mac
  149. Hex2Str((const char*)data,mac,12);
  150. log("↑ 收到传感器阈值配置请求,网关:%s \n",mac);
  151. SendSensorThreshold(mac , _db);
  152. return 0;
  153. }
  154. //服务器时间同步请求
  155. int do_SCR_NTP(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  156. {
  157. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  158. UNUSED(_db);
  159. //校验长度
  160. if(CheckMsgLength(topicName, pubmsg,12))
  161. return 1;
  162. unsigned char* data = pubmsg->payload;
  163. char mac[25] = {0}; //网关mac
  164. Hex2Str((const char*)data,mac,12);
  165. log("↑ 收到服务器时间同步请求,网关:%s \n",mac);
  166. //发送时间同步
  167. usleep(1000);
  168. SendNTP(mac);
  169. return 0;
  170. }
  171. //OTA数据请求
  172. int do_SCR_OTA(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  173. {
  174. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  175. UNUSED(topicName);
  176. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  177. char updateSql[1024] = {0};
  178. char buf[2048] = {0};
  179. char topicName2[256];
  180. char filename[256] = {0}; //升级文件
  181. unsigned int number = 0; //请求的包序号
  182. int offset = 0;//偏移数
  183. float rate_progress = 0.0;
  184. int upgrade_status = 0;//当前升级状态0:未开始 1:正在升级 2:完成 3:出现错误
  185. char2short sequence_number;
  186. unsigned char* data = pubmsg->payload;
  187. char mac[25] = {0}; //网关mac
  188. Hex2Str((const char*)data,mac,12);
  189. //log("↑ 收到ota升级请求,网关:%s \n",mac);
  190. sprintf(topicName2,"PP/%s/DS/OTA",mac);
  191. //查询升级文件名
  192. GetUpgradeFileFromDB(mac,_db,filename);
  193. if(strlen(filename)<=0)
  194. {
  195. log("↑ 收到ota升级请求,网关:%s,升级文件名为空! \n",mac);
  196. return 1;
  197. }
  198. //确认加载了升级文件
  199. //UpgradeFileAddFromDB(file_list,filename,);
  200. //取升级文件ota_info
  201. ota_info* info = GetOtaInfoByFileName(file_list,filename);
  202. if(info == NULL)
  203. {
  204. log("↑ 收到ota升级请求,网关:%s,升级文件名:%s,ota_info为空! \n",mac,filename);
  205. return 1;
  206. }
  207. //请求ota_info数据
  208. if(data[12] == 0x00 && data[13] == 0x80)
  209. {
  210. buf[2] = info->ota_mode;
  211. memcpy(buf+3,info->old_file_name,48);//旧文件名
  212. buf[51] = ((char*)&info->old_file_len)[0];//旧文件长度
  213. buf[52] = ((char*)&info->old_file_len)[1];
  214. buf[53] = ((char*)&info->old_file_len)[2];
  215. buf[54] = ((char*)&info->old_file_len)[3];
  216. buf[55] = ((char*)&info->old_file_crc)[0];//旧文件crc32校验值
  217. buf[56] = ((char*)&info->old_file_crc)[1];
  218. buf[57] = ((char*)&info->old_file_crc)[2];
  219. buf[58] = ((char*)&info->old_file_crc)[3];
  220. memcpy(buf+59,info->new_file_name,48);//新文件名
  221. buf[107] = ((char*)&info->new_file_len)[0];//新文件长度
  222. buf[108] = ((char*)&info->new_file_len)[1];
  223. buf[109] = ((char*)&info->new_file_len)[2];
  224. buf[110] = ((char*)&info->new_file_len)[3];
  225. buf[111] = ((char*)&info->new_file_crc)[0];//新文件crc32校验值
  226. buf[112] = ((char*)&info->new_file_crc)[1];
  227. buf[113] = ((char*)&info->new_file_crc)[2];
  228. buf[114] = ((char*)&info->new_file_crc)[3];
  229. buf[115] = info->ota_state;
  230. buf[116] = ((char*)&info->ota_file_len)[0];//ota 文件的长度
  231. buf[117] = ((char*)&info->ota_file_len)[1];
  232. buf[118] = ((char*)&info->ota_file_len)[2];
  233. buf[119] = ((char*)&info->ota_file_len)[3];
  234. buf[120] = ((char*)&info->ota_file_crc)[0];//ota文件 crc32校验值
  235. buf[121] = ((char*)&info->ota_file_crc)[1];
  236. buf[122] = ((char*)&info->ota_file_crc)[2];
  237. buf[123] = ((char*)&info->ota_file_crc)[3];
  238. buf[124] = ((char*)&info->ota_file_total_packets)[0];//ota文件的总的包数
  239. buf[125] = ((char*)&info->ota_file_total_packets)[1];
  240. buf[126] = ((char*)&info->ota_file_packet_len)[0];//ota文件每包的数据长度
  241. buf[127] = ((char*)&info->ota_file_packet_len)[1];
  242. sendData.payloadlen = 128;
  243. log(" 请求ota升级包信息头,文件名:%s,网关:%s,payloadlen:%d,请求包序号:0x0080 \n",filename,mac,sendData.payloadlen);
  244. }
  245. //请求ota升级包
  246. else
  247. {
  248. memcpy(sequence_number.c_char,data+12,2);
  249. number = sequence_number.i_short;
  250. sequence_number.i_short +=1;
  251. EndianSwap((unsigned char*)sequence_number.c_char,0,2);
  252. //序号
  253. memcpy(buf,sequence_number.c_char,2);
  254. log("请求的升级包序号:%02x %02x -->:%d\n",data[12],data[13],number);
  255. if((number+1)>info->ota_file_total_packets)
  256. {
  257. log("请求的升级包序号太大:%02x %02x ,-->:%d\n",data[12],data[13],number);
  258. return -1;
  259. }
  260. //升级包
  261. offset = number*info->ota_file_packet_len;
  262. //非最后一包
  263. if((number+1) != info->ota_file_total_packets)
  264. {
  265. memcpy(buf+2,info->buf+offset,info->ota_file_packet_len);
  266. sendData.payloadlen = info->ota_file_packet_len+2;
  267. }
  268. //最后一包
  269. else
  270. {
  271. int len = info->ota_file_len % info->ota_file_packet_len;
  272. memcpy(buf+2,info->buf+offset,len);
  273. sendData.payloadlen = len+2;
  274. }
  275. log(" 请求ota包序号:%d,文件名:%s,网关:%s,发送包序号:%d,payloadlen:%d \n",number,filename,mac,number+1,sendData.payloadlen);
  276. }
  277. //填充报文
  278. sendData.payload = buf;
  279. sendData.qos = 0;
  280. sendData.retained = 0;
  281. //发送
  282. int ret = my_mqqta_sendmsg(topicName2, &sendData);
  283. //SendSensorThreshold(mac , _db);
  284. //更新数据库
  285. upgrade_status = 1;
  286. rate_progress = ((float)(number+1)/(float)info->ota_file_total_packets)*100.0;
  287. sprintf(updateSql,"update dev_status_upgrade set status = %d,rate_progress = %.2f,current_request_number = %d,update_time = now() where "
  288. " gateway_mac = '%s'",upgrade_status,rate_progress,number,mac);
  289. excuteSql(_db,updateSql);
  290. return ret;
  291. }