NB-IoT_M5311LV.ino 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. /*
  2. Description: Use NB-IoT Module to send data to MQTT server.
  3. */
  4. #include <M5Stack.h>
  5. #include <stdint.h>
  6. #include <vector>
  7. TFT_eSprite Disbuff = TFT_eSprite(&M5.Lcd);
  8. TaskHandle_t xhandle_lte_event = NULL;
  9. SemaphoreHandle_t command_list_samap;
  10. typedef enum
  11. {
  12. kQUERY_MO = 0,
  13. KTEST_MO,
  14. kASSIGN_MO,
  15. kACTION_MO,
  16. kQUERY_MT,
  17. kTEST_MT,
  18. kASSIGN_MT,
  19. kACTION_MT,
  20. kINFORM
  21. } LTEMsg_t;
  22. typedef enum
  23. {
  24. kErrorSendTimeOUT = 0xe1,
  25. kErrorReError = 0xe2,
  26. kErroeSendError = 0xe3,
  27. kSendReady = 0,
  28. kSending = 1,
  29. kWaitforMsg = 2,
  30. kWaitforRead = 3,
  31. kReOK
  32. } LTEState_t;
  33. struct ATCommand
  34. {
  35. uint8_t command_type;
  36. String str_command;
  37. uint16_t send_max_number;
  38. uint16_t max_time;
  39. uint8_t state;
  40. String read_str;
  41. uint16_t _send_count;
  42. uint16_t _send_time_count;
  43. } user;
  44. using namespace std;
  45. vector<ATCommand> serial_at;
  46. String zmmi_str;
  47. void LTEModuleTask(void *arg)
  48. {
  49. int Number = 0;
  50. String restr;
  51. while (1)
  52. {
  53. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  54. if (Serial2.available() != 0)
  55. {
  56. String str = Serial2.readString();
  57. restr += str;
  58. if (restr.indexOf("\r\n") != -1)
  59. {
  60. }
  61. if (restr.indexOf("+ZMMI:") != -1)
  62. {
  63. zmmi_str = restr;
  64. }
  65. else if ((restr.indexOf("OK") != -1) || (restr.indexOf("ERROR") != -1))
  66. {
  67. Serial.print(restr);
  68. if (restr.indexOf("OK") != -1)
  69. {
  70. if ((serial_at[0].command_type == kACTION_MO) || (serial_at[0].command_type == kASSIGN_MO))
  71. {
  72. serial_at.erase(serial_at.begin());
  73. Serial.printf("erase now %d\n", serial_at.size());
  74. }
  75. else
  76. {
  77. serial_at[0].read_str = restr;
  78. serial_at[0].state = kWaitforRead;
  79. }
  80. }
  81. else if (restr.indexOf("ERROR") != -1)
  82. {
  83. serial_at[0].state = kErrorReError;
  84. }
  85. else
  86. {
  87. }
  88. restr.clear();
  89. }
  90. }
  91. if (serial_at.empty() != true)
  92. {
  93. Number = 0;
  94. switch (serial_at[0].state)
  95. {
  96. case kSendReady:
  97. Serial.printf(serial_at[0].str_command.c_str());
  98. Serial2.write(serial_at[0].str_command.c_str());
  99. serial_at[0].state = kSending;
  100. break;
  101. case kSending:
  102. if (serial_at[0]._send_time_count > 0)
  103. {
  104. serial_at[0]._send_time_count--;
  105. }
  106. else
  107. {
  108. serial_at[0].state = kWaitforMsg;
  109. }
  110. /* code */
  111. break;
  112. case kWaitforMsg:
  113. if (serial_at[0]._send_count > 0)
  114. {
  115. serial_at[0]._send_count--;
  116. serial_at[0]._send_time_count = serial_at[0].max_time;
  117. Serial.printf(serial_at[0].str_command.c_str());
  118. Serial2.write(serial_at[0].str_command.c_str());
  119. restr.clear();
  120. serial_at[0].state = 1;
  121. }
  122. else
  123. {
  124. serial_at[0].state = kErrorSendTimeOUT;
  125. }
  126. /* code */
  127. break;
  128. case kWaitforRead:
  129. /* code */
  130. break;
  131. case 4:
  132. /* code */
  133. break;
  134. case kErrorSendTimeOUT:
  135. /* code */
  136. break;
  137. case 0xe2:
  138. /* code */
  139. break;
  140. default:
  141. break;
  142. }
  143. }
  144. xSemaphoreGive(command_list_samap);
  145. delay(10);
  146. }
  147. }
  148. void AddMsg(String str, uint8_t type, uint16_t sendcount, uint16_t sendtime)
  149. {
  150. struct ATCommand newcommand;
  151. newcommand.str_command = str;
  152. newcommand.command_type = type;
  153. newcommand.max_time = sendtime;
  154. newcommand.send_max_number = sendcount;
  155. newcommand.state = 0;
  156. newcommand._send_count = sendcount;
  157. newcommand._send_time_count = sendtime;
  158. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  159. serial_at.push_back(newcommand);
  160. xSemaphoreGive(command_list_samap);
  161. }
  162. uint8_t readSendState(uint32_t number)
  163. {
  164. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  165. uint8_t restate = serial_at[number].state;
  166. xSemaphoreGive(command_list_samap);
  167. return restate;
  168. }
  169. uint32_t getATMsgSize()
  170. {
  171. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  172. uint32_t restate = serial_at.size();
  173. xSemaphoreGive(command_list_samap);
  174. return restate;
  175. }
  176. String ReadMsgstr(uint32_t number)
  177. {
  178. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  179. String restate = serial_at[number].read_str;
  180. xSemaphoreGive(command_list_samap);
  181. return restate;
  182. }
  183. bool EraseFirstMsg()
  184. {
  185. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  186. serial_at.erase(serial_at.begin());
  187. xSemaphoreGive(command_list_samap);
  188. return true;
  189. }
  190. uint16_t GetstrNumber(String Str, uint32_t *ptrbuff)
  191. {
  192. uint16_t count = 0;
  193. String Numberstr;
  194. int indexpos = 0;
  195. while (Str.length() > 0)
  196. {
  197. indexpos = Str.indexOf(",");
  198. if (indexpos != -1)
  199. {
  200. Numberstr = Str.substring(0, Str.indexOf(","));
  201. Str = Str.substring(Str.indexOf(",") + 1, Str.length());
  202. ptrbuff[count] = Numberstr.toInt();
  203. count++;
  204. }
  205. else
  206. {
  207. ptrbuff[count] = Str.toInt();
  208. count++;
  209. break;
  210. }
  211. }
  212. return count;
  213. }
  214. vector<String> restr_v;
  215. uint16_t GetstrNumber(String StartStr, String EndStr, String Str)
  216. {
  217. uint16_t count = 0;
  218. String Numberstr;
  219. int indexpos = 0;
  220. Str = Str.substring(Str.indexOf(StartStr) + StartStr.length(), Str.indexOf(EndStr));
  221. Str.trim();
  222. restr_v.clear();
  223. while (Str.length() > 0)
  224. {
  225. indexpos = Str.indexOf(",");
  226. if (indexpos != -1)
  227. {
  228. Numberstr = Str.substring(0, Str.indexOf(","));
  229. Str = Str.substring(Str.indexOf(",") + 1, Str.length());
  230. restr_v.push_back(Numberstr);
  231. count++;
  232. }
  233. else
  234. {
  235. restr_v.push_back(Numberstr);
  236. ;
  237. count++;
  238. break;
  239. }
  240. }
  241. return count;
  242. }
  243. String getReString(uint16_t Number)
  244. {
  245. if (restr_v.empty())
  246. {
  247. return String("");
  248. }
  249. return restr_v.at(Number);
  250. }
  251. uint16_t GetstrNumber(String StartStr, String EndStr, String Str, uint32_t *ptrbuff)
  252. {
  253. uint16_t count = 0;
  254. String Numberstr;
  255. int indexpos = 0;
  256. Str = Str.substring(Str.indexOf(StartStr) + StartStr.length(), Str.indexOf(EndStr));
  257. Str.trim();
  258. while (Str.length() > 0)
  259. {
  260. indexpos = Str.indexOf(",");
  261. if (indexpos != -1)
  262. {
  263. Numberstr = Str.substring(0, Str.indexOf(","));
  264. Str = Str.substring(Str.indexOf(",") + 1, Str.length());
  265. ptrbuff[count] = Numberstr.toInt();
  266. count++;
  267. }
  268. else
  269. {
  270. ptrbuff[count] = Str.toInt();
  271. count++;
  272. break;
  273. }
  274. }
  275. return count;
  276. }
  277. uint32_t numberbuff[128];
  278. String readstr;
  279. void setup()
  280. {
  281. // put your setup code here, to run once:
  282. M5.begin();
  283. M5.Power.begin();
  284. Serial.begin(115200);
  285. Serial2.begin(115200, SERIAL_8N1, 16, 17);
  286. Serial.printf("FUCK STC\n");
  287. Disbuff.createSprite(320, 100);
  288. Disbuff.fillRect(0, 0, 320, 100, BLACK);
  289. Disbuff.drawRect(0, 0, 320, 20, Disbuff.color565(36, 36, 36));
  290. Disbuff.pushSprite(0, 0);
  291. pinMode(2, OUTPUT);
  292. digitalWrite(2, 1);
  293. Disbuff.setTextColor(WHITE);
  294. Disbuff.setTextSize(1);
  295. for (int i = 0; i < 100; i++)
  296. {
  297. Disbuff.fillRect(0, 0, 320, 20, Disbuff.color565(36, 36, 36));
  298. Disbuff.pushSprite(0, 0);
  299. Disbuff.setCursor(7, 7);
  300. Disbuff.printf("Reset Module %02d", i);
  301. Disbuff.pushSprite(0, 0);
  302. delay(10);
  303. }
  304. digitalWrite(2, 0);
  305. xTaskCreate(LTEModuleTask, "LTEModuleTask", 1024 * 2, (void *)0, 4, &xhandle_lte_event);
  306. command_list_samap = xSemaphoreCreateMutex();
  307. xSemaphoreGive(command_list_samap);
  308. int count_t = 0;
  309. AddMsg("AT\r\n", kASSIGN_MO, 1000, 1000);
  310. while (getATMsgSize() > 0)
  311. {
  312. Disbuff.fillRect(0, 0, 320, 20, Disbuff.color565(36, 36, 36));
  313. Disbuff.pushSprite(0, 0);
  314. Disbuff.setCursor(7, 7);
  315. Disbuff.printf("Wait Modlue Srart %02d", count_t);
  316. Disbuff.pushSprite(0, 0);
  317. count_t++;
  318. delay(300);
  319. }
  320. AddMsg("AT^CARDMODE\r\n", kQUERY_MT, 1000, 1000);
  321. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))
  322. delay(50);
  323. Serial.printf("Read state = %d \n", readSendState(0));
  324. readstr = ReadMsgstr(0).c_str();
  325. int count = GetstrNumber("CARDMODE:", "OK", readstr, numberbuff);
  326. if (count != 0)
  327. {
  328. Serial.printf("CardMode = %d", numberbuff[0]);
  329. Disbuff.fillRect(0, 0, 320, 20, Disbuff.color565(36, 36, 36));
  330. Disbuff.pushSprite(0, 0);
  331. Disbuff.setCursor(7, 7);
  332. switch (numberbuff[0])
  333. {
  334. case 0:
  335. Disbuff.printf("Unknown Card");
  336. break;
  337. case 1:
  338. Disbuff.printf("SIM Card");
  339. break;
  340. case 2:
  341. Disbuff.printf("USIM Card");
  342. break;
  343. default:
  344. Disbuff.printf("Unknown Card:E");
  345. break;
  346. }
  347. Disbuff.pushSprite(0, 0);
  348. }
  349. EraseFirstMsg();
  350. AddMsg("AT+CFUN=1\r\n", kASSIGN_MO, 1000, 1000);
  351. AddMsg("AT^SYSCONFIG?\r\n", kQUERY_MT, 1000, 1000);
  352. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))
  353. delay(50);
  354. Serial.printf("Read state = %d ", readSendState(0));
  355. Serial.print(ReadMsgstr(0).c_str());
  356. AddMsg("AT+MQTTSTAT?\r\n", kQUERY_MT, 1000, 1000);
  357. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))
  358. delay(50);
  359. String str = ReadMsgstr(0).c_str();
  360. if (str.indexOf("+MQTTSTAT:") != -1)
  361. {
  362. str.trim();
  363. Serial.print(str.c_str());
  364. str = str.substring(str.indexOf(":"), 1);
  365. Serial.print(str.c_str());
  366. //str.toInt();
  367. }
  368. Serial.printf("Read state = %d ", readSendState(0));
  369. Serial.print(ReadMsgstr(0).c_str());
  370. EraseFirstMsg();
  371. delay(3000);
  372. AddMsg("AT+MQTTCFG=127.0.0.1,1883,110,60,M5Hard,hades,1,0\r\n", kQUERY_MT, 1000, 1000);
  373. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))
  374. delay(50);
  375. Serial.printf("Read state = %d ", readSendState(0));
  376. Serial.print(ReadMsgstr(0).c_str());
  377. EraseFirstMsg();
  378. delay(3000);
  379. AddMsg("AT+MQTTOPEN=1,1,0\r\n", kQUERY_MT, 1000, 1000);
  380. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))
  381. delay(50);
  382. Serial.printf("Read state = %d ", readSendState(0));
  383. Serial.print(ReadMsgstr(0).c_str());
  384. EraseFirstMsg();
  385. AddMsg("AT+MQTTSTAT?\r\n", kQUERY_MT, 1000, 1000);
  386. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))
  387. delay(50);
  388. Serial.printf("Read state = %d ", readSendState(0));
  389. Serial.print(ReadMsgstr(0).c_str());
  390. EraseFirstMsg();
  391. }
  392. uint8_t restate;
  393. void loop()
  394. {
  395. AddMsg("AT+MQTTPUB=pyr,1,0,0,0,Fuck STC from NB-Iot \r\n", kQUERY_MT, 1000, 1000);
  396. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))
  397. delay(50);
  398. Serial.printf("Read state = %d \n", readSendState(0));
  399. Serial.print(ReadMsgstr(0).c_str());
  400. EraseFirstMsg();
  401. M5.update();
  402. }