onenet.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. #include "main.h"
  2. //#include "stm32f10x.h"
  3. //#include "esp8266.h"
  4. //#include "onenet.h"
  5. //#include "mqttkit.h"
  6. //#include "usart.h"
  7. //#include "delay.h"
  8. //#include <string.h>
  9. //#include <stdio.h>
  10. #define PROID "509223" // 产品ID
  11. #define AUTH_INFO "0123456789" // 鉴权信息
  12. #define DEVID "932442653" // 设备ID
  13. /**
  14. * @brief 与onenet创建连接
  15. * @param None
  16. * @retval 1-成功 0-失败
  17. * @note 与onenet平台建立连接
  18. */
  19. _Bool OneNet_DevLink(void)
  20. {
  21. MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; // 协议包
  22. unsigned char *dataPtr;
  23. _Bool status = 1;
  24. #ifdef DEBUG_printf
  25. printf("OneNet_DevLink\n""PROID: %s, AUIF: %s, DEVID:%s\n", PROID, AUTH_INFO, DEVID);
  26. #endif
  27. if(MQTT_PacketConnect(PROID, AUTH_INFO, DEVID, 256, 0, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0)
  28. {
  29. ESP8266_SendData(mqttPacket._data, mqttPacket._len); // 上传平台
  30. dataPtr = ESP8266_GetIPD(250); // 等待平台响应
  31. if(dataPtr != NULL)
  32. {
  33. if(MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK)
  34. {
  35. switch(MQTT_UnPacketConnectAck(dataPtr))
  36. {
  37. case 0:
  38. status = 0;
  39. #ifdef DEBUG_printf
  40. printf("Tips: 连接成功\n");
  41. #endif
  42. break;
  43. case 1:
  44. #ifdef DEBUG_printf
  45. printf("WARN: 连接失败:协议错误\n");
  46. #endif
  47. break;
  48. case 2:
  49. #ifdef DEBUG_printf
  50. printf("WARN: 连接失败:非法的clientid\n");
  51. #endif
  52. break;
  53. case 3:
  54. #ifdef DEBUG_printf
  55. printf("WARN: 连接失败:服务器失败\n");
  56. #endif
  57. break;
  58. case 4:
  59. #ifdef DEBUG_printf
  60. printf("WARN: 连接失败:用户名或密码错误\n");
  61. #endif
  62. break;
  63. case 5:
  64. #ifdef DEBUG_printf
  65. printf("WARN: 连接失败:非法链接(比如token非法)\n");
  66. #endif
  67. break;
  68. default:
  69. #ifdef DEBUG_printf
  70. printf("ERR: 连接失败:未知错误\n");
  71. #endif
  72. break;
  73. }
  74. }
  75. }
  76. MQTT_DeleteBuffer(&mqttPacket); // 删包
  77. }
  78. else
  79. {
  80. #ifdef DEBUG_printf
  81. printf("WARN: MQTT_PacketConnect Failed\n");
  82. #endif
  83. }
  84. return status;
  85. }
  86. /**
  87. * @brief 填充上传数据
  88. * @param buf:数据
  89. * @retval 数据长度
  90. * @note 键值对格式逗号分隔 例如 {key1:99,key2:0}
  91. */
  92. unsigned char OneNet_FillBuf(char *buf)
  93. {
  94. char text[128];
  95. memset(text, 0, sizeof(text));
  96. strcpy(buf, "{");
  97. /****************user handle********************/
  98. memset(text, 0, sizeof(text));
  99. sprintf(text, "\"temp\":%d,", AllFlag.waterTemp);
  100. strcat(buf, text);
  101. memset(text, 0, sizeof(text));
  102. sprintf(text, "\"RELAY1\":%d,",AllFlag.relay1_sta);
  103. strcat(buf, text);
  104. memset(text, 0, sizeof(text));
  105. sprintf(text, "\"RELAY2\":%d,",AllFlag.relay2_sta);
  106. strcat(buf, text);
  107. memset(text, 0, sizeof(text));
  108. sprintf(text, "\"tempMax\":%d,",AllFlag.waterTempMax);
  109. strcat(buf, text);
  110. memset(text, 0, sizeof(text));
  111. sprintf(text, "\"tempMin\":%d",AllFlag.waterTempMin);
  112. strcat(buf, text);
  113. /**********************************************/
  114. strcat(buf, "}");
  115. return strlen(buf);
  116. }
  117. /**
  118. * @brief 上传数据到OneNET平台
  119. * @param None
  120. * @retval None
  121. */
  122. void OneNet_SendData(void)
  123. {
  124. MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; // 协议包
  125. char buf[128];
  126. short body_len = 0, i = 0;
  127. #ifdef DEBUG_printf
  128. printf("Tips: OneNet_SendData-MQTT\r\n");
  129. #endif
  130. memset(buf, 0, sizeof(buf));
  131. body_len = OneNet_FillBuf(buf); // 获取当前需要发送的数据流的总长度
  132. if(body_len)
  133. {
  134. if(MQTT_PacketSaveData(DEVID, body_len, NULL, 3, &mqttPacket) == 0) // 封包
  135. {
  136. for(; i < body_len; i++) mqttPacket._data[mqttPacket._len++] = buf[i];
  137. ESP8266_SendData(mqttPacket._data, mqttPacket._len); // 上传数据到平台
  138. #ifdef DEBUG_printf
  139. printf("Send %d Bytes\r\n", mqttPacket._len);
  140. #endif
  141. MQTT_DeleteBuffer(&mqttPacket); // 删包
  142. }
  143. else
  144. {
  145. #ifdef DEBUG_printf
  146. printf("WARN: EDP_NewBuffer Failed\r\n");
  147. #endif
  148. }
  149. }
  150. }
  151. /**
  152. * @brief 平台返回数据检测
  153. * @param cmd:平台返回的数据
  154. * @retval None
  155. */
  156. void OneNet_RevPro(unsigned char *cmd)
  157. {
  158. MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; // 协议包
  159. char *req_payload = NULL;
  160. char *cmdid_topic = NULL;
  161. unsigned short req_len = 0;
  162. unsigned char type = 0;
  163. short result = 0;
  164. char *dataPtr = NULL;
  165. char numBuf[10];
  166. int num = 0;
  167. type = MQTT_UnPacketRecv(cmd);
  168. switch(type)
  169. {
  170. case MQTT_PKT_CMD: // 命令下发
  171. result = MQTT_UnPacketCmd(cmd, &cmdid_topic, &req_payload, &req_len); // 解出topic和消息体
  172. if(result == 0)
  173. {
  174. #ifdef DEBUG_printf
  175. printf("cmdid: %s, req: %s, req_len: %d\r\n", cmdid_topic, req_payload, req_len);
  176. #endif
  177. if(MQTT_PacketCmdResp(cmdid_topic, req_payload, &mqttPacket) == 0) // 命令回复组包
  178. {
  179. #ifdef DEBUG_printf
  180. printf("Tips: Send CmdResp\r\n");
  181. #endif
  182. ESP8266_SendData(mqttPacket._data, mqttPacket._len); // 回复命令
  183. MQTT_DeleteBuffer(&mqttPacket); // 删包
  184. }
  185. }
  186. break;
  187. case MQTT_PKT_PUBACK: //发送Publish消息,平台回复的Ack
  188. if(MQTT_UnPacketPublishAck(cmd) == 0)
  189. {
  190. #ifdef DEBUG_printf
  191. printf("Tips: MQTT Publish Send OK\r\n");
  192. #endif
  193. }
  194. break;
  195. default:
  196. result = -1;
  197. break;
  198. }
  199. ESP8266_Clear(); // 清空缓存
  200. if(result == -1) return ;
  201. /************************user handle*****************************/
  202. if(strstr((char *)req_payload, "OPEN1")) // 搜索"OPEN1"
  203. {
  204. #ifdef DEBUG_printf
  205. printf("OPEN1\n");
  206. #endif
  207. AllFlag.AutoCtrl_time = 0;
  208. AllFlag.AutoCtrl_flag = 1;
  209. GPIOClass.Set(RELAY1);
  210. // user handle
  211. }
  212. if(strstr((char *)req_payload, "CLOSE1")) // 搜索"CLOSE1"
  213. {
  214. AllFlag.AutoCtrl_time = 0;
  215. AllFlag.AutoCtrl_flag = 1;
  216. GPIOClass.Reset(RELAY1);
  217. // user handle
  218. }
  219. if(strstr((char *)req_payload, "OPEN2")) // 搜索"OPEN2"
  220. {
  221. AllFlag.AutoCtrl_time = 0;
  222. AllFlag.AutoCtrl_flag = 1;
  223. GPIOClass.Set(RELAY2);
  224. // user handle
  225. }
  226. if(strstr((char *)req_payload, "CLOSE2")) // 搜索"CLOSE2"
  227. {
  228. AllFlag.AutoCtrl_time = 0;
  229. AllFlag.AutoCtrl_flag = 1;
  230. GPIOClass.Reset(RELAY2);
  231. // user handle
  232. }
  233. dataPtr = strchr(req_payload, ':'); // 搜索':'
  234. if(dataPtr != NULL && result != -1) // 如果找到了
  235. {
  236. dataPtr++;
  237. while(*dataPtr >= '0' && *dataPtr <= '9') // 判断是否是下发的命令控制数据
  238. {
  239. numBuf[num++] = *dataPtr++;
  240. }
  241. numBuf[num] = 0;
  242. num = atoi((const char *)numBuf); // 转为数值形式
  243. /*******************************************************/
  244. if(strstr((char *)req_payload, "xxx")) // 搜索"xxx"
  245. {
  246. AllFlag.xxx=num;
  247. #ifdef DEBUG_printf
  248. printf("xxx:%d\n",num);
  249. #endif
  250. }
  251. AllFlag.OneNET_send_flag = 1; // 发送标志置位,立即发送
  252. }
  253. if(type == MQTT_PKT_CMD || type == MQTT_PKT_PUBLISH)
  254. {
  255. MQTT_FreeBuffer(cmdid_topic);
  256. MQTT_FreeBuffer(req_payload);
  257. }
  258. }