Wappush可以通过短信行业网关发送出去(通过submit消息体),移动和联通都是一样,至于电信的协议没试过,不过应该也一样,因为都是参照标准协议改编的。我参考了网上N多文章后才总结出来的一种规则,而且实际测试过发到手机,应该说比较靠谱,写出来节省一下大家时间。我介绍的仅仅是一种能发送出去的方法,而且不是只有这种方法才能发送,如果你要深究原理,需参考GSM协议的相关章节。
具体规则如下:
1首先要设置字段:
setTpPid((byte) 0);
setTpUdui((byte) 1);
setMsgFmt((byte) 4);
2修改短信内容体的字段。
一个Wappush包发出去的时候(这里的包,仅仅是指短信协议里面的内容字段),是由WDP+WSP+SI三个部分组成。
WDP由固定的一串编码加一个refrence number + 总包数 + 当前包数。refrence number 应该是同一条Wappush唯一的标识(如果拆分成了多条,这几条的refNO应该相同),当然当你发送了128条后,肯定重复了,总包数指的是你这条Wappush分成几个包发送出去,当前包数顾名思义指的是当前这个包是第几条,如果不需要拆分的Wappush这两个字段当然均填1。
WDP = { 0x0B, 0x05, 0x04, 0x0B, (byte) 0x84, 0x23, (byte) 0xF0, 0x00, 0x03 } + refNO + total + currIndex;
WSP 由固定的3个字节的编码组成。WSP = { 0x06, 0x01, (byte) 0xAE }
SI里面包括了一些标记和推送链接以及内容。
SI = TransactionId(又是一个ID,每条Wappush应该不同,拆分时这个字段只会出现一次,详见后面描述) + { 0x02, 0x05, 0x6A, 0x00, 0x45, (byte) 0xC6, 0x08, 0x0C, 0x03 } + urlBytes(推送链接的UTF-8编码数组) + { 0x00, 0x01, 0x03 (这一串标记地址结束)} + contentBytes(推送内容的UTF-8编码数组) + { 0x00, 0x01, 0x01(这一串标记整个Wappush的结束) }
好了,你的消息体如果按上面规则(WDP+WSP+SI)组合起来的长度小于等于140(短信内容体字段要求),直接发送出去就OK了。
如果超过了140要进行拆分,拆分原理是每条拆分的包由WDP+ ( (WSP + SI)的第i部分组成 )。也就是说拆分出来的每一条都是以同样的WDP开始(注意:包的当前序号要增加,就这个字段不一样),然后后面的部分是将其直接按需要的长度截断来组成每一条的(这里也说明了SI的第一个字段TransactionId只会出现一次的原因)。这个算法不难,但是还是需要稍微动一下脑筋。
原理就是上面这些了,然后友情再说一下通过短信发送的时候,联通SGIP协议里面本身对长短信没什么特殊要求,只要在内容里面填上相应标记就可以了,当通过SGIP发送Wappush的时候,直接将内容按照上面规则组合就是了,拆分的时候把其他字段也不用管。
而移动CMPP协议里面有个当前第几条和总条数的字段,当超长短信的时候,需要在这个字段填值。如果是Wappush拆分的时候呢?这个我也没试过(超长Wappush是在联通试的,短的wappush在移动也试过,都是接的华为的短信行业网关),就留给大家自己去试试吧,最好把结果也告知我,如果觉得有什么问题的,也请留言或者来信指出,谢谢~。作者:笑傲网湖。
代码就不贴了,如果需要可以给我邮件,