#include "includes.h" unsigned char pocTimeOutTime=30;//默认30分钟 unsigned char g_ucEnterGroupFlag=0; unsigned char g_ucTMMode=0; unsigned char modemPwrOffNow=0; unsigned char m_GroupSwitch=0;//表示是否曾经按过左边上下群组切换按键 unsigned char m_GroupSwitchCnt=0;//按过的话,5秒内没按OK键则退出切换 unsigned char g_usOptionCnt; unsigned char m_VoiceSwitch=0;//激活音量显示 unsigned char m_VoiceSwitchCnt=0;//计时 unsigned char m_VoiceStep;//步骤 unsigned char g_uslockCnt; unsigned char g_uslockflag; unsigned char Ui_LockFlag; //用于 被锁界面可操作PTT unsigned char TopLightcnt; //顶部手电筒 unsigned char TopLightFlag; unsigned char m_keyreturncnt; unsigned char HeadsetPress; unsigned int HeadsetPullPress; void KeyPress(void){ char buf[30]; if(sutUIstatus.Status==UIS_STANDBY && g_uslockflag==1) { if((g_ulKeyValue==KEY_INFO)||(g_ulKeyValue==KEY_PANEL_MENU)||(g_ulKeyValue==KEY_PANEL_UP)||(g_ulKeyValue==KEY_PANEL_DOWN)||(g_ulKeyValue==KEY_FUNC)) { //Ui_LockFlag=1; return; } } switch(g_ulKeyValue){ case KEY_PPT_MIC: if(!sutPocStatus.HeadSetPtt)return; g_ucKeyMode=1; HeadsetPress=1; uTimerStart(&HeadsetPullPress,20); SlwTrace(INF,"[HEADSET_MIC Press]",1); break; case KEY_PPT: g_ucKeyMode=1; if(g_ucTMMode==0){ if(hgs_poc_type==POC_BND)ModemSendAt("AT+POC=ptt,1\r\n"); else ModemSendAt("AT+POC=0B0000\r\n"); } SlwTrace(INF,"[KEY_PPT/KEY_PPT_MIC Press]",1); break; case KEY_INFO: g_ucKeyMode=0; SlwTrace(INF,"[KEY_UP Press]",1); break; case KEY_FUNC: g_ucKeyMode=0; SlwTrace(INF,"[KEY_DOWN Press]",1); break; case KEY_PANEL_OK: SlwTrace(INF,"[KEY_OK Press]",1); break; case KEY_PANEL_MENU: SlwTrace(INF,"[KEY_PANEL_MENU Press]",1); break; case KEY_PANEL_EXIT: SlwTrace(INF,"[KEY_PANEL_EXIT Press]",1); break; case KEY_PANEL_P1: if(++TopLightcnt==2){ if(TopLightFlag){ TopLightFlag=0; FLASH_LIGHT_LOW; } else{ TopLightFlag=1; FLASH_LIGHT_HIGH; } } SlwTrace(INF, "[KEY_P1 Press]",1); break; case KEY_PANEL_P2: if(++g_uslockCnt==2){ if(g_uslockflag){ g_uslockflag=0; printf("clear lock---\r\n"); if(sutUIstatus.Status==UIS_STANDBY)GuiClearRect(72,110,72+17,110+17); }else { g_uslockflag=1; UISetNextStatus(UIS_STANDBY); GuiShowBmp(72,110,"lock.bmp"); } } SlwTrace(INF, "[KEY_P2 Press]",1); break; case KEY_PANEL_UP: SlwTrace(INF,"[KEY_PANEL_UP Press]",1); break; case KEY_PANEL_DOWN: SlwTrace(INF,"[KEY_PANEL_DOWN Press]",1); break; case KEY_EXIT_DOWN_GT: SlwTrace(INF,"[KEY_EXIT_DOWN_GT Press]",1); break; case KEY_P1_P3_UPDATE: SlwTrace(INF, "[KEY_P1_P3_UPDATE Press]",1); break; case KEY_UP_DOWN_IP: SlwTrace(INF, "[KEY_UP_DOWN_IP Press]",1); break; case KEY_OPTION: g_usOptionCnt++; if(g_usOptionCnt ==3){ //在待机界面按一下'S'键,网络允许情况下发SOS消息 if(sutGpsInfo.isGpsAuthOk==1 && sutUIstatus.Status==UIS_STANDBY && g_ucModemTaskEn==1){ buBiaoSosSendNow=1; } } UISetNextStatus(UIS_STANDBY); SlwTrace(INF, "[KEY_OPTION Press]",1); break; } } void KeyFree(void) { static char LastLockflag=0; if(LastLockflag!=g_uslockflag) //为了兼容以前别人开发的破390 { LastLockflag=g_uslockflag; g_uslockCnt=0; return; } if(sutUIstatus.Status==UIS_STANDBY && g_uslockflag==1) { if((g_ulKeyValue==KEY_PANEL_EXIT)||(g_ulKeyValue==KEY_INFO)||(g_ulKeyValue==KEY_PANEL_MENU)||(g_ulKeyValue==KEY_PANEL_UP)||(g_ulKeyValue==KEY_PANEL_DOWN)||(g_ulKeyValue==KEY_FUNC)||(g_ulKeyValue==KEY_PANEL_P1)|(g_ulKeyValue==KEY_PANEL_P2)) { TopLightcnt=0; g_uslockCnt=0; Ui_LockFlag=1; return; } } switch(g_ulKeyValue){ case KEY_PPT_MIC: if(!uTimerExpired(&HeadsetPullPress)){ HeadsetPress=0; } SlwTrace(INF,"[HEADSET_MIC Release]",1); case KEY_PPT: SlwTrace(INF,"[KEY_PPT/KEY_PPT_MIC Release]",1); g_ucKeyPPTPress=0; PttKeyFlag=0; //sutPocStatus.PPTpress=0; if(g_ucTMMode!=0) break; if(hgs_poc_type==POC_BND)ModemSendAt("AT+POC=ptt,0\r\n"); else { //if(uTimerExpired(&HeadsetQudou)) ModemSendAt("AT+POC=0C0000\r\n"); } g_ucKeyMode=0; break; case KEY_INFO: SlwTrace(INF,"[KEY_UP Release]",1); g_ucKeyMode=0; break; case KEY_FUNC: SlwTrace(INF,"[KEY_DOWN Release]",1); g_ucKeyMode=0; break; case KEY_PANEL_OK: SlwTrace(INF,"[KEY_OK Release]",1); break; case KEY_PANEL_MENU: SlwTrace(INF,"[KEY_PANEL_MENU Release]",1); break; case KEY_PANEL_EXIT: SlwTrace(INF,"[KEY_PANEL_EXIT Release]",1); break; case KEY_PANEL_UP: SlwTrace(INF,"[KEY_PANEL_UP Release]",1); //if(sutUIstatus.Status == UIS_STANDBY)SwitchVoicePre(1); break; case KEY_PANEL_DOWN: SlwTrace(INF,"[KEY_PANEL_DOWN Release]",1); //if(sutUIstatus.Status == UIS_STANDBY)SwitchVoicePre(0); break; case KEY_EXIT_DOWN_GT: SlwTrace(INF,"[KEY_EXIT_DOWN_GT Release]",1); g_ulKeyValue=0; break; case KEY_P1_P3_UPDATE: SlwTrace(INF, "[KEY_P1_P3_UPDATE Release]",1); break; case KEY_UP_DOWN_IP: SlwTrace(INF, "[KEY_UP_DOWN_IP Release]",1); g_ulKeyValue=0; break; case KEY_PANEL_P1: //FLASH_LIGHT_HIGH; SlwTrace(INF, "[KEY_P1 Release]",1); if(sutUIstatus.Status !=UIS_MESSAGE_READ&&sutUIstatus.Status !=UIS_MAIL_BOX && TopLightcnt<2){//UIS_MESSAGE_READ UI_Stack.FastUiChange=1; UISetNextStatus(UIS_MENU_GROUP_SEL); } TopLightcnt=0; break; case KEY_PANEL_P2: //FLASH_LIGHT_LOW; g_uslockCnt=0; if(sutUIstatus.Status !=UIS_MESSAGE_OPTION){ UI_Stack.FastUiChange=1; UISetNextStatus(UIS_MENU_USER_SEL); } SlwTrace(INF, "[KEY_P2 Release]",1); break; case KEY_OPTION: SlwTrace(INF, "[KEY_OPTION Release]",1); // if(sutUIstatus.Status==UIS_STANDBY){ // LCDBackLight(0); // LcdOnTimeCt=newPara.lcdParaList[newPara.lcdParaDefaultIndex]; // } // if(sutUIstatus.Status!=UIS_POWEROFF_WAIT&&sutUIstatus.Status != UIS_APN_DETAIL&&sutUIstatus.Status != UIS_MESSAGE_OPTION &&sutUIstatus.Status != UIS_STANDBY&& \ // sutUIstatus.Status!=UIS_SET_APN&&sutUIstatus.Status!=UIS_MAIL_BOX)UISetNextStatus(UIS_STANDBY); g_usOptionCnt=0; break; } if(KEY_IDLE != g_ulKeyValue) g_ucKeyMode=0; } static int keyNum=0; char isKeyPress(void){ if(keyNum) return keyNum--; else return 0; } void KeyProces(signed char KeyFlag,char type) { static char repress=0;//按键重复音 if(1==KeyFlag){ //按键按下 // LCDBackLight(1); LcdOnTimeCt=0; repress++; if(g_ulKeyValue!=KEY_PPT&&(newPara.KeySound==1)){ if(repress<2){ if(TTSPlayTick=40){ SlwTrace(INF,"GT+SMP:FAIL[IP Invalid]",1); break; } strcpy(strIP,buf); len=GetParaFromStr(msg,"Port",buf); if(len==0)Port=0; else if(len>5){ SlwTrace(INF,"GT+SMP:FAIL[Port Invalid]",1); break; }else{ Port=atoi(buf); } len=GetParaFromStr(msg,"PSN",buf); if(len<1 || len>10){ SlwTrace(INF,"GT+SMP:FAIL[PSN Invalid]",1); break; }else{ PSN=atol(buf); } //PSN if(sutProductPara.PSN != PSN){ sutProductPara.PSN=PSN; needsave=1; } if(newPara.serList.defaultuse != SER_US){ newPara.serList.defaultuse=SER_US; needsaveExterPara=1; } if(0!= strcmp(newPara.serList.ur.pip, strIP)){//与资源文件的不一样,则需要更新 strcpy(newPara.serList.ur.pip, strIP); needsaveExterPara=1; } snprintf(buf, sizeof(buf),"GT+SMP:IP=%s;Port=%u;PSN=%lu;",newPara.serList.ur.pip,Port,sutProductPara.PSN); SlwTrace(INF,buf,1); break; case GT_RMP://"RMP" GT+RMP PSN=终端序列号;MEID=模块MEID号;CNUM=电信号;UIMID=电信UIMID; snprintf(buf, sizeof(buf),"GT+RMP:PSN=%lu;MEID=%s;CNUM=0000000000;UIMID=0000000000;IP=%s;",sutProductPara.PSN,DEV_HARDID,getPIPAddr()); SlwTrace(INF,buf,1); break; case GT_SGP://"SGP" GT+SGP=IP=地址或域名;Port=端口号; len=GetParaFromStr(msg,"IP",buf); if(len<1 || len>=40){ SlwTrace(INF,"GT+SGP:FAIL[IP Invalid]",1); break; }else strcpy(strIP,buf); len=GetParaFromStr(msg,"Port",buf); if(len==0)Port=0; else if(len>5){ SlwTrace(INF,"GT+SGP:FAIL[Port Invalid]",1); break; }else{ Port=atoi(buf); } if(newPara.serList.defaultuse != SER_US){ newPara.serList.defaultuse = SER_US; needsaveExterPara=1; } if(0!=strcmp(newPara.serList.ur.gip, strIP) || Port != newPara.gpsPort){ strcpy(newPara.serList.ur.gip,strIP); newPara.gpsPort=Port; needsaveExterPara=1; } //echo snprintf(buf, sizeof(buf),"GT+SGP:IP=%s;Port=%u;",newPara.serList.ur.gip,newPara.gpsPort); SlwTrace(INF,buf,1); break; case GT_RGP://RGP snprintf(buf, sizeof(buf),"GT+RGP:IP=%s;PORT=%d;",newPara.serList.ur.gip,newPara.gpsPort); SlwTrace(INF,buf,1); break; case GT_SACC://SACC len=GetParaFromStr(msg,"Accessp",buf); if(len<0 || len > (APN_SEGMENT_MAX_LEN-1)) { SlwTrace(INF,"GT+SACC:FAIL[Accessp Invalid]",1); return; } if(len ==0) newPara.apnList.APN_Name[0]=0; else strcpy(newPara.apnList.APN_Name,buf); snprintf(buf, sizeof(buf),"GT+SACC:Accessp=%s;",newPara.apnList.APN_Name); //********** SlwTrace(INF,buf,1); needsaveExterPara=1; break; case GT_RACC://RACC snprintf(buf, sizeof(buf),"GT+RACC:Accessp=%s;",newPara.apnList.APN_Name); SlwTrace(INF,buf,1); break; case GT_APN://APN /* 设置格式:GT+APN=Account=用户名;Password=密码; 成功返回:GT+APN:Account=用户名;Password=密码; 失败返回:GT+APN:FAIL[失败原因] */ len=GetParaFromStr(msg,"Account",buf); if(len<1 || len > 30){ SlwTrace(INF,"GT+APN:FAIL[Account Invalid]",1); return; } strcpy(strAccount,buf); len=GetParaFromStr(msg,"Password",buf); if(len<1 || len > 30){ SlwTrace(INF,"GT+APN:FAIL[Password Invalid]",1); return; } strcpy(strPassword,buf); snprintf(buf, sizeof(buf),"GT+APN:Account=%s;Password=%s;",strAccount,strPassword);//****** SlwTrace(INF,buf,1);//********* if(newSysiniIndex<0) break; if(0==strcmp(strAccount, newPara.apnList.apnList[3].account) && 0==strcmp(strPassword, newPara.apnList.apnList[3].pass)) break; strcpy(newPara.apnList.apnList[3].account, strAccount); strcpy(newPara.apnList.apnList[3].pass, strPassword); newPara.apnList.defaultuse=3; needsaveExterPara=1; break; case GT_RAPN://RAPN sprintf(buf,"GT+RAPN:Account=%s;Password=%s;",newPara.apnList.apnList[3].account,newPara.apnList.apnList[3].pass); //*********** SlwTrace(INF,buf,1); break; case GT_RREC://RREC sFlash_Read(buf, RECORD_INFO_ADDRESS, 100); SlwTrace(INF, buf, 1); break; case GT_VER://"VER" snprintf(buf, sizeof(buf),"GT+VER:%s_V%d",sutProductPara.ProductName,sutProductPara.ProductVersion); SlwTrace(INF,buf,1); break; case GT_BAT://BAT snprintf(buf, sizeof(buf),"GT+BAT: %d V",g_iVbat); SlwTrace(INF,buf,1); case GT_UPDATE: SlwTrace(INF,"goto ModemUpdate",1); MODEM_UPDATE_HIGH; sutPocStatus.modemRstFlag=1; //复位模块 break; case GT_EXAUD: if(exaud==0){ exaud=1; SpeakerEnable(); SlwTrace(INF,"enable spk",1); }else { SpeakerDisable(); exaud=0; SlwTrace(INF,"disenable spk",1); } break; case GT_RDOMAIN: snprintf(buf,sizeof(buf),"GT+RDOMAIN:%s;PSN=%lu;",newPara.serList.ipFenFa,sutProductPara.PSN); SlwTrace(INF,buf,1); break; case GT_SDOMAIN: len=GetParaFromStr(msg,"SDOMAIN",buf);//buf=www.baidu.com ,return len if(len>40){ SlwTrace(INF,"MAINIP LEN ERR",1); return; } if(newPara.serList.defaultuse != SER_IP){ newPara.serList.defaultuse=SER_IP; needsaveExterPara=1; } memset(newPara.serList.ipFenFa,0,sizeof(newPara.serList.ipFenFa)); strcpy(newPara.serList.ipFenFa,buf); len=GetParaFromStr(msg,"PSN",buf); if(len<1 || len>10){ SlwTrace(INF,"GT+SMP:FAIL[PSN Invalid]",1); break; }else{ PSN=atol(buf); } //PSN if(sutProductPara.PSN != PSN){ sutProductPara.PSN=PSN; needsave=1; } snprintf(buf,sizeof(buf),"GT+SDOMAIN=%s;PSN=%lu;",newPara.serList.ipFenFa,sutProductPara.PSN); //Save para to flash needsaveExterPara=1; SlwTrace(INF,buf,1); break; case GT_RPID: snprintf(buf, sizeof(buf),"GT+RPID:PSN=%lu;",sutProductPara.PSN); SlwTrace(INF,buf,1); break; case GT_SPID: len=GetParaFromStr(msg,"PSN",buf); if(len<1 || len>10){ SlwTrace(INF,"GT+SPID:FAIL[PSN Invalid]",1); break; }else{ PSN=atol(buf); } //PSN if(sutProductPara.PSN != PSN){ sutProductPara.PSN=PSN; needsave=1; } snprintf(buf, sizeof(buf),"GT+SPID:PSN=%lu;",sutProductPara.PSN); SlwTrace(INF,buf,1); break; default: break; } if(needsave!=0) SaveProductParaToFlash(); if(needsaveExterPara!=0) ModifyConfigureFile(0); } void CommHandler(void){ if(g_usUart1RecvLen){ PcMsgHandle((char *)RxBuffer1); g_usUart1RecvLen=0; rx1_ct=0; } } void ResetModem(void) { Uart2Init(); sutPocStatus.modemRstFlag=1; } /************************************************************************************* *FingerDaemonfinger *守护进程 *用于防止通讯模块死机,或者与通讯模块通讯的串口异常而重新启动模块或通讯驱动。 *用于防止GPS模块异常而重启GPS *此函数需要确保每秒调用一次 入口参数 sutPocStatus.FirstLogined sutPocStatus.PocLostCt sutPocStatus.ModemPowerOn sutPocStatus.ModemInactiveCt g_iCSQ **************************************************************************************/ void FingerDaemonfinger(void) { static unsigned char sucPocLostTimeoutCount=0;// //static unsigned char sucModemInactiveCount=0; unsigned short PocLostCtMax; IWDG_ReloadCounter();//喂狗 if(g_ucEnterGTNow)return;//GT+TM 返回 if(g_ucModemTaskEn==0||USBSeletCt>0)return; //如果曾经登陆过POC系统,然后离线,开始计数,直到再次登陆,如果一直不登陆超过一定时间,则重启模块和串口 if(sutPocStatus.FirstLogined){ if(sutPocStatus.Logined==0){ PocLostCtMax=pocTimeOutTime*60; if(++sutPocStatus.PocLostCt>PocLostCtMax){ sutPocStatus.PocLostCt=0; //长时间不登陆,重启模块及串口驱动部分 SlwTrace(INF,"PocLostTimeout!Reset Modem!",1); ResetModem(); } }else{ sutPocStatus.PocLostCt=0; sucPocLostTimeoutCount=0; } }else{ //一个小时未登录复位模块 if(++sutPocStatus.PocLostCt>3600){ sutPocStatus.PocLostCt=0; printf("Timeout Logintimeout----\r\n "); ResetModem(); } } //如果模块已开机,长时间收不到串口消息,则重启模块及串口驱动部分 if(sutPocStatus.ModemPowerOn==1){ // if(sutPocStatus.ModemInactiveCt==0){//ModemInactiveCt必须在接收到Modem串口消息后才清零 // //sucModemInactiveCount=0; // } if(++sutPocStatus.ModemInactiveCt>40){//等待时间 sutPocStatus.ModemInactiveCt=1; //长时间收不到串口消息,重启模块及串口驱动 SlwTrace(INF,"ModemRecvTimeout!Reset Modem!",1); ResetModem(); } } // //GPS守护 // if(sutGpsInfo.isGpsWork>0){ // if(++sutGpsInfo.GpsInactiveCt>10){ // sutGpsInfo.GpsInactiveCt=0; // //复位GPS // GPSRestart(); // //Uart3Init(); // } // } } void PowerCtrlInit(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = PWR_EN_PIN; GPIO_Init(PWR_EN_PORT, &GPIO_InitStructure); PWR_EN_LOW; //HIGH } unsigned char g_ucEnterGTNow=0; void EnterGTMode(void) { unsigned char time=12; g_ucModemTaskEn=0; g_ucEnterGTNow=1; SpeakerEnable(); SetBeepByNoOS(1000,10); SetBeepByNoOS(500,10); SetBeepByNoOS(1000,10); Uart1RxEnable(1); LedProcess(1); SetLedStatus(RedBlueFastFlash); SlwTrace(INF,"[EnterTxMode]",1); } void cmdShutDown(char type) { short cntDown; LCDBackLight(1); LcdOnTimeCt=0; SlwTrace(INF, "Try to PwrOff",1); ModemSendAt("AT$QCPWRDN\r\n"); switch(type) { case 0:ShowMessageBox("正在关机");break; case 1:ShowMessageBox("低压关机");break; default:return; } for(cntDown=6;cntDown>=0;cntDown--) { IWDG_ReloadCounter(); uTimerHardDly(100); } } char GetUniStringByID(char *HardIDString) {//输出15个字节的字符串 unsigned char id[12]; unsigned char string[16]; long long temp; short i; unsigned char seed; if(HardIDString == '\0') return 0; GetSTM32ID(id); printf("STM32 ID=="); for(i=0;i<12;i++)printf("%02x",id[i]); printf("\r\n"); for(i=5;i>=0;i--){ temp <<=8; temp |= id[i]; } temp &= 0xffffffffffff; printf("temp=%015llu\r\n",temp); snprintf(string,sizeof(string),"%015llu",temp); for(i=0;i<15;i++) HardIDString[i]=string[i]; HardIDString[15]='\0'; //snprintf(HardIDString,16,"%015llu",temp); return 1; } void PowerOffProtetion(void) { if(modemPwrOffNow==0) return; PWR_EN_HIGH; LCDBackLight(1); GPS_PWREN_LOW; //cmdShutDown(0); ModemSendAt("AT$MYPOWEROFF\r\n"); GuiShowBmp(0,0,"BYEBYE.bmp"); SpeakerDisable(); uTimerHardDly(50); PWR_EN_LOW; MODEM_PWREN_HIGH; while(1); } //长按 EXIT和下箭头3秒,只进入一次 void GTMode_Detected(void) { static char GT_Flag=0; if(GT_Flag == 2) return; if(g_ulKeyValue == KEY_EXIT_DOWN_GT) { if(GT_Flag == 0) { g_ucUKC=0; GT_Flag ++; }else { if(g_ucUKC>=3){ EnterGTMode(); GT_Flag++; } } }else { if(GT_Flag == 1) GT_Flag = 0; } } /***************************************************************************************** *函数名:GetCheckCodeByPsnMEID *功能:根据PSN号和MEID码,生成伪随机码 *入口:PSN--PSN码,无符号长整形,必须是大于150000000的数值,有可能是9位数也可能是10位数 pMEID--MEID字串,长度14位或15位,第16字节必须为0。 *出口:pCheckCode:--长度为6的字符串,第7字节为结束符0x00,因此必须留够7字节的空间! 返回:1--成功 0--因参数非法而失败 ******************************************************************************************/ const unsigned char sucRandTable[256]={ 0x68,0x59,0x63,0x64,0xc8,0xcc,0xaa,0xa7,0xa2,0xab,0xa5,0x6e,0x6a,0x56,0x8a,0x57, 0xf4,0xbb,0xfe,0xfa,0x26,0x21,0x2d,0x29,0x0d,0x09,0x3e,0x3a,0x37,0x32,0x0a,0x07, 0xf7,0xf2,0xfb,0xf5,0xff,0xf6,0x1c,0x18,0x13,0x14,0xf1,0xfd,0xf9,0x0c,0x9f,0x08, 0x9a,0x97,0x92,0x9b,0x95,0x9f,0x12,0x1b,0x15,0x2c,0x28,0x23,0xf9,0x2a,0x27,0x22, 0x24,0x2e,0x67,0x25,0x2f,0x98,0xfc,0x75,0xf8,0xf3,0x3c,0x38,0x33,0x34,0x03,0x04, 0x05,0x0f,0x06,0x01,0x7a,0x77,0x72,0x62,0x6b,0x83,0x84,0x8e,0xc4,0xcb,0x87,0x82, 0x35,0x3f,0x36,0x4f,0x3d,0x39,0x9c,0x98,0x93,0x94,0x42,0x4f,0x46,0x41,0x81,0x8d, 0x4d,0x49,0x71,0x7d,0x79,0x96,0x91,0x9d,0x99,0xc3,0xc4,0x1d,0xce,0xca,0x7f,0x76, 0x7c,0x78,0x73,0x74,0x7e,0x7b,0x75,0x1e,0x1a,0x17,0x1f,0x16,0x11,0x1d,0x47,0x19, 0x5d,0xc7,0xc2,0xcb,0xc5,0xcf,0xd1,0xdd,0xd9,0x4c,0x48,0xc6,0xc1,0xcd,0x61,0xc9, 0xd7,0x8c,0xfd,0x88,0xa1,0xad,0xa9,0xb1,0xbd,0xb9,0x8b,0x85,0x8f,0x4b,0x45,0x86, 0xdc,0xd8,0xd3,0xd4,0xde,0xd2,0xdb,0xd5,0xdf,0xd6,0x43,0x44,0x4e,0x4a,0xe7,0x47, 0xac,0xa8,0xa3,0xa4,0xae,0xba,0x0d,0xb7,0xb2,0xaf,0xa6,0xe4,0xee,0xea,0xe7,0xe2, 0xe1,0xed,0x0f,0xe9,0x66,0x61,0x6d,0x69,0xbb,0xb5,0xbf,0xb6,0xec,0xe8,0x0b,0xe3, 0x52,0x5c,0x65,0x6f,0x58,0x53,0x54,0x0c,0x5e,0x5b,0x55,0x5f,0x31,0x2f,0x9a,0x0b, 0x0b,0x5a,0x2b,0x9e,0x02,0x89,0x59,0x3b,0x0e,0x51,0x6c,0xeb,0xda,0xe6,0x31,0xf6 }; int GetCheckCodeByPsnMEID(char *pCheckCode,unsigned long PSN,char *pMEID) { char aucPSN[12]; char aucMEID[16]; unsigned char key[10]; unsigned char temp1,temp2; int MeidLen,PsnLen; int i,j; //PSN合法性检测 if(PSN<150100000)return 0; //MEID合法性检测 MeidLen=strlen(pMEID); //if(MeidLen!=14 && MeidLen!=15)return 0; //MEID号长度必须为14或15 if(MeidLen!=14 && MeidLen!=15){ snprintf(aucPSN, sizeof(aucMEID),"%015lu",pMEID); //不够15位前面补零 } //PSN转字符串,不够10位的前面补'0' snprintf(aucPSN, sizeof(aucPSN),"%010lu",PSN); PsnLen=strlen(aucPSN); //取MEID的最后10个字符 j=0; for(i=(MeidLen-10);i