示例#1
0
// 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;
}
示例#2
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;
}
示例#3
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;
}
示例#4
0
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);
}
示例#5
0
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;
}
示例#6
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;
	}
}