联通长短信开发–使用smproxyapi.jar

内容纲要

联通短信是基于sgip协议的,作为第三方接入使用的是smproxyapi.jar包来开发短信功能。联通普通短信长度是140字节,超长就会报错不能提交给网关。起初规避措施是自己把长短信拆分,然后分条发送,这样手机用户接收到的就是多条短信,体验不好。后来通过查资料发现可以使用udhi头来使多条短信最终能合成一条短信展示给手机用户。 

1.首先要设置tp_udhi为1,代表后面每条短信内容前面几个字节是udhi头.如果是普通短信设置为0即可。 0:不含任何头信息, 1:含头信息。参考协议:gsm03.40  9.2.3.23 

2.如果一条长短信被分为了3条,则每条短信正文内容前面需要添加一个6字节的udhi头。 
       

Java代码  收藏代码

  1. // 头信息。包头一共6个字节,如下:   

  2.         // 1、字节一:包头长度,固定填写0x05;  

  3.         // 2、字节二:包头类型标识,固定填写0x00,表示长短信;  

  4.         // 3、字节三:子包长度,固定填写0x03,表示后面三个字节的长度;  

  5.         // 4、字节四到字节六:包内容:  

  6.         // 1)字节四:长消息参考号,每个SP给每个用户发送的每条参考号都应该不同,可以从0开始,每次加1,最大255,便于同一个终端对同一个SP的消息的不同的长短信进行识别;  

  7.         // 2)字节五:本条长消息的的总消息数,从1到255,一般取值应该大于2;  

  8.         // 3)字节六:本条消息在长消息中的位置或序号,从1到255,第一条为1,第二条为2,最后一条等于第四字节的值。  

  9.         byte[] tp_udhiHead = new byte[6];  

  10.         tp_udhiHead[0] = 0x05;  

  11.         tp_udhiHead[1] = 0x00;  

  12.         tp_udhiHead[2] = 0x03;  

  13.         tp_udhiHead[3] = 0x00;// 初始化,后面会具体赋值  

  14.         tp_udhiHead[4] = 0x00;// 初始化,后面会具体赋值。  

  15.         tp_udhiHead[5] = 0x00;// 初始化,后面会具体赋值。  


上面的第四个字节代表每组短信(比如一条长短信分为3条短信,则这3条为一组)的标识,不强制必须唯一,本人这样赋值: 

Java代码  收藏代码

  1. tp_udhiHead[3] = (byte)(int)(Math.random() * 255);  



3.编码。messageCoding要设置为8,即UCS2编码,也就是短信内容要使用smsContent.getBytes("UTF-16BE");来获取字节,然后前面拼接上6个字节的udhi头。普通短信messageCoding设置为15即可。


实际用15 gbk编码也可以

发表回复