搞了半个月的SGIP长短信协议,协议的涉及主要内容如下,其他内容和短协议没有区别。
一、设置UDHI标志
TP_udhi
Value |
1 |
Integer |
GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐。 |
SGIP的Submit信令中的TP_udhi设置为0x40。
二、消息内容增加用户数据包头UDH
包头一共6个字节,如下:
1、 字节一:包头长度,固定填写0x05;
2、 字节二:包头类型标识,固定填写0x00,表示长短信;
3、 字节三:子包长度,固定填写0x03,表示后面三个字节的长度;
4、 字节四到字节六:包内容:
1) 字节四:长消息参考号,每个SP给每个用户发送的每条参考号都应该不同,可以从0开始,每次加1,最大255,便于同一个终端对同一个SP的消息的不同的长短信进行识别;
2) 字节五:本条长消息的的总消息数,从1到255,一般取值应该大于2;
3) 字节六:本条消息在长消息中的位置或序号,从1到255,第一条为1,第二条为2,最后一条等于第四字节的值。
注:移动终端支持的一条消息的内容长度为140字节,因此后面还可以增加134个字节的真实的消息内容,若编码格式为0则可以增加134个ASCII字符,若编码格式为8则可以增加67个中英文字符。
反复测试之后,得到如下结论:
SP端不需要对短信进行分条处理
1.tp_udhi=0x40;
2.长消息不需要分条直接转化成 ucs2 编码的byte数组
3.messagecoding=8
4. byte[] tp_udhiHead = new byte[6];
tp_udhiHead[0] = 0x05;
tp_udhiHead[1] = 0x00;
tp_udhiHead[2] = 0x03;
tp_udhiHead[3] = 0x01;
tp_udhiHead[4] = (byte)(1);
tp_udhiHead[5] = 0x01;
5.把tp_udhiHead和message数组组合
SP把消息发送到ISMG之后ISMG根据消息长度自动分条,用户手机如果有自动合并消息内容的功能就能收到长短信,否则还是收到分条的短信。