100分求解电信网关(SMGP) MsgID 问题。
关于接收到Submit_Resp 以及 Deliver 包 里面包含的MsgID 组成部分拆包,百思不得其解!
MsgID (摘抄协议部分如下)
MsgId字段包含以下三部分内容:
SMGW代码:3字节(BCD码)
编码规则如下:
3位区号(不足前添0)+2位设备类别+1位序号
区号:所在省长途区号
设备类别:SMGW取06
序号:所在省的设备编码,例如第一个网关编号为1
时间:4字节(BCD码),格式为MMDDHHMM(月日时分)
序列号:3字节(BCD码),取值范围为000000~999999,从0开始,顺序累加,步长为1,循环使用。
例如某SMGW的代码为010061,在2003年1月16日下午5时0分收到一条短消息,这条短消息的MsgID为:0x01006101161700012345,其中010061表示SMGW代码,01161700表示接收时间,012345表示消息序列号。
为此按照协议拆分:
1.根据以上三部分 3、4、3字节分别进行BCD解码,得到的结果后6位序列号,按照BCD8421的说法,不应该出现BCD非法编码,却出现16进制(非法)的数值
2.按照BCD8421的严格标准转码,也就是BCD编码低位在前的要求,那么得到的结果是每两位就交换了位置,例如,2014年7月1日15点30分,按照协议(smgp)应该是07011530,然而得到的结果确实70105103
求解,正确解码规则,要求能解码后否和协议规则,再次压缩能恢复到解码前。