移动、联通、电信长短信规范

这段时间做了一个有趣的东西,就是利用长短信检测用户手机状态,原理是发送半条短信,一般来说:移动比较新点的手机都收不到,很老的手机会收到;联通手机几乎都收不到;电信手机都能收到。但这些短信都有一个共同的特点,手机不会提示收到短信,且能返回短信状态报告。后来测试中发现一些问题,这里总结一下。

移动联通长短信测试乱码,解决办法:在MsgContent前加入7个字节的TP_udhi头

7位的协议头格式:060804XXXXMMNN
byte1:06,表示剩余协议头的长度
byte2:08,这个值在GSM03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为2(格式中的XX值)。
byte3:04,这个值表示剩下短信标识的长度
byte4-5:XXXX,这批短信的唯一标志,事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很重要。
byte6:MM,这批短信的数量。如果一个超长短信总共5条,这里的值就是5。
byte7:NN,这批短信的数量。如果当前短信是这批短信中的第一条的值是1,第二条的值是2。
例如:06080400390201

电信长短信测试乱码,解决办法:在MsgContent前加入6个字节的TP_udhi头

6位协议头格式:050003XXMMNN
byte1:05,表示剩余协议头的长度
byte2:00,这个值在GSM03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为1(格式中的XX值)。
byte3:03,这个值表示剩下短信标识的长度
byte4:XX,这批短信的唯一标志(被拆分的多条短信,此值必需一致),事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很重要。
byte5:MM,这批短信的数量。如果一个超长短信总共5条,这里的值就是5。
byte6:NN,这批短信的数量。如果当前短信是这批短信中的第一条的值是1,第二条的值是2。

例如:050003390201