• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養(yǎng)德,非澹薄無以明志,非寧靜無以致遠(yuǎn)。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數(shù)據(jù)加載中……

            WINCE下如何實現(xiàn)發(fā)短信

            #include <sms.h>
            #pragma comment(lib,"sms.lib")
            void SendSMS1(LPCTSTR lpszMessage, LPCTSTR lpszRecipient,LPCTSTR lpszSMSC,BOOL bSendConfirmation, BOOL bUseDefaultSMSC)
            {

             SMS_HANDLE smshHandle; //短信句柄
             SMS_ADDRESS smsaDestination;//接收號碼
             TEXT_PROVIDER_SPECIFIC_DATA tpsd;
             SMS_MESSAGE_ID smsmidMessageID;

             // 打開發(fā)送句柄
             // 協(xié)議字符串,       SMS_MODE_SEND:發(fā)送模式 psmshHandle:返回的句柄 phMessageAvailableEvent:通知的事件
             if(FAILED(SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &smshHandle, NULL)))
             {
              return;
             }


             // Create the destination address
            //SMSAT_NATIONAL:國內(nèi)電話 SMSAT_INTERNATIONAL:國際電話
             smsaDestination.smsatAddressType = SMSAT_UNKNOWN;
             _tcsncpy(smsaDestination.ptsAddress, lpszRecipient, SMS_MAX_ADDRESS_LENGTH);

             // Set up provider specific data
             memset(&tpsd, 0, sizeof(tpsd));
             //tpsd.dwMessageOptions =  PS_MESSAGE_OPTION_NONE;
             tpsd.dwMessageOptions =  PS_MESSAGE_OPTION_STATUSREPORT;//表示需要狀態(tài)報告
             tpsd.psMessageClass = PS_MESSAGE_CLASSUNSPECIFIED;
            //PS_MESSAGE_CLASS0表示短信在被接收后立即顯示且不存儲在收件箱(稱為閃信)
             //PS_MESSAGE_CLASS1表示一般的情況,被接收后存儲到收件箱并發(fā)送一個確認(rèn)回短信中心,發(fā)送方收到一個已被接收的狀態(tài)報告。
             tpsd.psReplaceOption = PSRO_NONE;
             //手動清空頭信息 
             ZeroMemory(tpsd.pbHeaderData, sizeof(tpsd.pbHeaderData));        
             tpsd.dwHeaderDataSize = 0;
             tpsd.fMessageContainsEMSHeaders = FALSE;
             tpsd.dwProtocolID = SMS_MSGPROTOCOL_UNKNOWN;

             // Send the message, indicating success or failure
             /*
             *smshHandle: SmsOpen打開的句柄
             ?? psmsaSMSCAddress: SMSC中心
             ?? *psmsaDestinationAddress:發(fā)送的目的地址
             ?? pstValidityPeriod :發(fā)送時間的有效期
             ?? *pbData: 信息的內(nèi)容部分
             ?? *dwDataSize: 信息的內(nèi)容部分的長度
             ?? *pbProviderSpecificData:針對運營商的附加數(shù)據(jù)
             ?? *dwProviderSpecificDataSize :附加數(shù)據(jù)的長度
             ?? smsdeDataEncoding :短信編碼[SMSDE_OPTIMAL是其
             推薦值]表示由短信中心決定字符的格式
             ?? dwOptions :其他選項
             ?? psmsmidMessageID: 用于得到系統(tǒng)回執(zhí)的信息
             SmsGetMessageStatus
             */

            //SMSDE_GSM使用7-bit編碼
             //SMSDE_UCS2使用16-bit (Unicode)編碼
             if(SUCCEEDED(SmsSendMessage(smshHandle, NULL,
              &smsaDestination, NULL, (PBYTE) lpszMessage,
              _tcslen(lpszMessage) * sizeof(TCHAR), (PBYTE) &tpsd,
              sizeof(TEXT_PROVIDER_SPECIFIC_DATA), SMSDE_UCS2,
              SMS_OPTION_DELIVERY_NONE, &smsmidMessageID)))
             {
              //Tstr=L"發(fā)送完成";


              //發(fā)送完成
              MessageBox(    NULL,L"SEND OK",L"MSG",MB_OK);
             }
             else
             {

              //發(fā)送失敗
              //Tstr=L"發(fā)送失敗";
              MessageBox(NULL,L"發(fā)送失敗",L"MSG",MB_OK);
             }

             // clean up
             VERIFY(SUCCEEDED(SmsClose(smshHandle)));



            注意:LPCTSTR 和 PCWSTR是寬字符,所以用16-bit (Unicode)編碼。網(wǎng)上的HelloSMS的程序不夠嚴(yán)謹(jǐn),如果照用可能造成短信中心網(wǎng)關(guān)把短信給吞掉的情況,程序雖然調(diào)用成功,但是就是目標(biāo)號碼收不到短信。函數(shù)參數(shù)中的后三個參數(shù)可以不用或設(shè)默認(rèn)值都可以。

            使用Windows CESMS API函數(shù)SmsSendMessage可以發(fā)送7-bit編碼和16-bit編碼的短消息(未測試8-bit編碼)。單條短消息的最大字符數(shù)分別是16070。發(fā)送短消息全部為ASCII字符,SMS_DATA_ENCODING參數(shù)選擇SMSDE_GSMSMSDE_OPTIMAL都可以。發(fā)送短消息不全為ASCII字符,SMS_DATA_ENCODING參數(shù)選擇SMSDE_UCS2SMSDE_OPTIMAL都可以。建議選擇SMSDE_OPTIMAL

            發(fā)送短消息全部為ASCII字符,且字符個數(shù)超過160個時,系統(tǒng)會自動將短消息進(jìn)行分割,但并不是按每條160進(jìn)行分割,而是按每條153。發(fā)送短消息不全為ASCII字符,且字符個數(shù)超過70個時,系統(tǒng)會自動將短消息進(jìn)行分割,但并不是按每條70進(jìn)行分割,而是按每條67

            發(fā)送短消息的字符數(shù)超過16070時,應(yīng)該自行進(jìn)行分割,而不應(yīng)交由系統(tǒng)進(jìn)行分割,這樣可以最大限度的利用單條短消息的最大字符數(shù)分別是16070的條件.

            上面的代碼是通過MAPI來實現(xiàn),任意一部有SIM卡的PDA/PPC上都已運行。


            下面的代碼是通過串口和AT指令來發(fā)送短信,需要有Gms Modem 才可以運行。
            HANDLE hSerial;
             int res;
             unsigned long bytes;
             
             //COM1 COM2 COM4
             hSerial = CreateFile(_T("COM1:"), GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
             
             
             
             if(hSerial == NULL)
             {
              ///L"串口打開失敗";
              return;
             }
             ///配置串口
             DCB  PortDCB;   
             PortDCB.DCBlength = sizeof(DCB);
             // 默認(rèn)串口參數(shù)
             GetCommState(hSerial, &PortDCB);
             PortDCB.BaudRate =115200 ; // baud
             PortDCB.ByteSize = 8;     // Number of bits/byte, 4-8
             PortDCB.Parity = NOPARITY;
             PortDCB.StopBits = ONESTOPBIT; 
             PortDCB.fBinary=TRUE;
             if (! SetCommState(hSerial, &PortDCB))
             {
              ///L"配置串口失敗";
              return;
             }
             ////配置超時值
             COMMTIMEOUTS  CommTimeouts;
             GetCommTimeouts(hSerial, &CommTimeouts);
             CommTimeouts.ReadIntervalTimeout = 100; 
             CommTimeouts.ReadTotalTimeoutMultiplier = 100; 
             CommTimeouts.ReadTotalTimeoutConstant = 100;   
             CommTimeouts.WriteTotalTimeoutMultiplier =100; 
             CommTimeouts.WriteTotalTimeoutConstant = 100;   
             if (!SetCommTimeouts(hSerial, &CommTimeouts))
             {
              
              return;
                            
             
             //設(shè)置串口“感興趣”的事件
             SetCommMask(hSerial, EV_RXCHAR);
             
             //設(shè)置輸入輸出緩沖區(qū)
             SetupComm(hSerial, 1024, 1024);
             
             //初始化緩沖區(qū)中的信息
             PurgeComm(hSerial, PURGE_TXCLEAR|PURGE_RXCLEAR);
             
            //-------------------------------------串口設(shè)置完畢----------------------------------------


             UpdateData(TRUE);

             char str_last[2000];
             int num_Length=0;
             int context_length=0;
             TCHAR tmp[2];
             int i=0;
             char addr[100]="0891683108100005F0";//短信中心號碼 
             char phone[100]="11000D91";
             char msg[1000];
            // unsigned char *msg_tmp;
             unsigned char msg_tmp[1000];

             
             char str_tmp[100]="";
             char str_tmp2[50]="000800";

             num_Length=m_num.GetLength();
             context_length=m_context.GetLength();

             m_num=L"86"+m_num;
             if(num_Length%2){m_num=m_num+L"F";}


             for (i=0; i <(m_num.GetLength()); )  //處理 目標(biāo)電話號碼 奇偶換位
             {
              phone[i+9] = m_num.GetAt(i);
              phone[i+8] = m_num.GetAt(i+1);
              i+=2;
             }

            WideCharToMultiByte(CP_ACP, 0, m_context, m_context.GetLength(), str_tmp, 160, NULL, NULL);

            // msg_tmp=(unsigned char *)malloc(sizeof(unsigned char ));
             gsmEncodeUcs2(str_tmp,msg_tmp,context_length);//UCS2編碼

             for(i=0;i<context_length*2;i++)//將編后的碼轉(zhuǎn)換為16進(jìn)制以進(jìn)行傳輸 前兩位預(yù)留
             {
              wsprintf(tmp, L"%02X", msg_tmp[i]);
              msg[2*i+2]=tmp[0];
              msg[2*i+3]=tmp[1];
             
             }
             
             
             wsprintf(tmp, L"%02X", context_length*2);//前兩位存儲msg的長度
             msg[0]=tmp[0];
             msg[1]=tmp[1];

            //-------------------------------addr phone msg 全部就緒----------------------------
            // 最終信息為 str_last=addr+phone+000800+msg 

             for(i=0;i<18 ;i++)
             {
              str_last[i]=addr[i];
             }
             
             for(i=0;i<22 ;i++)
             {
              str_last[i+18]=phone[i];
             }
             

             for(i=0;i<6 ;i++)
             {
              str_last[i+40]=str_tmp2[i];
             }
             
             for(i=0;i<context_length*4+2 ;i++)
             {
              str_last[i+46]=msg[i];
             }

             str_last[i+46]='\32';

             
            //--------------------------開始發(fā)送-------------------------------------------- 
             
             char str1[100]="AT+CMGS=25\r";
             wsprintf(tmp, L"%02d",(context_length*4+30)/2);//計算需要發(fā)送的字節(jié)

             str1[8]=tmp[0];
             str1[9]=tmp[1];

             char str2[100]="";
             res=WriteFile(hSerial,str1,100,&bytes,NULL);
             res=ReadFile(hSerial,str2,100,&bytes,NULL);
             
             

             char str3[100]="";
             res=WriteFile(hSerial,str_last,1000,&bytes,NULL);
             res=ReadFile(hSerial,str3,100,&bytes,NULL);
            //----------------------------發(fā)送結(jié)束------------------------------------------------------- 

            // free(msg_tmp);
             CloseHandle(hSerial); 
            }

            BOOL CSendMessage2::OnInitDialog()
            {
             CDialog::OnInitDialog();
             
             // TODO: Add extra initialization here
            // m_num=L"15010657623";
             m_num=L"13811916883";

            // m_context=L"1192323 392486";
             m_context=L"工作愉快!";
             UpdateData(false);  
             return TRUE;

            網(wǎng)上的HelloSMS的發(fā)送短信代碼,有不完善的地方。用它來發(fā)短信可能會有問題,下面這段代碼是我對它的一個改進(jìn),基本可以運行在實際的項目中:
            ////////////////////////////////////////////////////////////////////////////
            //                         發(fā)送短信
            //lpszSMSC:短信中心號碼  lpszRecipient:接收號碼(目標(biāo)號碼)
            //lpszMessage:發(fā)送短信內(nèi)容
            //bUseDefaultSMSC:目標(biāo)地址 
            //bSendConfirmation:消息發(fā)送選項
            ////////////////////////////////////////////////////////////////////////////
            void CCellGuardApp::SendSMS( LPCTSTR lpszMessage, LPCTSTR lpszRecipient,LPCTSTR lpszSMSC,BOOL bSendConfirmation, BOOL bUseDefaultSMSC)
            {
             SMS_HANDLE smshHandle; //短信句柄
             SMS_ADDRESS smsaDestination;//接收號碼
             TEXT_PROVIDER_SPECIFIC_DATA tpsd;
             SMS_MESSAGE_ID smsmidMessageID;

             // 打開發(fā)送句柄
             // 協(xié)議字符串,       SMS_MODE_SEND:發(fā)送模式 psmshHandle:返回的句柄 phMessageAvailableEvent:通知的事件
             if(FAILED(SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &smshHandle, NULL)))
             {
              return;
             }

             // Create the destination address
             smsaDestination.smsatAddressType = SMSAT_UNKNOWN;
             _tcsncpy(smsaDestination.ptsAddress, lpszRecipient, SMS_MAX_ADDRESS_LENGTH);

             // Set up provider specific data
             memset(&tpsd, 0, sizeof(tpsd));
             //tpsd.dwMessageOptions =  PS_MESSAGE_OPTION_NONE;
             tpsd.dwMessageOptions =  PS_MESSAGE_OPTION_STATUSREPORT;
             tpsd.psMessageClass = PS_MESSAGE_CLASSUNSPECIFIED;
             tpsd.psReplaceOption = PSRO_NONE;
             //tpsd.dwHeaderDataSize = 0;
             ZeroMemory(tpsd.pbHeaderData, sizeof(tpsd.pbHeaderData));        
             tpsd.dwHeaderDataSize = 0;
             tpsd.fMessageContainsEMSHeaders = FALSE;
             tpsd.dwProtocolID = SMS_MSGPROTOCOL_UNKNOWN;

             // Send the message, indicating success or failure
             if(SUCCEEDED(SmsSendMessage(smshHandle, NULL,
              &smsaDestination, NULL, (PBYTE) lpszMessage,
              _tcslen(lpszMessage) * sizeof(TCHAR), (PBYTE) &tpsd,
              sizeof(TEXT_PROVIDER_SPECIFIC_DATA), SMSDE_UCS2,
              SMS_OPTION_DELIVERY_NONE, &smsmidMessageID)))
             {
              //Tstr=L"發(fā)送完成";
              //發(fā)送完成
              ;
             }

             // clean up
             VERIFY(SUCCEEDED(SmsClose(smshHandle)));
            }

            posted on 2008-04-10 11:17 Benjamin 閱讀(3609) 評論(3)  編輯 收藏 引用 所屬分類: PDA/PPC開發(fā)

            評論

            # re: WINCE下如何實現(xiàn)發(fā)短信  回復(fù)  更多評論   

            Thank you!
            通過看你的介紹把我的一個問題解決了!

            不勝感激啊!
            2009-03-09 17:23 | Sandy

            # re: WINCE下如何實現(xiàn)發(fā)短信  回復(fù)  更多評論   

            弄錯了一個參數(shù)
            PS_MESSAGE_CLASSUNSPECIFIED

            這個參數(shù)設(shè)置以后,短信發(fā)出去了,但是卻引起了tmail.exe的異常

            不知道什么原因造成的
            2009-03-09 19:30 | Sandy

            # re: WINCE下如何實現(xiàn)發(fā)短信  回復(fù)  更多評論   

            但是WINCE開發(fā)包中沒有 sms.h 啊,windows mobile中倒是有
            2009-07-10 11:04 | hou
            久久99国产亚洲高清观看首页 | 99久久精品免费国产大片| 亚洲精品久久久www| 久久只有这精品99| 老色鬼久久亚洲AV综合| 91精品国产高清久久久久久io| 777米奇久久最新地址| 国产精品一久久香蕉产线看| 亚洲国产天堂久久久久久| 精品国产日韩久久亚洲| 亚洲中文精品久久久久久不卡| 无码人妻久久一区二区三区免费| 精品久久无码中文字幕| 国产精品99久久久久久猫咪| 94久久国产乱子伦精品免费 | 亚洲乱码日产精品a级毛片久久 | 热99RE久久精品这里都是精品免费| 精品久久久中文字幕人妻| 久久午夜羞羞影院免费观看| 久久久久久久久久久久中文字幕 | 久久夜色精品国产欧美乱| 狠狠狠色丁香婷婷综合久久俺| 久久93精品国产91久久综合| 久久九色综合九色99伊人| 久久国产免费直播| 模特私拍国产精品久久| AAA级久久久精品无码区| 精品国产乱码久久久久软件| 97久久精品国产精品青草| 久久男人AV资源网站| 国内精品久久久久影院免费| 日韩一区二区久久久久久| 午夜天堂av天堂久久久| 精品久久久无码中文字幕天天| 久久久久无码精品国产不卡| 国产精品VIDEOSSEX久久发布| 亚洲av日韩精品久久久久久a| 亚洲国产成人久久笫一页| 午夜不卡888久久| 国产精品久久久天天影视香蕉| 亚洲AV无码久久精品狠狠爱浪潮|