WIFI.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. #include "WIFI.h"
  2. #include "cmsis_os.h"
  3. #include "remote.h"
  4. #include "ML307A.h"
  5. #include "main.h"
  6. #include "uType.h"
  7. #include "cmsis_os.h"
  8. char WIFIresponseBuf[256]; // AT指令应答的局部缓冲区
  9. char WIFIresponseBuf_2[256]; // AT指令应答的局部缓冲区
  10. extern circle_buf_t uart3CircleBuf; // 环形缓冲区管理结构体
  11. extern int g_cip_id; // TCP_IP分配的端口号
  12. extern uint8_t terminalId[7];
  13. extern uint8_t g_board_id[6];
  14. extern uint16_t Register_Serial_number;// 注册消息流水号
  15. extern uint16_t Heartbeat_Serial_number;// 心跳消息流水号
  16. extern uint16_t response_Serial_number;// 通用应答消息流水号
  17. extern uint16_t sensorline_Serial_number;// 掉线上传消息流水号
  18. extern uint16_t systemlevel_Serial_number;// 预警等级消息流水号
  19. extern uint16_t Temperature_Serial_number;// 温度数据消息流水号
  20. extern uint16_t Pressure_CO_H2_Serial_number;// 压气数据消息流水号
  21. extern uint8_t g_remote_databuffer[450];
  22. extern char g_remote_atbuffer[512];
  23. extern uint8_t systemlevel_body[12];
  24. extern uint8_t General_response[5];
  25. extern uint8_t temp_body[424];
  26. extern uint8_t prc0h2_body[62];
  27. extern uint8_t license[9];
  28. extern time_t epoch_time;
  29. extern uint8_t sensor_status[6]; // 传感器在线情况初始化全 0,0为掉线,1为在线
  30. extern uint32_t adc_val; // ADC读取电压
  31. extern uint8_t voltage_int;
  32. extern uint8_t percent;
  33. extern uint8_t flash_temp_prc0h2[512]; // 存入flash的温度和压力数据
  34. extern uint16_t trigger_info[3]; // 存储触发信息
  35. uint8_t sendCmd_WIFI(char *pCmd, char *pRes1, char *pRes2, uint32_t timeOut, uint8_t sendNum)
  36. {
  37. uint8_t i;
  38. uint32_t time;
  39. uint8_t receivedByte;
  40. memset(WIFIresponseBuf_2, 0, sizeof(WIFIresponseBuf_2)); // 清空临时缓冲区
  41. for (i = 0; i < sendNum; i++)
  42. {
  43. time = timeOut * 10; // 计算超时时间
  44. // // ★ 发送前丢弃旧数据 ★
  45. // __HAL_UART_DISABLE_IT(&huart1, UART_IT_IDLE); // 可选:保护指针修改
  46. // uart1CircleBuf.r = uart1CircleBuf.w; // 丢弃旧数据
  47. // __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  48. USART_SendString(&huart3, pCmd); // 发送 AT 指令
  49. osDelay(50); // 等待模块返回
  50. uint8_t matchFlag = 0;
  51. while (time--)
  52. {
  53. uint8_t gotNewData = 0;
  54. // 读取环形缓冲区内的新数据
  55. while (circle_buf_read(&uart3CircleBuf, &receivedByte) == 0)
  56. {
  57. gotNewData = 1;
  58. uint16_t len = strlen(WIFIresponseBuf_2);
  59. if (len < sizeof(WIFIresponseBuf_2) - 1)
  60. {
  61. WIFIresponseBuf_2[len] = receivedByte;
  62. WIFIresponseBuf_2[len + 1] = '\0'; // 字符串结束符
  63. }
  64. }
  65. if (gotNewData)
  66. {
  67. // 每次有新数据都检测是否有完整的行
  68. char *lineStart = WIFIresponseBuf_2;
  69. while (1)
  70. {
  71. // 查找是否有一行结束符
  72. char *lineEnd = strstr(lineStart, "\r\n");
  73. if (lineEnd == NULL)
  74. break; // 没有完整行,等待更多数据
  75. // 截断这一行,形成完整字符串
  76. *lineEnd = '\0';
  77. // 打印完整行
  78. printf("%s\n", lineStart);
  79. // 判断是否有匹配到成功应答
  80. if ((pRes1 && strstr(lineStart, pRes1) != NULL) ||
  81. (pRes2 && strstr(lineStart, pRes2) != NULL))
  82. {
  83. matchFlag = 1;
  84. }
  85. // 移动到下一行
  86. lineStart = lineEnd + 2;
  87. }
  88. // 剩下的内容移动到buffer头部(继续拼接未完整行)
  89. uint16_t remainLen = strlen(lineStart);
  90. memmove(WIFIresponseBuf_2, lineStart, remainLen + 1); // +1 包含结束符
  91. }
  92. osDelay(10);
  93. }
  94. if (matchFlag)
  95. {
  96. printf("%s\n", WIFIresponseBuf_2); // 打印剩余数据
  97. return 1; // 任意一个匹配成功
  98. }
  99. printf("Timeout_!: %s\n", WIFIresponseBuf_2); // 超时打印
  100. }
  101. return 0;
  102. }
  103. void sendATOnly(char *pCmd)
  104. {
  105. // 保护环形缓冲区(避免主循环或DMA干扰)
  106. __HAL_UART_DISABLE_IT(&huart3, UART_IT_IDLE);
  107. uart3CircleBuf.r = uart3CircleBuf.w; // 丢弃旧数据
  108. __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
  109. USART_SendString(&huart3, pCmd); // 发送 AT 指令
  110. osDelay(100); // 可选延时,让模块处理
  111. }
  112. int extract_cip_port(const char *src)
  113. {
  114. const char *p = strstr(src, "+CIPSTART:");
  115. if (p) {
  116. p += strlen("+CIPSTART:");
  117. return atoi(p); // 提取冒号后面的数字
  118. }
  119. return -1; // 未找到
  120. }
  121. void Send_Heartbeat_WIFI(void) // test
  122. {
  123. uint8_t send_buffer[64] = {0}; // 拼接缓冲区
  124. uint8_t hex_payload[] = {0x7E, 0x7E, 0x7E, 0x7E}; // 原始 HEX 数据
  125. uint16_t payload_len = sizeof(hex_payload); // 自动获取长度
  126. uint16_t index = 0;
  127. int header_len= sprintf((char *)send_buffer, "AT+CIPSEND=%d,%d,0,0,", g_cip_id, payload_len);
  128. index +=header_len;
  129. memcpy(send_buffer + index, hex_payload, payload_len);
  130. index += payload_len;
  131. send_buffer[index++] = '\r';
  132. send_buffer[index++] = '\n';
  133. HAL_UART_Transmit(&huart3, send_buffer, index, 1000);
  134. printf("%.*s", header_len, send_buffer);
  135. for (uint16_t i = 0; i < payload_len; i++) {
  136. printf("%02X", hex_payload[i]);
  137. }
  138. printf("\r\n");
  139. }
  140. void Send_WIFI_HEX_Packet(uint8_t *hex_payload, uint16_t payload_len)
  141. {
  142. uint8_t send_buffer[512] = {0};
  143. uint16_t index = 0;
  144. int header_len = sprintf((char *)send_buffer, "AT+CIPSEND=%d,%d,0,0,", g_cip_id, payload_len);
  145. index += header_len;
  146. memcpy(send_buffer + index, hex_payload, payload_len);
  147. index += payload_len;
  148. send_buffer[index++] = '\r';
  149. send_buffer[index++] = '\n';
  150. HAL_UART_Transmit_DMA(&huart3, send_buffer, index);
  151. printf("%.*s", header_len, send_buffer); // 打印 AT+CIPSEND=...
  152. for (uint16_t i = 0; i < payload_len; i++) {
  153. printf("%02X", hex_payload[i]); // 打印 HEX 数据
  154. }
  155. printf("\r\n");
  156. }
  157. void Send_WIFI_ASCII_Packet_HEX(const uint8_t *bin_payload, uint16_t bin_len)
  158. {
  159. uint8_t send_buffer[900] = {0};
  160. uint16_t index = 0;
  161. int header_len = sprintf((char *)send_buffer, "AT+CIPSEND=%d,%d,0,0,", g_cip_id, bin_len);
  162. index += header_len;
  163. memcpy(send_buffer + index, bin_payload, bin_len);
  164. index += bin_len;
  165. send_buffer[index++] = '\r';
  166. send_buffer[index++] = '\n';
  167. HAL_UART_Transmit_DMA(&huart3, send_buffer, index);
  168. printf("%.*s", header_len, send_buffer); // 打印 AT+CIPSEND=...
  169. for (uint16_t i = 0; i < bin_len; i++) {
  170. printf("%02X", bin_payload[i]); // 打印 HEX 数据
  171. }
  172. printf("\r\n");
  173. }
  174. void Send_WIFI_ASCII_Packet(const char *ascii_payload)
  175. {
  176. uint8_t send_buffer[900] = {0};
  177. uint16_t index = 0;
  178. uint16_t payload_len = strlen(ascii_payload);
  179. // payload_len += 2;
  180. // 拼接 CIPSEND 命令
  181. int header_len = sprintf((char *)send_buffer, "AT+CIPSEND=%d,%d,0,0,", g_cip_id, payload_len+3);
  182. index += header_len;
  183. // 拷贝 ASCII 数据
  184. memcpy(send_buffer + index, ascii_payload, payload_len);
  185. index += payload_len;
  186. // 添加 \r\n 结束符
  187. send_buffer[index++] = '|'; // '|'
  188. send_buffer[index++] = '\r'; // '\r' 0x0D
  189. send_buffer[index++] = '\n'; // '\n' 0x0A
  190. // printf("Send Buffer (Length %d): ", index);
  191. // for (int i = 0; i < index; i++) {
  192. // printf("%02X ", send_buffer[i]);
  193. // }
  194. // printf("\n");
  195. // 实际发送
  196. HAL_UART_Transmit_DMA(&huart3, send_buffer, index);
  197. // 打印内容
  198. printf("%.*s", header_len, send_buffer); // 打印 AT+CIPSEND=...
  199. printf("%.*s\r\n", payload_len, ascii_payload); // 打印 ASCII 数据
  200. }
  201. void bin_to_hex_ascii(const uint8_t *bin, uint16_t len, char *ascii_out)
  202. {
  203. for (uint16_t i = 0; i < len; i++)
  204. {
  205. sprintf(ascii_out + i * 2, "%02X", bin[i]);
  206. }
  207. // ascii_out[len * 2] = '\0';
  208. // ascii_out[len * 2 + 1] = '\r';
  209. // ascii_out[len * 2 + 2] = '\n';
  210. }
  211. void WIFI_Send_Register(uint8_t use_ascii_mode) // // 0为发送为原始HEX数据 1为发送为ASCII字符串(HEX字符)
  212. {
  213. Msg_Header header;
  214. Register_Body body;
  215. uint16_t data_len = 0;
  216. memset(&header, 0, sizeof(Msg_Header));
  217. header.id = 0x0001;
  218. memcpy(header.phone_number, g_board_id, 6);
  219. header.sequence = (Register_Serial_number << 8 & 0xFF00) | (Register_Serial_number >> 8);
  220. Register_Serial_number++;
  221. header.attr.length = sizeof(Register_Body);
  222. memset(&body, 0, sizeof(Register_Body));
  223. memcpy(body.terminalId, terminalId, 7);
  224. body.license_color = 0x00;
  225. memcpy(body.license, license, 9);
  226. // 开始组包
  227. g_remote_databuffer[data_len++] = 0x7E;
  228. memcpy(g_remote_databuffer + data_len, &header, sizeof(Msg_Header));
  229. data_len += sizeof(Msg_Header);
  230. memcpy(g_remote_databuffer + data_len, &body, sizeof(Register_Body));
  231. data_len += sizeof(Register_Body);
  232. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  233. data_len++;
  234. data_len = escape_7E((char *)g_remote_databuffer + 1, data_len - 1);
  235. data_len++;
  236. g_remote_databuffer[data_len++] = 0x7E;
  237. // g_remote_databuffer[data_len++] = 0x7C;
  238. // g_remote_databuffer[data_len++] = '\0';
  239. // g_remote_databuffer[data_len++] = '\r';
  240. // g_remote_databuffer[data_len++] = '\n';
  241. // printf("data_len %d\r\n",data_len);
  242. if (use_ascii_mode)
  243. {
  244. char ascii_payload[200] = {0};
  245. bin_to_hex_ascii(g_remote_databuffer, data_len, ascii_payload); // 124
  246. Send_WIFI_ASCII_Packet(ascii_payload);
  247. // Send_WIFI_ASCII_Packet_HEX(g_remote_databuffer, data_len);
  248. }
  249. else
  250. {
  251. Send_WIFI_HEX_Packet(g_remote_databuffer, data_len);
  252. }
  253. }
  254. void WIFI_Send_Heartbeat(uint8_t use_ascii_mode)
  255. {
  256. Msg_Header header;
  257. uint16_t data_len = 0;
  258. memset(&header,0,sizeof(Msg_Header));
  259. header.id = 0x0200;
  260. memcpy(header.phone_number, g_board_id, 6);
  261. header.sequence = (Heartbeat_Serial_number<<8&0xFF00)|(Heartbeat_Serial_number>>8);
  262. Heartbeat_Serial_number++;
  263. header.attr.length = 0;
  264. g_remote_databuffer[data_len++] = 0x7E;
  265. memcpy(g_remote_databuffer+data_len, &header, sizeof(Msg_Header));
  266. data_len += sizeof(Msg_Header);
  267. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  268. data_len++;
  269. data_len = escape_7E((char *)g_remote_databuffer + 1, data_len - 1);
  270. data_len++;
  271. g_remote_databuffer[data_len++] = 0x7E;
  272. // g_remote_databuffer[data_len++] = 0x7C;
  273. // g_remote_databuffer[data_len++] = '\r';
  274. // g_remote_databuffer[data_len++] = '\n';
  275. // printf("data_len %d\r\n",data_len);
  276. if (use_ascii_mode)
  277. {
  278. char ascii_payload[200] = {0};
  279. bin_to_hex_ascii(g_remote_databuffer, data_len, ascii_payload);
  280. Send_WIFI_ASCII_Packet(ascii_payload);
  281. // Send_WIFI_ASCII_Packet_HEX(g_remote_databuffer, data_len);
  282. }
  283. else
  284. {
  285. Send_WIFI_HEX_Packet(g_remote_databuffer, data_len);
  286. }
  287. }
  288. void WIFI_Send_unix(uint8_t use_ascii_mode)
  289. {
  290. Msg_Header header;
  291. uint16_t data_len = 0;
  292. memset(&header,0,sizeof(Msg_Header));
  293. header.id = 0xFF00;
  294. memcpy(header.phone_number, g_board_id, 6);
  295. header.sequence = (Heartbeat_Serial_number<<8&0xFF00)|(Heartbeat_Serial_number>>8);
  296. Heartbeat_Serial_number++;
  297. header.attr.length = 0;
  298. g_remote_databuffer[data_len++] = 0x7E;
  299. memcpy(g_remote_databuffer+data_len, &header, sizeof(Msg_Header));
  300. data_len += sizeof(Msg_Header);
  301. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  302. data_len++;
  303. data_len = escape_7E((char *)g_remote_databuffer + 1, data_len - 1);
  304. data_len++;
  305. g_remote_databuffer[data_len++] = 0x7E;
  306. // g_remote_databuffer[data_len++] = 0x7C;
  307. // g_remote_databuffer[data_len++] = '\r';
  308. // g_remote_databuffer[data_len++] = '\n';
  309. // printf("data_len %d\r\n",data_len);
  310. if (use_ascii_mode)
  311. {
  312. char ascii_payload[200] = {0};
  313. bin_to_hex_ascii(g_remote_databuffer, data_len, ascii_payload);
  314. Send_WIFI_ASCII_Packet(ascii_payload);
  315. // Send_WIFI_ASCII_Packet_HEX(g_remote_databuffer, data_len);
  316. }
  317. else
  318. {
  319. Send_WIFI_HEX_Packet(g_remote_databuffer, data_len);
  320. }
  321. }
  322. void WIFI_Send_systemlevel(uint8_t use_ascii_mode)
  323. {
  324. uint32_t systemlevelbody_len = 0;
  325. Msg_Header header;
  326. uint16_t data_len = 0;
  327. memset(&header,0,sizeof(Msg_Header));
  328. header.id = 0x0103;
  329. memcpy(header.phone_number, g_board_id, 6);
  330. header.sequence = (systemlevel_Serial_number<<8&0xFF00)|(systemlevel_Serial_number>>8);
  331. systemlevel_Serial_number++;
  332. header.attr.res = 0x00;
  333. header.attr.length = 0x0C;
  334. g_remote_databuffer[data_len++] = 0x7E;
  335. memcpy(g_remote_databuffer+data_len, &header, sizeof(Msg_Header));
  336. data_len += sizeof(Msg_Header);
  337. systemlevel_body[systemlevelbody_len++] = 0x01;
  338. systemlevel_body[systemlevelbody_len++] = 0xF0;
  339. systemlevel_body[systemlevelbody_len++] = 0x01;
  340. systemlevel_body[systemlevelbody_len++] = system_level;
  341. systemlevel_body[systemlevelbody_len++] = (uint8_t)(trigger_info[0] >> 8); // 传感器类型高字节
  342. systemlevel_body[systemlevelbody_len++] = (uint8_t)(trigger_info[0]); // 传感器类型低字节
  343. systemlevel_body[systemlevelbody_len++] = (uint8_t)(trigger_info[1]); // 传感器编号低字节
  344. systemlevel_body[systemlevelbody_len++] = (uint8_t)(trigger_info[2]); // 触发值低字节
  345. uint32_t epoch_time_value = epoch_time; // 获取 epoch 时间戳
  346. systemlevel_body[systemlevelbody_len++] = (uint8_t)(epoch_time_value >> 24); // 高字节
  347. systemlevel_body[systemlevelbody_len++] = (uint8_t)(epoch_time_value >> 16); // 次高字节
  348. systemlevel_body[systemlevelbody_len++] = (uint8_t)(epoch_time_value >> 8); // 次低字节
  349. systemlevel_body[systemlevelbody_len++] = (uint8_t)(epoch_time_value); // 低字节
  350. memcpy(g_remote_databuffer + data_len, systemlevel_body, systemlevelbody_len);
  351. data_len += systemlevelbody_len;
  352. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  353. data_len++;
  354. data_len = escape_7E((char *)g_remote_databuffer + 1, data_len - 1);
  355. data_len++;
  356. g_remote_databuffer[data_len++] = 0x7E;
  357. // g_remote_databuffer[data_len++] = 0x7C;
  358. // g_remote_databuffer[data_len++] = '\r';
  359. // g_remote_databuffer[data_len++] = '\n';
  360. // printf("data_len %d\r\n",data_len);
  361. if (use_ascii_mode)
  362. {
  363. char ascii_payload[200] = {0};
  364. bin_to_hex_ascii(g_remote_databuffer, data_len, ascii_payload); // 48
  365. Send_WIFI_ASCII_Packet(ascii_payload);
  366. // Send_WIFI_ASCII_Packet_HEX(g_remote_databuffer, data_len);
  367. }
  368. else
  369. {
  370. Send_WIFI_HEX_Packet(g_remote_databuffer, data_len);
  371. }
  372. }
  373. void WIFI_Send_sensorline(uint8_t use_ascii_mode)
  374. {
  375. Msg_Header header;
  376. uint16_t data_len = 0;
  377. memset(&header,0,sizeof(Msg_Header));
  378. header.id = 0x0009;
  379. memcpy(header.phone_number, g_board_id, 6);
  380. header.sequence = (sensorline_Serial_number<<8&0xFF00)|(sensorline_Serial_number>>8);
  381. sensorline_Serial_number++;
  382. header.attr.res = 0X00; // 存储高字节
  383. header.attr.length = 0x0A; // 存储低字节
  384. g_remote_databuffer[data_len++] = 0x7E;
  385. memcpy(g_remote_databuffer+data_len, &header, sizeof(Msg_Header));
  386. data_len += sizeof(Msg_Header);
  387. memcpy(g_remote_databuffer + data_len, sensor_status, 6);
  388. data_len += 6;
  389. uint32_t epoch_time_value = epoch_time; // 获取 epoch 时间戳
  390. g_remote_databuffer[data_len++] = (uint8_t)(epoch_time_value >> 24); // 高字节
  391. g_remote_databuffer[data_len++] = (uint8_t)(epoch_time_value >> 16); // 次高字节
  392. g_remote_databuffer[data_len++] = (uint8_t)(epoch_time_value >> 8); // 次低字节
  393. g_remote_databuffer[data_len++] = (uint8_t)(epoch_time_value); // 低字节
  394. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  395. data_len++;
  396. data_len = escape_7E((char *)g_remote_databuffer + 1, data_len - 1);
  397. data_len++;
  398. g_remote_databuffer[data_len++] = 0x7E;
  399. // g_remote_databuffer[data_len++] = 0x7C;
  400. // g_remote_databuffer[data_len++] = '\r';
  401. // g_remote_databuffer[data_len++] = '\n';
  402. // printf("data_len %d\r\n",data_len);
  403. if (use_ascii_mode)
  404. {
  405. char ascii_payload[200] = {0};
  406. bin_to_hex_ascii(g_remote_databuffer, data_len, ascii_payload);
  407. Send_WIFI_ASCII_Packet(ascii_payload);
  408. // Send_WIFI_ASCII_Packet_HEX(g_remote_databuffer, data_len);
  409. }
  410. else
  411. {
  412. Send_WIFI_HEX_Packet(g_remote_databuffer, data_len);
  413. }
  414. }
  415. void WIFI_Send_Temperature_Data(uint8_t use_ascii_mode,SensorDataBuffer* sensor_data)
  416. {
  417. uint32_t tempbody_len = 0;
  418. uint16_t data_len = 0;
  419. Msg_Header header;
  420. temp_body[tempbody_len++] = 0xF0; // 温度数据的类型标识
  421. temp_body[tempbody_len++] = 0x0A; // 固定值
  422. // memcpy(&temp_body[tempbody_len], temp_cloud_send_buffer, 390);
  423. // tempbody_len += 390;
  424. for (uint8_t sensorId = 0; sensorId < MAX_TEMP_NODE_NUM; sensorId++)
  425. {
  426. temp_body[tempbody_len++] = 0x00; // 固定值
  427. temp_body[tempbody_len++] = sensorId + 1; // 传感器编号从 1 开始
  428. memcpy(temp_body + tempbody_len, sensor_data->temp_data[sensorId], 12);
  429. tempbody_len += 12;
  430. }
  431. uint32_t epoch_time_value = epoch_time; // 获取 epoch 时间戳
  432. temp_body[tempbody_len++] = (uint8_t)(epoch_time_value >> 24); // 高字节
  433. temp_body[tempbody_len++] = (uint8_t)(epoch_time_value >> 16); // 次高字节
  434. temp_body[tempbody_len++] = (uint8_t)(epoch_time_value >> 8); // 次低字节
  435. temp_body[tempbody_len++] = (uint8_t)(epoch_time_value); // 低字节
  436. // 构造 header
  437. memset(&header, 0, sizeof(Msg_Header));
  438. header.id = 0x2602;
  439. memcpy(header.phone_number, g_board_id, 6);
  440. header.sequence = (Temperature_Serial_number << 8 & 0xFF00) | (Temperature_Serial_number >> 8);
  441. Temperature_Serial_number++;
  442. // header.attr.length = tempbody_len ;
  443. header.attr.res = (uint8_t)(tempbody_len >> 8); // 存储高字节
  444. header.attr.length = (uint8_t)(tempbody_len & 0xFF); // 存储低字节
  445. // 拼接完整数据
  446. g_remote_databuffer[data_len++] = 0x7E; // 开始符
  447. memcpy(g_remote_databuffer + data_len, &header, sizeof(Msg_Header));
  448. data_len += sizeof(Msg_Header);
  449. memcpy(g_remote_databuffer + data_len, temp_body, tempbody_len);
  450. data_len += tempbody_len;
  451. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  452. data_len++;
  453. data_len = escape_7E((char *)g_remote_databuffer + 1, data_len - 1);
  454. data_len++;
  455. g_remote_databuffer[data_len++] = 0x7E;
  456. // g_remote_databuffer[data_len++] = 0x7C;
  457. // g_remote_databuffer[data_len++] = '\r';
  458. // g_remote_databuffer[data_len++] = '\n';
  459. // printf("data_len %d\r\n",data_len);
  460. memcpy(flash_temp_prc0h2, g_remote_databuffer, 441);
  461. if (use_ascii_mode)
  462. {
  463. char ascii_payload[900] = {0};
  464. bin_to_hex_ascii(g_remote_databuffer, data_len, ascii_payload); // 884
  465. Send_WIFI_ASCII_Packet(ascii_payload);
  466. // Send_WIFI_ASCII_Packet_HEX(g_remote_databuffer, data_len);
  467. }
  468. else
  469. {
  470. Send_WIFI_HEX_Packet(g_remote_databuffer, data_len);
  471. }
  472. }
  473. void WIFI_Send_Pressure_CO_H2_Data(uint8_t use_ascii_mode, SensorDataBuffer* sensor_data)
  474. {
  475. uint8_t body_len = 0;
  476. uint16_t data_len = 0;
  477. Msg_Header header;
  478. // prc0h2_body[body_len++] = 0xF0; // 压力数据类型标识
  479. // prc0h2_body[body_len++] = 0x0C; // 固定值
  480. prc0h2_body[0] = 0xF0; // 压力数据类型标识
  481. prc0h2_body[1] = 0x0C; // 固定值
  482. body_len = 2;
  483. // 拼接压力数据
  484. for (uint8_t sensorId = 0; sensorId < MAX_PRESSURE_NODE_NUM; sensorId++)
  485. {
  486. // if (sensor_data->pressure_valid[sensorId])
  487. // {
  488. prc0h2_body[body_len++] = 0x00; // 固定值
  489. prc0h2_body[body_len++] = sensorId + 1; // 传感器编号从 1 开始
  490. memcpy(prc0h2_body + body_len, sensor_data->pressure_data[sensorId], 2);
  491. body_len += 2;
  492. // }
  493. }
  494. prc0h2_body[body_len++] = 0xF0; // CO 数据类型标识
  495. prc0h2_body[body_len++] = 0x08; // 固定值
  496. // 拼接 CO 数据
  497. for (uint8_t sensorId = 0; sensorId < MAX_CO_NODE_NUM; sensorId++)
  498. {
  499. // if (sensor_data->co_valid[sensorId])
  500. // {
  501. prc0h2_body[body_len++] = 0x00; // 固定值
  502. prc0h2_body[body_len++] = sensorId + 1; // 传感器编号从 1 开始
  503. memcpy(prc0h2_body + body_len, sensor_data->co_data[sensorId], 4);
  504. body_len += 4;
  505. // }
  506. }
  507. prc0h2_body[body_len++] = 0xF0; // H2 数据类型标识
  508. prc0h2_body[body_len++] = 0x06; // 固定值
  509. // 拼接 H2 数据
  510. for (uint8_t sensorId = 0; sensorId < MAX_H2_NODE_NUM; sensorId++)
  511. {
  512. // if (sensor_data->h2_valid[sensorId])
  513. // {
  514. prc0h2_body[body_len++] = 0x00; // 固定值
  515. prc0h2_body[body_len++] = sensorId + 1; // 传感器编号从 1 开始
  516. memcpy(prc0h2_body + body_len, sensor_data->h2_data[sensorId], 4);
  517. body_len += 4;
  518. // }
  519. }
  520. prc0h2_body[body_len++] = 0xF0; // 电压数据类型标识
  521. prc0h2_body[body_len++] = 0x05; // 固定值
  522. prc0h2_body[body_len++] = voltage_int; // 电压
  523. prc0h2_body[body_len++] = percent; // 电量百分比
  524. uint32_t epoch_time_value = epoch_time; // 获取 epoch 时间戳
  525. prc0h2_body[body_len++] = (uint8_t)(epoch_time_value >> 24); // 高字节
  526. prc0h2_body[body_len++] = (uint8_t)(epoch_time_value >> 16); // 次高字节
  527. prc0h2_body[body_len++] = (uint8_t)(epoch_time_value >> 8); // 次低字节
  528. prc0h2_body[body_len++] = (uint8_t)(epoch_time_value); // 低字节
  529. // 构造 header
  530. memset(&header, 0, sizeof(Msg_Header));
  531. header.id = 0x2602;
  532. memcpy(header.phone_number, g_board_id, 6);
  533. header.sequence = (Pressure_CO_H2_Serial_number << 8 & 0xFF00) | (Pressure_CO_H2_Serial_number >> 8);
  534. Pressure_CO_H2_Serial_number++;
  535. header.attr.length = body_len;
  536. // 拼接完整数据
  537. g_remote_databuffer[data_len++] = 0x7E; // 开始符
  538. memcpy(g_remote_databuffer + data_len, &header, sizeof(Msg_Header));
  539. data_len += sizeof(Msg_Header);
  540. memcpy(g_remote_databuffer + data_len, prc0h2_body, body_len);
  541. data_len += body_len;
  542. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  543. data_len++;
  544. data_len = escape_7E((char *)g_remote_databuffer + 1, data_len - 1);
  545. data_len++;
  546. g_remote_databuffer[data_len++] = 0x7E;
  547. // g_remote_databuffer[data_len++] = 0x7C;
  548. // g_remote_databuffer[data_len++] = '\r';
  549. // g_remote_databuffer[data_len++] = '\n';
  550. // printf("data_len %d\r\n",data_len);
  551. // 从 g_remote_databuffer[13] 开始复制 64 字节到 flash_temp_prc0h2[441]
  552. memcpy(&flash_temp_prc0h2[441], &g_remote_databuffer[13], 64);
  553. if (use_ascii_mode)
  554. {
  555. char ascii_payload[200] = {0};
  556. bin_to_hex_ascii(g_remote_databuffer, data_len, ascii_payload); // 156
  557. Send_WIFI_ASCII_Packet(ascii_payload);
  558. // Send_WIFI_ASCII_Packet_HEX(g_remote_databuffer, data_len);
  559. }
  560. else
  561. {
  562. Send_WIFI_HEX_Packet(g_remote_databuffer, data_len);
  563. }
  564. }