Modem.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. #include "includes.h"
  2. SUT_MODEM_AT_MSG sutAtm,sutAtmPro;
  3. unsigned char ModemVer[15];
  4. void ModemPinConfig(void)
  5. {
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  10. GPIO_InitStructure.GPIO_Pin = MODEM_RESET_PIN;
  11. GPIO_Init(MODEM_RESET_PORT, &GPIO_InitStructure);
  12. // GPIO_InitStructure.GPIO_Pin = MODEM_PWRKEY_PIN;
  13. //
  14. // GPIO_Init(MODEM_PWRKEY_PORT, &GPIO_InitStructure);
  15. GPIO_InitStructure.GPIO_Pin = MODEM_PWREN_PIN;
  16. GPIO_Init(MODEM_PWREN_PORT, &GPIO_InitStructure);
  17. //USBorTTL SWITCH
  18. GPIO_InitStructure.GPIO_Pin = USBORTTL_PIN;
  19. GPIO_Init(USBORTTL_PORT, &GPIO_InitStructure);
  20. //MODEM DATE or UPDATE
  21. GPIO_InitStructure.GPIO_Pin = MODEM_UPDATE_PIN;
  22. GPIO_Init(MODEM_UPDATE_PORT, &GPIO_InitStructure);
  23. USBORTTL_HIGH;
  24. MODEM_UPDATE_LOW;
  25. MODEM_RESET_LOW;
  26. //MODEM_PWREN_LOW;
  27. }
  28. void ModemSendAt(char *p){
  29. unsigned short len;
  30. len=strlen(p);
  31. Uart2Send((unsigned char *)p,len);
  32. }
  33. /************************************************************************************
  34. *
  35. *************************************************************************************/
  36. void ModemSendData(unsigned char *pData,unsigned short datalen)
  37. {
  38. Uart2Send(pData,datalen);
  39. }
  40. void ModemVersionGet(char *msg)
  41. {//InnerVersion: LLA0029_0016_1.0.57_L0901_EFS2.6
  42. char j,bufTemp[30],version[10],type,countFlag;
  43. if(0==ModemStrCmp(msg,"InnerVersion:")){
  44. countFlag=0;
  45. for(j=0;j<strlen(msg);j++){
  46. if(msg[j] == '_'){
  47. countFlag++;
  48. if(countFlag == 1){
  49. version[0] = msg[j+3];
  50. version[1] = msg[j+4];
  51. }else if(countFlag == 3){
  52. version[2] = msg[j+2];
  53. version[3] = msg[j+3];
  54. version[4] = msg[j+4];
  55. version[5] = msg[j+5];
  56. version[6] = 0;
  57. snprintf(bufTemp, sizeof(bufTemp), "ModemVer:%s",version);
  58. SlwTrace(INF, bufTemp, 1);
  59. g_iModemVer=atoi(version);
  60. }
  61. }
  62. }
  63. }
  64. }
  65. void SetDefaultSpkMic(void){
  66. char sendInfo[40];
  67. snprintf(sendInfo, sizeof(sendInfo), "at+syscmd=start_pcm volume ");
  68. if(1) strcat(sendInfo, "7 7\r\n");//这里1根据实际参数替换吧
  69. else strcat(sendInfo, "7 5\r\n");
  70. ModemSendAt(sendInfo);
  71. }
  72. char IMEI[18]={0};
  73. char *getIMEI(void){return IMEI;}
  74. void ModemGetIMEI(char *msg){
  75. //+LSHIMEI:862015039899963
  76. ReplaceStrWithN(msg);
  77. strncpy(IMEI, msg+9, sizeof(IMEI));
  78. printf("IMEI:%s\r\n",IMEI);
  79. }
  80. void ModemGetTime(char *msg)
  81. {
  82. USER_RTC_DEF tmpTime;
  83. //+CCLK: "20/07/03,09:18:32+32"
  84. ReplaceStrWithN(msg);
  85. tmpTime.year=atoi(&msg[8]);
  86. tmpTime.month=atoi(&msg[11]);
  87. tmpTime.day=atoi(&msg[14]);
  88. tmpTime.hour=atoi(&msg[17]);
  89. tmpTime.min=atoi(&msg[20]);
  90. tmpTime.second=atoi(&msg[23]);
  91. RTC_UserSetTime(tmpTime);
  92. printf("\r\nNewTime:%02d-%02d-%02d %02d:%02d:%02d\r\n",
  93. tmpTime.year,tmpTime.month,tmpTime.day,
  94. tmpTime.hour,tmpTime.min,tmpTime.second);
  95. }
  96. char CCID[21]={0};
  97. char *getICCID(void){return CCID;}
  98. void ModemGetICCID(char *msg){
  99. char bufTemp[3],info[20];
  100. //^SCID: 89860316452001903429
  101. memcpy(CCID, &msg[7], sizeof(CCID));
  102. CCID[20]=0;
  103. bufTemp[0] = CCID[4];
  104. bufTemp[1] = CCID[5];
  105. bufTemp[2] = 0;
  106. switch(atoi(bufTemp))
  107. {
  108. case 1:
  109. case 6:
  110. case 9:thisYunYingShang = CHINA_UNICOM;
  111. snprintf(info,sizeof(info), "CHINA_UNICOM]");
  112. break;
  113. case 0:
  114. case 2:
  115. case 4:
  116. case 7:thisYunYingShang = CHINA_MOBILE;
  117. snprintf(info,sizeof(info), "CHINA_MOBILE]");
  118. break;
  119. case 3:
  120. case 8:
  121. case 11:thisYunYingShang = CHINA_TELECOM;
  122. snprintf(info,sizeof(info), "CHINA_TELECOM]");
  123. break;
  124. default:snprintf(info,sizeof(info), "UNKNOW-ICCID]");
  125. break;
  126. }
  127. printf("ICCID:%s %s\r\n", CCID, info);
  128. }
  129. void ModemSetPocPara(char *msg,int len){
  130. //+POC:0200000069643D313030303031343031343B69703D3138332E3133312E31332E31303B7077643D3135303034343739303438383931343B646F6D61696E3D7777772E6869676F73706F632E636F6D3B
  131. //id=1000014014;ip=183.131.13.10;pwd=150044790488914;domain=www.higospoc.com;
  132. char buf[40];
  133. char buf1[100];
  134. char idFlag=0;
  135. char ipFlag=0;
  136. char pwdFlag=0;
  137. char domainFlag=0;
  138. char enableChangeIp=1;
  139. msg[len-3]=0;
  140. len=AsciiHexStringToHexBytes(&msg[13], msg);
  141. msg[len]=0;
  142. //找id
  143. len=GetParaFromStr(msg,"id",buf);
  144. snprintf(buf1, sizeof(buf1),"%lu",sutProductPara.PSN);
  145. if(0!=strcmp(buf1, buf)) idFlag=1;;
  146. // //找ip
  147. // len=GetParaFromStr(msg,"ip",buf);
  148. // snprintf(buf1, sizeof(buf1), "%s", getPIPAddr());
  149. // if(0!=strcmp(buf1, buf)) ipFlag=1;
  150. //找pwd
  151. len=GetParaFromStr(msg,"pwd",buf);
  152. snprintf(buf1, sizeof(buf1), "%s",DEV_HARDID);
  153. if(0!=strcmp(buf1, buf)) pwdFlag=1;
  154. //找domain
  155. switch(newPara.serList.defaultuse)
  156. {
  157. case SER_HZ:
  158. case SER_SD:
  159. case SER_US:
  160. break;
  161. case SER_IP:
  162. case SER_JIQUN:
  163. if(newPara.serList.defaultuse==SER_IP)snprintf(buf1, sizeof(buf1), "%s",newPara.serList.ipFenFa);
  164. else if(newPara.serList.defaultuse==SER_JIQUN)snprintf(buf1, sizeof(buf1), "%s",newPara.serList.jiqun);
  165. len=GetParaFromStr(msg,"domain",buf); //domain
  166. if(0!=strcmp(buf1, buf)) domainFlag=1;
  167. //modify by wjl 0609
  168. //但使用集群或者IP分发的时候,保证不去更新ip即可
  169. enableChangeIp=0;
  170. break;
  171. }
  172. //找ip
  173. if(enableChangeIp!=0){//modify by wjl 0609
  174. len=GetParaFromStr(msg,"ip",buf);
  175. snprintf(buf1, sizeof(buf1), "%s", getPIPAddr());
  176. if(0!=strcmp(buf1, buf)) ipFlag=1;
  177. }
  178. if(idFlag == 0 && ipFlag==0 && pwdFlag==0&&domainFlag==0) {
  179. SlwTrace(INF,"POC still",1);
  180. return;
  181. }
  182. RESET_ALL:
  183. ModemSendAt("AT+POC=010000");
  184. //更新id
  185. if(idFlag != 0){
  186. snprintf(buf, sizeof(buf),"id=%lu;",sutProductPara.PSN);
  187. AscStrToHexStr(buf,buf1);
  188. ModemSendAt(buf1);
  189. }
  190. //更新ip
  191. if(enableChangeIp!=0){//modify by wjl 0609
  192. //if(ipFlag != 0){
  193. snprintf(buf, sizeof(buf), "ip=%s;", getPIPAddr());
  194. AscStrToHexStr(buf,buf1);
  195. ModemSendAt(buf1);
  196. //}
  197. }
  198. //更新pwd
  199. // if(pwdFlag != 0){
  200. snprintf(buf, sizeof(buf), "pwd=%s;",DEV_HARDID);
  201. AscStrToHexStr(buf,buf1);
  202. ModemSendAt(buf1);
  203. //}
  204. if(newPara.serList.defaultuse==SER_IP)snprintf(buf, sizeof(buf), "domain=%s;",newPara.serList.ipFenFa);
  205. else if(newPara.serList.defaultuse==SER_JIQUN)snprintf(buf, sizeof(buf), "domain=%s;",newPara.serList.jiqun);
  206. else{
  207. snprintf(buf, sizeof(buf), "domain=;");
  208. AscStrToHexStr(buf,buf1);
  209. }
  210. AscStrToHexStr(buf,buf1);
  211. ModemSendAt(buf1);
  212. ModemSendAt("\r\n");
  213. SlwTrace(INF,"Rst_POCPara",1);
  214. }
  215. void MeSpeak(ENCODE_DEF type, char *voice)
  216. {
  217. char buf[20];//
  218. //SpeakerCtrl(1);//wjl
  219. snprintf(buf, sizeof(buf), "AT+LSHTTS=%d,\"",type);
  220. ModemSendAt(buf);
  221. ModemSendAt(voice);
  222. // if(ENCODE_UNICODEBigend==type)
  223. // else TTSdaxieguibi(voice);
  224. ModemSendAt("\"\r\n");
  225. sutPocStatus.TTS=1;
  226. }
  227. void ModemApnConfig(void)
  228. {
  229. char needAuthLogin=0;
  230. char buf[100];
  231. char buf2[80];
  232. char i,t;
  233. char ApnSetFlag=0;
  234. char *apnName=newPara.apnList.apnList[newPara.apnList.defaultuse].account;
  235. char *apnPass=newPara.apnList.apnList[newPara.apnList.defaultuse].pass;
  236. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  237. snprintf(buf, sizeof(buf), "Accessp:");
  238. if(apnName[0] ==0 ||
  239. apnPass[0] ==0)
  240. {//名称或密码为空不配置,因为模块不支持
  241. strcat(buf, "unsupport-Empty");
  242. }else
  243. {
  244. snprintf(buf2, sizeof(buf2),"AT+CSTT=\"%s\",\"%s\",\"%s\"\r\n",newPara.apnList.APN_Name,apnName,apnPass);
  245. ModemSendAt(buf2);
  246. snprintf(buf2, sizeof(buf2), "%s,%s,%s",newPara.apnList.APN_Name,apnName,apnPass);
  247. strcat(buf,buf2);
  248. needAuthLogin=1;
  249. }
  250. SlwTrace(INF, buf,1);
  251. if(needAuthLogin != 0){
  252. //认证
  253. snprintf(buf, sizeof(buf),"AUTH-LOGIN:");
  254. switch(newPara.authType){
  255. case AUTH_LOGIN_PAP:strcat(buf, "PAP");
  256. case AUTH_LOGIN_CHAP:strcat(buf, "CHAP");
  257. snprintf(buf2, sizeof(buf2),"AT+CGAUTH=1,%d,%s,%s\r\n",newPara.authType,apnName,apnPass);
  258. ModemSendAt(buf2);
  259. SlwTrace(INF,buf2,0);
  260. break;
  261. case AUTH_LOGIN_NONE:strcat(buf, "NONE");
  262. break;
  263. default:strcat(buf, " Do nothing");
  264. break;
  265. }
  266. SlwTrace(INF,buf, 1);
  267. // ModemSendAt(buf2);
  268. // SlwTrace(INF,buf2,0);
  269. __nop();__nop();
  270. SlwTrace(INF,"AuthLogin Done",1);
  271. }
  272. }
  273. //////////////////////////////////////////
  274. void getModemModule(char *msg){
  275. memcpy(ModemVer,msg,strlen(msg)-2);
  276. SlwTrace(INF, msg,0);
  277. }
  278. void getModemVersion(char *msg){
  279. short j;
  280. char countFlag,version[10];
  281. SlwTrace(INF, msg, 0);
  282. countFlag=0;
  283. for(j=0;j<strlen(msg);j++){
  284. if(msg[j] == '_'){
  285. countFlag++;
  286. if(countFlag == 1){
  287. version[0] = msg[j+3];
  288. version[1] = msg[j+4];
  289. }else if(countFlag == 3)
  290. {
  291. version[2] = msg[j+2];
  292. version[3] = msg[j+3];
  293. version[4] = msg[j+4];
  294. version[5] = msg[j+5];
  295. version[6] = 0;
  296. g_iModemVer=atoi(version);
  297. printf("ModemVer:%d\r\n",g_iModemVer);
  298. }
  299. }
  300. }
  301. }
  302. //AT+POC=version
  303. //+POC:BROAD-3.0.7-20200812-release
  304. void getPocVersion(char *msg,HGS_POC_DEF type){
  305. int i,j,len,ver;
  306. char bufTemp[40];
  307. len = strlen(msg);
  308. j=0;
  309. for(i=0;i<len;i++){
  310. if(msg[i] == '\r'){
  311. bufTemp[j]=0;
  312. strncpy(g_iPocVer,bufTemp,sizeof(g_iPocVer));
  313. //ver=atoi(bufTemp);
  314. snprintf(bufTemp, sizeof(bufTemp),"POCver:%s<->%s", bufTemp,msg);
  315. SlwTrace(INF, bufTemp,0);
  316. // g_iPocVer=ver;
  317. return;
  318. }else if(msg[i] >= '0' && msg[i] <= '9') bufTemp[j++]=msg[i];
  319. }
  320. }
  321. void CheckPocType(void)
  322. {
  323. hgs_poc_type=POC_OWN;//默认是西安的,然后通过POC版本号来判断是西安的还是自研的POC
  324. }
  325. void ModemOwnPocSet(void)
  326. {
  327. if(hgs_poc_type != POC_OWN) return;
  328. ModemSendAt("AT+POC=3000000100\r\n");//GBK
  329. __nop();__nop();
  330. ModemSendAt("AT+POC=030000\r\n");//启动登陆,POC默认打开的
  331. __nop();__nop();
  332. }
  333. void getPocCode(char *msg){
  334. if(msg[14]=='0') sutPocStatus.codeType=0;
  335. else sutPocStatus.codeType=1;
  336. printf("PocCode:%d\r\n", sutPocStatus.codeType);
  337. }
  338. //total 成员总数
  339. //一次获取个数最多5个,取决于显示条目个数
  340. //前提是要使用简短模式
  341. char SimpleUserInfoScan(uint8_t firstIn,uint8_t direction)
  342. {
  343. static char first=1;
  344. static unsigned char machine;
  345. static unsigned int timer;
  346. char buf[40];//30
  347. char ret =0;
  348. if(firstIn && first){
  349. sutPocStatus.handleIndex=0;//当前页
  350. machine=0;
  351. first=0;
  352. ret=0;
  353. }
  354. switch(machine){
  355. case 0:
  356. //ShowMessageBox("请稍候...");
  357. if(sutUIstatus.Status==UIS_MENU_GROUP_SEL){
  358. if(hgs_poc_type==POC_BND) snprintf(buf, sizeof(buf),"AT+POC=groupnum\r\n");//先更新总数
  359. else snprintf(buf, sizeof(buf),"AT+POC=3D0000\r\n");//先更新总数
  360. }
  361. else {
  362. if(hgs_poc_type==POC_BND)snprintf(buf, sizeof(buf),"AT+POC=membernum,%d\r\n",sutPocStatus.LocalGroup.ID);//先更新总数
  363. else snprintf(buf, sizeof(buf),"AT+POC=3E0000\r\n");//先更新总数
  364. }
  365. ModemSendAt(buf);
  366. SlwTrace(INF,buf,0);
  367. sutPocStatus.ListUpdate=0;
  368. sutPocStatus.ListFillIndex=0;
  369. uTimerStart(&timer, 500);//500
  370. machine=1;
  371. break;
  372. case 1:
  373. if(sutPocStatus.ListUpdate || uTimerExpired(&timer) ){
  374. if(sutPocStatus.ListCurOnlineNum<=0){
  375. sutPocStatus.ListFillIndex=0;
  376. printf("sutPocStatus.ListUpdate==%d,ListCurOnlineNum==%d\r\n",sutPocStatus.ListUpdate,sutPocStatus.ListCurOnlineNum);
  377. goto QUIT_FUNCTION;
  378. }
  379. machine=2;
  380. }
  381. break;
  382. case 2:
  383. /*
  384. 第一次进来不操作页数
  385. 后续判定sutPocStatus.handleIndex 页是否合法
  386. 注意处理临界值 5的倍数
  387. */
  388. if(firstIn!=1){
  389. if(direction==1){
  390. sutPocStatus.handleIndex ++;
  391. if(sutPocStatus.handleIndex>sutPocStatus.ListCurOnlineNum/5){
  392. sutPocStatus.handleIndex=0;
  393. }
  394. if(sutPocStatus.ListCurOnlineNum%5==0){
  395. if(sutPocStatus.handleIndex==sutPocStatus.ListCurOnlineNum/5)sutPocStatus.handleIndex=0;
  396. }
  397. }
  398. else {
  399. if(sutPocStatus.handleIndex>0)sutPocStatus.handleIndex--;
  400. else if(sutPocStatus.handleIndex==0){
  401. if(sutPocStatus.ListCurOnlineNum%5==0)sutPocStatus.handleIndex=(sutPocStatus.ListCurOnlineNum/5)-1;
  402. else sutPocStatus.handleIndex=sutPocStatus.ListCurOnlineNum/5;
  403. printf("sutPocStatus.ListCurOnlineNum===%d,sutPocStatus.handleIndex==%d\r\n",sutPocStatus.ListCurOnlineNum,sutPocStatus.handleIndex);
  404. }
  405. }
  406. }
  407. /*
  408. 下面操作只决定 预读值sutPocStatus.ExceptionReadNum
  409. */
  410. if((sutPocStatus.handleIndex+1)*5 >sutPocStatus.ListCurOnlineNum){ //超过 首页 +1
  411. snprintf(buf, sizeof(buf), "over:%d",sutPocStatus.handleIndex);
  412. SlwTrace(INF, buf, 1);
  413. if(sutPocStatus.ListCurOnlineNum%5==0)sutPocStatus.ExceptionReadNum=5;
  414. else sutPocStatus.ExceptionReadNum=sutPocStatus.ListCurOnlineNum%5;
  415. } else{
  416. sutPocStatus.ExceptionReadNum=5; //普通情况 5个
  417. }
  418. sutPocStatus.ListFillIndex=0;
  419. machine=3;
  420. break;
  421. case 3:
  422. sutPocStatus.ListGetOneFlag=0; //起始 //个数//5个
  423. if(sutUIstatus.Status==UIS_MENU_GROUP_SEL){
  424. if(hgs_poc_type==POC_BND) snprintf(buf, sizeof(buf),"AT+POC=groups,%d+1,5\r\n",sutPocStatus.handleIndex*5);//先更新总数
  425. else snprintf(buf, sizeof(buf), "AT+POC=1D0000%04x0005\r\n",sutPocStatus.handleIndex*5);
  426. }
  427. else {
  428. if(hgs_poc_type==POC_BND) snprintf(buf, sizeof(buf),"AT+POC=members,%d,%d+1,5\r\n",sutPocStatus.LocalGroup.ID,sutPocStatus.handleIndex*5);
  429. else snprintf(buf, sizeof(buf), "AT+POC=1E0000%04x0005\r\n",sutPocStatus.handleIndex*5);
  430. }
  431. ModemSendAt(buf);
  432. SlwTrace(INF, buf,0);
  433. uTimerStart(&timer, 200);
  434. machine=4;
  435. break;
  436. case 4:
  437. if(sutPocStatus.ListGetOneFlag){//获取成功
  438. machine=5;
  439. }
  440. if(uTimerExpired(&timer)){
  441. machine=5;//超时了,结束
  442. }
  443. break;
  444. case 5:
  445. //最终成功读了多少个回来,存在sutPocStatus.FillUserIndex中
  446. QUIT_FUNCTION:
  447. first=1;
  448. GuiClearRect(0, 40, LCD_WIDTH-1, LCD_HEIGHT-32);
  449. machine=0;//
  450. return 1;
  451. break;
  452. }
  453. return ret;
  454. }