东软短信网关发送wappush实现方法

为了推广厦门移动掌上110,由于网址不易记忆,厦门移动提出让用户拨打一个接入号,由我们的系统给用户推送掌上110的网址,这就需要用到wappush功能。目前我们在移动公司申请的短信接入端口一般是连短信网关的企业网关,默认是没有开放wappush功能的,需要用到wappush功能是需要通过移动公司向省公司申请。
    CMPP的协议是用来发送短消息的,包括普通的短消息、彩信以及WapPush等。具体你要发送什么类型的消息,需要设置MessageType字段和MessageContent字段。MessageType字段指定需要发送的短消息类型,根据不同的短消息类型,在填写MessageContent字段需要按照要求的特定格式来填写。因此如果你要发送的是普通的短消息,那只要在MessageContent字段填上你要发送的文字内容即可,如果你要发送的是WapPush,则就要在MessageContent字段按照发送wappush要求的格式来填写。目前介绍wappush数据包结构的资料很少,而且短信网关的厂商也不提供相关的开发文档。按照我的理解它应该是属于一种通用的标准。
    下面根据网上搜索到的介绍内容及试验后的结果对MessageType字段和MessageContent字段的填写方法做一说明:
    1、MessageType字段的设置:设置消息体submit类msgmode字段为UDHI(即msgmode字段设置为8)。UDHI字段,消息体扩展的标志。普通短消息设置为0,扩展使用时,设置为1。使用长短信合并功能时和wappush时,需要设置为1;短消息编码方式dataCoding设置为4,即采用二进制编码作为短消息编码方式。
    2、MessageContent字段格式:
       WapPush包发送的内容实际上WBXML,这种格式将一些标记用代码来表示,例如数值0x01表示上一个标记结束(</xxx>之类的)。然而WBXML的缩略标记分为两部分,一部分是所有类型的XML都通用的,另一部分是不同类型的XML有着不同的解释。而WBXML的Spec只提到了:
       "-//WAPFORUM//DTD WML 1.0//EN" (WML 1.0)
       "-//WAPFORUM//DTD WTA 1.0//EN" (WTA Event 1.0)
       "-//WAPFORUM//DTD WML 1.1//EN" (WML 1.1)
       这三种类型,而我们所做的WapPush使用的是
       "-//WAPFORUM//DTD SI 1.0//EN
       以上是我搜索到的可能是比较有说明价值的资料,下面主要说说试验成功过的MessageContent的编码格式:
       首先必须从0605040B8423F0开始,这应该是表示是wappush的消息头。具体的意义大概是:
  udh += "06"; //User Data Header Length (6 bytes)
  udh += "05"; //UDH Item Element id (Port Numbers)
  udh += "04"; //UDH IE length (4 bytes)
  udh += "0B";
  udh += "84"; //destination port number
  udh += "23";
  udh += "F0"; //origin port number
 接下来是:
  pud += "81"; //transaction id (connectionless WSP)
  pud += "06"; //'pdu type (06=push)
  pud += "06"; //Headers len
  pud += "03"; //字符串开始
  pud += "AE";
  pud += "81";
  pud += "EA"; //content type: application/vnd.wap.sic; charset=utf-8
  pud += "8D"; //content-length
  pud += Integer.toHexString(length).toUpperCase();//body消息体的长度(16进制表示)
 接下来是:
  body += "02";
  body += "05"; //-//WAPFORUM//DTD SI 1.0//EN
  body += "6A"; //UTF-8
  body += "00"; //字符串结束
  body += "45"; //<si>
  body += "C6"; //<indication
  body += "08"; //<action=signal-high>
  body += "0C"; //href="http://
  body += "03"; //字符串开始
  body += byteArrayToHexString(url.getBytes()); //实际地址(不要包括"http://",用ascii码表示)
  body += "00"; //字符串结束
  body += "0A"; //created 创建时间
  body += "C3"; //时间
  body += "07"; //时间长度
  body += startTime; //YYYYMMDDHHMISS
  body += "10"; //si_expires 过期时间
  body += "C3"; //时间
  body += "07"; //时间长度
  body += endTime; //YYYYMMDDHHMISS
  body += "01"; //>
  body += "03"; //字符串开始
  body += byteArrayToHexString(subject.getBytes("utf-8")); //显示给用户的内容,(用UTF-8编码)
  body += "00";
  body += "01"; //</indication>"
  body += "01"; //</si>

 给用户推送“http://wap.xiamentd.com”这个内容的messageContent的字符串表示的内容为:
 0605040B8423F081060603AE81EA8D6602056A0045C6080C037761702E7869616D656E74642E636F6D000AC3072009010101010110C307200912010101010103000101
 

 

      
      几个注意点:
      1、实际使用时可以将按上述格式用字符串的方式生成消息内容,然后在统一压缩成字节流。
      2、startTime和endTime的格式是YYYYMMDDHHMISS要用7个byte表示。
      3、给同一个号码不能发送完全相同的内容,否则只能收到第一条消息。也就是说startTime和endTime要实时变换。

 

 

你可能感兴趣的:(数据结构,xml,IE,WAP)