当短信成功下发到手机终端时,一个多星期的联通业务接入程序终于完成,由于以前没有类似的开发经验,中间走了不少弯路,浪费了很多时间。总结下开发经验为下一步开发移动的业务接入打下一个基础。
开发过程遇到的几个难点:
1、 | 序列号的定义 |
2、 | int转byte[]及字节序 |
3、 | 重复收到联通上行(MO) |
4、 | 收到用户的定购命令但无法下行(MT) |
1、序列号的定义
SMG的编号规则:1AAAAX
SMSC的编号规则:2AAAAX
SP的编号规则:3AAAAQQQQQ
GNS的编号规则:4AAAAX
其中,AAAA表示四位长途区号(不足四位的长途区号,左对齐,右补零),X表示1位序号,QQQQQ表示5位企业代码。
由于java只有byte,short,int,long等数据类型,不像c/c++那样,有unsigned int,所以java语言中普通的int变量不能存储如此大的数据
比如说,我所在的城市济南,区号为0531,公司的企业代码为41211,按照源节点编码规则为3053141211,共10位,而int变量的范围为-2147483648~2147483647
int srcnode = 3053141211;显然不能通过编译因为已经超过int的表示范围。
还好,Java提供了超大整型类BigInteger
int srcnode =new BigInteger("3053141211").intValue(); //源节点编号
byte[] srcnodeBytes = IntToBytes4(srcnode);
用于Java采用补码srcnode的字节长度为5,不要使用toByteArray()方法获得字节数组,应单独编写一个方法用于int转byte[]的方法,注意必须以网络字节序的方式转换,即高位放在低地址,低位放在高地址
/** * 将int转换为byte数组 *@param i 待转换的int变量 *@return byte[] 转换后的byte数组 */ public static byte[] intToBytes4(int i) { byte[] tmpbytes = new byte[4]; tmpbytes[3] = (byte) (0xFF & i); tmpbytes[2] = (byte) ((0xFF00 & i) >> 8); tmpbytes[1] = (byte) ((0xFF0000 & i) >> 16); tmpbytes[0] = (byte) ((0xFF000000 & i) >> 24); return tmpbytes; }
2、int转byte[]及字节序
在将int转为byte[],须注意字节的顺序。字节顺序分网络字节序和本地字节序,网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解析。网络字节顺序采用big endian排序方式。sgip1.2规定数据传输采用网络字节顺序Big endian(将高字节存储在低地址处,将低字节存储在高地址处)。具体转换及移位操作的使用见http://blog.csdn.net/Mailbomb/archive/2008/05/30/2496168.aspx
3、重复收到联通上行(MO)
重复收到联通上行困扰了我好几天,仔细检查命令的格式都没有错误,上网搜索在csdn看到一个遇到同样问题的帖子,加他QQ,问他这个问题时一直不肯告诉我原因,真的太小气了。想想也是,说不定他解决这个问题费了好多的时间和精力,怎么能让自己辛苦劳动的结果让别人拿去呢,真没有开源精神,鄙视下!
最后实在找不出原因,打电话请济南联通的张工在后台跟踪下,最终找出原因:
在SMG向SP递交上行时,SP收到上行必须给SMG一个deliver_resp应答,且应答的序列号必须和相对应的命令的序列号相同。 问题出在我返回了应答,但是返回的应答序列号和之前的上行的deliver命令的序列号不同,SMG认为SP没有收到上行,所以才会重复发送上行给SP.
4、收到用户的定购命令但无法下行(MT)
实施SPMS系统后,凡是订购(定制)业务都需要SPMS给用户发送确认短信,得到用户确认后,才形成临时订购关系;当SP的订购成功欢迎短信通知成功下发后,才生成正式订购(定制)关系。
根据“联通在信”SGIP1.2协议修改部分说明,在给用户下发短信时,必须附加linkID且SP下发时UserCount必须填写1,否则视为业务非法包处理。
Submit命令中Reserve字段说明:
该Reserve字段为8个字节的保留字段;现将该字段作为MO和MT之间一一对应的LinkID来用。该Reserve字段的值(LinkID)由SPMS业务鉴权平台生成,传给SMG。SPMS将对MO所引起的下发MT进行Reserve(LinkID)值的匹配校验。
SP收到SMG网关发送的MO包后,要将MO中的Reserve字段原封不动拷贝出,并赋到该MO所引起的MT(1个或多个)包的Reserve字段中。该操作适用于进行定制命令、退订命令、MO所引起的MT点播之间的对应关系。如果SP不填,SPMS将因为匹配关系不合法,进行过滤。没有成功下发的原因就是因为没将MO中的Reserve字段赋值到Submit的Reserve字段造成的。
2 命令字错误
3 消息序列号重复
4 消息长度错
5 资费代码错
6 超过最大信息长
7 业务代码错
8 流量控制错(user_phone单填写CDMA号码不在白名单中或charge_phone和user_phone填写的CDMA号码不在白名单)
9 本网关不负责此计费号码(如意通和外省号码)
10 Src_ID错(手机因关机或内存满消息超时删除返回的状态报告)
11 CorpID错(如是MT消息出现很多,可能是他的提交submit消息接口与回状态报告的接口冲突,建议SP不要使用手机上行接口来下发SUBMIT消息;还有一种情况是corp_id填写错误)
12 计费地址错(user_phone单填写GSM号码不在白名单中或charge_phone和user_phone填写的GSM号码不在白名单)
13 目的地址错
14~49 扩展
23(英斯克定义) 路由错误。路由不存在,指消息路由的节点在路由表中不存在
24(英斯克定义) 黑名单用户。计费号码无效,鉴权不成功时反馈的错误信息
40(英斯克定义) 网关对如意通用户进行拦截
50(英斯克定义) 短消息内容非法
51 尚未建立连接
52 尚未成功登录
53 发送消息失败
54 超时未接收到响应消息(一般是tp_udhi一项填写不对,应该填写0)
55 等待状态报告超时
56 用户鉴权时用户状态不正常(charge_phone不在白名单)
60 保留
61 有效时间已经过期(charge_phone和user_phone填写的GSM号码不在白名单)
62 定时发送时间已经过期
63 不能识别的FeeType
64 发送服务源地址鉴权失败
65 发送服务目的地址鉴权失败
66 接收服务源地址鉴权失败(手机内存满或关机等待下发已经到达10条后,SP再发就会出现此错误)
67 接收服务目的地址鉴权失败
68 用户鉴权失败
69 此用户为黑名单用户
70 网络断连或目的设备关闭接口
71 超过最大节点数
72 找不到路由
73 等待应答超时
74 送SCP失败
75 送SCP鉴权等待应答超时
76 信息安全鉴权失败
77 超过最大Submit提交数
78 SPID 为空
79 业务类型为空
80 CPCode错误
81 发送接收接口重复
82 循环路由
83 超过接收侧短消息MTU
84 送DSMP重发失败
85 DSMP系统忙重发
86 DSMP系统忙,且缓存满重发
87 DSMP流控重发
88 流控错误,流量超过最大限制
89
90 SGIP消息等待处理
91 SGIP协议状态报告请求标识错误
92 SGIP协议MT标识错
93 SGIP协议SP节点编号错
94 没有配置帐号
101 /* 定购业务失败 */
102 /* 退定业务失败 */
103 /* 非法SP */
104 /* 非法用户 */
105 /* 用户未定购此项业务,鉴权失败 */
106 /* 非法费用,鉴权失败 */
107 /* 重复包月话单 */
108 /* 非法指令*/
109 /* 非法业务代码*/
110 /* 已定购该业务 */
111 /*--需要用户回复的定制信息--*/
112 /*--需要用户回复的定制信息--*/
113 /*--需要用户回复的定制信息--*/
114 /*--用户回复的定制信息不存在--*/
115 /*--SP回复的定制信息不存在--*/
116 /* 用户未点播此项业务,鉴权失败 */
117 /* 等待用户作二次确认*/
118 /* 等待sp作定制确认*/
119 /* sp定制确认返回ERROR定制不成功要求复位*/
121 /* 下行对应多个目的号码*/
199 /* SPMS 修正了SUBMIT */
122 /* 非法SERVICE */
123 /* 非法SERVICE */
1 非法登录,如登录名、口令出错、登录名与口令不符等。
2 重复登录,如在同一TCP/IP连接中连续两次以上请求登录。
3 连接过多,指单个节点要求同时建立的连接数过多。
4 登录类型错,指bind命令中的logintype字段出错。
5 参数格式错,指命令中参数值与参数类型不符或与协议规定的范围不符。
6 非法手机号码,协议中所有手机号码字段出现非86130号码或手机号码前未加“86”时都应报错。
7 消息ID错
8 信息长度错
9 非法序列号,包括序列号重复、序列号格式错误等
10 非法操作GNS (黑名单用户)
11 节点忙,指本节点存储队列满或其他原因,暂时不能提供服务的情况
21 目的地址不可达,指路由表存在路由且消息路由正确但被路由的节点暂时不能提供服务的情况
22 路由错,指路由表存在路由但消息路由出错的情况,如转错SMG等
23 路由不存在,指消息路由的节点在路由表中不存在
24 计费号码无效,鉴权不成功时反馈的错误信息
25 用户不能通信(如不在服务区、未开机等情况)
26 手机内存不足
27 手机不支持短消息
28 手机接收短消息出现错误
29 不知道的用户
30 不提供此功能
31 非法设备
32 系统失败
33 短信中心队列满
34 智能网平台扣费失败
35-99 其它错误码(待定义)
以下错误指SMG收到SPMS鉴权错误的原因
100 鉴权成功
101 SPNumber与SP企业代码匹配错
102 SPNumber未分配或不合法
103 业务代码未分配
104 业务资费类型填错
105 业务信息费率填写错误
106 用户未订制的SP非法下发
107 LinkID不匹配(MT与MO)
108 停机用户鉴权不通过,无法下发
109 计费号码无效
110 黑名单用户鉴权不通过,包括未启用状态、预开户状态及销户状态,即除正常通话状态、停机状态以外的所有其他状态
111 MT消息SPMS鉴权超时
112 包月话单SPMS鉴权超时
113 该包格式错误,MT话单的用户号码为空,或者CHARGENUMBER为空,或者SPNUMBER为空,或者CORPID为空,或者SERVICETYPE为空,或MT包里没有LINKID但根据业务代码判断却又不是订制类业务。
112 下发的MT超过最大条数,对点播类业务使用同一个LINKID下发的MT条数不能超过申报的数量
113 下发MT超过允许携带信息费的MT消息上限
114 USERCOUNT字段不为1,该字段必须填写1
115 SP不能将MOFLAG填为3,SP下发的MT包(除包月话单)中MOFLAG字段不能填3
116 将发NOTIUSER包,原流程需要终止。SPMS发通知信息给用户,MO不再上行发送给SP
117 WEB点播命令字不存在
118 包月话单被拦截
119 重复包月话单
120 订购业务失败
121 退订业务失败
123 重复订购
124 重复点播
125-255 其它错误码(待定义)
12为网关返回,说明SP NUMBER未分配或不合法
附各种常见错误码:
状态报告中常见错误码:
106:订购关系不存在,sp与vac订购关系不同步造成,建议sp进行全量同步;sp开通与vac每天ftp文件增量订购关系同步接口,以弥补vac通过sgip协议通知sp落订购关系的误差。
108:用户状态不正确,即用户处于非正常状态,不允许下发消息
10:短信中心下发失败,短信超过有效期
12:短信中心下发失败,被删除(超流量)
应答常见错误码:
SGIP协议登录网关错误码说明:
1:无权限(登录帐号或密码错误)
57:登录ip错误,sp连接网关的ip与sp申请资料中配置的ip不一样
93:SGIP协议SP节点编号错误,主要是节点编号中企业代码错误SGIP协议提交消息,网关应答错误码说明:
64:消息发送的源地址错误
93:SGIP协议SP节点编号错误,提交消息中的企业代码错误
联通最新更新定义
100 鉴权成功
102 SPNumber未分配
103 产品代码不存在
106 用户未订制的SP非法下发,即没有订购关系,或临时点播关系
107 LinkID不匹配(MT与MO)
108 用户状态不正常
109 计费号码不存在
110 黑名单用户鉴权不通过
115 SP不能将MOFLAG填为3,SP下发的MT包(除包月话单)中MOFLAG字段不能填3
117 WEB点播命令字不存在
118 包月话单被拦截
120 订购业务失败
121 退订业务失败
123 重复订购,订购关系已存在
162 超出用户消费限额
163 未发现用户归属地信息,用于按地市惩罚SP。
170 用户二次确认回复提示语出错
171 订购关系不存在,退订时用
172 订购关系不存在,SP不能主动HELP
173 订购关系处于中间状态(如待生效),业务不能用
175 QX分项退订之前没有查询
176 订购关系处于暂停状态
177 Sp下发的计费用户和VASP中定购关系的计费用户不一致,用于sp下包月话单。
179 Sp同步定购关系的产品代码和临时定购关系不一致
180 定购二次确认成功返回码; 0000,qxn,00000 发送到平台号码的返回码;0000,qxn,00000 发送到sp号码的返回码。 这些情况,网关不计上行通讯费。业务相关
181 超出业务发送时间段
182 超出业务当日下发次数
183 点播类业务不支持主动下行
185 不支持第三方订购
186 业务处于测试状态,非测试用户使用测试业务
187 业务处于异常状态
188 低信用度业务
190 用户点播的不是SP下行的业务,即SP点播下行业务代码与点播上行不一致SP相关
211 SP处于异常状态
212 SP的企业代码不存在
213 SP没有权限下发包月扣费消息
214 Sp没有被授权在该用户所在地市开展业务
215 Sp在该用户所在地市被暂停端口
216 Sp在该用户所在地市被暂停业务代收费
221 SP的IP地址不合法(仅用于HTTP接口反向操作)
222 SP的密钥无效(仅用于HTTP接口反向操作)
225 SP模拟mo定购未发现定购指令系统或数据配置错误
231 东软同步订购字段非法
248 系统不支持该服务,没有该系统指令
249 系统不支持帮助下发
251 (东软)捆绑业务不能退订
254 系统错误
255 缺省错
相关推荐
中国联通短信网关接入程序是基于SGIP1.2协议实现的,这个协议是中国联通用于与SP(服务提供商)进行通信的一种标准。SGIP1.2是SMGP(Short Message Gateway Protocol)的升级版本,主要用于短信的发送、接收、查询等...
中国联通SGIP 1.2接口文档详尽地描述了短消息网关系统接口协议的各项细节,涵盖了系统架构、通信流程、消息定义等内容,为SP和SMG开发提供了全面的技术指导。通过遵循这些规范,开发者可以构建出稳定可靠、高效易用...
1.接口说明 该接口库是用VC6.0开发的基于Windows平台上的SGIP1.2协议的实现,接口对中国联通SGIP协议进行了高度封装,目的是方便SP接入中国联通短消息网关。 2.功能特点 1)严格按照SGIP1.2协议实现,...
SGIP1.2协议定义了SMSC与SP之间进行数据交互的格式、命令和响应机制,涵盖了发送、接收、状态报告、计费等短信业务的关键环节。它基于TCP/IP协议栈,确保了数据传输的稳定性和安全性。 1.2 **适用范围** 该协议主要...
《联通短消息协议SGIP1.2》是中国联合通信公司在2001年推出的一种用于短消息服务(SMS)的网络接口协议。该协议详细规定了SMSC(Short Message Service Center,短信服务中心)与SP(Service Provider,服务提供商)...
中国联通SGIP1.2是中国联合通信公司在2001年推出的短消息网关系统接口协议的一个版本,旨在规范SP(Service Provider,服务提供商)与SMG(Short Message Gateway,短信网关)之间的通信,实现SP服务的一点接入、...
SGIP1.2协议的实施,对于提升中国联通的短信服务质量、优化网络资源分配、支持多样化的短信应用起到了关键作用。它不仅规范了内部通信,也为第三方开发者和服务提供商提供了接入标准,促进了整个行业的健康发展。...
参数包括SP接入号、企业代码、服务代码、计费类型、消息内容等。 - **主动与网关断开连接(SGIP_Disconnect)**:主动断开与网关的连接,返回0表示成功,负值表示失败。 - **等待并接收MO消息(SGIP_Get_MO)**:等待...
在实际应用中,SP需要按照SGIP协议的规定,进行接口开发,以便接入中国联通的短信平台。同时,SMG会定期通过SGIP协议与GNS交换路由信息,以保持路由表的最新状态,从而保证服务质量。 综上所述,SGIP协议在中国联通...