Modem.c 13 KB

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