通过短信网关发送Wappush消息
来源:互联网 发布:三分算法应用 编辑:程序博客网 时间:2024/04/29 13:01
因为已经有了另一个同事的工作基础,我所要作的就是使发送出去的消息尽量支持更多的手机型号。在网上搜关于wap和短信方面的资料,收获不多,而且不很具体。
最后经过不懈的努力,大量的试验,现在已经可以支持很多种机型了。如:索爱K750c, 索爱K700, MOTO A768, Nokia3230, Nokia6270。
下面这段介绍转自网上,已经不知道最初的作者是谁了:
--------------------------------------------------
基于短信网关发送WAP PUSH
WAP PUSH的发送有两种途径,一个是通过PPG网关,另外一个是通过SMPP协议。其中SMPP是一个基本协议,在中国主要有三个由其派生的协议:中国移动的CMPP协议,中国联通的SGIP(在CDMA上是ETIP),以及小灵通的SMGP。通过中国移动的PPG网关发送WAP PUSH有着开发周期长,调测流程较复杂等不足,而使用CMPP协议即基于短信网关来进行WAP PUSH发送灵活性比较高,相对比较简单。
--------------------------------------------------
我所使用的方式,就是通过中国移动的CMPP协议网关,发送wap push消息。消息格式整理如下:
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;
}
- 通过短信网关发送Wappush消息
- 通过短信网关发送Wappush消息
- 通过短信网关发送Wappush消息
- 通过短信网关发送Wappush(包括超长Wappush)C#代码
- 通过短信网关发送Wappush(包括超长Wappush)
- WAPPUSH 原理 基于短信网关WAP推送的实现
- 发送WapPush(C#)
- Cmpp发送wappush
- SMS发送WapPush
- 发送短信消息
- 寻找短信发送网关Webservcie接口
- cmpp2.0如何实现网关短信发送
- 网站通过移动网关发短信
- perl通过网关发短信程序
- java实现短信消息发送
- asp.net通过短信猫发送短信
- java通过短信平台发送短信
- java通过sms发送短信
- 搭建一个轻量级服务器环境 LIGHTTPD + MYSQL + PHP(FAST-CGI)
- 多线程、Socket技术及委托技术的关系
- 自动播控系统软件的性能要求
- 实现调用外部EXE程序的代码
- 迁移Exchange Server 2003
- 通过短信网关发送Wappush消息
- 查询前几条记录在不同数据库中的用法
- 巴比伦富翁
- 注意、提示、错误通用对话框函数
- C#开发编码规范
- 获取计算机名称的函数
- 腾讯要来了——和Qmm的约会
- C# 中的委托和事件
- 启动服务函数