// PDU解码,用于接收、阅读短消息 // 输入: pSrc - 源PDU串指针 // 输出: pDst - 目标PDU参数指针 // 返回: 用户信息串长度 int gsmDecodePdu(const char* pSrc, SM_PARAM* pDst) { int nDstLength; // 目标PDU串长度 unsigned char tmp; // 内部用的临时字节变量 unsigned char buf[256]; // 内部用的缓冲区 // SMSC地址信息段 gsmString2Bytes(pSrc, &tmp, 2); // 取长度 tmp = (tmp - 1) * 2; // SMSC号码串长度 pSrc += 4; // 指针后移,忽略了SMSC地址格式 gsmSerializeNumbers(pSrc, pDst->SCA, tmp); // 转换SMSC号码到目标PDU串 pSrc += tmp; // 指针后移 // TPDU段基本参数 gsmString2Bytes(pSrc, &tmp, 2); // 取基本参数 pSrc += 2; // 指针后移 // 取回复号码 gsmString2Bytes(pSrc, &tmp, 2); // 取长度 if(tmp & 1) tmp += 1; // 调整奇偶性 pSrc += 4; // 指针后移,忽略了回复地址(TP-RA)格式 gsmSerializeNumbers(pSrc, pDst->TPA, tmp); // 取TP-RA号码 pSrc += tmp; // 指针后移 // TPDU段协议标识、编码方式、用户信息等 gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_PID, 2); // 取协议标识(TP-PID) pSrc += 2; // 指针后移 gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_DCS, 2); // 取编码方式(TP-DCS) pSrc += 2; // 指针后移 gsmSerializeNumbers(pSrc, pDst->TP_SCTS, 14); // 服务时间戳字符串(TP_SCTS) pSrc += 14; // 指针后移 gsmString2Bytes(pSrc, &tmp, 2); // 用户信息长度(TP-UDL) pSrc += 2; // 指针后移 if(pDst->TP_DCS == GSM_7BIT) { // 7-bit解码 nDstLength = gsmString2Bytes(pSrc, buf, tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4); // 格式转换 gsmDecode7bit(buf, pDst->TP_UD, nDstLength); // 转换到TP-DU nDstLength = tmp; } else if(pDst->TP_DCS == GSM_UCS2) { // UCS2解码 nDstLength = gsmString2Bytes(pSrc, buf, tmp * 2); // 格式转换 nDstLength = gsmDecodeUcs2(buf, pDst->TP_UD, nDstLength); // 转换到TP-DU } else { // 8-bit解码 nDstLength = gsmString2Bytes(pSrc, buf, tmp * 2); // 格式转换 nDstLength = gsmDecode8bit(buf, pDst->TP_UD, nDstLength); // 转换到TP-DU } // 返回目标字符串长度 return nDstLength; }
int gsmSendMessage(SM_PARAM* pSrc) { int nPduLength; // PDU串长度 unsigned char nSmscLength; // SMSC串长度 int nLength; // 串口收到的数据长度 char cmd[16]; // 命令串 char pdu[512]; // PDU串 char ans[128]; // 应答串 nPduLength = gsmEncodePdu(pSrc, pdu); // 根据PDU参数,编码PDU串 strcat(pdu, "\x01a"); // 以Ctrl-Z结束 TRACE("%s", pdu); //zhao gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度 nSmscLength++; // 加上长度字节本身 // 命令中的长度,不包括SMSC信息长度,以数据字节计 sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength); // 生成命令 TRACE("%s", cmd); TRACE("%s\n", pdu); WriteComm(cmd, strlen(cmd)); // 先输出命令串 nLength = ReadComm(ans, 128); // 读应答数据 // 根据能否找到"\r\n> "决定成功与否 if(nLength == 4 && strncmp(ans, "\r\n> ", 4) == 0) { return WriteComm(pdu, strlen(pdu)); // 得到肯定回答,继续输出PDU串 } return 0; }
///////////////////////////////////////////////////////////////////////////////// // 函数:gsmSendMessage // // 说明:发送短消息 // // 参数: // // pSrc: 源PDU参数指针 // ///////////////////////////////////////////////////////////////////////////////// bool CSerialPort::gsmSendMessage(const SM_PARAM* pSrc) { int nPduLength; // PDU串长度 unsigned char nSmscLength; // SMSC串长度 int nLength; // 串口收到的数据长度 char cmd[16]; // 命令串 char pdu[512]; // PDU串 char ans[128]; // 应答串 nPduLength = gsmEncodePdu(pSrc, pdu); // 根据PDU参数,编码PDU串 strcat(pdu, "\x01a"); // 以Ctrl-Z结束 gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度 nSmscLength++; // 加上长度字节本身 // 命令中的长度,不包括SMSC信息长度,以数据字节计 sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength); // 生成命令 printf(cmd); WritePort(cmd, strlen(cmd)); // 先输出命令串 Sleep(ShortSleepTime); WritePort(pdu, strlen(pdu)); WritePort("\x1A", 1); nLength = ReadPort(ans, 128); // 读应答数据 Sleep(ShortSleepTime); // 根据能否找到"\r\n> "决定成功与否 /* if(nLength == 4 && strncmp(ans, "\r\n> ", 4) == 0) { WritePort(pdu, strlen(pdu)); Sleep(ShortSleepTime);// 得到肯定回答,继续输出PDU串 nLength = ReadPort(ans, 128); // 读应答数据 // 根据能否找到"+CMS ERROR"决定成功与否 if(nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0) { nLength = ReadPort(ans, 128); // 读应答数据 return FALSE; } }*/ return TRUE; }
void nfc_reader(nfc_device_desc_t *pnddDevices, int times){ char c_pubN[128]; char c_pubKey[3]; memset(c_pubN,0,sizeof(c_pubN)); memset(c_pubKey,0,sizeof(c_pubKey)); size_t i,j,k,l; size_t sourceLength,destLength; bool res; byte_t pbrData[256]; byte_t QueryDataWithFrame[256]; int mode; // char *g_pubN = "AA030736A1480CC78576531EDF2D1153C18C22F1D0CAA5DBC7B52E3183B6BCC24F8853F7621F6E9473827DC32789E12F2D324BAE4C53A26F71ECF77C78914E107CC76B25507946F68A5D0FF9BD9D1EBB4234B2482E3824C2D3F55EA1D108DA2CF7F1B48D23FF7508DDCD4824E5E1D7C5B74FFB4A7F3492B3E0E3EEF3EA7B76F1"; // char *g_pubKey = "10001"; // char *g_priKey = "5F074248EEED6EF7374A643BA5537393F5637744E307E29D6E8B7F3E7DF8EE994E0B4DA3C15D005A4A166E655EFC5ABA1BF1390C3BEDA3A5D770350585FEF23AABCA9774C98AD60015926D4D843C82F52E52923A41F2387F7A54CBAD6416543549FED54ACE2D21F5B6B9B593549E57FEE48AA4FAFDF4C12B47EA34B4574DFAE1"; // bool verbose = false; // byte_t pbrDatabuf[256]; // char *randData_char; // char *plain; // randData_char = (char *)malloc(sizeof(char)*4); // plain = (char *)malloc(sizeof(char)*4); // char *plain_receive; // plain_receive = (char *)malloc(sizeof(char)*4); // char *cipherResult_send; // cipherResult_send = (char*)malloc(sizeof(char)*129); // char *cipherResult_send_hex; // cipherResult_send_hex = (char *)malloc(sizeof(char)*260); // unsigned char *cipherResult_send_hex; // cipherResult_send_hex = (unsigned char*)malloc(sizeof(char)*129); // byte_t cipherDataWithFrame_receive[256]; // byte_t cipherDataWithoutFrame_receive[128]; // byte_t cipherDataWithoutFrame[128]; // byte_t QueryDataWithoutFrame[256]; signal (SIGINT, stop_polling); // 进行NFC设备的连接 pnd = pn532_uart_connect (pnddDevices); if (pnd == NULL) { TraceLog("%s","Unable to connect to NFC device."); printf("Unable to connect to NFC device."); exit (EXIT_FAILURE); } printf ("Connected to NFC reader: %s\n", pnd->acName); printf ("NFC reader is on! \n"); //SAMConfiguration memset(pbrData,0,sizeof(pbrData)); byte_t pbtData1[] = { 0x14, 0x01, 0x00, 0x00}; res = pn532_uart_send(pnd,pbtData1,sizeof(pbtData1)); if(!res){ TraceLog("%s","SAMConfiguration pn532_uart_send ERROR!"); printf ("SAMConfiguration pn532_uart_send ERROR!"); } int n = pn532_uart_receive (pnd,pbrData,sizeof(pbrData)); if(n < 0){ printf("SAMConfiguration receive %d\n",n); goto theend; } //List Passive Target memset(pbrData,0,sizeof(pbrData)); byte_t pbtData2[] = { 0x4A, 0x01, 0x00}; res = pn532_uart_send(pnd,pbtData2,sizeof(pbtData2)); if(!res){ TraceLog("%s","List Passive Target pn532_uart_send ERROR!"); printf ("List Passive Target pn532_uart_send ERROR!\n"); } n = pn532_uart_receive (pnd,pbrData,sizeof(pbrData)); printf("List Passive Target%d",n); int iv=0; while( n<=0 ){ if(iv++ > times){ goto theend; } pn532_uart_send(pnd,pbtData2,sizeof(pbtData2)); n = pn532_uart_receive (pnd,pbrData,sizeof(pbrData)); // sleep(0.5); } if(pbrData[0] != 0x01){ TraceLog("%s","List Passive Target pn532_uart_receive ERROR!"); printf("List Passive Target pn532_uart_receive ERROR!\n"); goto theend; } printf("List Passive Target success ! \n"); unsigned char content[256]; unsigned char mapsrc[256]; unsigned char mapdes[256]; byte_t mapsrcHEX[256]; byte_t mapdesHEX[256]; byte_t mapconHEX[256]; memset(mapsrcHEX,0,sizeof(mapsrcHEX)); memset(mapdesHEX,0,sizeof(mapdesHEX)); memset(content,0,sizeof(content)); //区分swp卡和双界面卡 if((pbrData[15] == 0x90)||(pbrData[15] == 0x42)||(pbrData[15] == 0x48)||(pbrData[15] == 0xA1)){ mode = 1; TraceLog("%s","use swp card."); printf("use swp card\n"); //Select APP on mobile phone memset(pbrData,0,sizeof(pbrData)); //byte_t pbtData3[] = { 0x40, 0x01, 0x00, 0xA4, 0x04, 0x00, 0x0A, 0x62, 0x75, 0x70, 0x74, 0x2E, 0x64, 0x65,0x6d, 0x6f, 0x2e}; byte_t pbtData3[] = { 0x40, 0x01, 0x00, 0xA4, 0x04, 0x00, 0x0D, 0x62, 0x75, 0x70, 0x74, 0x2E, 0x6E, 0x65, 0x77, 0x70, 0x75, 0x73,0x68,0x2e}; res = pn532_uart_send (pnd,pbtData3,sizeof(pbtData3)); if(!res){ TraceLog("%s","Select APP pn532_uart_send ERROR!"); printf ("Select APP pn532_uart_send ERROR!"); goto theend; } //printf("%d",res); n = pn532_uart_receive(pnd,pbrData,sizeof(pbrData)); if(n <= 0){ TraceLog("%s","Select APP pn532_uart_receive ERROR!"); printf ("Select APP pn532_uart_receive ERROR!"); goto theend; } if(pbrData[0] != 0x00){ TraceLog("%s","Select APP Status Error!"); printf("Select APP Status Error! \n"); goto theend; } //Map search memset(QueryDataWithFrame,0,sizeof(QueryDataWithFrame)); //test mobile byte_t pbtData5[] = { 0x40, 0x01, 0x00, 0x76, 0x00, 0x00,0x1E}; pn532_uart_send (pnd,pbtData5,sizeof(pbtData5)); n = pn532_uart_receive(pnd,QueryDataWithFrame,sizeof(QueryDataWithFrame)); printf("QueryDataWithFrame length:%d \n",n); if(QueryDataWithFrame[0] != 0x00){ TraceLog("%s","QueryData Error!"); printf("QueryData Error! \n"); goto theend; } for(l = 0;l < n-3;l++){ content[l] = QueryDataWithFrame[l+1]; if(n>50){ goto theend; } } sourceLength = content[0]; destLength = content[sourceLength+1]; for(l=0;l<sourceLength+1;l++){ mapsrc[l]=content[l+1]; } for(l=0;l<destLength+1;l++){ mapdes[l]=content[l+2+sourceLength]; } } else{ TraceLog("%s","use dual interface card."); printf("use dual interface card\n"); mode = 0; //Select APP on mobile phone 1 memset(pbrData,0,sizeof(pbrData)); byte_t pbtData3[] = { 0x40, 0x01, 0x00, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00}; res = pn532_uart_send (pnd,pbtData3,sizeof(pbtData3)); if(!res){ TraceLog("%s","Select APP1 pn532_uart_send ERROR!"); printf ("Select APP1 pn532_uart_send ERROR!"); goto theend; } n = pn532_uart_receive(pnd,pbrData,sizeof(pbrData)); if(n <= 0){ TraceLog("%s","Select APP1 pn532_uart_receive ERROR!"); printf ("Select APP1 pn532_uart_receive ERROR!"); goto theend; } if(pbrData[0] != 0x00){ TraceLog("%s","Select APP1 on mobile phone 1 Error!"); printf("Select APP1 on mobile phone 1 Error! \n"); goto theend; } //Select APP on mobile phone 2 memset(pbrData,0,sizeof(pbrData)); byte_t pbtData4[] = { 0x40, 0x01, 0x00, 0xA4, 0x00, 0x00, 0x02, 0xDF, 0x03}; res = pn532_uart_send (pnd,pbtData4,sizeof(pbtData4)); if(!res){ TraceLog("%s","Select APP2 pn532_uart_send ERROR!"); printf ("Select APP2 pn532_uart_send ERROR!"); goto theend; } n = pn532_uart_receive(pnd,pbrData,sizeof(pbrData)); if(n <= 0){ TraceLog("%s","Select APP2 pn532_uart_receive ERROR!"); printf ("Select APP2 pn532_uart_receive ERROR!"); goto theend; } if(pbrData[0] != 0x00){ TraceLog("%s","Select APP on mobile phone 2 Error!"); printf("Select APP on mobile phone 2 Error! \n"); goto theend; } //Select APP on mobile phone 3 memset(pbrData,0,sizeof(pbrData)); byte_t pbtData5[] = { 0x40, 0x01, 0x00, 0xA4, 0x00, 0x00, 0x02, 0xEF, 0x02}; res = pn532_uart_send (pnd,pbtData5,sizeof(pbtData5)); if(!res){ TraceLog("%s","Select APP3 pn532_uart_send ERROR!"); printf ("Select APP3 pn532_uart_send ERROR!"); goto theend; } n = pn532_uart_receive(pnd,pbrData,sizeof(pbrData)); if(n <= 0){ TraceLog("%s","SSelect APP3 pn532_uart_receive ERROR!"); printf ("Select APP3 pn532_uart_receive ERROR!"); goto theend; } if(pbrData[0] != 0x00){ TraceLog("%s","Select APP on mobile phone 3 Error!"); printf("Select APP on mobile phone 3 Error! \n"); goto theend; } //Map search memset(QueryDataWithFrame,0,sizeof(QueryDataWithFrame)); //test mobile byte_t pbtData6[] = { 0x40, 0x01, 0x00, 0xB0, 0x00, 0x00,0x20}; pn532_uart_send (pnd,pbtData6,sizeof(pbtData6)); n = pn532_uart_receive(pnd,QueryDataWithFrame,sizeof(QueryDataWithFrame)); printf("\nQueryDataWithFrame length:%d \n",n); if(QueryDataWithFrame[0] != 0x00){ printf("QueryData Error! \n"); goto theend; } for(l = 0;l < n-3;l++){ content[l] = QueryDataWithFrame[l+3]; } destLength = content[0]; sourceLength = content[destLength+2]; for(l=0;l<destLength;l++){ mapdes[l]=content[l+1]; } for(l=0;l<sourceLength;l++){ mapsrc[l]=content[l+3+destLength]; } } int conLen = sourceLength+destLength+2; int mapsrcln = gsmString2Bytes(mapsrc,sourceLength,mapsrcHEX); int mapdesln = gsmString2Bytes(mapdes,destLength,mapdesHEX); int mapconln = gsmString2Bytes(content,conLen,mapconHEX); write(STDOUT_FILENO, mapsrcHEX, mapsrcln); write(STDOUT_FILENO, mapdesHEX, mapdesln); write(STDOUT_FILENO, mapconHEX, mapconln); bool bMapStarted = false; if((mapsrcln==0)||(mapdesln==0)){ TraceLog("%s","source or dest value is null."); } else{ //download map if((mapsrcHEX[0]!=0x30)&&(mapsrcln!=0)&&(mapdesln!=0)&&(!bMapStarted)){ TraceLog("nfc-main.c:bMapStarted:%d",bMapStarted); int res = show_map(mapsrcHEX,mapsrcln,mapdesHEX,mapdesln,mode,bMapStarted);//启动地图,关闭video if(res==0){ bMapStarted = true; } // sleep(0.1); TraceLog("%s","show_map is end."); } //如果mode=1 swp card 时,向管理平台发送日志 if((mapsrcHEX[0]!=0x30)&&(mode == 1)){ char *iccid = load_user_info(pnd); byte_t iccidHEX[20]; int iccidln=gsmString2Bytes(iccid,10,iccidHEX); if( iccidHEX[0]=='0'){ goto theend; } char *reader_website; reader_website = (char *)malloc(sizeof(char)*256); memset(reader_website,0,sizeof(reader_website)); strcat(reader_website,configInfo.serverIP); strcat(reader_website,"/NFC/TerminalAction?terminalId="); strcat(reader_website,configInfo.terminalId); strcat(reader_website,"&type=02&content="); // strcat(reader_website,"http://192.168.1.101:8080/NFC/TerminalAction?terminalId=01&type=02&content="); // strncat(reader_website,mapsrcHEX,mapsrcln); // strncat(reader_website,mapdesHEX,mapdesln); strncat(reader_website,mapconHEX,mapconln); strcat(reader_website,"&iccid="); strncat(reader_website,iccidHEX,iccidln); int len_reader_website = strlen(reader_website); write(STDOUT_FILENO, reader_website, len_reader_website); TraceLog("%s",reader_website); WebTransUpload(reader_website); sleep(0.1); free(reader_website); } else if((mapsrc[0]==0x00)&&(mapsrc[1]==0x2a)&&(mapsrc[2]==0x00)&&(mapsrc[3]==0x23)){ //*# char *dual_website; char *tagNumber; tagNumber = (char *)malloc(sizeof(char)*32); memset(tagNumber,0,sizeof(tagNumber)); sprintf(tagNumber,"%d",tagCount+1); dual_website = (char *)malloc(sizeof(char)*256); memset(dual_website,0,sizeof(dual_website)); strcat(dual_website,configInfo.serverIP); strcat(dual_website,"/NFC/TerminalAction?terminalId="); strcat(dual_website,configInfo.terminalId); strcat(dual_website,"&type=03&content="); strcat(dual_website,tagNumber); TraceLog("%s",dual_website); dualInterfaceUpload(dual_website); pwm(); TraceLog("%s","*#:pwm"); free(tagNumber); free(dual_website); } else if((mode==0)&&(mapsrc[0]!=0x00)){ //daul char *dual_website; dual_website = (char *)malloc(sizeof(char)*256); memset(dual_website,0,sizeof(dual_website)); strcat(dual_website,configInfo.serverIP); strcat(dual_website,"/NFC/TerminalAction?terminalId="); strcat(dual_website,configInfo.terminalId); strcat(dual_website,"&type=04&content="); strncat(dual_website,mapconHEX,mapconln); dualInterfaceUpload(dual_website); TraceLog("%s",dual_website); free(dual_website); } } theend: // free(randData_char); // free(plain); // free(plain_receive); // free(cipherResult_send); pn532_uart_disconnect (pnd); }
bool AT_SendMsg(const char * msgCenterNo, const char * desTelNo, const char * msg) { int nPduLength; // PDU串长度 unsigned char nSmscLength; // SMSC串长度 unsigned char m_pdu[pduLength]; memset(m_pdu,0,pduLength); // 检查短消息内容是否空,或者超长 // WCHAR wchar[UnicodeLength]; // int nCount = ::MultiByteToWideChar(CP_ACP, 0, msg, -1, wchar, UnicodeLength); // if(nCount <= 1) // { // printf("pls input msg\r\n"); // return FALSE; // } // else if(nCount > 70) // 我们决定全部用UCS2编码,最大70个字符(半角/全角) // { // printf("msg is too long\r\n"); // return FALSE; // } SM_PARAM SmParam; memset(&SmParam, 0, sizeof(SM_PARAM)); // 填充短消息结构 strcpy(SmParam.SCA, msgCenterNo); strcpy(SmParam.TPA, desTelNo); strcpy(SmParam.TP_UD, msg); SmParam.TP_PID = 0; SmParam.TP_DCS = 8; // 发送短消息 nPduLength = gsmEncodePdu(&SmParam, (char*)m_pdu); // 根据PDU参数,编码PDU串 strcat((char*)m_pdu, "\x01a"); // 以Ctrl-Z结束 gsmString2Bytes((char*)m_pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度 nSmscLength++; // 加上长度字节本身 // 命令中的长度,不包括SMSC信息长度,以数据字节计 unsigned char szCmd[32]; // 命令串 memset(szCmd,0,32); sprintf((char*)szCmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength); // 生成命令 char szATCmdGet[CodeLen]; if (SendATCmd((char *)szCmd)==FALSE) { return FALSE; } GetATCmd(szATCmdGet); strcat((char*)szCmd, "\r\n> "); if (strcmp(szATCmdGet, (const char*)szCmd)!=0 && strstr(szATCmdGet, ">")==NULL) { return FALSE; } //send int nhaveTrytime=0; char szATCmdTemp[CodeLen]; if (SendATCmd((const char*)m_pdu)==FALSE) { return FALSE; } GetATCmd(szATCmdTemp); memset(szATCmdGet,0,CodeLen); strcat(szATCmdGet, szATCmdTemp); while (nhaveTrytime<WaitForSMSSendOKTime) { memset(szATCmdTemp, 0, CodeLen); GetATCmd(szATCmdTemp); strcat(szATCmdGet, szATCmdTemp); if (strstr(szATCmdGet, "OK") != NULL) { return TRUE; } nhaveTrytime++; } return FALSE; }
bool CSMS::AT_SendMsg(const string & msgCenterNo, const string & desTelNo, const string & msg) { int nPduLength; // PDU串长度 unsigned char nSmscLength; // SMSC串长度 TBYTE m_pdu[pduLength]; memset(m_pdu,0,pduLength); // 检查短消息内容是否空,或者超长 CString strUnicode; WCHAR wchar[UnicodeLength]; int nCount = ::MultiByteToWideChar(CP_ACP, 0, msg.c_str(), -1, wchar, UnicodeLength); if(nCount <= 1) { AfxMessageBox("pls input msg"); return false; } else if(nCount > 70) // 我们决定全部用UCS2编码,最大70个字符(半角/全角) { AfxMessageBox("msg is too long"); return false; } SM_PARAM SmParam; memset(&SmParam, 0, sizeof(SM_PARAM)); // 去掉号码前的"+" string strSmsc=msgCenterNo; string strNumber=desTelNo; string strContent=msg; if(strSmsc[0] == '+') strSmsc = strSmsc.substr(1); if(strNumber[0] == '+') strNumber = strNumber.substr(1); // 在号码前加"86" //if(strSmsc.substr(0,2) != "86") strSmsc = "86" + strSmsc; //if(strNumber.substr(0,2) != "86") strNumber = "86" + strNumber; // 填充短消息结构 strcpy(SmParam.SCA, strSmsc.c_str()); strcpy(SmParam.TPA, strNumber.c_str()); strcpy(SmParam.TP_UD, strContent.c_str()); SmParam.TP_PID = 0; SmParam.TP_DCS = 8; // 发送短消息 nPduLength = gsmEncodePdu(&SmParam, (char*)m_pdu); // 根据PDU参数,编码PDU串 strcat((char*)m_pdu, "\x01a"); // 以Ctrl-Z结束 gsmString2Bytes((char*)m_pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度 nSmscLength++; // 加上长度字节本身 // 命令中的长度,不包括SMSC信息长度,以数据字节计 TBYTE cmd[16]; // 命令串 memset(cmd,0,16); sprintf((char*)cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength); // 生成命令 string strATCmdGet; string strATCmdSend; strATCmdSend=(char *)cmd; if (SendATCmd(strATCmdSend)==true) { Sleep(waitForReturnCMD); GetATCmd(strATCmdGet); if (strATCmdGet!=strATCmdSend+"\r\n> " && strATCmdGet.find(">")==string::npos) { return false; } } else { return false; } //send int nhaveTrytime=0; strATCmdGet; strATCmdSend=(const char*)m_pdu; string strATCmdTemp=""; if (SendATCmd(strATCmdSend)==true) { Sleep(waitForReturnCMD); GetATCmd(strATCmdTemp); strATCmdGet=strATCmdTemp; while (nhaveTrytime<WaitForSMSSendOKTime) { Sleep(waitForReturnCMD*3);//可以再设长一点 GetATCmd(strATCmdTemp); strATCmdGet+=strATCmdTemp; if (strATCmdGet.find("OK")==string::npos) { nhaveTrytime++; continue; } else { return true; } } return false; } else { return false; } }