您的位置:首页 > 编程语言

AT编程常见问题

2015-08-04 16:12 309 查看
例如短信息中心号码为深圳 +8613800755500

  

  对方手机号码为
+8613612345678

  

  要发送的信息为“中”

  

  算法步骤:

  

  一、地址部分,用字符串 addr 表示

  

  1、将短信息中心号码去掉+号,看看长度是否为偶数,如果不是,最后添加F

  即 addr =
"+8613800755500"

  => addr =
"8613800755500F"

  

  2、将奇数位和偶数位交换。

  => addr =
"683108705505F0"

  

  3、将短信息中心号码前面加上字符91,91是国际化的意思

  => addr =
"91683108705505F0"

  

  4、算出 addr 长度,结果除2,格式化成2位的16进制字符串,16 / 2 = 8
=> "08"

  => addr =
"0891683108705505F0"

  

  二、手机号码部分,用字符串 phone

  

  1、将手机号码去掉+号,看看长度是否为偶数,如果不是,最后添加F

  即 phone =
"+8613612345678"

  => phone =
"8613612345678F"

  

  2、将手机号码奇数位和偶数位交换。

  => phone =
"683116325476F8"

  

  三、短信息部分,用字符串 msg 表示

  

  1、转字符串转换为Unicode代码,例如“中”的unicode代码为 4E2D,

  (好像是将中字的ASCII码分开,分别转成16进制)。因为我用DELPHI,

  请vb朋友自己找例子,网上应该许多

  

  function
TfrmMain.str_Gb2UniCode( text: string ): String;

  var

  i,j,len:Integer;

  cur:Integer;

  t:String;

  ws:WideString;

  begin

  Result:='';

  ws := text;

  len :=
Length(ws);

  i := 1;

  j := 0;

  while i <=
len do

  begin

  cur :=
ord(ws);

  FmtStr(t,'%4.4X',[cur]);
//BCD转换

  Result :=
Result+t;

  inc(i);

  //移位计数达到7位的特别处理

  j := (j+1) mod
7;

  end;

  end;

  

  即 msg = "中"

  即 msg =
str_Gb2UniCode( msg )

  => msg =
"4E2D"

  

  

  

  2、将 msg 长度除2,保留两位16进制数,即 4E2D = 4 / 2
=> "02",再加上 msg

  => msg =
"024E2D"

  

  四、组合

  

  1、手机号码前加上字符串 11000D91,这是一些PDU代码,写死就行了,感兴趣可以参考相关PDU格式说明

  即 phone =
"11000D91" + phone

  =>
11000D9168683116325476F8

  

  2、手机号码后加上 000800 和刚才的短信息内容,000800也写死就可以了

  即 phone = phone
+ "000800" + msg

  即
11000D9168683116325476F8 + 000800 + 024E2D

  => phone =
11000D9168683116325476F8000800024E2D

  

  3、phone 长度除以2,格式化成2位的十进制数

  即
11000D9168683116325476F8000800024E2D => 36位 / 2 => 18

  

  五、所以要发送的内容为

  AT+CMGS=18<回车,ASCII为13>

  addr+phone+<^Z>+换行回车<13和10>

  

  即AT+CMGS=18<回车>0891683108705505F011000D91683116325476F8000800024E2D^Z换行回车

  

  你先用AT指令试是 然后在用程序实现

  

  function
Encode7bit(Src:String):String;

  var
Dst:String;

  i:Integer;

  CurS,NextS:Byte;

  TStr:String;

  begin

  for i:=1 to
Length(Src) do begin

  //当前是字符按8位分组的第8位,无需编码(8个字符已缩短为7个)

  if (i mod 8)=0
then Continue;

  

  //取当前位为数字

  TStr:=Copy(Src,i,1);

  CurS:=Ord(TStr[1]);

  

  //当前右移位组中的第一个字符不移位

  if (i mod
8)>1 then

  CurS:=(CurS
shr ((i mod 8)-1) );

  

  //取后一位为数字如果到了字符的结束,不取

  if i

  TStr:=Copy(Src,i+1,1);

  NextS:=Ord(TStr[1]);

  end else

  NextS:=0;

  //后一位移位
左移

  NextS:=(NextS
shl (8-(i mod 8)));

  

  //当前移位后加后一位移位后
转换成为十六进制

  Dst:=Dst+IntToHex(CurS+NextS,2);

  end;

  Result:=Dst;

  end;

  

  function
Decode7bit(Src:String):String;

  var
Dst:String;

  i:Integer;

  CurS,ProiS:Byte;

  begin

  for i:=1 to
(Length(Src) div 2) do begin

  //将当前位的十六进制转换为十进制

  CurS:=StrToInt('$'+Copy(Src,(i-1)*2+1,2));
//32->50

  //取前一位十六进制转换为十进制

  if (i mod
7)<>1 then

  ProiS:=StrToInt('$'+Copy(Src,(i-2)*2+1,2))
//C8->200

  else

  ProiS:=0;

  //前一位右移,即将当前字符前移的位取出来

  if (i mod
7)>0 then

  ProiS:=(ProiS
shr (9-(i mod 7)))

  else

  ProiS:=(ProiS
shr 2);

  //当前位左移除掉高位

  if (i mod
7)>0 then

  CurS:=(CurS
shl (i mod 7) )

  else

  CurS:=(CurS
shl 7 );

  //将第八位设置为0

  CurS:=(CurS
shr 1);

  Dst:=Dst+Chr(CurS+ProiS);

  //第七个十六进制内已包含有一个完整的字符

  if (i mod
7)=0 then begin

  CurS:=StrToInt('$'+Copy(Src,(i-1)*2+1,2));
//32->50

  CurS:=(CurS
shr 1);

  Dst:=Dst+Chr(CurS);

  end;

  end;//en
for

  Result:=Dst;

  end

  转自http://bbs.sendsms.com.cn/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: