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; }
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; } }