通过短信网关发送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;
}

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
短信网关接口源代码:口标准:客户端通过Tcp连接到服务器(211.162.36.89:8021, IP可能会变动,变动时,以www.pohoo.com网站公布的为准)。连接成功后客户端应首先发送注册串为:Login Name=【注册名】&Pwd=【注册密码】&Type=【注册类型,0:接收和发送;1:接收;2:发送;默认为0】(回车换行) 注:强烈建议使用Type=0的模式。如果所有服务注册成功,服务器返回给客户端字符串:Pass(回车换行)否则将断开连接。指令集: 1:分发中心向服务方发送用户的短信请求,格式如下: 分发中心==>Deliver CommandId=【命令标识,4字节整型,循环使用】 &GateName=【源网关名】 &ItemId=【节目标识】 &UserNumber=【用户号码】 &SpNumber=【服务号码,必须以9160开头】 &MsgCode=【短信编码,0:ASCII串;3:短信写卡操作;4:二进制信息;8:UCS2编码;15:含GB汉字; 24:UCS2编码闪电短信(Msg<=69个汉字),124:GBK编码闪电短信(Msg<=69个汉字)】 &Msg:=【短信内容,经加码处理,需解码】 (回车换行) 回应:Received CommandId=【对应于发送时的命令标识】(回车换行) 2:服务方向分发中心提交发送内容,格式如下: 服务方==>Submit (空格) CommandId=【命令标识,4字节整型,循环使用】 &GateName=【目的网关名】,默认由分发中心根据手机号码决定目的网关名】 &ItemId=【节目标识】 &SpNumber=【服务号码,以9160开头】 &UserNumber=【目的用户号码,如果是群发将个号码之间用“,”隔开,注意最多只能有255个群发号码】 &FeeNumber=【计费号码,短信产生的费用由该号码承担,不填时默认向目的用户号码收费】 &FeeType=【计费类型,1:免费,需申请,2:按条计费,3:定制包月计费(同时要求ReportFlag=2)。默认:2】 &ScheduleTime=【定时发送时间,默认立即发送,格式举例:2002年09月10日20:08:00为:020910200800】 &ExpireTime=【短信寿命中止时间,格式举例:021201090508,默认为移动或联通(24小时后)中止时间】 &MtFlag=【*引起MT消息的原因,仅当向联通用户发短信时需要该参数,0-MO点播引起的第一条MT消息;1-MO点播引起的非第一条MT消息; 2-非MO点播引起的MT消息;3-系统反馈引起的MT消息。默认为0】 &ReportFlag=【状态报告标志,0:不需要 状态报告;1:无论成功与否都返回状态报告;2:该条消息仅携带包月计费信息,不下发给用户; 3:只有最后出错时要返回状态报告,默认:0】 注:在每次包月定制计费时都需发送一条内容为空串,ReportFlag=2,FeeType=3的记录,该短信不会下发给用户,仅用于告知网关向 该用户收取包月费用,在用户没有取消定制的情况下每月必须且只能发送一次。 &MsgCode=【短信编码,0:ASCII串;3:短信写卡操作;4:二进制信息;8:UCS2编码;15:含GB汉字; 24:UCS2编码闪电短信(Msg<=69个汉字),124:GBK编码闪电短信(Msg<=69个汉字)】 &MsgId=【用户自定义消息标识,推荐格式:年月日时分秒+6位自递增码,例如:9月23日10:00:03发出的序号为1记录可定义为 923100003000001。自定义格式最大不超过20个字符且不能有需加码解码的特殊字符】 &ExtData:=【短信扩展数据,服务方短信发送的附加信息,在有报告反馈时会连带该扩展数据反馈给服务方,需加码处理,但加码后不能超过 120个字节长度。默认为空串】 &TP_pId=【GSM协议类型。详细解释请参考GSM0 3.40中的9.2.3.9】 &TP_udhi=【GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐】 &Msg:=【短信内容,需加码处理】 (回车换行) 回应:Received CommandId=【对应于发送时的命令标识】(回车换行) 3:分发中心向服务方发送报告,格式如下: 分发中心==>Report CommandId=【命令标识,4字节整型,循环使用】 &GateName=【源网关名】 &MsgId=【服务方在Submit时写在MsgId参数中的值】 &ExtData=【服务方在Submit时写在ExtData参数中的值】 &State=【发送状态,0:向网关提交成功,1:向网关提交失败,2:发送成功,3:等待发送,4:发送失败,5:Submit参数错误】 (回车换行) 回应:Received CommandId=【对应于发送时的命令标识】(回车换行) 4:分发中心为了测试服务方是否连接,会在等待1分钟未收到任何数据发送测试指令,该指令也可由服务方主动发起: 分发中心或服务方==>ActiveTest CommandId=【命令标识,4字节整型,循环使用】(回车换行) 回应:Received CommandId=【对应于发送时的命令标识】(回车换行) 5:无论分发中心还是服务方,只要3分钟之内未收到任何数据要主动断开连接,对于服务方在断开后重新连接。加码解码规则: 加码时将字符串中的所有字符转换成其对应的ASCII值的16进制值,例如:“A”的ASCII码值为65,以16进制值表示为41,故应发送两个字符 “41”以代表字符“A”。对于汉字则以其内码的16进制值来表示,如“测试”应为:B2E2CAD4。参数中只要参数标识与内容之间用 “:=”连接的都需要解码后方可使用,解码时将没两位当成其ASCII值的16进制值将其还原。 注: 1、命令和回应并非一个命令完了后紧接者就回应,服务方可一次发出许多条指令,可能在若干条后才陆续收到回应,根据“Received”的 “CommandId”可知道是对于哪一条发出指令的回应。 2、指令和参数标识不区分大小写,但各参数内容区分大小写。 3、不需要的参数可不参与发送,此时系统认为该参数值为系统默认值。同时所有参数的位置并不固定,请不要按照位置获取特定参数值。 4、信息发送方对于参数如果进行过加码处理的其参数标识和参数之间用“:=”连接,否则用“=”连接。同样对于接收方,只要发现参数标识和 参数之间用“:=”连接,接收方必须对参数内容进行解码方可使用。 5、当注册类型为发送,回应内容也是从该通道反馈,但报告的反馈是从同注册名的接收注册通道反馈的。 6、新网关测试需向鸿讯要求提供测试的注册名和密码。 6: 错误代码: 1、 100:用户名或密码不正确,登录失败 2、 110:记费号码与注册手机不符。 3、 111: 实际IP与登录IP不符

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值