开发过程遇到的几个难点:
1、 | 序列号的定义 |
2、 | int转byte[]及字节序 |
3、 | 重复收到联通上行(MO) |
4、 | 收到用户的定购命令但无法下行(MT) |
1、序列号的定义
SGIP1.2 第7页 序列号的定义 写道
序列号分成三部分,每部分为一个32位整数,第一部分表示命令源节点的编号,第二部分表示命令产生的日期和时间(网关系统中的任何命令的保存时间都不应该超过一年),格式为十进制的mmddhhmmss,比如11月20日20时32分25秒产生的命令,其第二部分为1120203225;第三部分由0开始,循环进位,直到进位满了之后再清零,重新开始计数。接收方在返回应答时,应答的序列号必须和相对应的命令的序列号相同。
SGIP1.2 第7页 源节点编号规则 写道
在整个网关系统中,所有的通信节点(SMG、GNS、SP和SMSC)都有一个唯一的数字编号,不同的SP或SMSC或SMG或GNS编号不能相同,编号由系统管理人员负责分配。编号规则如下:
SMG的编号规则:1AAAAX
SMSC的编号规则:2AAAAX
SP的编号规则:3AAAAQQQQQ
GNS的编号规则:4AAAAX
其中,AAAA表示四位长途区号(不足四位的长途区号,左对齐,右补零),X表示1位序号,QQQQQ表示5位企业代码。
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[]的方法,注意必须以网络字节序的方式转换,即高位放在低地址,低位放在高地址