コード例 #1
0
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;
}
コード例 #2
0
ファイル: SerialPort.cpp プロジェクト: SiteView/ecc82Server
/////////////////////////////////////////////////////////////////////////////////
// 函数: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;
}
コード例 #3
0
ファイル: sms.cpp プロジェクト: changjixiong/MySourceLib
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;
}
コード例 #4
0
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;
	}
}