串口编程总懂点吧?就是用普通串口通讯控件;当然最好的是APRO串口系列;经典;
PDU串不仅仅 包含了消息,而且还有很多发送者的元信息,他的SMS服务中心,时间标志等等。这些都是以8位字节的16进制数,或者半8位字节
的十进制数。以下的字符书我从Nokia 6110 收到的信息,当从www.mtn.co.za发送的串是"hellohello"的时候。
07 917238010010F5 040BC87238880900F100009930925161958003C16010
这个八位串包含了三个部分:第一个8位表示SMSC信息的长度("07"),SMSC的信息 ("917238010010F5"),和SMS_DELIVER部分(GSM 03.40中
指定)。
注意: 有些手机(例如:Ericssson 888?)头三个部分(被着色)在PDU模式下被省略。
8位 描述
07 SMSC信息的长度。(在这个例子里是7个八位)
91 SMSC的地址类型 (91意味着国际格式的电话号码)
72 38 01 00 10 F5 服务中心号码(半八位的十进制数)电话号码是一个奇数(11),因此加入F来保证8位。这个服务中心的号码
是"+27381000015"
04 SMS_DELIVER的第一个8位。
0B 地址长度。发送号码的长度(0B hex = 11 dec)
C8 发送号码的地址类型
72 38 88 09 00 F1 发送号码(半八位的十进制数),有一个F结尾。
00 TP-PID.协议标识
00 TP-DCS 编码方式
99 30 92 51 61 95 80 TP-SCTS.时间邮戳(半8位)
0A TP-UDL.用户数据长度,信息的长度。TP-DCS域表明是7-bit格式的数据。因此长度在这里是一个10个7-bits。如果TP-DCS被设置成8-bit或
者Unicode,那么长度就应该是9个八位长度。
E8329BFD4697D9EC37 TP-UD. 7-bit编码的信息。
所有的8位都是16进制编码,除了服务中心号码,发送号码和时间邮戳;他们都是十进制的半8位编码。在PDU串的结尾部分包含了一些16进
制的8-bits数据,但他们实际7-bits数据。
十进制的半8位只需要将高位和地位交换就可以得到实际的数值。例如:"72 38 88 09 00 F1" 到 "27 83 88 90 00 1F"。因为电话号码是
一个奇数,没有办法组成8位编码,所以使用F来补齐。在解析时间邮戳的时候("99 03 29 15 16 59 08"),前6位代表日期,后6位代表时间
,最后2位是时区。
Flash SMS
在某些手机上(所有的Nokias,某些Siemens, Ericsson, Motorola 等等..)class 0信息将被显示为一种flash SMS信息。这些信息只要一到
达,将立即显示在屏幕上,而不需要按任何按钮。如果数据的编码方式是设置成16-bit unicode (ucs2), 而且信息以"0001"开头,那么它将作
为一个闪烁的flash message显示。
1、 英文编码
缺省的GSM字符集为7位编码,ASCII码为8位编码,编码就是将8位ASCII编码转换为7位编码。
例如:1234 编码后得到31D98C06
2进制表示
8位编码 00110001 00110010 00110011 00110100
7位编码 00110001 11011001 10001100 00000110
通过例子可以看出,将ascii8位编码的Bit8去掉,依次将下7位编码的后几位逐次移到前面,形成新的8位编码。
以下是C++Builder的实现代码:
String __stdcall EncodeEnglish(String InputStr)
{
int n,len,cur;
String tempstr,returnstr;
unsigned char mid1[2],mid2[2];
len=InputStr.Length();
n=0;
for(int i=1;i<=len;i++)
{
if (i
{
strcpy(mid1,InputStr.SubString(i,1).c_str());
strcpy(mid2,InputStr.SubString(i+1,1).c_str());
cur=(mid1[0]>>n)|((mid2[0]<<(7-n))& 0xff);
}
else
{
strcpy(mid1,InputStr.SubString(i,1).c_str());
cur=(mid1[0]>>n)& 0x7f;
}
FmtStr(tempstr,"%2.2X",ARRAYOFCONST((cur)));
returnstr=returnstr+tempstr;
n=(n+1)%7;
if (n==0)
i++;
}
return returnstr;
}