COAPHandle-1hour.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  1. #define BC26 //定义引入得通讯模块 BC26 | ESP8266
  2. #include "coap.h"
  3. #include <string.h>
  4. #include "mbedtls_util.h"
  5. #include "COAPHandle.h"
  6. #include "module_wrapper.h"
  7. #include "TypeDefine.h"
  8. #include "SystemAlarm.h"
  9. #include "sys.h"
  10. #include "crc.h"
  11. #include "DrawLCDGUI.h"
  12. #include "ProgramData.h"
  13. #include "cJSON.h"
  14. #ifdef BC26
  15. #include "bc26.h"
  16. #elif defined(ESP8266)
  17. #include "esp8266.h"
  18. #endif
  19. void endpoint_setup(void)
  20. {
  21. }
  22. coap_endpoint_t endpoints[1]= {0};
  23. #define BUF_SIZE 1024
  24. static uint8_t buf[BUF_SIZE];
  25. extern uint8 tcp_connect_status;
  26. extern valid_data_t valid_data;
  27. static char iv[17] = "543yhjy97ae7fyfg";
  28. static const char *coap_con_path="auth";
  29. static const uint8_t coap_content_json = COAP_CONTENTTYPE_APPLICATION_JSON;
  30. static char* sign_format = "clientId%s.%sdeviceName%sproductKey%sseq%d";
  31. static char* payload_format="{\"clientId\":\"%s.%s\",\"signmethod\":\"%s\",\"sign\":\"%s\",\"productKey\":\"%s\",\"deviceName\":\"%s\",\"seq\":%d}";
  32. static auth_token_t auth_token =
  33. {
  34. .flag = AUTH_FAILURE,
  35. };
  36. coap_packet_t coap_send_pkt = //coap发送包
  37. {
  38. .hdr.ver=0x01,
  39. .hdr.t=COAP_TYPE_CON,
  40. .hdr.tkl=0,
  41. .hdr.code=COAP_METHOD_POST,
  42. .numopts=0,
  43. };
  44. coap_packet_t coap_rec_pkt = {0}; //coap接受包
  45. #define PAYLOAD_DATA_LEN 44 //数据包
  46. static uint8_t pumpData[PAYLOAD_DATA_LEN]; //包数据
  47. extern uint8_t StartToRun_flag; //当按下运行按键的时候,置位该标志
  48. extern char mqtt_publish_topic[100]; //发布主题
  49. extern uint8_t Alarm_flag; //报警状态
  50. extern uint8_t Start_send ; //开始发送标志,0:发送
  51. extern uint16_t send_cont; //数据发送次数
  52. static uint16_t send_num = 0;
  53. static uint8_t repeat_send_count = 0;//重发次数
  54. static uint16_t pre_send_num = 0;
  55. uint8_t repeat_send_switch = 0; //0关闭重发,1开启重发
  56. static int firstSendFlag = 1;
  57. static int moduleInitCou = 0; //模块连续初始化次数
  58. static uint8_t pumpState = 0; //运行状态标志
  59. static uint16_t pumpAlarm = 0; //报警标志
  60. static uint8_t pumpPreAlarm = 0; //预报标志
  61. static uint8_t pumpStateLast = 0; //上次运行状态标志
  62. static uint16_t pumpAlarmLast = 0; //上次报警标志
  63. static uint8_t pumpPreAlarmLast = 0; //上次预报标志
  64. static void setValue(uint8_t **p,void* data,int len)
  65. {
  66. memcpy(*p,data,len);
  67. *p+=len;
  68. }
  69. static void generateCoapKey(void)
  70. {
  71. int i = 0;
  72. char out[80]={0};
  73. char sign_content[100]={0};
  74. if(auth_token.flag == AUTH_SUCCESS)
  75. {
  76. snprintf(sign_content, sizeof(sign_content), "%s,%s",registInfo->deviceSecret,auth_token.random);
  77. utils_sha256(sign_content, strlen(sign_content), out);
  78. memset(auth_token.key,0,sizeof(auth_token.key));
  79. memcpy(auth_token.key,out+8,16); //获取key
  80. }
  81. }
  82. /**
  83. * @Title 封装数据并通过mqtt发送
  84. */
  85. static void packPumbDataCoapSend(void)
  86. {
  87. int i = 0;
  88. //if(mqtt_status.ping_status != MQTT_SUCCESS) return; //外调该接口时,做网络判断
  89. if(send_num < 0 )
  90. {
  91. send_num = 0;
  92. }
  93. send_num++;
  94. send_cont = send_num;
  95. uint8_t *ptr =pumpData;
  96. unsigned short crc = 0;
  97. if(tcp_connect_status != TCP_OPEN)
  98. {
  99. return;
  100. }
  101. memset(pumpData,0,sizeof(pumpData));
  102. *ptr++ = 0xEF; //[0] 固定值
  103. *ptr++ = PAYLOAD_DATA_LEN-2; //[1]数据长度
  104. *ptr++ = 0x15; //[2]泵类型,网络泵
  105. setValue(&ptr,classification,4);//[3-6]分类标识
  106. setValue(&ptr,&send_num,sizeof(send_num));//[7-8]数据编号
  107. *ptr++=8; //[9]住院号长度
  108. setValue(&ptr,&verifyInfo.hospitalNO,8); //[10-17]住院号
  109. setValue(&ptr,&verifyInfo.sickroom,2); //[18-19]病区
  110. setValue(&ptr,&verifyInfo.bedNO,2); //[20-21]床号
  111. setValue(&ptr,&setParamInfo.totalDose,2); //[22-23]总量
  112. setValue(&ptr,&setParamInfo.limitDose1,2); //[24-25]极限零
  113. setValue(&ptr,&setParamInfo.superaddition1,2); //[26-27] 追加量
  114. setValue(&ptr,&setParamInfo.lockTime1,2); //[28-29] 锁时时间
  115. setValue(&ptr,&setParamInfo.continueDose1,2); //[30,31]持续量
  116. setValue(&ptr,&realTimeData.inputDose,2); //[32-33]已输入量
  117. *ptr++ = (uint8_t)(setParamInfo.firstDose & 0x00ff); //[34]首次量
  118. *ptr++ = (uint8_t)( realTimeData.validCount & 0x00ff ); //[35]有效次数
  119. *ptr++ = (uint8_t)( realTimeData.invalidCount & 0x00ff );//[36]无效次数
  120. if( realTimeData.batteryVolt > 100 )//[37]电池电量,发送电量百分比
  121. {
  122. *ptr++ = 100;
  123. }
  124. else
  125. {
  126. *ptr++ = realTimeData.batteryVolt;
  127. }
  128. switch( realTimeData.stateRun ) //[38]泵运行状态
  129. {
  130. case FirstRun:
  131. case MainRun:
  132. case Airout:
  133. case PCARun:
  134. pumpData[38] = 0x02;//运行状态 0000 0010
  135. break;
  136. case Pause:
  137. pumpData[38] = 0x04;//暂停状态 0000 0100
  138. break;
  139. case Poweroff:
  140. pumpData[38] = 0x00;//关机状态 0000 0000
  141. break;
  142. case Poweron:
  143. pumpData[38] = 0x01;//开机状态 0000 0001
  144. break;
  145. default:
  146. pumpData[38] = 0x08;//待机状态 0000 1000,
  147. break;
  148. }
  149. ptr++;
  150. if( sysAlarmFlag.BubbleFault == ALARM_ON )
  151. {
  152. pumpData[39] |= 0x01;//气泡或无液故障 0000 0001
  153. }
  154. if( sysAlarmFlag.JamFault == ALARM_ON )
  155. {
  156. pumpData[39] |= 0x02;//堵塞故障 0000 0010
  157. }
  158. if( sysAlarmFlag.InputTotal == ALARM_ON )
  159. {
  160. pumpData[39] |= 0x04;//输入总量报警 0000 0100
  161. }
  162. if( sysAlarmFlag.MaxFault == ALARM_ON )
  163. {
  164. pumpData[39] |= 0x08;//极限量报警 0000 1000
  165. }
  166. if( sysAlarmFlag.VoltLowest == ALARM_ON )//电量耗尽
  167. {
  168. pumpData[39] |= 0x10;// 0001 0000
  169. }
  170. if( sysAlarmFlag.InputEnd == ALARM_ON )//输液结束
  171. {
  172. pumpData[39] |= 0x20;// 0010 0000
  173. }
  174. if( sysAlarmFlag.MotorFalt == ALARM_ON )//电机失控
  175. {
  176. pumpData[39] |= 0x40;// 0100 0000
  177. }
  178. if( (sysAlarmFlag.MechanicalFault == ALARM_ON ) || ( sysAlarmFlag.MechanicalFault == ALARM_CONTINUE ) )//机械故障
  179. {
  180. pumpData[39] |= 0x80;// 1000 0010;
  181. }
  182. ptr++;
  183. if( sysAlarmFlag.NonePillCase == ALARM_ON )
  184. {
  185. pumpData[40] |= 0x01;//未装药盒报警 0000 0001
  186. }
  187. ptr++;
  188. if( sysAlarmFlag.InputEnding == ALARM_ON )
  189. {
  190. pumpData[41] |= 0x01;//输液将要结束 0000 0001
  191. }
  192. if( sysAlarmFlag.Zhentongxiaoguo == ALARM_ON )
  193. {
  194. pumpData[41] |= 0x02;//阵痛不足预报 0000 0010
  195. }
  196. if( sysAlarmFlag.VoltLowest == ALARM_PREPARE )
  197. {
  198. pumpData[41] |= 0x04;//电量偏低预报 0000 0100
  199. }
  200. ptr++;
  201. crc = CRC16_CCITT((unsigned char*)pumpData, sizeof(pumpData)-2);
  202. setValue(&ptr,&crc,2); //[42-43]CRC
  203. UsartPrintf(USART_DEBUG,"发布数据包:%d\r\n",sizeof(pumpData));
  204. for(i = 0;i<sizeof(pumpData);i++)
  205. {
  206. UsartPrintf(USART_DEBUG,"%02x",pumpData[i]);
  207. }
  208. UsartPrintf(USART_DEBUG,"\r\n");
  209. CoapPublish(pumpData,sizeof(pumpData));
  210. }
  211. //将泵状态报警信息封装在一起
  212. static void IntePumpStateCoap()
  213. {
  214. switch( realTimeData.stateRun ) //[38]泵运行状态
  215. {
  216. case FirstRun:
  217. case MainRun:
  218. case Airout:
  219. case PCARun:
  220. pumpState = 0x02;//运行状态 0000 0010
  221. break;
  222. case Pause:
  223. pumpState = 0x04;//暂停状态 0000 0100
  224. break;
  225. case Poweroff:
  226. pumpState = 0x00;//关机状态 0000 0000
  227. break;
  228. case Poweron:
  229. pumpState = 0x01;//开机状态 0000 0001
  230. break;
  231. default:
  232. pumpState = 0x08;//待机状态 0000 1000,
  233. break;
  234. }
  235. if( sysAlarmFlag.BubbleFault == ALARM_ON )
  236. {
  237. pumpAlarm |= 0x0001;//气泡或无液故障 0000 0001
  238. }
  239. if( sysAlarmFlag.JamFault == ALARM_ON )
  240. {
  241. pumpAlarm |= 0x0002;//堵塞故障 0000 0010
  242. }
  243. if( sysAlarmFlag.InputTotal == ALARM_ON )
  244. {
  245. pumpAlarm |= 0x0004;//输入总量报警 0000 0100
  246. }
  247. if( sysAlarmFlag.MaxFault == ALARM_ON )
  248. {
  249. pumpAlarm |= 0x0008;//极限量报警 0000 1000
  250. }
  251. if( sysAlarmFlag.VoltLowest == ALARM_ON )//电量耗尽
  252. {
  253. pumpAlarm |= 0x0010;// 0001 0000
  254. }
  255. if( sysAlarmFlag.InputEnd == ALARM_ON )//输液结束
  256. {
  257. pumpAlarm |= 0x0020;// 0010 0000
  258. }
  259. if( sysAlarmFlag.MotorFalt == ALARM_ON )//电机失控
  260. {
  261. pumpAlarm |= 0x0040;// 0100 0000
  262. }
  263. if( (sysAlarmFlag.MechanicalFault == ALARM_ON ) || ( sysAlarmFlag.MechanicalFault == ALARM_CONTINUE ) )//机械故障
  264. {
  265. pumpAlarm |= 0x0080;// 1000 0010;
  266. }
  267. if( sysAlarmFlag.NonePillCase == ALARM_ON )
  268. {
  269. pumpAlarm |= 0x0100;//未装药盒报警 0000 0001
  270. }
  271. if( sysAlarmFlag.InputEnding == ALARM_ON )
  272. {
  273. pumpPreAlarm |= 0x01;//输液将要结束 0000 0001
  274. }
  275. if( sysAlarmFlag.Zhentongxiaoguo == ALARM_ON )
  276. {
  277. pumpPreAlarm |= 0x02;//阵痛不足预报 0000 0010
  278. }
  279. if( sysAlarmFlag.VoltLowest == ALARM_PREPARE )
  280. {
  281. pumpPreAlarm |= 0x04;//电量偏低预报 0000 0100
  282. }
  283. }
  284. static void DecideSendFlagCoap()
  285. {
  286. static int addition_active=0;// 报警发送激活
  287. static int first_dose_active = 0;// 首次量结束发送激活
  288. //开始
  289. if(firstSendFlag ==1 && StartToRun_flag == 1)
  290. {
  291. firstSendFlag = 0;
  292. TaskSchedulerFlag.MqttSendFlag = TASK_FLAG_SET;
  293. //UsartPrintf(USART_DEBUG, "====firstSendFlag=====\r\n");
  294. }else if(StartToRun_flag == 0)
  295. {
  296. firstSendFlag = 1;
  297. }
  298. //泵状态发生改变
  299. if(pumpState != pumpStateLast || pumpAlarm != pumpAlarmLast || pumpPreAlarm != pumpPreAlarmLast)
  300. {
  301. // UsartPrintf(USART_DEBUG, "====state change:%d,%d,%d,%d,%d,%d\r\n",pumpState,pumpStateLast,pumpAlarm,pumpAlarmLast,pumpPreAlarm,pumpPreAlarmLast);
  302. pumpStateLast = pumpState;
  303. pumpAlarmLast = pumpAlarm;
  304. pumpPreAlarmLast = pumpPreAlarm;
  305. TaskSchedulerFlag.MqttSendFlag = TASK_FLAG_SET;
  306. if(module_init_status == MODULE_FAIL && moduleInitCou == 0)
  307. {
  308. TaskSchedulerFlag.ModuleInitFlag = TASK_FLAG_SET;
  309. }
  310. }
  311. //首次量结束发送数据
  312. if(realTimeData.firstDose == 0)
  313. {
  314. if(first_dose_active == 1)
  315. {
  316. first_dose_active = 0;
  317. TaskSchedulerFlag.MqttSendFlag = TASK_FLAG_SET;
  318. //UsartPrintf(USART_DEBUG, "====firstDose=====\r\n");
  319. }
  320. }
  321. else if(realTimeData.firstDose > 0)
  322. {
  323. first_dose_active = 1;
  324. }
  325. //追加量结束发送数据
  326. if(realTimeData.superaddition == 0)
  327. {
  328. if(addition_active == 1)
  329. {
  330. addition_active = 0;
  331. TaskSchedulerFlag.MqttSendFlag = TASK_FLAG_SET;
  332. //UsartPrintf(USART_DEBUG, "====superaddition====\r\n");
  333. }
  334. }
  335. else if(realTimeData.superaddition > 0)
  336. {
  337. addition_active = 1;
  338. }
  339. }
  340. void CoapConnect(void)
  341. {
  342. static uint32 seq = 1;
  343. int buf_len = 0;
  344. char sign_content[100]={0};
  345. char out[50]={0};
  346. char payload_content[512];
  347. int i=0;
  348. uint16_t coap_port = my_atoi(registInfo->port);//端口
  349. auth_token.flag = AUTH_HANDLING;
  350. coap_send_pkt.hdr.id[0]=AUTH_MID;
  351. coap_send_pkt.hdr.id[1]=0;
  352. coap_send_pkt.numopts=5;
  353. coap_send_pkt.opts[0].num=COAP_OPTION_URI_HOST;
  354. coap_send_pkt.opts[0].buf.len=strlen(registInfo->address);
  355. coap_send_pkt.opts[0].buf.p=(uint8_t*)registInfo->address;
  356. coap_send_pkt.opts[1].num=COAP_OPTION_URI_PORT;
  357. coap_send_pkt.opts[1].buf.len=sizeof(coap_port);
  358. coap_send_pkt.opts[1].buf.p=(uint8_t*)&coap_port;
  359. coap_send_pkt.opts[2].num=COAP_OPTION_URI_PATH;
  360. coap_send_pkt.opts[2].buf.len=strlen(coap_con_path);
  361. coap_send_pkt.opts[2].buf.p=(uint8_t*)coap_con_path;
  362. coap_send_pkt.opts[3].num=COAP_OPTION_CONTENT_FORMAT,
  363. coap_send_pkt.opts[3].buf.len=sizeof(coap_content_json),
  364. coap_send_pkt.opts[3].buf.p=&coap_content_json,
  365. coap_send_pkt.opts[4].num=COAP_OPTION_ACCEPT,
  366. coap_send_pkt.opts[4].buf.len=sizeof(coap_content_json),
  367. coap_send_pkt.opts[4].buf.p=&coap_content_json,
  368. seq++;
  369. snprintf(sign_content, sizeof(sign_content), sign_format,registInfo->productKey,registInfo->deviceName,registInfo->deviceName,registInfo->productKey,seq);
  370. utils_hmac_sha1_str(sign_content, strlen(sign_content), out, registInfo->deviceSecret, strlen(registInfo->deviceSecret));
  371. UsartPrintf(USART_DEBUG,"sign_content:%s,sign:%s\r\n",sign_content,out);
  372. snprintf(payload_content, sizeof(payload_content), payload_format,registInfo->productKey,registInfo->deviceName,"hmacsha1",out,registInfo->productKey,registInfo->deviceName,seq);
  373. coap_send_pkt.payload.len=strlen(payload_content);
  374. coap_send_pkt.payload.p=(uint8_t*)payload_content;
  375. UsartPrintf(USART_DEBUG,"auth_payload:%s\r\n",payload_content);
  376. memset(buf,0,BUF_SIZE);
  377. buf_len = BUF_SIZE;
  378. coap_build(buf,&buf_len,&coap_send_pkt);
  379. // UsartPrintf(USART_DEBUG,"\r\nauth byte,%d:\r\n",buf_len);
  380. // for(i=0;i<buf_len;i++)
  381. // {
  382. // UsartPrintf(USART_DEBUG,"%02x",buf[i]);
  383. // }
  384. at_module_send_rai(buf,buf_len,ONE_RRC);
  385. }
  386. void CoapPublish(uint8_t* payload,int len)
  387. {
  388. int buf_len = 0;
  389. char seq_conent[20] = {0};
  390. uint8_t seq[8] = {0};
  391. char paybyte[100] = {0};
  392. char *topic[] = {"topic","sys",registInfo->productKey, registInfo->deviceName,"thing","model","up_raw"};
  393. int topic_len = sizeof(topic)/sizeof(topic[0]);
  394. int optnum = 0;
  395. int i=0;
  396. uint16_t coap_port = my_atoi(registInfo->port);
  397. coap_send_pkt.hdr.id[0]=(uint8_t)(send_num&0x00ff);
  398. coap_send_pkt.hdr.id[1]=(uint8_t)(send_num>>8);
  399. coap_send_pkt.numopts=6+topic_len;
  400. coap_send_pkt.opts[optnum].num=COAP_OPTION_URI_HOST;
  401. coap_send_pkt.opts[optnum].buf.len=strlen(registInfo->address);
  402. coap_send_pkt.opts[optnum++].buf.p=(uint8_t*)registInfo->address;
  403. coap_send_pkt.opts[optnum].num=COAP_OPTION_URI_PORT;
  404. coap_send_pkt.opts[optnum].buf.len=sizeof(coap_port);
  405. coap_send_pkt.opts[optnum++].buf.p=(uint8_t*)&coap_port;
  406. for(i=0;i<topic_len;i++)
  407. {
  408. coap_send_pkt.opts[optnum].num=COAP_OPTION_URI_PATH;
  409. coap_send_pkt.opts[optnum].buf.len=strlen(topic[i]);
  410. coap_send_pkt.opts[optnum++].buf.p=(uint8_t*)topic[i];
  411. }
  412. coap_send_pkt.opts[optnum].num=COAP_OPTION_CONTENT_FORMAT,
  413. coap_send_pkt.opts[optnum].buf.len=sizeof(coap_content_json),
  414. coap_send_pkt.opts[optnum++].buf.p=&coap_content_json,
  415. coap_send_pkt.opts[optnum].num=COAP_OPTION_ACCEPT,
  416. coap_send_pkt.opts[optnum].buf.len=sizeof(coap_content_json),
  417. coap_send_pkt.opts[optnum++].buf.p=&coap_content_json,
  418. auth_token.seqOffset++;
  419. //UsartPrintf(USART_DEBUG,"===发送数据认证: %d,%s,%s:\r\n",auth_token.seqOffset,auth_token.random,auth_token.token);
  420. my_itoa(auth_token.seqOffset,(char*)seq,10);
  421. int seqlen = utils_aes128_cbc_enc((char*)auth_token.key, iv, (char*)seq, seq_conent);
  422. coap_send_pkt.opts[optnum].num=2088;
  423. coap_send_pkt.opts[optnum].buf.len=strlen(auth_token.token);
  424. coap_send_pkt.opts[optnum++].buf.p=(uint8_t*)auth_token.token;
  425. coap_send_pkt.opts[optnum].num=2089;
  426. coap_send_pkt.opts[optnum].buf.len=seqlen;
  427. coap_send_pkt.opts[optnum++].buf.p=(uint8_t*)seq_conent;
  428. int paylen = utils_aes128_cbc_base64_enc((char*)auth_token.key, iv, payload,len, paybyte);
  429. //UsartPrintf(USART_DEBUG,"===发送数据paylen: %d\r\n",paylen);
  430. coap_send_pkt.payload.len=paylen;
  431. coap_send_pkt.payload.p=(uint8_t*)paybyte;
  432. memset(buf,0,BUF_SIZE);
  433. buf_len = BUF_SIZE;
  434. coap_build(buf,&buf_len,&coap_send_pkt);
  435. // UsartPrintf(USART_DEBUG,"\r\npush byte,%d:\r\n",buf_len);
  436. // for(i=0;i<buf_len;i++)
  437. // {
  438. // UsartPrintf(USART_DEBUG,"%02x",buf[i]);
  439. // }
  440. // UsartPrintf(USART_DEBUG,"\r\n");
  441. at_module_send_rai(buf,buf_len,ONE_RRC);
  442. }
  443. static void ModuleKeepOnLine(void)
  444. {
  445. if(module_start_status == MODULE_OK && module_init_status == MODULE_OK)
  446. {
  447. if(moduleInitCou > 0) // 连接基站成功
  448. {
  449. moduleInitCou = 0;
  450. if(repeat_send_switch)//有数据发送, 重设重发时间
  451. {
  452. at_module_udpreopen(registInfo->address,registInfo->port);
  453. TaskSchedulerTimer.MQTTReSendTimer = FIVE_SECOND_TIMER;
  454. TaskSchedulerFlag.MqttReSendFlag = TASK_FLAG_CLEAR;
  455. }
  456. }
  457. TaskSchedulerFlag.NET_ONLINE_FLAG = TASK_FLAG_SET;//模块联网
  458. if(auth_token.flag == AUTH_FAILURE)
  459. {
  460. if(tcp_connect_status == TCP_OPEN)
  461. {
  462. UsartPrintf(USART_DEBUG, "===CoapConnect=====\r\n");
  463. CoapConnect(); //coap认证
  464. }
  465. else
  466. {
  467. if(tcp_connect_status == TCP_CLOSED)
  468. {
  469. UsartPrintf(USART_DEBUG, "===udp open=====\r\n");
  470. at_module_udpreopen(registInfo->address,registInfo->port);
  471. }
  472. }
  473. }
  474. if(repeat_send_switch)
  475. {
  476. if(TaskSchedulerFlag.MqttReSendFlag == TASK_FLAG_SET)
  477. {
  478. TaskSchedulerFlag.MqttReSendFlag = TASK_FLAG_CLEAR;
  479. repeat_send_count++;
  480. if(repeat_send_count == 2)
  481. {
  482. at_module_udpreopen(registInfo->address,registInfo->port);
  483. return;
  484. }
  485. if(repeat_send_count == 4)
  486. {
  487. repeat_send_switch = 0; //关闭重发
  488. repeat_send_count = 0;
  489. module_start_status = MODULE_FAIL; //模块再次启动
  490. module_init_status = MODULE_FAIL;
  491. tcp_connect_status = TCP_CLOSED;
  492. return;
  493. }
  494. UsartPrintf(USART_DEBUG, "\r\n===repeat send:%d=====\r\n",repeat_send_count);
  495. send_num--;
  496. packPumbDataCoapSend();//重新发送
  497. }
  498. }
  499. }
  500. else
  501. {
  502. TaskSchedulerFlag.NET_ONLINE_FLAG = TASK_FLAG_CLEAR;//模块未联网
  503. if(TaskSchedulerFlag.ModuleInitFlag == TASK_FLAG_SET)
  504. {
  505. TaskSchedulerFlag.ModuleInitFlag = TASK_FLAG_CLEAR;
  506. TaskSchedulerTimer.ModuleInitTimer = FIFTEEN_SECOND_TIMER;
  507. moduleInitCou++;
  508. UsartPrintf(USART_DEBUG, "===start module=====%d\r\n",moduleInitCou);
  509. if(moduleInitCou >= 2 && module_start_status == MODULE_FAIL)
  510. {
  511. moduleInitCou = 0;
  512. TaskSchedulerTimer.ModuleInitTimer = ONE_HOUR_TIMER;//连续5次启动失败,启动间隔变为半小时
  513. at_module_low_power();//低功耗
  514. repeat_send_switch = 0; //关闭重发
  515. repeat_send_count = 0;
  516. return;
  517. }
  518. if(module_start_status == MODULE_FAIL)
  519. {
  520. UsartPrintf(USART_DEBUG, "===restart module=====\r\n");
  521. at_module_start();
  522. }
  523. else if(module_init_status == MODULE_FAIL)
  524. {
  525. UsartPrintf(USART_DEBUG, "===init module=====\r\n");
  526. at_module_init();
  527. }
  528. }
  529. }
  530. }
  531. /**
  532. * 处理认证信息
  533. */
  534. static void AuthHandle(void)
  535. {
  536. cJSON *json = NULL,*json_seqOffset=NULL,*json_random=NULL,*json_token = NULL;
  537. json = cJSON_Parse((char*)coap_rec_pkt.payload.p);
  538. if(!json)
  539. {
  540. UsartPrintf(USART_DEBUG, "json parse error,%s\r\n",cJSON_GetErrorPtr());
  541. goto end;
  542. }
  543. json_seqOffset = cJSON_GetObjectItem(json,"seqOffset");
  544. json_random = cJSON_GetObjectItem(json,"random");
  545. json_token = cJSON_GetObjectItem(json,"token");
  546. if(json_random && json_token)
  547. {
  548. memset(&auth_token,0,sizeof(auth_token));
  549. if(json_seqOffset)
  550. {
  551. UsartPrintf(USART_DEBUG, "==认证成功=====%d,%s,%s\r\n",json_seqOffset->valueint,json_random->valuestring,json_token->valuestring);
  552. auth_token.seqOffset = json_seqOffset->valueint;
  553. }
  554. else
  555. {
  556. UsartPrintf(USART_DEBUG, "==认证成功=====%s,%s\r\n",json_random->valuestring,json_token->valuestring);
  557. auth_token.seqOffset = 100;
  558. }
  559. auth_token.flag = AUTH_SUCCESS;
  560. memcpy(auth_token.random,json_random->valuestring,strlen(json_random->valuestring));
  561. memcpy(auth_token.token,json_token->valuestring,strlen(json_token->valuestring));
  562. generateCoapKey();
  563. }
  564. else
  565. {
  566. UsartPrintf(USART_DEBUG, "==认证失败=====\r\n");
  567. // auth_token.flag = AUTH_FAILURE;
  568. }
  569. end:
  570. cJSON_Delete(json);
  571. }
  572. /**
  573. * 处理Coap返回消息
  574. */
  575. static void HandleCoapValidData()
  576. {
  577. int i = 0;
  578. uint16_t back_send_num = 0;
  579. int ret = coap_parse(&coap_rec_pkt, (uint8_t*)valid_data.buf, valid_data.len);
  580. UsartPrintf(USART_DEBUG, "coap back,%d:\r\n",valid_data.len);
  581. for(i=0;i<valid_data.len;i++)
  582. {
  583. UsartPrintf(USART_DEBUG, "%02x",valid_data.buf[i]);
  584. }
  585. if(ret)
  586. {
  587. UsartPrintf(USART_DEBUG, "\r\n==解析失败,%d=====\r\n",ret);
  588. }
  589. else
  590. {
  591. //UsartPrintf(USART_DEBUG, "\r\n==解析成功====\r\n");
  592. if(coap_rec_pkt.hdr.code == SUC_ACK_CODE)
  593. {
  594. back_send_num = (uint16_t)coap_rec_pkt.hdr.id[1]<<8;
  595. back_send_num |= coap_rec_pkt.hdr.id[0];
  596. if(auth_token.flag != AUTH_SUCCESS && back_send_num == AUTH_MID) //认证返回
  597. {
  598. AuthHandle();
  599. }
  600. else if(back_send_num == send_num ) //上传返回
  601. {
  602. repeat_send_switch = 0; //收到最新回复关闭重发
  603. }
  604. }
  605. else if(coap_rec_pkt.hdr.code == UNAUTH_ACK_CODE)
  606. {
  607. UsartPrintf(USART_DEBUG, "\r\n==未授权的请求=====\r\n");
  608. auth_token.flag = AUTH_FAILURE;
  609. }
  610. }
  611. valid_data_clear(); //清除有效数据
  612. }
  613. void CoapHandleEvent(void)
  614. {
  615. at_module_handle_event();
  616. if(valid_data.len>0)
  617. {
  618. HandleCoapValidData();
  619. }
  620. }
  621. //发送泵数据
  622. static void SendCoapPumpData()
  623. {
  624. IntePumpStateCoap();
  625. DecideSendFlagCoap();
  626. if(TaskSchedulerFlag.MqttSendFlag == TASK_FLAG_SET && motorWorkState != MOTOR_WORK_ON)
  627. {
  628. TaskSchedulerFlag.MqttSendFlag = TASK_FLAG_CLEAR;
  629. TaskSchedulerTimer.MQTTSendTimer = TWENTY_MINUTE_TIMER;
  630. if(EngineeringModeValue.test == 0)
  631. {
  632. TaskSchedulerTimer.MQTTSendTimer = TWENTY_SECOND_TIMER;
  633. }
  634. repeat_send_switch = 1;//准备重发
  635. repeat_send_count = 0;
  636. packPumbDataCoapSend();
  637. TaskSchedulerTimer.MQTTReSendTimer = FIVE_SECOND_TIMER;
  638. TaskSchedulerFlag.MqttReSendFlag = TASK_FLAG_CLEAR;
  639. }
  640. }
  641. void CoapHandle(void)
  642. {
  643. ModuleKeepOnLine(); //保持网络连接
  644. CoapHandleEvent(); //处理接收数据
  645. if(Start_send == 0)
  646. {
  647. SendCoapPumpData(); //发送数据
  648. }
  649. if(realTimeData.stateRun == Poweroff)
  650. {
  651. delay_ms(500);
  652. TaskSchedulerFlag.sysPowerOffFlag = TASK_FLAG_SET;//关机
  653. }
  654. }
  655. void ModelRegister(void)
  656. {
  657. GPIO_InitTypeDef GPIO_InitStruct;
  658. /* enable clock */
  659. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  660. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  661. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
  662. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  663. //GPIO_InitStruct.Pull = GPIO_NOPULL;
  664. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  665. GPIO_Init(GPIOA, &GPIO_InitStruct);
  666. // GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
  667. // GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  668. // //GPIO_InitStruct.Pull = GPIO_NOPULL;
  669. // GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  670. // GPIO_Init(GPIOC, &GPIO_InitStruct);
  671. // BC26_WAKE_LOW();
  672. #ifdef BC26
  673. bc26_sal_register();
  674. #elif defined(ESP8266)
  675. esp8266_sal_register();
  676. #endif
  677. }
  678. /**
  679. * 模块信号强度,为负值
  680. */
  681. int16_t GetModeldBm(void)
  682. {
  683. uint8_t data[50]={0};
  684. uint16 dBm = 0;
  685. #ifdef BC26
  686. const char *SIGN = "+CSQ: ";
  687. char *signStr = NULL;
  688. at_module_cmd_back("AT+CSQ\r\n",(char*)data,sizeof(data));
  689. signStr = strstr((const char*)data,SIGN);
  690. if(signStr)
  691. {
  692. signStr+=strlen(SIGN);
  693. dBm = my_atoi(signStr);
  694. }
  695. if(dBm >= 2 && dBm <= 30)
  696. {
  697. dBm = 109-((dBm-2)*3); //简略换算
  698. }
  699. else
  700. {
  701. switch(dBm)
  702. {
  703. case 0: dBm = 113; break;
  704. case 1: dBm = 111; break;
  705. case 31: dBm = 51; break;
  706. default: dBm = 0;
  707. }
  708. }
  709. #elif defined(ESP8266)
  710. #endif
  711. return dBm;
  712. }