通過短信網關發送Wappush消息

1. 消息頭,包含兩部分,UDH和PUD,現在經過測試,有三種可以使用的包頭數據.

 包頭a:
  UDH: 06 05 04 0B 84 23 F0
  PUD: 01 06 03 AE 8D C4
 包頭b:
  UDH: 0B 05 04 0B 84 23 F0 00 03 03 01 01
  PUD: 29 06 06 03 AE 81 EA 8D CA
 包頭c:
  UDH: 06 05 04 0B 84 23 F0
  PUD: 81 06 06 03 AE 81 EA 8D 00

2. 消息體

 02
 05 //WAPFORUM//DTD SI 1.0//EN
 6A //UTF-8
 00 //字符串結束
 45 //<si>
 C6 //<indication
 08 //<action=signal-high>
 0C //href="http://"
 03 //字符串開始
 .... //URL字符串,要UTF8編碼
 00 //字符串結束
 01 //>
 03 //字符串開始
 .... //內容描述字符串,要UTF8編碼
 00 //字符串結束
 01 //</indication>
 01 //</si>


3.
生成消息包體後,要在PUD包頭中設置包體的長度,PUD頭中的最後一個字節表示包體的長度.

 PUD[len(PUD)-1] = len(BODY)/2 + 128;

4. 生成短信內容消息數據

 SMSDATA = UDH + PUD + BODY
 SMSDATA在短消息中作爲消息內容

5. 短信息發送
 
 
使用CMPP協議向中國移動網關發送短消息時,要設定MsgFormat爲4,表示數據是二進制格式.


6. 測試結果

 使用各種包頭數據,所支持的手機型號不同.測試結果如下:
 包頭a: 索愛K750c, Nokia3230, Nokia6270
 包頭b: 索愛K750c, Nokia3230, Nokia6270, 多普達ppc696
 包頭c: 索愛K750c, 索愛K700, MOTO A768, Nokia3230, Nokia6270

附1: 第三個包頭的詳細描述

 // UDH
 06 //User Data Header Length (6 bytes)
 05 //UDH Item Element id (Port Numbers)
 04 //UDH IE length (4 bytes)
 0B
 84 //destination port number
 23
 F0 //origin port number

 // PUD
 81 //transaction id (connectionless WSP)
 06 //pdu type (06=push)
 06 //Headers len
 03
 AE
 81
 EA //content type: application/vnd.wap.sic; charset=utf-8
 8D //content-length
 INT //body length


附2:封裝的C++數據打包函數代碼

BOOL GenWapPushMsg(const char *pszUrl,const char *pszInfo,char *pszData,int &nMsgLen)
{
 char szUTF8Url[256]={0},szUTF8Info[256]={0};
 if(!GB2UTF8((char*)pszUrl,szUTF8Url))
 {
  return FALSE;
 }
 
 if(!GB2UTF8((char*)pszInfo,szUTF8Info))
 {
  return FALSE;
 }

 // guanzhong 2006-2-22, 使用了第三個包頭
 unsigned char szUDH[] = {0x06,0x05,0x04,0x0B,0x84,0x23,0xF0};
 unsigned char szPUD[] = {0x81,0x06,0x06,0x03,0xAE,0x81,0xEA,0x8D,0x00};
 // guanzhong

 unsigned char szMsg[280]={0};
 
 int nUDHLen = sizeof(szUDH);
 int nPUDLen = sizeof(szPUD);
 unsigned char *pszBody = szMsg + nUDHLen + nPUDLen;

 unsigned char *pszPos = pszBody;

 *pszPos++ = 0x02;;
 *pszPos++ = 0x05; //-//WAPFORUM//DTD SI 1.0//EN
 *pszPos++ = 0x6A; //UTF-8
 *pszPos++ = 0x00; //字符串結束
 *pszPos++ = 0x45; //<si>
 *pszPos++ = 0xC6; //<indication
 *pszPos++ = 0x08; //<action=signal-high>
 *pszPos++ = 0x0C; //href="http://"
 *pszPos++ = 0x03; //字符串開始
 strcpy((char*)pszPos,szUTF8Url);
 pszPos += strlen(szUTF8Url);

 *pszPos++ = 0x00; //字符串結束
 *pszPos++ = 0x01; //>
 *pszPos++ = 0x03; //字符串開始

 strcpy((char*)pszPos,szUTF8Info);
 pszPos += strlen(szUTF8Info);

 *pszPos++ = 0x00; //字符串結束
 *pszPos++ = 0x01; //</indication>"
 *pszPos++ = 0x01; //</si>

 //設置包體的長度
 //szPUD[nPUDLen-1] = pszPos-pszBody;
 // guanzhong 2006-3-3 修改,否則MOTO A768不能正常接收
 szPUD[nPUDLen-1] = (pszPos-pszBody)/2 + 128;

 memcpy(szMsg,szUDH,nUDHLen);
 memcpy(szMsg + nUDHLen,szPUD,nPUDLen);
 nMsgLen = pszPos - szMsg;

 memcpy(pszData,szMsg,nMsgLen);
 return TRUE;
}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章