atair720.c 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080
  1. #include "stm32f4xx.h"
  2. #include <type-spec.h>
  3. #include "at.h"
  4. #include <string.h>
  5. #include "queue.h"
  6. #include "atair720.h"
  7. #include "flash_if.h"
  8. #include "board-config.h"
  9. #include "usart.h"
  10. #include "WatchDog.h"
  11. #include "sys_tick.h"
  12. #include "sx1276_api.h"
  13. #include "para-config.h"
  14. #include "led.h"
  15. #include "type-spec.h"
  16. #include <stdlib.h>
  17. #include "atoi.h"
  18. #include "main.h"
  19. #include "ota.h"
  20. //#include "usart.h"
  21. #define TEST_TEST_TEST 1
  22. #define UART2_Buffer_Max_LEN 256
  23. #define USART_REC_LEN 200 //定义最大接收字节数 200
  24. #define RevOK 1
  25. #define Idle 0
  26. #define Reving 2
  27. uint8_t Air_IMEI[32]={0};
  28. uint8_t Air_ICCID[32]={0};
  29. //TCP连接超时
  30. u16 TcpConnectTimeOut = 0;
  31. uint16_t USART1RxSta = 0;
  32. //TCP连接OK标识
  33. u8 CONNECTISOK = 0;
  34. extern struct UsartRxBuffer Usart2RxBuffer;
  35. /**
  36. * @brief 向 AIR 模块发送命令后,检测接收到的应答
  37. * @param str 期待的应答结果
  38. * @retval 0 没有得到期待的应答结果
  39. 其他 期待应答结果的位置
  40. */
  41. char* air_check_cmd(char *str)
  42. {
  43. char *strx = 0;
  44. char *CONNECTOK = "CONNECT OK";
  45. if(str == NULL)
  46. return strx;
  47. /* 添加结束符 */
  48. strx = strstr((const char*)Usart2RxBuffer.pBuffer, (const char*)str);
  49. if( NULL != strstr((const char*)Usart2RxBuffer.pBuffer, (const char*)CONNECTOK ) )
  50. {
  51. CONNECTISOK = 1;
  52. TcpConnectTimeOut = 0;
  53. }
  54. return (char*)strx;
  55. }
  56. /**
  57. * @brief 实现下载
  58. * @param cmd 发送的命令
  59. * @param ack 期待的应答结果
  60. * @param waittime 等待时间(单位:10ms)
  61. * @retval 0 发送成功
  62. 1 发送失败
  63. */
  64. uint8_t * air_send_HTTPREADCmd(uint16_t srcadr,uint16_t downcLen, uint16_t waittime)
  65. {
  66. uint8_t res,cmdtmp[100],tmp[50],len;
  67. u8 times = 3;
  68. uint32_t wait = waittime,readlen,cmdLen,codelen = downcLen;
  69. char *cmdTmp;
  70. char *AckTmp = "+HTTPACTION:",*pstrx,*pchar,*pres=NULL;
  71. memset(cmdtmp,0,50);
  72. cmdLen = strlen("AT+HTTPREAD=");
  73. memcpy(cmdtmp,"AT+HTTPREAD=",cmdLen);
  74. memset(tmp,0,50);
  75. len = myitoa(srcadr,(char *)&tmp[0]);//address
  76. strcat((char *)&cmdtmp[0],(char *)&tmp);
  77. cmdLen += len;
  78. memset(tmp,0,50);
  79. strcat((char *)&cmdtmp[0],",");//,
  80. cmdLen += 1;
  81. memset(tmp,0,50);
  82. myitoa(codelen,(char *)&tmp[0]);//data len
  83. strcat((char *)&cmdtmp[0],(char *)&tmp);
  84. cmdLen += strlen((char *)&tmp[0]);
  85. strcat((char *)&cmdtmp[0],"\r\n");
  86. cmdLen +=strlen("\r\n");
  87. times = 10;
  88. res = 0;
  89. AT_AIR720_DEBUG_F("%s",cmdtmp);
  90. USART2_ready_buf_ok = 0;
  91. while(times)
  92. {
  93. times--;
  94. /* 发送下一条命令之前,清接收状态 */
  95. memset(Usart2RxBuffer.pBuffer , 0 , USART2_BUF_SIZE);
  96. Usart2RxBuffer.Buffer_Len = 0;
  97. USART2_ready_buf_ok = Idle;
  98. USART2_SendNByte((uint8_t *)cmdtmp, cmdLen);
  99. wait=waittime;
  100. if(wait)
  101. {
  102. while(--wait)
  103. {
  104. delay_ms(100);
  105. /* 接收到一帧数据 */
  106. //AT_AIR720_DEBUG_F("%s:wait!!!!","+HTTPREAD:");
  107. if (USART2_ready_buf_ok == RevOK)
  108. {
  109. USART2_ready_buf_ok = Idle;
  110. AT_AIR720_DEBUG_F("cmd rcv =%s\r\n",Usart2RxBuffer.pBuffer);
  111. /* 添加结束符 */
  112. pstrx = strstr((const char*)Usart2RxBuffer.pBuffer, "+HTTPREAD:");
  113. if(pstrx == NULL)
  114. {
  115. break;
  116. }
  117. pstrx += strlen("+HTTPREAD: ");
  118. pchar = strstr((const char*)pstrx, "\r\n");
  119. *pchar = '\0';
  120. readlen = atoi(pstrx);
  121. if(readlen == downcLen)
  122. {
  123. pres = pchar+2;
  124. res = 1;
  125. break;
  126. }
  127. //AT_AIR720_DEBUG_F("%s:send ok!!!!",cmd);
  128. break;
  129. }
  130. USART2_ready_buf_ok = Idle;
  131. }
  132. IWDG_Feed(); //喂狗
  133. }
  134. return (uint8_t *)pres;
  135. }
  136. return NULL;
  137. }
  138. /**
  139. * @brief 向 AIR 模块发送命令
  140. * @param cmd 发送的命令
  141. * @param ack 期待的应答结果
  142. * @param waittime 等待时间(单位:10ms)
  143. * @retval 0 发送成功
  144. 1 发送失败
  145. */
  146. uint8_t air_send_cmd(char *cmd, char *ack, uint16_t waittime)
  147. {
  148. uint8_t res = 0;
  149. u8 times = 3;
  150. uint16_t wait = waittime;
  151. //memset(Usart2_RX_BUF , 0 , 64);
  152. //AT_AIR720_DEBUG_F("%s!!!!",cmd);
  153. times = 10;
  154. while(times)
  155. {
  156. times--;
  157. /* 发送下一条命令之前,清接收状态 */
  158. memset(Usart2RxBuffer.pBuffer , 0 , USART2_BUF_SIZE);
  159. Usart2RxBuffer.Buffer_Len = 0;
  160. USART2_ready_buf_ok = Idle;
  161. USART2_SendNByte((uint8_t *)cmd, strlen((const char *)cmd));
  162. //AT_AIR720_DEBUG_F("%s:send!!!!",cmd);
  163. wait=waittime;
  164. if(ack && wait)
  165. {
  166. while(--wait)
  167. {
  168. delay_ms(10);
  169. /* 接收到一帧数据 */
  170. //AT_AIR720_DEBUG_F("%s:wait!!!!",cmd);
  171. if (USART2_ready_buf_ok == RevOK)
  172. {
  173. USART2_ready_buf_ok = Idle;
  174. AT_AIR720_DEBUG_F("cmd rcv =%s\r\n",Usart2RxBuffer.pBuffer);
  175. /* 接收到期待的应答结果 */
  176. if (air_check_cmd(ack))
  177. {
  178. AT_AIR720_DEBUG_F("air_send_cmd:2:%s ACK OK!!!!!!!!!!\r\n",cmd);
  179. times = 0;
  180. res = 1;
  181. //AT_AIR720_DEBUG_F("%s:send ok!!!!",cmd);
  182. break;
  183. }
  184. }
  185. IWDG_Feed(); //喂狗
  186. }
  187. }
  188. }
  189. return res;
  190. }
  191. /**
  192. * @brief air_send_HTTPACTIONCmd
  193. * @param cmd 发送的命令
  194. * @param ack 期待的应答结果
  195. * @param waittime 等待时间(单位:10ms)
  196. * @retval 0 发送成功
  197. 1 发送失败
  198. */
  199. uint8_t air_send_HTTPACTIONCmd(uint8_t index, uint32_t *pLen, uint16_t waittime)
  200. {
  201. uint8_t res = 0;
  202. u8 times = 3,get_Wait_flg;
  203. uint16_t wait = waittime,len,i;
  204. const char *cmdTmp = "AT+HTTPACTION=0\r\n";
  205. const char *AckTmp = "+HTTPACTION:",*strx;
  206. //memset(Usart2_RX_BUF , 0 , 64);
  207. char *ACkOK = "OK";
  208. USART2_ready_buf_ok = 0;
  209. res=air_send_cmd(( char *)cmdTmp, ACkOK, 300);
  210. while(res &&waittime)
  211. {
  212. waittime--;
  213. delay_ms(10);
  214. //AT_AIR720_DEBUG_F("%s:wait len!!!!","AT+HTTPACTION");
  215. if (USART2_ready_buf_ok == RevOK)
  216. {
  217. USART2_ready_buf_ok = Idle;
  218. AT_AIR720_DEBUG_F("cmd rcv =%s\r\n",Usart2RxBuffer.pBuffer);
  219. strx = strstr((const char*)Usart2RxBuffer.pBuffer, (const char*)AckTmp );
  220. for(i = 0;i< USART2_ready_buf_len;i++)
  221. printf("%02X ",USART2_ready_buf[i]);
  222. if(strx == NULL)
  223. {
  224. AT_AIR720_DEBUG_F("%s NULL!!!!",AckTmp);
  225. break;
  226. }
  227. strx = strstr((const char*)strx, "," );
  228. if(strx == NULL)
  229. {
  230. break;
  231. }
  232. strx+=1;
  233. strx = strstr((const char*)strx, "," );
  234. if(strx == NULL)
  235. {
  236. break;
  237. }
  238. strx +=1;
  239. *pLen = atoi(strx);//获取接收长度
  240. res = 1;
  241. break;
  242. }
  243. IWDG_Feed(); //喂狗
  244. }
  245. return res;
  246. }
  247. /**
  248. * @brief air_send_IMEI_Cmd
  249. * @param cmd 发送的命令
  250. * @param ack 期待的应答结果
  251. * @param waittime 等待时间(单位:10ms)
  252. * @retval 0 发送成功
  253. 1 发送失败
  254. */
  255. uint8_t air_send_IMEI_Cmd(uint16_t waittime)
  256. {
  257. uint8_t res = 1;
  258. u8 times = 3,get_Wait_flg;
  259. uint16_t wait = waittime,len,i;
  260. const char *cmdTmp = "AT+CGSN\r\n";
  261. const char *strx,*stry;
  262. //memset(Usart2_RX_BUF , 0 , 64);
  263. char *ACkOK = "OK";
  264. times = 10;
  265. while(times--){
  266. USART2_ready_buf_ok = 0;
  267. memset(USART2_ready_buf,0,USART2_BUF_SIZE);
  268. USART2_SendNByte((uint8_t *)cmdTmp, strlen((const char *)cmdTmp));
  269. while(waittime)
  270. {
  271. waittime--;
  272. delay_ms(10);
  273. //AT_AIR720_DEBUG_F("%s:wait len!!!!","AT+HTTPACTION");
  274. if (USART2_ready_buf_ok == RevOK)
  275. {
  276. strx = (const char*)USART2_ready_buf;
  277. //打印返回指令
  278. for(i = 0;i< USART2_ready_buf_len;i++)
  279. printf("%02X ",USART2_ready_buf[i]);
  280. printf("\r\n");
  281. //检索8 6 6 7 1 4 0 4 6 8 1 8 3 5 6 之前的"\r\n"
  282. strx = strstr((const char*)strx, "\r\n86" );
  283. if(strx == NULL)
  284. {
  285. AT_AIR720_DEBUG_F("strx == NULL\r\n");
  286. break;
  287. }
  288. strx+=2;
  289. //检索8 6 6 7 1 4 0 4 6 8 1 8 3 5 6 之后的"\r\n"
  290. stry = strstr((const char*)(strx), "\r\n" );
  291. if(stry == NULL)
  292. {
  293. AT_AIR720_DEBUG_F("stry == NULL\r\n");
  294. break;
  295. }
  296. len = (int)(stry)-(int)(strx);
  297. //
  298. if((len<=0)||(len>17)||(len>sizeof(Air_IMEI)))
  299. {
  300. AT_AIR720_DEBUG_F("((len<=0)||(len>17)||(len>sizeof(Air_IMEI)))\r\n");
  301. AT_AIR720_DEBUG_F("len=%d,stry=0x%8X,strx=0x%8X\r\n",len,(int)stry,(int)strx);
  302. break;
  303. }
  304. //中间段为IMEI
  305. memset(Air_IMEI,0,sizeof(Air_IMEI));
  306. for(i = 0;i < len;i++)
  307. {
  308. if((*(strx+i)>='0')||(*(strx+i)<='9'))
  309. {
  310. Air_IMEI[i]= *(strx+i);
  311. }
  312. else{
  313. memset(Air_IMEI,0,sizeof(Air_IMEI));
  314. AT_AIR720_DEBUG_F("((*(strx+i)<'0')||(*(strx+i)>'9'))\r\n");
  315. return 0;
  316. }
  317. }
  318. AT_AIR720_DEBUG_F("IMEI=%s\r\n",Air_IMEI);
  319. //USART2_SendNByte(Air_IMEI,len);
  320. //AT_AIR720_DEBUG("\r\n");
  321. return 0;
  322. }
  323. delay_ms(300);
  324. }
  325. }
  326. return res;
  327. }
  328. /**
  329. * @brief air_send_ICCID_Cmd
  330. * @param cmd 发送的命令
  331. * @param ack 期待的应答结果
  332. * @param waittime 等待时间(单位:10ms)
  333. * @retval 0 发送成功
  334. 1 发送失败
  335. */
  336. uint8_t air_send_ICCID_Cmd(uint16_t waittime)
  337. {
  338. uint8_t res = 1;
  339. u8 times = 3,get_Wait_flg;
  340. uint16_t wait = waittime,len,i;
  341. const char *cmdTmp = "AT+ICCID\r\n";
  342. const char *strx,*stry;
  343. //memset(Usart2_RX_BUF , 0 , 64);
  344. char *ACkOK = "OK";
  345. times = 10;
  346. while(times--){
  347. USART2_ready_buf_ok = 0;
  348. memset(USART2_ready_buf,0,USART2_BUF_SIZE);
  349. USART2_SendNByte((uint8_t *)cmdTmp, strlen((const char *)cmdTmp));
  350. while(waittime)
  351. {
  352. waittime--;
  353. delay_ms(10);
  354. //AT_AIR720_DEBUG_F("%s:wait len!!!!","AT+HTTPACTION");
  355. if (USART2_ready_buf_ok == RevOK)
  356. {
  357. strx = (const char*)USART2_ready_buf;
  358. //打印返回指令
  359. for(i = 0;i< USART2_ready_buf_len;i++)
  360. printf("%02X ",USART2_ready_buf[i]);
  361. printf("\r\n");
  362. /*
  363. AT+ICCID
  364. +ICCID: 89860464011970002199
  365. OK
  366. */
  367. //检索89860464011970002199之前的"\r\n"
  368. strx = strstr((const char*)strx, "\r\n+ICCID: 8986" );
  369. if(strx == NULL)
  370. {
  371. AT_AIR720_DEBUG_F("strx == NULL\r\n");
  372. break;
  373. }
  374. strx+=10;
  375. //检索89860464011970002199之后的"\r\n"
  376. stry = strstr((const char*)(strx), "\r\n" );
  377. if(stry == NULL)
  378. {
  379. AT_AIR720_DEBUG_F("stry == NULL\r\n");
  380. break;
  381. }
  382. len = (int)(stry)-(int)(strx);
  383. //
  384. if((len<=0)||(len>20)||(len>sizeof(Air_ICCID)))
  385. {
  386. AT_AIR720_DEBUG_F("((len<=0)||(len>17)||(len>sizeof(Air_ICCID)))\r\n");
  387. AT_AIR720_DEBUG_F("len=%d,stry=0x%8X,strx=0x%8X\r\n",len,(int)stry,(int)strx);
  388. break;
  389. }
  390. //中间段为IMEI
  391. memset(Air_ICCID,0,sizeof(Air_ICCID));
  392. for(i = 0;i < len;i++)
  393. {
  394. if((*(strx+i)>='0')||(*(strx+i)<='9'))
  395. {
  396. Air_ICCID[i]= *(strx+i);
  397. }
  398. else{
  399. memset(Air_ICCID,0,sizeof(Air_ICCID));
  400. AT_AIR720_DEBUG_F("((*(strx+i)<'0')||(*(strx+i)>'9'))\r\n");
  401. return 0;
  402. }
  403. }
  404. AT_AIR720_DEBUG_F("Air_ICCID=%s\r\n",Air_ICCID);
  405. //USART2_SendNByte(Air_IMEI,len);
  406. //AT_AIR720_DEBUG("\r\n");
  407. return 0;
  408. }
  409. delay_ms(300);
  410. }
  411. }
  412. return res;
  413. }
  414. uint8_t bcd_h_asc ( uint8_t data)
  415. {
  416. return ((data>>4)+0x30);
  417. }
  418. uint8_t bcd_l_asc ( uint8_t data)
  419. {
  420. return ((data&0x0f)+0x30);
  421. }
  422. static uint8_t check_code(uint8_t size,uint8_t *buf)
  423. {
  424. uint8_t i;
  425. uint8_t check_c ;
  426. if(size<5)
  427. return 0;
  428. check_c =buf[2]; //
  429. for(i=3;i<(size-1);i++)
  430. check_c =check_c^buf[i];
  431. return check_c;
  432. }
  433. extern config_t Config;
  434. extern uint8_t LoRa_receive_buf[LoRa_RCV_BUF_SIZE];
  435. extern volatile uint32_t Air720RestCounter;
  436. #define AIR720_SQ_DEPTH (8)
  437. #define AIR720_SQ_WIDTH (128)
  438. extern sequeue_t *SX1276_Send_sq_init(uint8_t row,uint16_t col);
  439. sequeue_t * Air720_Send_Sq;
  440. sequeue_t * Air720_SqInit(void)
  441. {
  442. return Create_Empty_Sequeue(AIR720_SQ_DEPTH,AIR720_SQ_WIDTH);
  443. }
  444. sequeue_t * Air720_Rev_Sq;
  445. sequeue_t * Air720_RevSqInit(void)
  446. {
  447. return Create_Empty_Sequeue(AIR720_SQ_DEPTH,AIR720_SQ_WIDTH);
  448. }
  449. tCounterTimeOut_t time_gw_heartbeat;
  450. tCounterTimeOut_t time_gw_force_rst;
  451. void Air720_Init(void)
  452. {
  453. GPIO_InitTypeDef GPIO_InitStructure;
  454. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能GPIOB时钟
  455. //GPIO初始化设置
  456. GPIO_InitStructure.GPIO_Pin = AIR720_RESET_PIN;
  457. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  458. GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//推挽输出
  459. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  460. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  461. GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
  462. GPIO_ResetBits(GPIOD, AIR720_RESET_PIN);
  463. delay_ms(500);
  464. GPIO_SetBits(GPIOD,AIR720_RESET_PIN);
  465. Air720_Send_Sq = Air720_SqInit();
  466. Air720_Rev_Sq = Air720_RevSqInit();
  467. time_gw_heartbeat.counter =TickCounter;
  468. time_gw_heartbeat.timeOut =60*1000;
  469. }
  470. Uint8 AT[]="AT\r\n";
  471. #define SERVICE_IP
  472. tAT_AIRE720_StateCodes AT_aire720_State = AT_AIRE720_STATE_INIT;
  473. extern GATE_CONFIG_T gt_config_para;
  474. tCounterTimeOut_t time_at_air720_receive;
  475. #define UDP_CONNECT_RETRY_TIMES (50)
  476. void Air720_send(uint8_t*pbuf, uint8_t Size)
  477. {
  478. char at_cmd[32];
  479. uint8_t at_len;
  480. at_len = sprintf((char *)at_cmd,"AT+CIPSEND=%d\r\n",Size);
  481. USART2_SendNByte((uint8_t *)at_cmd, at_len);
  482. delay_ms(10);
  483. USART2_SendNByte((uint8_t *)pbuf, Size);
  484. /*
  485. if(air_send_cmd(at_cmd, ">", 2))
  486. {
  487. USART2_SendNByte((uint8_t *)pbuf, Size);
  488. //AT_AIR720_DEBUG_F("UDP send ready!!!!");
  489. }
  490. */
  491. }
  492. uint16_t UDP_0C_frame(void)
  493. {
  494. uint8_t temp,index;
  495. uint8_t check;
  496. uint8_t i;
  497. uint8_t frame[128];
  498. tUNION32_T ptmp_32;
  499. index = 0;
  500. frame[index++]=0xFF;
  501. frame[index++]=0xEE;
  502. frame[index++]=0x00;
  503. frame[index++]=0x00;
  504. frame[index++]=0x0C; // 1
  505. frame[index++]=gt_config_para.DevId[0]; //网关ID(4B)
  506. frame[index++]=gt_config_para.DevId[1];
  507. frame[index++]=gt_config_para.DevId[2];
  508. frame[index++]=gt_config_para.DevId[3];
  509. frame[index++]=0x00; //预留
  510. frame[index++]=0x00; //预留
  511. frame[index++]=0x00; //
  512. frame[index++]=0x00; //是否加密,网关自己的0c指令不关注
  513. frame[index++]=gt_config_para.DevId[0]; //网关ID(4B)
  514. frame[index++]=gt_config_para.DevId[1];
  515. frame[index++]=gt_config_para.DevId[2];
  516. frame[index++]=gt_config_para.DevId[3];
  517. frame[index++]=gt_config_para.DevType; //网关类型 0x1,网关 0x2,液位仪 0x3,采集器 0x4,NB油机 0x5,NB液位仪 0x9,英泰赛福模块
  518. frame[index++]=0x00; //通道号
  519. ptmp_32.data_32=CURRENT_SOFTWARE_VER;
  520. frame[index++]=ptmp_32.data_8[0]; //网关App版本号(4B)
  521. frame[index++]=ptmp_32.data_8[1];
  522. frame[index++]=ptmp_32.data_8[2];
  523. frame[index++]=ptmp_32.data_8[3];
  524. frame[index++]=gt_config_para.BLVer[0]; //网关BL版本(4B)
  525. frame[index++]=gt_config_para.BLVer[1];
  526. frame[index++]=gt_config_para.BLVer[2];
  527. frame[index++]=gt_config_para.BLVer[3];
  528. frame[index++]=gt_config_para.BLVer[0]; //网关Set版本(2B) 低16位
  529. frame[index++]=gt_config_para.BLVer[1];
  530. frame[index++]=gt_config_para.RstCnt[0]; //复位次数
  531. frame[index++]=gt_config_para.RstCnt[1];
  532. frame[index++]=0x00; //逻辑和校验
  533. frame[2] = ((index-5) >> 0) & 0xff;
  534. frame[3] = ((index-5) >> 8) & 0xff;
  535. //计算逻辑和校验
  536. check =0x00;
  537. for(i=0;i<(index-1);i++)
  538. {
  539. check = check ^ frame[i];
  540. }
  541. frame[index-1]=check;
  542. AT_AIR720_DEBUG_F("0C len=%02d,msg=\r\n",index);
  543. AT_AIR720_DEBUG_H(frame,index);
  544. AT_AIR720_DEBUG("\r\n");
  545. //将组装好的0D包,入队列
  546. En_Queue(Air720_Send_Sq,frame,sizeof(frame),index);
  547. //
  548. return (index+1);
  549. }
  550. int Air720_analysis(uint8_t *sbuf,uint8_t slen){
  551. int ReturnCode = -1;
  552. uint8_t check=0;
  553. uint8_t scrc=0x00;
  554. uint8_t at720frame[128];
  555. uint8_t index;
  556. uint8_t temp;
  557. uint32_t uTemp_32=0;
  558. int i;
  559. tUNION32_T *ptmp_32 = NULL;
  560. tUNION16_T *ptmp_16 = NULL;
  561. uint8_t findChannel=0;
  562. uint8_t offset=0;
  563. uint32_t fCMD1=0;
  564. uint32_t fGwID=0;
  565. uint8_t fencrypt=0;
  566. uint32_t fNodeID=0;
  567. uint32_t fport=0;
  568. uint32_t fgun=0;
  569. uint8_t fDevType=0;
  570. uint8_t fChannel=0;
  571. uint32_t fAppVer=0;
  572. uint32_t fBLVer=0;
  573. uint32_t fSetVer=0;
  574. IWDG_Feed(); //喂狗
  575. //校验
  576. if((sbuf==NULL)||(slen == 0))
  577. {
  578. AT_AIR720_DEBUG_F("error:sbuf == NULL,or slen == 0\r\n");
  579. return ReturnCode;
  580. }
  581. //帧头(1Byte)
  582. if((sbuf[0]!=0xFF)||(sbuf[1]!=0xEE))
  583. {
  584. AT_AIR720_DEBUG_F("error:帧头错误,0x%02X%02X\r\n",sbuf[0],sbuf[1]);
  585. return ReturnCode;
  586. }
  587. //帧长度(1Byte)
  588. if((sbuf[2]!=slen-5)||(sbuf[3]!=0))
  589. {
  590. AT_AIR720_DEBUG_F("error:sbuf[2]!=slen-5,sbuf[2]=0x%02X,slen=0x%02X\r\n",sbuf[2],slen);
  591. return ReturnCode;
  592. }
  593. //和校验
  594. check = 0;
  595. for(i=0;i<slen-1;i++)
  596. {
  597. check = check ^ sbuf[i];
  598. }
  599. scrc = sbuf[slen-1];
  600. if(check != scrc)
  601. {
  602. AT_AIR720_DEBUG_F("error:Sum check error!,check=0x%02X,scrc=0x%02X\r\n",check,scrc);
  603. return ReturnCode;
  604. }
  605. //
  606. //网关ID是否匹配
  607. offset = 5;
  608. fGwID = ((tUNION32_T *)(sbuf+offset))->data_32;
  609. uTemp_32 = ((tUNION32_T *)&gt_config_para.DevId[0])->data_32;
  610. if(fGwID!=uTemp_32){
  611. AT_AIR720_DEBUG_F("error:网关ID不匹配thisGwID=0x%08X,fGwID=0x%08X\r\n",uTemp_32,fGwID);
  612. return ReturnCode;
  613. }
  614. IWDG_Feed(); //喂狗
  615. //解析
  616. if(sbuf[4]==0x0C){//心跳相关的指令
  617. offset = 13;
  618. fNodeID = ((tUNION32_T *)(sbuf+offset))->data_32;
  619. //NodeID是否匹配
  620. //查询设备是否已在列表中
  621. findChannel=0;
  622. for(i=0;i<NODE_NUM;i++){
  623. ptmp_32 = (tUNION32_T *)&node_config_para[i].DevId[0];
  624. if(ptmp_32->data_32==fNodeID){
  625. findChannel=i+1;
  626. break;
  627. }
  628. }
  629. if(findChannel){
  630. AT_AIR720_DEBUG_F("找到设备绑定信息!ID=0x%08X,Channel=%d\r\n",fNodeID,findChannel);
  631. AT_AIR720_DEBUG_F("0C len=%02d,msg=\r\n",slen);
  632. AT_AIR720_DEBUG_H(sbuf,slen);
  633. AT_AIR720_DEBUG("\r\n");
  634. //帧结构完全一致,只需转发
  635. En_Queue(Air720_Send_Sq,sbuf,slen,slen);
  636. set_led_en_process();
  637. start_led(findChannel-1,500,80,400);
  638. //心跳计数器清零
  639. //time_gw_heartbeat.counter = TickCounter;
  640. return 0;
  641. }
  642. else{
  643. AT_AIR720_DEBUG_F("未找到设备绑定信息!ID=0x%08X\r\n",fNodeID);
  644. return -1;
  645. }
  646. }
  647. //非加密FFEE45000DFFFFFFFF00000000190001630101303030303030313133303638303030303030353933303939BB1AFF8601303130323033303035383034303239363538303531317481
  648. //加 密FFEE37000D03000161000000011B00016301000000123456789000001234567890BB188101A111000101010112345678901234567890000100E51254
  649. else if(sbuf[4]==0x0D){//业务上报相关的指令
  650. offset = 13;
  651. fNodeID = ((tUNION32_T *)(sbuf+offset))->data_32;
  652. //NodeID是否匹配
  653. //查询设备是否已在列表中
  654. findChannel=0;
  655. for(i=0;i<NODE_NUM;i++){
  656. ptmp_32 = (tUNION32_T *)&node_config_para[i].DevId[0];
  657. if(ptmp_32->data_32==fNodeID){
  658. findChannel=i+1;
  659. break;
  660. }
  661. }
  662. if(findChannel){
  663. set_led_en_process();
  664. start_led(findChannel-1,500,20,400);
  665. AT_AIR720_DEBUG_F("找到设备绑定信息!ID=0x%08X,Channel=%d\r\n",fNodeID,findChannel);
  666. //创建0D上报帧
  667. index=0;
  668. for(i=0;i<17;i++){
  669. //前17个字节一致,
  670. at720frame[index++] = sbuf[i];
  671. }
  672. fport = sbuf[17];
  673. at720frame[index++] = (findChannel-1)*2 + fport + 1; //端口号(1-12)
  674. fgun = sbuf[18];
  675. at720frame[index++] = fgun+ 1; //枪号(1-8)
  676. fencrypt = sbuf[12];//是否加密,指英泰赛福
  677. //如果是加密的
  678. if(fencrypt){
  679. //UDP总累计油量(12B) 比如0000001234.56
  680. offset=20;
  681. index+=Hex2Ascii(at720frame+index,sbuf+offset,6);
  682. //UDP总累计金额(12B), 比如0000002222.56
  683. offset=27;
  684. index+=Hex2Ascii(at720frame+index,sbuf+offset,6);
  685. temp = index; // 记录当前长度
  686. // 非加密真实返回数据
  687. // BB 1A FF 86 01 32 34 31 36 31 35 30 30 30 30 30 31 30 30 30 30 35 33 35 33 31 39 74
  688. at720frame[index++]=0xBB; //32 //帧头 35
  689. at720frame[index++]=0x1A; //33 //帧长度 36
  690. at720frame[index++]=0xFF; //34 //帧号 37
  691. at720frame[index++]=0x86; //35 //86表示当次加油数据 38
  692. at720frame[index++]=0x01; //36 //状态 39
  693. //日期,(6B),05日14时19分
  694. offset=41;
  695. index+=Hex2Ascii(at720frame+index,sbuf+offset,3);
  696. //加油机返回记录 1升
  697. offset=46;
  698. index+=Hex2Ascii(at720frame+index,sbuf+offset,3);
  699. //加油机返回记录金额
  700. offset=51;
  701. index+=Hex2Ascii(at720frame+index,sbuf+offset,3);
  702. //单价 53.19
  703. offset=55;
  704. index+=Hex2Ascii(at720frame+index,sbuf+offset,2);
  705. at720frame[index++] = 0x00; //小帧逻辑和校验
  706. //计算小帧长度,固定0x1A
  707. //小帧逻辑和校验
  708. check = 0;
  709. AT_AIR720_DEBUG_F("temp=%d\r\n",temp);
  710. for(i=temp+2;i<index-1;i++)
  711. {
  712. check = check ^ at720frame[i];
  713. }
  714. at720frame[index-1] = check; //小帧逻辑和校验
  715. at720frame[index++] = 0x00; //UDP大帧逻辑和校验校验
  716. //计算UDP帧长度,
  717. at720frame[2] = ((index-5) >> 0) & 0xff;
  718. at720frame[3] = ((index-5) >> 8) & 0xff;
  719. check = 0;
  720. for(i=0;i<index-1;i++)
  721. {
  722. check = check ^ at720frame[i];
  723. }
  724. //计算UDP帧逻辑和校验
  725. at720frame[index-1] = check;//UDP大帧逻辑和校验校验
  726. AT_AIR720_DEBUG_F("0D len=%02d,msg=\r\n",index);
  727. AT_AIR720_DEBUG_H(at720frame,index);
  728. AT_AIR720_DEBUG("\r\n");
  729. //将组装好的0D包,入队列
  730. En_Queue(Air720_Send_Sq,at720frame,sizeof(at720frame),index);
  731. //心跳计数器清零
  732. // time_gw_heartbeat.counter = TickCounter;
  733. return 0;
  734. }
  735. //否则为非加密的
  736. else{
  737. //从第19-69,共51个数是一致的
  738. memcpy(at720frame+index,sbuf+index,51);
  739. index+=51;
  740. at720frame[index++] = 0x00; //小帧逻辑和校验
  741. //计算小帧长度,固定0x1A
  742. at720frame[44]=0x1A;
  743. //小帧逻辑和校验
  744. check = 0;
  745. temp = 43;
  746. AT_AIR720_DEBUG_F("temp=%d\r\n",temp);
  747. for(i=temp+2;i<index-1;i++)
  748. {
  749. check = check ^ at720frame[i];
  750. }
  751. at720frame[index-1] = check; //小帧逻辑和校验
  752. at720frame[index++] = 0x00; //UDP大帧逻辑和校验校验
  753. //计算UDP帧长度,
  754. at720frame[2] = ((index-5) >> 0) & 0xff;
  755. at720frame[3] = ((index-5) >> 8) & 0xff;
  756. check = 0;
  757. for(i=0;i<index-1;i++)
  758. {
  759. check = check ^ at720frame[i];
  760. }
  761. //计算UDP帧逻辑和校验
  762. at720frame[index-1] = check;//UDP大帧逻辑和校验校验
  763. AT_AIR720_DEBUG_F("0D len=%02d,msg=\r\n",index);
  764. AT_AIR720_DEBUG_H(at720frame,index);
  765. AT_AIR720_DEBUG("\r\n");
  766. //将组装好的0D包,入队列
  767. En_Queue(Air720_Send_Sq,at720frame,sizeof(at720frame),index);
  768. //心跳计数器清零
  769. // time_gw_heartbeat.counter = TickCounter;
  770. return 0;
  771. }
  772. }
  773. else{
  774. AT_AIR720_DEBUG_F("未找到设备绑定信息!ID=0x%08X\r\n",fNodeID);
  775. return -1;
  776. }
  777. }
  778. else if(sbuf[4]==0x0E){
  779. }
  780. return 0;
  781. }
  782. /**
  783. * @brief 实现升级包的读,并完成写
  784. * @param cmd 发送的命令
  785. * @param ack 期待的应答结果
  786. * @param waittime 等待时间(单位:10ms)
  787. * @retval 0 发送成功
  788. 1 发送失败
  789. */
  790. int Update_Read_Write(uint16_t srclen)
  791. {
  792. #define DOWM_BYTE_SIZE (1024)//每次下载的字节大小,必须为整字节数
  793. #define DOWM_WORD_SIZE (DOWM_BYTE_SIZE>>2)//
  794. uint16_t packetsize = DOWM_BYTE_SIZE;
  795. int16_t res =-1;
  796. uint16_t i,j;
  797. uint16_t cnt = 0 ,len_tail,cnt_tail,byte_tail,dlen,wlen;
  798. uint8_t *pBuff = NULL ;
  799. uint8_t flg,cntOk;
  800. Uint32 BuffTmp,addr;
  801. BuffTmp = 0;
  802. BuffTmp += packetsize + 41;//总bufer大小,41为指令的大小
  803. if(BuffTmp>USART2_BUF_SIZE)
  804. {
  805. AT_AIR720_DEBUG_F("buffer is SMALLL!!!");
  806. return 1;
  807. }
  808. cnt = srclen/(packetsize);//计算下载次数
  809. len_tail = srclen%(packetsize);//不够一包剩余字节
  810. addr = APP3_SECTOR1_START_ADD;//flash编程地址
  811. FLASH_If_EraseSector(addr);
  812. //packetsize = 10;
  813. cntOk = 0;
  814. //while(1)
  815. {
  816. for(i=0;i<cnt;i++)
  817. {
  818. AT_AIR720_DEBUG_F("down: %d\n!!!",i);
  819. pBuff = air_send_HTTPREADCmd(addr,packetsize,300);
  820. if(pBuff != NULL)//1024
  821. {
  822. //写flash
  823. for(j = 0; j<(packetsize>>2) ;j++)
  824. {
  825. BuffTmp = *(Uint32*)(pBuff + j*sizeof(Uint32));
  826. FLASH_ProgramWord((uint32_t)(addr + j*sizeof(Uint32)), BuffTmp);
  827. }
  828. cntOk++;
  829. addr +=packetsize;
  830. }
  831. //指示在下载
  832. if(gt_config_para.pcb_ver ==0){
  833. LED_Set(0,LED_FLASH);
  834. }
  835. else{
  836. LED_MODE_Set(LED_FLASH);
  837. }
  838. }
  839. }
  840. if(i != cntOk)
  841. {
  842. AT_AIR720_DEBUG_F("down is FAIL!!!");
  843. return -1;
  844. }
  845. if(len_tail)
  846. {
  847. pBuff = air_send_HTTPREADCmd(addr,len_tail,300);
  848. if(pBuff != NULL)//1024
  849. {
  850. cnt_tail= len_tail>>2;
  851. //写flash
  852. for(i = 0; i<cnt_tail ;i++)
  853. {
  854. BuffTmp = *(Uint32*)(pBuff + i*sizeof(Uint32));
  855. FLASH_ProgramWord((uint32_t)(addr + i*sizeof(Uint32)), BuffTmp);
  856. }
  857. res = 0;
  858. }
  859. }
  860. return res;
  861. }
  862. int aire720_closeUDP_openHTTP(const Uint8 *pSrc,Uint8 len){
  863. Uint8 sout[128];
  864. Uint32 lout;
  865. int res=255;
  866. Uint32 uTemp32 = 0;
  867. AT_AIR720_DEBUG_F("关闭UDP或TCP,AT+CIPCLOSE!!!!,%d\r\n",uTemp32++);
  868. if(air_send_cmd("AT+CIPCLOSE\r\n", "CLOSE OK", 200))
  869. {
  870. AT_AIR720_DEBUG_F("AT+CIPCLOSE ok!!!!\r\n");
  871. }
  872. else{
  873. AT_AIR720_DEBUG_F("AT+CIPCLOSE failed!!!!\r\n");
  874. }
  875. AT_AIR720_DEBUG_F("设置HTTP功能的承载类型,AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"!!!!,%d\r\n",uTemp32++);
  876. if(air_send_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n", "OK", 200))
  877. {
  878. AT_AIR720_DEBUG_F("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"! ok!!!!\r\n");
  879. }
  880. else{
  881. AT_AIR720_DEBUG_F("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"! failed!!!!\r\n");
  882. }
  883. AT_AIR720_DEBUG_F("设置pdp承载参数之APN,AT+SAPBR=3,1,\"APN\",\"\"!!!!,%d\r\n",uTemp32++);
  884. if(air_send_cmd("AT+SAPBR=3,1,\"APN\",\"\"\r\n", "OK", 200))
  885. {
  886. AT_AIR720_DEBUG_F("AT+SAPBR=3,1,\"APN\",\"\" ok!!!!\r\n");
  887. }
  888. else{
  889. AT_AIR720_DEBUG_F("AT+SAPBR=3,1,\"APN\",\"\" failed!!!!\r\n");
  890. }
  891. IWDG_Feed();
  892. AT_AIR720_DEBUG_F("激活该承载的GPRS PDP上下文,AT+SAPBR=1,1!!!!,%d\r\n",uTemp32++);
  893. if(air_send_cmd("AT+SAPBR=1,1\r\n", "OK", 200)) /* 激活该承载的GPRS PDP上下文 模式 */
  894. {
  895. AT_AIR720_DEBUG_F("AT+SAPBR=1,1 ok!!!!\r\n");
  896. }
  897. else{
  898. AT_AIR720_DEBUG_F("AT+SAPBR=1,1 failed!!!!\r\n");
  899. }
  900. AT_AIR720_DEBUG_F("查询下承载的状态,AT+SAPBR=2,1!!!!,%d\r\n",uTemp32++);
  901. if(air_send_cmd("AT+SAPBR=2,1\r\n", "OK", 200))
  902. {
  903. AT_AIR720_DEBUG_F("AT+SAPBR=2,1 ok!!!!\r\n");
  904. }
  905. else{
  906. AT_AIR720_DEBUG_F("AT+SAPBR=2,1 failed!!!!\r\n");
  907. }
  908. IWDG_Feed();
  909. AT_AIR720_DEBUG_F("HTTP协议栈初始化,AT+HTTPINIT!!!!,%d\r\n",uTemp32++);
  910. if(air_send_cmd("AT+HTTPINIT\r\n", "OK", 200)) /* 设置为快发模式 */
  911. {
  912. AT_AIR720_DEBUG_F("AT+HTTPINIT ok!!!!\r\n");
  913. }
  914. else{
  915. AT_AIR720_DEBUG_F("AT+HTTPINIT failed!!!!\r\n");
  916. }
  917. memset(sout,0,sizeof(sout));
  918. lout=sprintf((char *)(sout),"AT+HTTPPARA=\"URL\",\"");
  919. memcpy(sout+lout,(char *)pSrc,len);
  920. lout+=len;
  921. lout=sprintf((char *)(sout+lout),"\"\r\n");
  922. IWDG_Feed();
  923. AT_AIR720_DEBUG_F("建立http链接,%s!!!!,%d\r\n",sout,uTemp32++);
  924. if(air_send_cmd((char *)&sout[0], "OK", 300))/*建立http链接*/
  925. {
  926. AT_AIR720_DEBUG_F("AT+HTTPPARA OK!!!!\r\n");
  927. res=0;
  928. }
  929. else{
  930. AT_AIR720_DEBUG_F("AT+HTTPPARA failed!!!!\r\n");
  931. }
  932. return res;
  933. }
  934. //const char *pURl = "http://47.104.15.180:8081/chfs/shared/A61010002.bin";//
  935. int32_t Down_Update_Packet(const Uint8 *pSrc,Uint8 len/*路径长度*/)
  936. {
  937. int8_t res=-1;
  938. Uint8 tmp[100];
  939. char *ptmp;
  940. Uint16 cmdLen;
  941. Uint16 reTry=0;
  942. static Uint32 codelen,vaildcodelen;
  943. //关闭之前的链接
  944. //http配置
  945. #if 1//ok
  946. //一旦关闭之前的连接,则等待一段时间后,必须重新建立连接,可通过强制复位实现
  947. time_gw_force_rst.counter=TickCounter;
  948. time_gw_force_rst.timeOut=5*60*1000;
  949. AT_AIR720_DEBUG_F("复位时间设为5分钟\r\n");
  950. aire720_closeUDP_openHTTP(pSrc,len);
  951. #if 0
  952. if(air_send_cmd("AT+CIPCLOSE\r\n", "CLOSE OK", 200))
  953. {
  954. AT_AIR720_DEBUG_F("AT+CIPCLOSE ok!!!!\r\n");
  955. }
  956. if(air_send_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n", "OK", 200))
  957. {
  958. AT_AIR720_DEBUG_F("AT+SAPBR=3,1 ok!!!!\r\n");
  959. }
  960. if(air_send_cmd("AT+SAPBR=3,1,\"APN\",\"\"\r\n", "OK", 200))
  961. {
  962. AT_AIR720_DEBUG_F("AT+SAPBR=3,1 ok!!!!\r\n");
  963. }
  964. IWDG_Feed();
  965. if(air_send_cmd("AT+SAPBR=1,1\r\n", "OK", 200)) /* 激活该承载的GPRS PDP上下文 模式 */
  966. {
  967. AT_AIR720_DEBUG_F("AT+SAPBR ok!!!!\r\n");
  968. }
  969. if(air_send_cmd("AT+SAPBR=2,1\r\n", "OK", 200))
  970. {
  971. AT_AIR720_DEBUG_F("AT+SAPBR=2,1 ok!!!!\r\n");
  972. }
  973. IWDG_Feed();
  974. if(air_send_cmd("AT+HTTPINIT\r\n", "OK", 200)) /* 设置为快发模式 */
  975. {
  976. AT_AIR720_DEBUG_F("AT+HTTPINIT ok!!!!\r\n");
  977. }
  978. ptmp ="AT+HTTPPARA=\"URL\",\"";
  979. memcpy(tmp,(void *)ptmp,strlen(ptmp));
  980. memcpy(tmp+strlen(ptmp),(char *)pSrc,len);
  981. //strcat((char *)&tmp[0],(char *)pSrc);
  982. memcpy(tmp+strlen(ptmp)+len,"\"\r\n",strlen("\"\r\n"));
  983. //strcat((char *)&tmp[0],"\"\r\n");
  984. IWDG_Feed();
  985. if(air_send_cmd((char *)&tmp[0], "OK", 300))/*建立http链接*/
  986. {
  987. AT_AIR720_DEBUG_F("AT+HTTPPARA OK!!!!\r\n");
  988. }
  989. #endif
  990. #endif
  991. IWDG_Feed();
  992. //发送"AT+HTTPACTION=0\r\n",等待get数据成功,并且获取数据长度
  993. for(reTry=0;reTry<5;reTry++){
  994. if(air_send_HTTPACTIONCmd(NULL, &codelen, 500))/*建立http链接*/
  995. {
  996. AT_AIR720_DEBUG_F("AT+HTTPACTION=0,get len=%d!!!!,reTry=%d\r\n",codelen,reTry);
  997. if((codelen>=10)&&(codelen<=128*1024)){
  998. break;
  999. }
  1000. }
  1001. }
  1002. if((codelen<10)||(codelen>128*1024)){
  1003. AT_AIR720_DEBUG_F("升级包长度错误\r\n");
  1004. NVIC_SystemReset();// 强制复位
  1005. }
  1006. IWDG_Feed();
  1007. #if 0
  1008. if(air_send_HTTPREADCmd(0,codelen, 300))/*读取数据codelen = 10; */
  1009. {
  1010. AT_AIR720_DEBUG_F("AT+HTTPREADCmd=0!!!!,%d\r\n",vaildcodelen);
  1011. res = 0;
  1012. }
  1013. #else
  1014. return Update_Read_Write(codelen);
  1015. #endif
  1016. }
  1017. #define F1_CMD2_DOWM_SVR2WG_START_UPDATE 0x01 //下行,网关->采集器,启动升级
  1018. tUpdare_Paras Updare_Paras_form_S;
  1019. /********************************
  1020. * @brief Air720_Update_Down
  1021. * @par pddata [tUpdare_Paras*]
  1022. * @
  1023. * @retval 0初始成功,非0失败
  1024. ********************************/
  1025. int8_t Air720_Update_Down(void)
  1026. {
  1027. //切换模式
  1028. tUpdare_Paras *ptmp = &Updare_Paras_form_S;
  1029. //Uint16 len = strlen((const char *)pURl);
  1030. //ptmp->srcUrlLen = len;
  1031. if((ptmp == NULL) || (ptmp->srcUrlLen < 30 ))//URL太短,小于50个字符,认为不合法
  1032. {
  1033. AT_AIR720_DEBUG_F("input para error:pddata == NULL\r\n");
  1034. return -EINVAL;
  1035. }
  1036. AT_AIR720_DEBUG_F("Air720_Update_Down\r\n");
  1037. //模式切换
  1038. if(Down_Update_Packet(&ptmp->ppath[0],ptmp->srcUrlLen)!=0){
  1039. AT_AIR720_DEBUG_F("Air720_Update_Down exit: dowm fail!!!!!!!!!!!\r\n");
  1040. }
  1041. else
  1042. {
  1043. Clr_Queue(lora_rx_sq);
  1044. Clr_Queue(lora_tx_sq);
  1045. set_ota_http_time_init();
  1046. if(Updare_Paras_form_S.desDeviceType == DEVICE_TYPE_OIL_GATEWAY){//升级网关
  1047. set_ota_upstate(0x71,Updare_Paras_form_S.firmWareType);
  1048. set_main_WorkMode(GATEWAY_UPDATE_MODE);
  1049. }
  1050. if(Updare_Paras_form_S.desDeviceType == DEVICE_TYPE_NODE){//升级采集器
  1051. OTA_Wg2Node(DEVICE_TYPE_NODE,0xFFFFFFFF,OTA_UPDATE_FIREWARE_TYPE_APP,0xFFFFFFFF);//
  1052. set_main_WorkMode(NODE_UPDATE_MODE);
  1053. }
  1054. AT_AIR720_DEBUG_F("Air720_Update_Down OK!!\r\n");
  1055. }
  1056. return 0;
  1057. }
  1058. /********************************
  1059. * @brief Air720_Receive_Handle
  1060. * @par sbuf [uint8_t*] 帧缓存地址
  1061. * @par slen [uint8_t] 帧长度
  1062. * @retval 0初始成功,非0失败
  1063. ********************************/
  1064. DEV_WORK_MODE_T Air720_Receive_Handle(uint8_t *sbuf,uint16_t slen)
  1065. {
  1066. int8_t ReturnCode = -1;
  1067. uint8_t scrc=0x0000,cmd1Tmp,cmd2Tmp;
  1068. DEV_WORK_MODE_T GtWorkMode =DEV_MODE_ALL ;
  1069. uint8_t O9cmd2=0;
  1070. int i,j;
  1071. uint8_t check=0;
  1072. uint8_t uTemp_8=0;
  1073. uint8_t findChannel=0;
  1074. uint32_t uTemp_32=0;
  1075. uint8_t data_offset=0;
  1076. uint32_t addrPkg=0;
  1077. uint32_t id=0;
  1078. uint32_t ver=0;
  1079. uint8_t state=0;
  1080. //uint8_t arair720[8][128]={0};
  1081. uint16_t sendLen,RevLen,sumCheck;
  1082. static uint32_t cmdCnt=0;
  1083. tUNION32_T *ptmp_32 = NULL,*ptmp_32_2=NULL;
  1084. tUNION16_T *ptmp_16 = NULL;
  1085. uint8_t *pbuf;
  1086. //Frame09_t *pdst;
  1087. //校验
  1088. if((sbuf == NULL)||(slen == 0))
  1089. {
  1090. AT_AIR720_DEBUG_F("error:sbuf == NULL,or slen == 0,%p\r\n",sbuf);
  1091. return GtWorkMode;
  1092. }
  1093. AT_AIR720_DEBUG_F("len=%d,msg=\r\n",USART2_ready_buf_len);
  1094. for(i=0;i<USART2_ready_buf_len;i++)
  1095. printf("%02X ",sbuf[i]);
  1096. printf("\r\n");
  1097. pbuf = sbuf;
  1098. if((pbuf[0]==0xFF)&&(pbuf[1]==0xEE)){
  1099. En_Queue(Air720_Rev_Sq,pbuf+2,AIR720_SQ_WIDTH,pbuf[2]+5);//AIR720_SQ_DEPTH,AIR720_SQ_WIDTH);
  1100. }
  1101. for(i=0;i<USART2_ready_buf_len;i++){
  1102. if((pbuf[i+0]==0x0D)&&(pbuf[i+1]==0x0A)&&(pbuf[i+2]==0xFF)&&(pbuf[i+3]==0xEE)){
  1103. En_Queue(Air720_Rev_Sq,pbuf+2,AIR720_SQ_WIDTH,pbuf[i+4]+5);//AIR720_SQ_DEPTH,AIR720_SQ_WIDTH);
  1104. }
  1105. }
  1106. //0D 0A FF EE 05 00 0D 0E 00 01 61 77 0D 0A
  1107. //帧头(1Byte)
  1108. if((pbuf[0]==0xFF)&&(pbuf[1]==0xEE)){
  1109. slen = pbuf[2]+5;
  1110. //接收到任何FF EE的数据,复位时间后延
  1111. time_gw_force_rst.counter=TickCounter;
  1112. AT_AIR720_DEBUG_F("接收到服务器指令,CMD=0x%02X,cmdCnt=%010d\r\n",pbuf[4],cmdCnt++);
  1113. }
  1114. else
  1115. {
  1116. // AT_AIR720_DEBUG_F("非服务器指令");
  1117. // for(i=0;i<USART2_ready_buf_len;i++)
  1118. // printf("%02X ",pbuf[i]);
  1119. // return ReturnCode;
  1120. for(i=0;i<USART2_ready_buf_len;i++){
  1121. }
  1122. for(i=0;i<USART2_ready_buf_len;i++){
  1123. if((pbuf[i+0]==0x0D)&&(pbuf[i+1]==0x0A)&&(pbuf[i+2]==0xFF)&&(pbuf[i+3]==0xEE)&&(pbuf[i+4]==0xF1)){
  1124. //接收到任何FF EE的数据,复位时间后延
  1125. time_gw_force_rst.counter=TickCounter;
  1126. AT_AIR720_DEBUG_F("接收到服务器指令,CMD=0x%02X,cmdCnt=%010d\r\n",(pbuf[i+6]),cmdCnt++);
  1127. slen = pbuf[i+4]+5;
  1128. pbuf = pbuf+i+2;
  1129. break;
  1130. }
  1131. if(i==USART2_ready_buf_len-1){
  1132. AT_AIR720_DEBUG_F("非服务器指令,Rx=\r\n");
  1133. AT_AIR720_DEBUG_NB(pbuf,USART2_ready_buf_len);
  1134. printf("\r\n");
  1135. return GtWorkMode;
  1136. }
  1137. }
  1138. }
  1139. //和校验
  1140. check = 0;
  1141. for(i=0;i<slen-1;i++)
  1142. {
  1143. check = check ^ pbuf[i];
  1144. }
  1145. scrc = pbuf[slen-1];
  1146. if(check != scrc)
  1147. {
  1148. AT_AIR720_DEBUG_F("error:Sum check error!,check0x%02X,scrc=0x%02X\r\n",check,scrc);
  1149. return GtWorkMode;
  1150. }
  1151. pbuf+=2;//指向长度
  1152. //帧长度(1Byte)
  1153. ptmp_16 =(tUNION16_T *)pbuf;
  1154. RevLen = ptmp_16->data_16 ;
  1155. pbuf+=2;//指向命令字
  1156. //解析
  1157. ptmp_16 =(tUNION16_T *)pbuf;
  1158. cmd1Tmp = ptmp_16->data_8[0];
  1159. cmd2Tmp = ptmp_16->data_8[1];
  1160. pbuf +=2;//指向设备ID
  1161. if(cmd1Tmp == F1_CMD2)
  1162. {
  1163. switch(cmd2Tmp)
  1164. {
  1165. case 0xFF://启动升级,F1_CMD2_DOWM_SVR2WG_START_UPDATE
  1166. //
  1167. AT_AIR720_DEBUG_F("接收到升级指令!!!!!!!!!!!!!!!!!!!!!!\r\n");
  1168. ptmp_32 = (tUNION32_T *)pbuf;
  1169. ptmp_32_2 = (tUNION32_T *)&gt_config_para.DevId;
  1170. pbuf+=4;//指向参数信息
  1171. if((ptmp_32->data_32 == ptmp_32_2->data_32) ||(ptmp_32->data_32== 0xFFFFFFFF))
  1172. {//提取信息
  1173. pbuf+=1;
  1174. Updare_Paras_form_S.firmWareType = *pbuf++;//提取固件类型
  1175. Updare_Paras_form_S.desDeviceType = *pbuf++;
  1176. ptmp_32 =(tUNION32_T *)pbuf;
  1177. ptmp_32_2 = (tUNION32_T *)&Updare_Paras_form_S.desDeviceID;
  1178. ptmp_32_2->data_32 = ptmp_32->data_32;
  1179. pbuf +=4;
  1180. Updare_Paras_form_S.desDeviceChannel = *pbuf++;
  1181. ptmp_32 =(tUNION32_T *)pbuf;
  1182. ptmp_32_2 = (tUNION32_T *)&Updare_Paras_form_S.softWareOldVer;
  1183. ptmp_32_2->data_32 = ptmp_32->data_32;
  1184. pbuf +=4;
  1185. ptmp_32 =(tUNION32_T *)pbuf;
  1186. ptmp_32_2 = (tUNION32_T *)&Updare_Paras_form_S.softWareNewVer;
  1187. ptmp_32_2->data_32 = ptmp_32->data_32;
  1188. pbuf +=4;
  1189. //路径长度
  1190. Updare_Paras_form_S.srcUrlLen = *pbuf++;
  1191. AT_AIR720_DEBUG_F("路径长度=%d\r\n",Updare_Paras_form_S.srcUrlLen);
  1192. //路径
  1193. memcpy(Updare_Paras_form_S.ppath,pbuf,Updare_Paras_form_S.srcUrlLen);
  1194. AT_AIR720_DEBUG_F("url=\r\n");
  1195. AT_AIR720_DEBUG_NB(Updare_Paras_form_S.ppath,Updare_Paras_form_S.srcUrlLen);
  1196. printf("\r\n");
  1197. //
  1198. GtWorkMode = GATEWAY_UPDATE_DOWN_MODE;
  1199. AT_AIR720_DEBUG_F("F1_CMD2_DOWM_SVR2WG_START_UPDATE\r\n");
  1200. }else
  1201. {
  1202. //id不匹配不做处理
  1203. }
  1204. break;
  1205. case O9_CMD2:
  1206. break;
  1207. default:
  1208. break;
  1209. }
  1210. }
  1211. IWDG_Feed(); //喂狗
  1212. return GtWorkMode;
  1213. }
  1214. /********************************
  1215. * @brief Air720_Receive_Handle
  1216. * @par sbuf [uint8_t*] 帧缓存地址
  1217. * @par slen [uint8_t] 帧长度
  1218. * @retval 0初始成功,非0失败
  1219. ********************************/
  1220. DEV_WORK_MODE_T Air720_Receive_Handler2(uint8_t *pbuf,uint16_t plen)//接收,拆包,入队列
  1221. {
  1222. uint32_t i=0;
  1223. static uint32_t rcvCnt=0;
  1224. DEV_WORK_MODE_T GtWorkMode =DEV_MODE_ALL ;
  1225. AT_AIR720_DEBUG_F("接收,rcvCnt=%d,plen=%d:\r\n",rcvCnt++,plen);
  1226. if(plen<10)
  1227. return DEV_MODE_ALL;
  1228. AT_AIR720_DEBUG_NB(pbuf,plen);
  1229. AT_AIR720_DEBUG("\r\n");
  1230. if((pbuf[0]==0xFF)&&(pbuf[1]==0xEE)){
  1231. En_Queue(Air720_Rev_Sq,pbuf,AIR720_SQ_WIDTH,pbuf[2]+5);//AIR720_SQ_DEPTH,AIR720_SQ_WIDTH);
  1232. AT_AIR720_DEBUG_F("单独,接收到服务器指令,len=%d\r\n",pbuf[2]+5);
  1233. AT_AIR720_DEBUG_H(pbuf,pbuf[2]+5);
  1234. }
  1235. for(i=0;i<plen-5;i++){
  1236. if((pbuf[i+0]==0x0D)&&(pbuf[i+1]==0x0A)&&(pbuf[i+2]==0xFF)&&(pbuf[i+3]==0xEE)){
  1237. En_Queue(Air720_Rev_Sq,pbuf+i+2,AIR720_SQ_WIDTH,pbuf[i+4]+5);//AIR720_SQ_DEPTH,AIR720_SQ_WIDTH);
  1238. AT_AIR720_DEBUG_F("复合,接收到服务器指令,len=%d\r\n",pbuf[i+4]+5);
  1239. AT_AIR720_DEBUG_H(pbuf+i+2,pbuf[i+4]+5);
  1240. }
  1241. else{
  1242. }
  1243. }
  1244. return GtWorkMode;
  1245. }
  1246. /********************************
  1247. * @brief Air720_Receive_process
  1248. * @par sbuf [uint8_t*] 帧缓存地址
  1249. * @par slen [uint8_t] 帧长度
  1250. * @retval 0初始成功,非0失败
  1251. ********************************/
  1252. DEV_WORK_MODE_T Air720_Receive_process()//接收,拆包,入队列
  1253. {
  1254. uint32_t i=0;
  1255. uint8_t sout[128]={0};
  1256. uint8_t lout=0;
  1257. uint8_t *pbuf;
  1258. uint8_t slen=0;
  1259. uint8_t check=0;
  1260. uint8_t scrc=0x00;
  1261. uint8_t cmd1Tmp,cmd2Tmp;
  1262. tUNION32_T *ptmp_32 = NULL;
  1263. tUNION32_T *ptmp_32_2=NULL;
  1264. tUNION16_T *ptmp_16 = NULL;
  1265. tUpdate_t *pUpdateS =NULL;
  1266. DEV_WORK_MODE_T GtWorkMode =DEV_MODE_ALL ;
  1267. uint16_t RevLen;
  1268. static uint32_t cmdCnt=0;
  1269. if(!Check_Seqeue_Empty(Air720_Rev_Sq))
  1270. {
  1271. De_Queue(Air720_Rev_Sq,sout,sizeof(sout),(uint8_t *)&lout);
  1272. AT_AIR720_DEBUG_F("处理服务器指令,cmdCnt=%d\r\n",cmdCnt++);
  1273. pbuf=sout;
  1274. slen = pbuf[2]+5;
  1275. //和校验
  1276. check = 0;
  1277. for(i=0;i<slen-1;i++)
  1278. {
  1279. check = check ^ pbuf[i];
  1280. }
  1281. scrc = pbuf[slen-1];
  1282. if(check != scrc)
  1283. {
  1284. AT_AIR720_DEBUG_F("error:Sum check error!,check0x%02X,scrc=0x%02X\r\n",check,scrc);
  1285. return GtWorkMode;
  1286. }
  1287. pbuf+=2;//指向长度
  1288. //帧长度(1Byte)
  1289. ptmp_16 =(tUNION16_T *)pbuf;
  1290. RevLen = ptmp_16->data_16 ;
  1291. pbuf+=2;//指向命令字
  1292. //解析
  1293. ptmp_16 =(tUNION16_T *)pbuf;
  1294. cmd1Tmp = ptmp_16->data_8[0];
  1295. cmd2Tmp = ptmp_16->data_8[1];
  1296. pbuf +=2;//指向设备ID
  1297. AT_AIR720_DEBUG_F("处理服务器指令,cmdCnt=%d,cmd1Tmp=0x%02X,cmd2Tmp=0x%02X,\r\n",cmdCnt,cmd1Tmp,cmd2Tmp);
  1298. if(cmd1Tmp == F1_CMD2)
  1299. {
  1300. switch(cmd2Tmp)
  1301. {
  1302. case F1_CMD2_DOWM_SVR2WG_START_UPDATE://启动升级,
  1303. //
  1304. AT_AIR720_DEBUG_F("接收到升级指令!!!!!!!!!!!!!!!!!!!!!!\r\n");
  1305. ptmp_32 = (tUNION32_T *)pbuf;
  1306. ptmp_32_2 = (tUNION32_T *)&gt_config_para.DevId;
  1307. pbuf+=4;//指向参数信息
  1308. if((ptmp_32->data_32 == ptmp_32_2->data_32) ||(ptmp_32->data_32== 0xFFFFFFFF))
  1309. {//提取信息
  1310. pbuf+=1;
  1311. Updare_Paras_form_S.firmWareType = *pbuf++;//提取固件类型
  1312. Updare_Paras_form_S.desDeviceType = *pbuf++;
  1313. ptmp_32 =(tUNION32_T *)pbuf;
  1314. ptmp_32_2 = (tUNION32_T *)&Updare_Paras_form_S.desDeviceID;
  1315. ptmp_32_2->data_32 = ptmp_32->data_32;
  1316. pbuf +=4;
  1317. Updare_Paras_form_S.desDeviceChannel = *pbuf++;
  1318. ptmp_32 =(tUNION32_T *)pbuf;
  1319. ptmp_32_2 = (tUNION32_T *)&Updare_Paras_form_S.softWareOldVer;
  1320. ptmp_32_2->data_32 = ptmp_32->data_32;
  1321. pbuf +=4;
  1322. ptmp_32 =(tUNION32_T *)pbuf;
  1323. ptmp_32_2 = (tUNION32_T *)&Updare_Paras_form_S.softWareNewVer;
  1324. ptmp_32_2->data_32 = ptmp_32->data_32;
  1325. pbuf +=4;
  1326. //路径长度
  1327. Updare_Paras_form_S.srcUrlLen = *pbuf++;
  1328. AT_AIR720_DEBUG_F("路径长度=%d\r\n",Updare_Paras_form_S.srcUrlLen);
  1329. //路径
  1330. memcpy(Updare_Paras_form_S.ppath,pbuf,Updare_Paras_form_S.srcUrlLen);
  1331. AT_AIR720_DEBUG_F("url=\r\n");
  1332. AT_AIR720_DEBUG_NB(Updare_Paras_form_S.ppath,Updare_Paras_form_S.srcUrlLen);
  1333. printf("\r\n");
  1334. // //
  1335. // i=10;
  1336. // while(i--){
  1337. // IWDG_Feed(); //喂狗
  1338. // AT_AIR720_DEBUG_F("F1_CMD2_DOWM_SVR2WG_START_UPDATE\r\n");
  1339. // delay_ms(1000);
  1340. // }
  1341. // return GtWorkMode;
  1342. gt_config_para.is_udp_update = 1;//是UDP升级
  1343. GtWorkMode = GATEWAY_UPDATE_DOWN_MODE;
  1344. set_main_WorkMode(GtWorkMode);
  1345. AT_AIR720_DEBUG_F("F1_CMD2_DOWM_SVR2WG_START_UPDATE\r\n");
  1346. }else
  1347. {
  1348. //id不匹配不做处理
  1349. }
  1350. break;
  1351. default:
  1352. break;
  1353. }
  1354. }
  1355. else if(0x0C){
  1356. //接收到任何FF EE的数据,复位时间后延
  1357. time_gw_force_rst.counter=TickCounter;
  1358. AT_AIR720_DEBUG_F("心跳清零\r\n");
  1359. }
  1360. else if(0x0D){
  1361. }
  1362. else if(0xF2){
  1363. if(cmd2Tmp==0x11){
  1364. AT_AIR720_DEBUG_F("接收到复位网关指令!!!!!!!!!!!!!!!!!!!!!!\r\n");
  1365. NVIC_SystemReset();// 复位
  1366. }
  1367. }
  1368. }
  1369. return GtWorkMode;
  1370. }
  1371. //////////////////////////////////////////////////////////////////////////////////////////////
  1372. int aire720_closeHTTP_openUDP(int AireConnectState){
  1373. Uint8 sout[128];
  1374. Uint32 lout;
  1375. int res=255;
  1376. int i=0;
  1377. Uint32 uTemp32 = 0;
  1378. static Uint32 CIICR_retry_time=0;
  1379. if(AireConnectState){
  1380. AT_AIR720_DEBUG_F("关闭UDP或TCP,AT+CIPCLOSE!!!!,%d\r\n",uTemp32++);
  1381. if(air_send_cmd("AT+CIPCLOSE\r\n", "CLOSE OK", 200))
  1382. {
  1383. AT_AIR720_DEBUG_F("AT+CIPCLOSE ok!!!!\r\n");
  1384. }
  1385. else{
  1386. AT_AIR720_DEBUG_F("AT+CIPCLOSE failed!!!!\r\n");
  1387. }
  1388. }
  1389. AT_AIR720_DEBUG_F("AT,%d\r\n",uTemp32++);
  1390. if(air_send_cmd("AT\r\n", "OK", 200))
  1391. {
  1392. AT_AIR720_DEBUG_F("AT ok!!!!\r\n\r\n");
  1393. }
  1394. else{
  1395. AT_AIR720_DEBUG_F("AT failed!!!!\r\n\r\n");
  1396. }
  1397. AT_AIR720_DEBUG_F("ATTE0,%d\r\n",uTemp32++);
  1398. if(air_send_cmd("ATTE0\r\n", "OK", 200))
  1399. {
  1400. AT_AIR720_DEBUG_F("ATTE0 ok!!!!\r\n\r\n");
  1401. }
  1402. else{
  1403. AT_AIR720_DEBUG_F("ATTE0 failed!!!!\r\n\r\n");
  1404. }
  1405. AT_AIR720_DEBUG_F("设置为快发模式,AT+CIPQSEND=1,%d\r\n",uTemp32++);
  1406. if(air_send_cmd("AT+CIPQSEND=1\r\n", "OK", 200)) // 设置为快发模式
  1407. {
  1408. AT_AIR720_DEBUG_F("AT+CIPQSEND ok!!!!\r\n\r\n");
  1409. }
  1410. else{
  1411. AT_AIR720_DEBUG_F("AT+CIPQSEND failed!!!!\r\n\r\n");
  1412. }
  1413. AT_AIR720_DEBUG_F("启动任务,设置APN,AT+CSTT,%d\r\n",uTemp32++);
  1414. if(air_send_cmd("AT+CSTT\r\n", "OK", 200)) // 启动任务,设置APN
  1415. {
  1416. AT_AIR720_DEBUG_F("AT+CSTT ok!!!!\r\n\r\n");
  1417. }
  1418. else{
  1419. AT_AIR720_DEBUG_F("AT+CSTT failed!!!!\r\n\r\n");
  1420. }
  1421. AT_AIR720_DEBUG_F("激活移动场景,获取IP地址,AT+CIICR%d\r\n",uTemp32++);
  1422. if(air_send_cmd("AT+CIICR\r\n", "OK", 200)) // 激活移动场景,获取IP地址
  1423. {
  1424. AT_AIR720_DEBUG_F("AT+CIICR ok!!!!\r\n\r\n");
  1425. }
  1426. else{
  1427. AT_AIR720_DEBUG_F("AT+CSTT failed!!!!retry=%d\r\n\r\n",CIICR_retry_time);
  1428. CIICR_retry_time++;
  1429. if(CIICR_retry_time>5){
  1430. return res;
  1431. }
  1432. }
  1433. //LED_RUN_Set(LED_FLASH);
  1434. IWDG_Feed();
  1435. // 确保模块工作正常
  1436. AT_AIR720_DEBUG_F("查询分配的IP地址,AT+CIFSR,%d\r\n",uTemp32++);
  1437. if(air_send_cmd("AT+CIFSR\r\n", ".", 200)) //查询分配的IP地址
  1438. {
  1439. AT_AIR720_DEBUG_F("AT+CIFSR ok!!!!\r\n\r\n");
  1440. }
  1441. else{
  1442. AT_AIR720_DEBUG_F("AT+CIFSR failed!!!!\r\n\r\n");
  1443. return res;
  1444. }
  1445. //LED_RUN_Set(LED_FLASH);
  1446. IWDG_Feed();
  1447. res=0;
  1448. return 0;
  1449. }
  1450. /***返回工作模式**/
  1451. int flg = 1;
  1452. void AT_aire720_process(DEV_WORK_MODE_T *pmode){
  1453. Uint16 retryTimes = 0,sendlen,flg = 1;
  1454. Uint16 lora_rcv_len = 0;
  1455. Uint8 lora_rcv_buffer[128];
  1456. Uint16 at_send_len = 0;
  1457. Uint8 at_send_buffer[128];
  1458. Uint16 cmd_len = 0;
  1459. Uint32 uTemp32 = 0;
  1460. Uint8 cmd_str[32];
  1461. Uint8 buffer[256];
  1462. DEV_WORK_MODE_T WorkMode = *pmode,ret;
  1463. static Uint32 retry_time=0;
  1464. static Uint32 CIICR_retry_time=0;
  1465. int i;
  1466. char *pchar = "AT+CPIN1111111111111111111111\r\n";
  1467. //心跳,超过一定时间没有节点的数据,则网关自己上传心跳
  1468. if((*pmode == GATEWAY_WORK_MODE)&&(TickCounter - time_gw_heartbeat.counter > time_gw_heartbeat.timeOut)){
  1469. time_gw_heartbeat.counter = TickCounter;
  1470. UDP_0C_frame();
  1471. AT_AIR720_DEBUG_F("gw heartbeat time out\r\n");
  1472. }
  1473. IWDG_Feed(); //喂狗
  1474. if(!Check_Seqeue_Empty(lora_rx_sq)){
  1475. IWDG_Feed(); //喂狗
  1476. lora_rcv_len = 0;
  1477. memset(lora_rcv_buffer,0,sizeof(lora_rcv_buffer));
  1478. De_Queue(lora_rx_sq,lora_rcv_buffer,sizeof(lora_rcv_buffer),(uint8_t *)&lora_rcv_len);
  1479. AT_AIR720_DEBUG_F("lora receive:len=%02d,msg=\r\n",lora_rcv_len);
  1480. AT_AIR720_DEBUG_H(lora_rcv_buffer,lora_rcv_len);
  1481. AT_AIR720_DEBUG("\r\n");
  1482. IWDG_Feed(); //喂狗
  1483. Air720_analysis(lora_rcv_buffer,lora_rcv_len);
  1484. IWDG_Feed(); //喂狗
  1485. //int Air720_analysis(uint8_t *sbuf,uint8_t slen){
  1486. }
  1487. switch(AT_aire720_State){
  1488. case AT_AIRE720_STATE_IDLE:
  1489. // AT_aire720_State = AT_AIRE720_STATE_SEND;
  1490. break;
  1491. case AT_AIRE720_STATE_INIT:
  1492. Air720_Init();
  1493. #if 0
  1494. AT_AIR720_DEBUG_F("尝试联网,retry_time=%d\r\n",retry_time++);
  1495. if(aire720_closeHTTP_openUDP(0)){
  1496. AT_AIR720_DEBUG_F("尝试联网 failed!!!!retry_time=%d\r\n",retry_time++);
  1497. if(retry_time>5){
  1498. AT_aire720_State =AT_AIRE720_STATE_CONNECTING;
  1499. retry_time=0;
  1500. }
  1501. break;
  1502. }
  1503. else{
  1504. AT_AIR720_DEBUG_F("尝试联网 OK\r\n");
  1505. }
  1506. #endif
  1507. if(1){
  1508. for(i=0;i<10;i++){
  1509. AT_AIR720_DEBUG_F(".\r\n");
  1510. IWDG_Feed(); //喂狗
  1511. delay_ms(1000);
  1512. //LED_RUN_Set(LED_FLASH);
  1513. }
  1514. AT_AIR720_DEBUG_F("start AT\r\n");
  1515. cmd_len = sprintf((char *)cmd_str,"AT\r\n");
  1516. USART2_SendNByte(cmd_str, cmd_len);
  1517. IWDG_Feed(); //喂狗
  1518. delay_ms(1000);
  1519. IWDG_Feed(); //喂狗
  1520. //LED_RUN_Set(LED_FLASH);
  1521. AT_AIR720_DEBUG_F("start ATE0&W\r\n");
  1522. cmd_len = sprintf((char *)cmd_str,"ATE0&W\r\n");
  1523. USART2_SendNByte(cmd_str, cmd_len);
  1524. IWDG_Feed(); //喂狗
  1525. delay_ms(1000);
  1526. IWDG_Feed(); //喂狗
  1527. //LED_RUN_Set(LED_FLASH);
  1528. AT_AIR720_DEBUG_F("start AT+CIPMUX=0\r\n");
  1529. cmd_len = sprintf((char *)cmd_str,"AT+CIPMUX=0\r\n");
  1530. USART2_SendNByte(cmd_str, cmd_len);
  1531. IWDG_Feed(); //喂狗
  1532. delay_ms(1000);
  1533. IWDG_Feed(); //喂狗
  1534. //LED_RUN_Set(LED_FLASH);
  1535. AT_AIR720_DEBUG_F("start AT+CIPQSEND=1\r\n");
  1536. cmd_len = sprintf((char *)cmd_str,"AT+CIPQSEND=1\r\n"); // 设置为快发模式
  1537. USART2_SendNByte(cmd_str, cmd_len);
  1538. IWDG_Feed(); //喂狗
  1539. delay_ms(1000);
  1540. IWDG_Feed(); //喂狗
  1541. //LED_RUN_Set(LED_FLASH);
  1542. AT_AIR720_DEBUG_F("start AT+CSTT\r\n");
  1543. cmd_len = sprintf((char *)cmd_str,"AT+CSTT\r\n"); // 启动任务,设置APN
  1544. USART2_SendNByte(cmd_str, cmd_len);
  1545. IWDG_Feed(); //喂狗
  1546. delay_ms(1000);
  1547. IWDG_Feed(); //喂狗
  1548. //LED_RUN_Set(LED_FLASH);
  1549. AT_AIR720_DEBUG_F("start AT+CIICR\r\n");
  1550. cmd_len = sprintf((char *)cmd_str,"AT+CIICR\r\n"); // 激活移动场景,获取IP地址
  1551. USART2_SendNByte(cmd_str, cmd_len);
  1552. IWDG_Feed(); //喂狗
  1553. delay_ms(1000);
  1554. IWDG_Feed(); //喂狗
  1555. //LED_RUN_Set(LED_FLASH);
  1556. AT_AIR720_DEBUG_F("start AT+CIFSR\r\n");
  1557. cmd_len = sprintf((char *)cmd_str,"AT+CIFSR\r\n"); //查询分配的IP地址
  1558. USART2_SendNByte(cmd_str, cmd_len);
  1559. IWDG_Feed(); //喂狗
  1560. delay_ms(1000);
  1561. IWDG_Feed(); //喂狗
  1562. //LED_RUN_Set(LED_FLASH);
  1563. }
  1564. else{
  1565. AT_AIR720_DEBUG_F("AT_AIRE720_STATE_INIT!!!!,%d\r\n",uTemp32++);
  1566. for(i=0;i<5;i++){
  1567. AT_AIR720_DEBUG_F(".%d\r\n",uTemp32++);
  1568. IWDG_Feed(); //喂狗
  1569. delay_ms(1000);
  1570. //LED_RUN_Set(LED_FLASH);
  1571. }
  1572. AT_AIR720_DEBUG_F("AT,%d\r\n",uTemp32++);
  1573. if(air_send_cmd("AT\r\n", "OK", 200))
  1574. {
  1575. AT_AIR720_DEBUG_F("AT ok!!!!\r\n\r\n");
  1576. }
  1577. else{
  1578. AT_AIR720_DEBUG_F("AT failed!!!!\r\n\r\n");
  1579. }
  1580. AT_AIR720_DEBUG_F("ATTE0,%d\r\n",uTemp32++);
  1581. if(air_send_cmd("ATTE0\r\n", "OK", 200))
  1582. {
  1583. AT_AIR720_DEBUG_F("ATTE0 ok!!!!\r\n\r\n");
  1584. }
  1585. else{
  1586. AT_AIR720_DEBUG_F("ATTE0 failed!!!!\r\n\r\n");
  1587. }
  1588. //AT_AIR720_DEBUG_F("设置为快发模式,AT+CIPQSEND=1,%d\r\n",uTemp32++);
  1589. if(air_send_cmd("AT+CIPQSEND=1\r\n", "OK", 200)) // 设置为快发模式
  1590. {
  1591. AT_AIR720_DEBUG_F("AT+CIPQSEND ok!!!!\r\n\r\n");
  1592. }
  1593. else{
  1594. AT_AIR720_DEBUG_F("AT+CIPQSEND failed!!!!\r\n\r\n");
  1595. }
  1596. //AT_AIR720_DEBUG_F("启动任务,设置APN,AT+CSTT,%d\r\n",uTemp32++);
  1597. if(air_send_cmd("AT+CSTT\r\n", "OK", 200)) // 启动任务,设置APN
  1598. {
  1599. AT_AIR720_DEBUG_F("AT+CSTT ok!!!!\r\n\r\n");
  1600. }
  1601. else{
  1602. AT_AIR720_DEBUG_F("AT+CSTT failed!!!!\r\n\r\n");
  1603. }
  1604. //AT_AIR720_DEBUG_F("激活移动场景,获取IP地址,AT+CIICR%d\r\n",uTemp32++);
  1605. if(air_send_cmd("AT+CIICR\r\n", "OK", 1000)) // 激活移动场景,获取IP地址
  1606. {
  1607. AT_AIR720_DEBUG_F("AT+CIICR ok!!!!\r\n\r\n");
  1608. }
  1609. else{
  1610. AT_AIR720_DEBUG_F("AT+CSTT failed!!!!retry=%d\r\n\r\n",CIICR_retry_time);
  1611. CIICR_retry_time++;
  1612. if(CIICR_retry_time>5){
  1613. AT_aire720_State =AT_AIRE720_STATE_CONNECTING;
  1614. CIICR_retry_time=0;
  1615. }
  1616. break;
  1617. }
  1618. //LED_RUN_Set(LED_FLASH);
  1619. IWDG_Feed();
  1620. // 确保模块工作正常
  1621. AT_AIR720_DEBUG_F("查询分配的IP地址,AT+CIFSR,%d\r\n",uTemp32++);
  1622. if(air_send_cmd("AT+CIFSR\r\n", ".", 200)) //查询分配的IP地址
  1623. {
  1624. AT_AIR720_DEBUG_F("AT+CIFSR ok!!!!\r\n\r\n");
  1625. }
  1626. else{
  1627. AT_AIR720_DEBUG_F("AT+CIFSR failed!!!!\r\n\r\n");
  1628. }
  1629. //LED_RUN_Set(LED_FLASH);
  1630. IWDG_Feed();
  1631. }
  1632. AT_aire720_State =AT_AIRE720_STATE_CONNECTING;
  1633. break;
  1634. case AT_AIRE720_STATE_CONNECTING:
  1635. /* 连接服务器 */
  1636. retryTimes = 0;
  1637. while(retryTimes++ < UDP_CONNECT_RETRY_TIMES)
  1638. {
  1639. IWDG_Feed();
  1640. #if TEST_TEST_TEST
  1641. //124.70.207.36 9084
  1642. //47.104.15.180 9082
  1643. //
  1644. // cmd_len = sprintf((char *)cmd_str,"AT+CIPSTART=\"UDP\",\"124.70.207.36\",\"9084\"\r\n");
  1645. cmd_len = sprintf((char *)cmd_str,"AT+CIPSTART=\"UDP\",\"47.104.15.180\",\"9082\"\r\n");
  1646. AT_AIR720_DEBUG_F("%s,%d\r\n",cmd_str,uTemp32++);
  1647. #else
  1648. cmd_len = sprintf((char *)cmd_str,"AT+CIPSTART=\"UDP\",\"47.104.15.180\",\"9080\"\r\n");
  1649. AT_AIR720_DEBUG_F("%s,%d\r\n",cmd_str,uTemp32++);
  1650. #endif
  1651. if(air_send_cmd((char *)cmd_str, "OK", 100))/*建立UDP链接*/
  1652. {
  1653. AT_aire720_State = AT_AIRE720_STATE_CONNECT_OK;
  1654. AT_AIR720_DEBUG_F("UDP connect ok!!!!,%d\r\n",uTemp32++);
  1655. //Air720_send(cmd_str,cmd_len);
  1656. // Air720_send((uint8_t *)pchar,strlen((char *)pchar));
  1657. break;
  1658. }
  1659. //LED_RUN_Set(LED_FLASH);
  1660. }
  1661. if(AT_aire720_State != AT_AIRE720_STATE_CONNECT_OK)
  1662. {
  1663. AT_AIR720_DEBUG_F("ERROR:UDP connect fail!!!!,%d\r\n",uTemp32++);
  1664. AT_AIR720_DEBUG_F("ERROR:UDP connect fail!!!!,%d\r\n",uTemp32++);
  1665. AT_AIR720_DEBUG_F("ERROR:UDP connect fail!!!!,%d\r\n",uTemp32++);
  1666. NVIC_SystemReset();// 复位
  1667. }
  1668. else
  1669. {
  1670. IWDG_Feed(); //喂狗
  1671. delay_ms(200);
  1672. AT_AIR720_DEBUG_F("%d\r\n",uTemp32++);
  1673. if(air_send_IMEI_Cmd(10))
  1674. {
  1675. AT_AIR720_DEBUG_F("read imei,%d\r\n",uTemp32++);
  1676. }
  1677. //LED_RUN_Set(LED_FLASH);
  1678. AT_AIR720_DEBUG_F("%d\r\n",uTemp32++);
  1679. if(air_send_ICCID_Cmd(10))
  1680. {
  1681. AT_AIR720_DEBUG_F("read iccid,%d\r\n",uTemp32++);
  1682. }
  1683. //LED_RUN_Set(LED_FLASH);
  1684. //联网之后先心跳
  1685. UDP_0C_frame();
  1686. //无服务器反馈指令时,设置强制复位时间1小时
  1687. time_gw_force_rst.timeOut=60*60*1000;
  1688. }
  1689. // for(i=0;i<NODE_NUM;i++){
  1690. // LED_Set(i,LED_OFF);
  1691. // }
  1692. LED_OFF_ALL();
  1693. break;
  1694. case AT_AIRE720_STATE_CONNECT_OK://指令收发
  1695. //air_send_cmd("AT+CIPSEND=25", 0, 300);/*建立UDP链接*/
  1696. if(!Check_Seqeue_Empty(Air720_Send_Sq)){
  1697. IWDG_Feed(); //喂狗
  1698. at_send_len = 0;
  1699. memset(at_send_buffer,0,sizeof(at_send_buffer));
  1700. De_Queue(Air720_Send_Sq,at_send_buffer,sizeof(at_send_buffer),(uint8_t *)&at_send_len);
  1701. //AT_AIR720_DEBUG_F("at_send_len=%d\r\n",at_send_len);
  1702. Air720_send(at_send_buffer,at_send_len);
  1703. IWDG_Feed(); //喂狗
  1704. delay_ms(100);
  1705. IWDG_Feed(); //喂狗
  1706. }
  1707. //接收处理
  1708. #if 0
  1709. if(!Check_Seqeue_Empty(Air720_Rev_Sq)){
  1710. IWDG_Feed(); //喂狗
  1711. sendlen = 0;
  1712. memset(buffer,0,sizeof(buffer));
  1713. De_Queue(Air720_Rev_Sq,buffer,sizeof(buffer),(uint8_t *)&sendlen);
  1714. Air720_Receive_Handle(buffer,sendlen);
  1715. }
  1716. if (USART2_ready_buf_ok == RevOK)
  1717. {
  1718. AT_AIR720_DEBUG_F("UDP ready Entery!!!!\r\n");
  1719. flg = 0;
  1720. for(i = 0;i<USART2_ready_buf_len; i++)
  1721. {
  1722. if(USART2_ready_buf[i] == 0xff)
  1723. flg = 1;
  1724. //if(flg)
  1725. //AT_AIR720_DEBUG_F("0x%02X ",USART2_ready_buf[i]);
  1726. }
  1727. //AT_AIR720_DEBUG_F("%p\n",USART2_ready_buf);
  1728. if((ret = Air720_Receive_Handler2(&USART2_ready_buf[0],USART2_ready_buf_len))!=DEV_MODE_ALL)
  1729. *pmode = ret;
  1730. USART2_ready_buf_ok = 0;
  1731. }
  1732. else
  1733. memset(USART2_ready_buf,0,USART2_BUF_SIZE);
  1734. #endif
  1735. if (USART2_ready_buf_ok == RevOK){
  1736. Air720_Receive_Handler2(&USART2_ready_buf[0],USART2_ready_buf_len);
  1737. USART2_ready_buf_ok = 0;
  1738. memset(USART2_ready_buf,0,USART2_BUF_SIZE);
  1739. }
  1740. if((ret = Air720_Receive_process())!=DEV_MODE_ALL){
  1741. *pmode=ret;
  1742. return;
  1743. }
  1744. break;
  1745. case AT_AIRE720_STATE_RE_CONNECT:
  1746. //
  1747. // AT_AIR720_DEBUG_F("重新尝试联网,retry_time=%d\r\n",retry_time++);
  1748. // if(aire720_closeHTTP_openUDP(1)){
  1749. // AT_AIR720_DEBUG_F("尝试联网 failed!!!!retry_time=%d\r\n",retry_time++);
  1750. // if(retry_time>5){
  1751. // AT_aire720_State =AT_AIRE720_STATE_CONNECTING;
  1752. // retry_time=0;
  1753. // }
  1754. // break;
  1755. // }
  1756. // else{
  1757. // AT_AIR720_DEBUG_F("尝试联网 OK\r\n");
  1758. // }
  1759. //
  1760. // AT_AIR720_DEBUG_F("关闭UDP或TCP,AT+CIPCLOSE!!!!,%d\r\n",uTemp32++);
  1761. // if(air_send_cmd("AT+CIPCLOSE\r\n", "CLOSE OK", 200))
  1762. // {
  1763. // AT_AIR720_DEBUG_F("AT+CIPCLOSE ok!!!!\r\n");
  1764. // }
  1765. // else{
  1766. // AT_AIR720_DEBUG_F("AT+CIPCLOSE failed!!!!\r\n");
  1767. // }
  1768. AT_aire720_State =AT_AIRE720_STATE_CONNECTING;
  1769. break;
  1770. default:
  1771. AT_aire720_State = AT_AIRE720_STATE_IDLE;
  1772. break;
  1773. }
  1774. return;
  1775. }
  1776. void set_at_aire720_workState(tAT_AIRE720_StateCodes mode){
  1777. AT_aire720_State = mode;
  1778. return;
  1779. }