Modem.c 14 KB

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