remote.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590
  1. #include "remote.h"
  2. #include "ML307A.h"
  3. #include "main.h"
  4. #include "uType.h"
  5. #include "cmsis_os.h"
  6. #include "w25qxx.h"
  7. #include "spi.h"
  8. extern time_t epoch_time;
  9. extern uint8_t sensor_status[6];
  10. extern uint16_t trigger_info[3];
  11. //extern uint8_t temp_cloud_send_buffer[420];
  12. /*
  13. *@ 终端ID 202400000300
  14. *@ 终端手机号 202412040003
  15. */
  16. uint8_t terminalId[7] = {0};
  17. uint8_t g_board_id[6] = {0};
  18. //uint8_t g_board_id[6] = {0x20, 0x24, 0x12, 0x04, 0x00, 0x03}; // 终端手机号
  19. //uint8_t terminalId[7] = {0x20, 0x24, 0x00, 0x00, 0x00, 0x03, 0x00}; // 终端ID
  20. uint8_t license[9] = {0xD5, 0xE3, 0x41, 0x39, 0x39, 0x39, 0x39, 0x39, 0x00}; // 车牌
  21. //uint16_t g_remote_sequence = 1; // 消息流水号
  22. uint16_t Register_Serial_number = 1;// 注册消息流水号
  23. uint16_t Heartbeat_Serial_number = 1;// 心跳消息流水号
  24. uint16_t response_Serial_number = 1;// 通用应答消息流水号
  25. uint16_t sensorline_Serial_number = 1;// 掉线上传消息流水号
  26. uint16_t systemlevel_Serial_number = 1;// 预警等级消息流水号
  27. uint16_t Temperature_Serial_number = 1;// 温度数据消息流水号
  28. uint16_t Pressure_CO_H2_Serial_number = 1;// 压气数据消息流水号
  29. uint8_t g_remote_databuffer[450]__attribute__((section(".ccmram")));
  30. char g_remote_atbuffer[512]__attribute__((section(".ccmram")));
  31. uint8_t systemlevel_body[12]__attribute__((section(".ccmram")));
  32. uint8_t General_response[5]__attribute__((section(".ccmram")));
  33. uint8_t temp_body[424]__attribute__((section(".ccmram")));
  34. uint8_t prc0h2_body[62]__attribute__((section(".ccmram")));
  35. extern volatile SystemLevel_t system_level;
  36. extern uint16_t msg_serial ;
  37. extern uint32_t adc_val; // ADC读取电压
  38. extern uint8_t voltage_int;
  39. extern uint8_t percent;
  40. extern uint8_t flash_temp_prc0h2[512]; // 存入flash的温度和压力数据
  41. //异或校验和
  42. uint8_t Calculate_Checksum(uint8_t* data, uint16_t length)
  43. {
  44. uint8_t checksum = 0;
  45. for (uint16_t i = 0; i < length; i++)
  46. {
  47. checksum ^= data[i];
  48. }
  49. return checksum;
  50. }
  51. void my_memmove(char* dest, const char* src, size_t count)
  52. {
  53. if(0 == count){
  54. return;
  55. }
  56. for(int i=count-1; i>=0; i-- ){
  57. dest[i] = src[i];
  58. }
  59. }
  60. uint16_t escape_7E(char* data, uint16_t data_len )
  61. {
  62. // return data_len;
  63. for(uint16_t i=0; i<data_len; i++){
  64. if(0x7E == data[i]){
  65. my_memmove(data+i+2, data+i+1, data_len-i-1);
  66. data[i]=0x7D;
  67. data[i+1]=0x02;
  68. data_len++;
  69. i++;
  70. }else if(0x7D == data[i]){
  71. my_memmove(data+i+2, data+i+1, data_len-i-1);
  72. data[i+1]=0x01;
  73. data_len++;
  74. i++;
  75. }
  76. }
  77. return data_len;
  78. }
  79. uint8_t Send_Register(void)
  80. {
  81. Msg_Header header;
  82. Register_Body body;
  83. uint16_t data_len = 0;
  84. uint16_t at_len = 0;
  85. memset(&header,0,sizeof(Msg_Header));
  86. header.id = 0x0001;
  87. memcpy(header.phone_number, g_board_id, 6);
  88. header.sequence = (Register_Serial_number<<8&0xFF00)|(Register_Serial_number>>8);
  89. Register_Serial_number++;
  90. header.attr.length = sizeof(Register_Body);
  91. memset(&body, 0, sizeof(Register_Body));
  92. memcpy(body.terminalId, terminalId, 7);
  93. body.license_color = 0x00;
  94. memcpy(body.license, license, 9);
  95. g_remote_databuffer[data_len++] = 0x7E;
  96. memcpy(g_remote_databuffer+data_len, &header, sizeof(Msg_Header));
  97. data_len += sizeof(Msg_Header);
  98. memcpy(g_remote_databuffer+data_len, &body, sizeof(Register_Body));
  99. data_len += sizeof(Register_Body);
  100. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  101. data_len++;
  102. data_len = escape_7E((char*)g_remote_databuffer+1, data_len-1);
  103. data_len++;
  104. g_remote_databuffer[data_len++] = 0x7E;
  105. // 发送AT buffer
  106. at_len += sprintf(g_remote_atbuffer, "AT+MIPSEND=0,%d,\"", data_len); // 改为HEX不用乘2
  107. for (uint16_t i = 0; i < data_len; i++)
  108. {
  109. at_len += sprintf(g_remote_atbuffer+at_len, "%02X", g_remote_databuffer[i]);
  110. }
  111. at_len += sprintf(g_remote_atbuffer+at_len,"%s", "\"\r\n");
  112. // 打印AT+MIPSEND=0发送内容
  113. // printf("MIP_REGISTER:\r\n");
  114. // printf("%s\r\n", g_remote_atbuffer);
  115. if (sendCmd_4G_3(g_remote_atbuffer, "OK", "+MIPURC: \"rtcp\",0,26", 6, 1)) { // +MIPSEND: 0,61 // +MIPURC: \"rtcp\",0,26,26
  116. // printf("Send_Cloud_Register_SUCCESS\r\n");
  117. return 0;
  118. } else {
  119. printf("Send_Cloud_Register_fail\r\n");
  120. return 1;
  121. // return 0;
  122. }
  123. }
  124. uint8_t Send_Heartbeat(void)
  125. {
  126. Msg_Header header;
  127. uint16_t data_len = 0;
  128. uint16_t at_len = 0;
  129. memset(&header,0,sizeof(Msg_Header));
  130. header.id = 0x0200;
  131. memcpy(header.phone_number, g_board_id, 6);
  132. header.sequence = (Heartbeat_Serial_number<<8&0xFF00)|(Heartbeat_Serial_number>>8);
  133. Heartbeat_Serial_number++;
  134. header.attr.length = 0;
  135. g_remote_databuffer[data_len++] = 0x7E;
  136. memcpy(g_remote_databuffer+data_len, &header, sizeof(Msg_Header));
  137. data_len += sizeof(Msg_Header);
  138. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  139. data_len++;
  140. data_len = escape_7E((char*)g_remote_databuffer+1, data_len-1);
  141. data_len++;
  142. g_remote_databuffer[data_len++] = 0x7E;
  143. // 发送AT buffer
  144. at_len += sprintf(g_remote_atbuffer, "AT+MIPSEND=0,%d,\"", data_len); // 改为HEX不用乘2
  145. for (uint16_t i = 0; i < data_len; i++)
  146. {
  147. at_len += sprintf(g_remote_atbuffer+at_len, "%02X", g_remote_databuffer[i]);
  148. }
  149. at_len += sprintf(g_remote_atbuffer+at_len,"%s", "\"\r\n");
  150. // printf("%s\r\n", g_remote_atbuffer);
  151. if (sendCmd_4G_3(g_remote_atbuffer, "OK","+MIPURC: \"rtcp\",0,20", 6, 1)) {
  152. // printf("MIPSEND_Heart_OK\r\n");
  153. return 0;
  154. } else {
  155. printf("MIPSEND_Heart_fail\r\n");
  156. return 1;
  157. }
  158. }
  159. uint8_t Send_General_response(void)
  160. {
  161. Msg_Header header;
  162. uint16_t data_len = 0;
  163. uint16_t at_len = 0;
  164. uint16_t general_len = 0;
  165. memset(&header,0,sizeof(Msg_Header));
  166. header.id = 0x0100;
  167. memcpy(header.phone_number, g_board_id, 6);
  168. header.sequence = (response_Serial_number<<8&0xFF00)|(response_Serial_number>>8);
  169. response_Serial_number++;
  170. header.attr.res = 0x00;
  171. header.attr.length = 0x05;
  172. g_remote_databuffer[data_len++] = 0x7E;
  173. memcpy(g_remote_databuffer+data_len, &header, sizeof(Msg_Header));
  174. data_len += sizeof(Msg_Header);
  175. General_response[general_len++] = (msg_serial<<8 & 0xFF);
  176. General_response[general_len++] = (msg_serial & 0xFF);
  177. General_response[general_len++] = 0x81;
  178. General_response[general_len++] = 0x03;
  179. General_response[general_len++] = 0x00;
  180. memcpy(g_remote_databuffer + data_len, General_response, general_len);
  181. data_len += general_len;
  182. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  183. data_len++;
  184. data_len = escape_7E((char*)g_remote_databuffer+1, data_len-1);
  185. data_len++;
  186. g_remote_databuffer[data_len++] = 0x7E;
  187. // 发送AT buffer
  188. at_len += sprintf(g_remote_atbuffer, "AT+MIPSEND=0,%d,\"", data_len); // 改为HEX不用乘2
  189. for (uint16_t i = 0; i < data_len; i++)
  190. {
  191. at_len += sprintf(g_remote_atbuffer+at_len, "%02X", g_remote_databuffer[i]);
  192. }
  193. at_len += sprintf(g_remote_atbuffer+at_len,"%s", "\"\r\n");
  194. printf("%s\r\n", g_remote_atbuffer);
  195. if (sendCmd_4G_3(g_remote_atbuffer, "OK","+MIPURC: \"rtcp\",0,20", 6, 1)) {
  196. // printf("Send_General_response_OK\r\n");
  197. return 0;
  198. } else {
  199. printf("Send_General_response_fail\r\n");
  200. return 1;
  201. }
  202. }
  203. uint8_t Send_sensorline(void)
  204. {
  205. Msg_Header header;
  206. uint16_t data_len = 0;
  207. uint16_t at_len = 0;
  208. memset(&header,0,sizeof(Msg_Header));
  209. header.id = 0x0009;
  210. memcpy(header.phone_number, g_board_id, 6);
  211. header.sequence = (sensorline_Serial_number<<8&0xFF00)|(sensorline_Serial_number>>8);
  212. sensorline_Serial_number++;
  213. header.attr.res = 0X00; // 存储高字节
  214. header.attr.length = 0x0A; // 存储低字节
  215. g_remote_databuffer[data_len++] = 0x7E;
  216. memcpy(g_remote_databuffer+data_len, &header, sizeof(Msg_Header));
  217. data_len += sizeof(Msg_Header);
  218. memcpy(g_remote_databuffer + data_len, sensor_status, 6);
  219. data_len += 6;
  220. uint32_t epoch_time_value = epoch_time; // 获取 epoch 时间戳
  221. g_remote_databuffer[data_len++] = (uint8_t)(epoch_time_value >> 24); // 高字节
  222. g_remote_databuffer[data_len++] = (uint8_t)(epoch_time_value >> 16); // 次高字节
  223. g_remote_databuffer[data_len++] = (uint8_t)(epoch_time_value >> 8); // 次低字节
  224. g_remote_databuffer[data_len++] = (uint8_t)(epoch_time_value); // 低字节
  225. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  226. data_len++;
  227. data_len = escape_7E((char*)g_remote_databuffer+1, data_len-1);
  228. data_len++;
  229. g_remote_databuffer[data_len++] = 0x7E;
  230. // 发送AT buffer
  231. at_len += sprintf(g_remote_atbuffer, "AT+MIPSEND=0,%d,\"", data_len); // 改为HEX不用乘2
  232. for (uint16_t i = 0; i < data_len; i++)
  233. {
  234. at_len += sprintf(g_remote_atbuffer+at_len, "%02X", g_remote_databuffer[i]);
  235. }
  236. at_len += sprintf(g_remote_atbuffer+at_len,"%s", "\"\r\n");
  237. printf("%s\r\n", g_remote_atbuffer);
  238. if (sendCmd_4G_3(g_remote_atbuffer, "OK","+MIPURC: \"rtcp\",0,20", 6, 1)) {
  239. printf("Send_sensorline_OK\r\n");
  240. return 0;
  241. } else {
  242. printf("Send_sensorline_fail\r\n");
  243. return 1;
  244. }
  245. }
  246. uint8_t Send_systemlevel(void)
  247. {
  248. uint32_t systemlevelbody_len = 0;
  249. Msg_Header header;
  250. uint16_t data_len = 0;
  251. uint16_t at_len = 0;
  252. memset(&header,0,sizeof(Msg_Header));
  253. header.id = 0x0103;
  254. memcpy(header.phone_number, g_board_id, 6);
  255. header.sequence = (systemlevel_Serial_number<<8&0xFF00)|(systemlevel_Serial_number>>8);
  256. systemlevel_Serial_number++;
  257. header.attr.res = 0x00;
  258. header.attr.length = 0x0C;
  259. g_remote_databuffer[data_len++] = 0x7E;
  260. memcpy(g_remote_databuffer+data_len, &header, sizeof(Msg_Header));
  261. data_len += sizeof(Msg_Header);
  262. systemlevel_body[systemlevelbody_len++] = 0x01;
  263. systemlevel_body[systemlevelbody_len++] = 0xF0;
  264. systemlevel_body[systemlevelbody_len++] = 0x01;
  265. systemlevel_body[systemlevelbody_len++] = system_level;
  266. systemlevel_body[systemlevelbody_len++] = (uint8_t)(trigger_info[0] >> 8); // 传感器类型高字节
  267. systemlevel_body[systemlevelbody_len++] = (uint8_t)(trigger_info[0]); // 传感器类型低字节
  268. systemlevel_body[systemlevelbody_len++] = (uint8_t)(trigger_info[1]); // 传感器编号低字节
  269. systemlevel_body[systemlevelbody_len++] = (uint8_t)(trigger_info[2]); // 触发值低字节
  270. uint32_t epoch_time_value = epoch_time; // 获取 epoch 时间戳
  271. systemlevel_body[systemlevelbody_len++] = (uint8_t)(epoch_time_value >> 24); // 高字节
  272. systemlevel_body[systemlevelbody_len++] = (uint8_t)(epoch_time_value >> 16); // 次高字节
  273. systemlevel_body[systemlevelbody_len++] = (uint8_t)(epoch_time_value >> 8); // 次低字节
  274. systemlevel_body[systemlevelbody_len++] = (uint8_t)(epoch_time_value); // 低字节
  275. memcpy(g_remote_databuffer + data_len, systemlevel_body, systemlevelbody_len);
  276. data_len += systemlevelbody_len;
  277. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  278. data_len++;
  279. data_len = escape_7E((char*)g_remote_databuffer+1, data_len-1);
  280. data_len++;
  281. g_remote_databuffer[data_len++] = 0x7E;
  282. // 发送AT buffer
  283. at_len += sprintf(g_remote_atbuffer, "AT+MIPSEND=0,%d,\"", data_len); // 改为HEX不用乘2
  284. for (uint16_t i = 0; i < data_len; i++)
  285. {
  286. at_len += sprintf(g_remote_atbuffer+at_len, "%02X", g_remote_databuffer[i]);
  287. }
  288. at_len += sprintf(g_remote_atbuffer+at_len,"%s", "\"\r\n");
  289. printf("%s\r\n", g_remote_atbuffer);
  290. if (sendCmd_4G_3(g_remote_atbuffer, "OK","+MIPURC: \"rtcp\",0,23", 6, 2)) {
  291. printf("MIPSEND_systemlevel_change_OK\r\n");
  292. return 0;
  293. } else {
  294. printf("MIPSEND_systemlevel_fail\r\n");
  295. return 1;
  296. }
  297. }
  298. uint8_t Send_Temperature_Data(SensorDataBuffer* sensor_data)
  299. {
  300. uint32_t tempbody_len = 0;
  301. uint16_t data_len = 0;
  302. uint16_t at_len = 0;
  303. Msg_Header header;
  304. temp_body[tempbody_len++] = 0xF0; // 温度数据的类型标识
  305. temp_body[tempbody_len++] = 0x0A; // 固定值
  306. // memcpy(&temp_body[tempbody_len], temp_cloud_send_buffer, 390);
  307. // tempbody_len += 390;
  308. for (uint8_t sensorId = 0; sensorId < MAX_TEMP_NODE_NUM; sensorId++)
  309. {
  310. temp_body[tempbody_len++] = 0x00; // 固定值
  311. temp_body[tempbody_len++] = sensorId + 1; // 传感器编号从 1 开始
  312. memcpy(temp_body + tempbody_len, sensor_data->temp_data[sensorId], 12);
  313. tempbody_len += 12;
  314. }
  315. uint32_t epoch_time_value = epoch_time; // 获取 epoch 时间戳
  316. temp_body[tempbody_len++] = (uint8_t)(epoch_time_value >> 24); // 高字节
  317. temp_body[tempbody_len++] = (uint8_t)(epoch_time_value >> 16); // 次高字节
  318. temp_body[tempbody_len++] = (uint8_t)(epoch_time_value >> 8); // 次低字节
  319. temp_body[tempbody_len++] = (uint8_t)(epoch_time_value); // 低字节
  320. // 构造 header
  321. memset(&header, 0, sizeof(Msg_Header));
  322. header.id = 0x2602;
  323. memcpy(header.phone_number, g_board_id, 6);
  324. header.sequence = (Temperature_Serial_number << 8 & 0xFF00) | (Temperature_Serial_number >> 8);
  325. Temperature_Serial_number++;
  326. // header.attr.length = tempbody_len ;
  327. header.attr.res = (uint8_t)(tempbody_len >> 8); // 存储高字节
  328. header.attr.length = (uint8_t)(tempbody_len & 0xFF); // 存储低字节
  329. // 拼接完整数据
  330. g_remote_databuffer[data_len++] = 0x7E; // 开始符
  331. memcpy(g_remote_databuffer + data_len, &header, sizeof(Msg_Header));
  332. data_len += sizeof(Msg_Header);
  333. memcpy(g_remote_databuffer + data_len, temp_body, tempbody_len);
  334. data_len += tempbody_len;
  335. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  336. data_len++;
  337. data_len = escape_7E((char*)g_remote_databuffer + 1, data_len - 1);
  338. data_len++;
  339. g_remote_databuffer[data_len++] = 0x7E; // 结束符
  340. // for( int i = 0 ; i < data_len; i++ )
  341. // {
  342. // printf("%02X", g_remote_databuffer[i]);
  343. // }
  344. // printf("\r\n");
  345. // flash_write_temp_data(g_remote_databuffer, data_len);
  346. memcpy(flash_temp_prc0h2, g_remote_databuffer, 441);
  347. // 发送 AT 命令
  348. at_len += sprintf(g_remote_atbuffer, "AT+MIPSEND=0,%d,\"", data_len); // 改为 HEX 格式
  349. for (uint16_t i = 0; i < data_len; i++)
  350. {
  351. at_len += sprintf(g_remote_atbuffer + at_len, "%02X", g_remote_databuffer[i]);
  352. }
  353. at_len += sprintf(g_remote_atbuffer + at_len, "%s", "\"\r\n");
  354. // printf("%s\r\n", g_remote_atbuffer); // 打印温度数据
  355. if (sendCmd_4G_3(g_remote_atbuffer, "OK", "+MIPSEND: 0,441" , 6, 2))
  356. {
  357. // printf("MIPSEND_Temperature_Data_OK\r\n");
  358. return 0;
  359. }
  360. else
  361. {
  362. printf("MIPSEND_Temperature_Data_fail\r\n");
  363. return 1;
  364. }
  365. }
  366. uint8_t Send_Pressure_CO_H2_Data(SensorDataBuffer* sensor_data)
  367. {
  368. uint8_t body_len = 0;
  369. uint16_t data_len = 0;
  370. uint16_t at_len = 0;
  371. Msg_Header header;
  372. prc0h2_body[0] = 0xF0; // 压力数据类型标识
  373. prc0h2_body[1] = 0x0C; // 固定值
  374. body_len = 2;
  375. // 拼接压力数据
  376. for (uint8_t sensorId = 0; sensorId < MAX_PRESSURE_NODE_NUM; sensorId++)
  377. {
  378. // if (sensor_data->pressure_valid[sensorId])
  379. // {
  380. prc0h2_body[body_len++] = 0x00; // 固定值
  381. prc0h2_body[body_len++] = sensorId + 1; // 传感器编号从 1 开始
  382. memcpy(prc0h2_body + body_len, sensor_data->pressure_data[sensorId], 2);
  383. body_len += 2;
  384. // }
  385. }
  386. prc0h2_body[body_len++] = 0xF0; // CO 数据类型标识
  387. prc0h2_body[body_len++] = 0x08; // 固定值
  388. // 拼接 CO 数据
  389. for (uint8_t sensorId = 0; sensorId < MAX_CO_NODE_NUM; sensorId++)
  390. {
  391. // if (sensor_data->co_valid[sensorId])
  392. // {
  393. prc0h2_body[body_len++] = 0x00; // 固定值
  394. prc0h2_body[body_len++] = sensorId + 1; // 传感器编号从 1 开始
  395. memcpy(prc0h2_body + body_len, sensor_data->co_data[sensorId], 4);
  396. body_len += 4;
  397. // }
  398. }
  399. prc0h2_body[body_len++] = 0xF0; // H2 数据类型标识
  400. prc0h2_body[body_len++] = 0x06; // 固定值
  401. // 拼接 H2 数据
  402. for (uint8_t sensorId = 0; sensorId < MAX_H2_NODE_NUM; sensorId++)
  403. {
  404. // if (sensor_data->h2_valid[sensorId])
  405. // {
  406. prc0h2_body[body_len++] = 0x00; // 固定值
  407. prc0h2_body[body_len++] = sensorId + 1; // 传感器编号从 1 开始
  408. memcpy(prc0h2_body + body_len, sensor_data->h2_data[sensorId], 4);
  409. body_len += 4;
  410. // }
  411. }
  412. prc0h2_body[body_len++] = 0xF0; // 电压数据类型标识
  413. prc0h2_body[body_len++] = 0x05; // 固定值
  414. prc0h2_body[body_len++] = voltage_int; // 电压
  415. prc0h2_body[body_len++] = percent; // 电量百分比
  416. uint32_t epoch_time_value = epoch_time; // 获取 epoch 时间戳
  417. prc0h2_body[body_len++] = (uint8_t)(epoch_time_value >> 24); // 高字节
  418. prc0h2_body[body_len++] = (uint8_t)(epoch_time_value >> 16); // 次高字节
  419. prc0h2_body[body_len++] = (uint8_t)(epoch_time_value >> 8); // 次低字节
  420. prc0h2_body[body_len++] = (uint8_t)(epoch_time_value); // 低字节
  421. // 构造 header
  422. memset(&header, 0, sizeof(Msg_Header));
  423. header.id = 0x2602;
  424. memcpy(header.phone_number, g_board_id, 6);
  425. header.sequence = (Pressure_CO_H2_Serial_number << 8 & 0xFF00) | (Pressure_CO_H2_Serial_number >> 8);
  426. Pressure_CO_H2_Serial_number++;
  427. header.attr.length = body_len;
  428. // 拼接完整数据
  429. g_remote_databuffer[data_len++] = 0x7E; // 开始符
  430. memcpy(g_remote_databuffer + data_len, &header, sizeof(Msg_Header));
  431. data_len += sizeof(Msg_Header);
  432. memcpy(g_remote_databuffer + data_len, prc0h2_body, body_len);
  433. data_len += body_len;
  434. g_remote_databuffer[data_len] = Calculate_Checksum(g_remote_databuffer + 1, data_len - 1);
  435. data_len++;
  436. data_len = escape_7E((char*)g_remote_databuffer + 1, data_len - 1);
  437. data_len++;
  438. g_remote_databuffer[data_len++] = 0x7E; // 结束符
  439. // 从 g_remote_databuffer[13] 开始复制 64 字节到 flash_temp_prc0h2[441]
  440. memcpy(&flash_temp_prc0h2[441], &g_remote_databuffer[13], 64);
  441. // 发送 AT 命令
  442. at_len += sprintf(g_remote_atbuffer, "AT+MIPSEND=0,%d,\"", data_len); // 改为 HEX 格式
  443. for (uint16_t i = 0; i < data_len; i++)
  444. {
  445. at_len += sprintf(g_remote_atbuffer + at_len, "%02X", g_remote_databuffer[i]);
  446. }
  447. at_len += sprintf(g_remote_atbuffer + at_len, "%s", "\"\r\n");
  448. // printf("%s\r\n", g_remote_atbuffer); // 打印压力气体电压数据
  449. if (sendCmd_4G_3(g_remote_atbuffer, "OK", "+MIPSEND: 0,73" , 6, 2))
  450. {
  451. // printf("MIPSEND_Pressure_CO_H2_Data_OK\r\n");
  452. return 0;
  453. }
  454. else
  455. {
  456. printf("MIPSEND_Pressure_CO_H2_Data_fail\r\n");
  457. return 1;
  458. }
  459. }
  460. /*
  461. 注册平台的应答:
  462. +MIPURC: "rtcp",0,26,7E8100000B202412040001000000000020241204000100008A7E
  463. 心跳平台的应答:
  464. +MIPURC: "rtcp",0,20,7E8001000520241204000100520052000200957E
  465. 设置终端参数:
  466. +MIPURC: "rtcp",0,56,7E81030029202412040001000109F1010101F102013CF1030164F1040164F105010AF106010AF1070101F108011EF109010167DFC4051B7E
  467. */