最近刚完成CMPP3.0发送手机短信的开发工作,感觉不错。
发送短信方法:是向移动网关发送CMPP_SUBMIT消息,如果CMPP_SUBMIT消息中标识要移动网关发送确认是否成功的CMPP_SUBMIT_RESP消息。CMPP_SUBMIT_RESP结构(CMPP3.0的):
字段名 | 字节数 | 属性 | 描述 |
Msg_Id | 8 | Unsigned Integer | 信息标识,生成算法如下: 采用64 位(8 字节)的整数: (1)时间(格式为MMDDHHMMSS,即 月日时分秒):bit64~bit39,其中 bit64~bit61:月份的二进制表示; bit60~bit56:日的二进制表示; bit55~bit51:小时的二进制表示; bit50~bit45:分的二进制表示; bit44~bit39:秒的二进制表示; (2)短信网关代码:bit38~bit17,把短信 网关的代码转换为整数填写到该字 段中;(3)序列号:bit16~bit1,顺序增加,步 长为1,循环使用。 各部分如不能填满,左补零,右对齐。 (SP 根据请求和应答消息的Sequence_Id 一致性就可得到CMPP_Submit 消息的 Msg_Id) |
Result | 4 | Unsigned Integer | 结果: .... |
下面给出自己写的解析Msg_Id的简单代码:
public class ToByteTest {
public static void main(String[] args){
long temp = -4025053409177436045L;
byte[] bt = new byte[8];
for(int i=0;i<8;i++){
bt[i] = (byte) (temp >> (56 - i * 8));
}
int mask = 0xf0;
int month = (bt[0] & mask)>>4;
System.out.println("Month:"+month);
mask=0xF;
int date = (bt[0] & mask)<<1;
mask=0x80;
int date2 = bt[1]>>7;
date = (date&(date2|0x1E));
System.out.println("Date:"+date);
//01111100
mask=0x7C;
int hour = (bt[1]&mask)>>2;
System.out.println("Hour:"+hour);
mask=0x3;
int minute = (bt[1]&mask)<<4;
minute |= (bt[2]&0xF0)>>4;
System.out.println("Minute:"+minute);
mask=0xf;
int second = (bt[2]&mask)<<2;
second |= (bt[3]&0xff)>>6;
System.out.println("Second:"+second);
mask = 0x3F;
int Msg_Id = (bt[3]&mask)<<16;
Msg_Id |= (bt[4]&0xFF)<<8;
Msg_Id |= (bt[5]&0xFF);
System.out.println("Msg_Id:"+Msg_Id);
mask = 0xFF;
int seq_id = (bt[6]&mask)<<8;
seq_id |= (bt[7]&mask);
System.out.println("seq_id:"+seq_id);
}
}
执行结果如下:
Month:12(月份)
Date:16(日期)
Hour:9(小时)
Minute:2(分钟)
Second:13(秒)
Msg_Id:1(短信网关代码)
seq_id:115(序列号)