例如短信息中心号码为深圳 +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/
分享到:
相关推荐
AT编程的常见问题,资料来源网络,希望对大家有用。AT编程的常见问题,资料来源网络,希望大家有用。
在使用model开发过程中常会碰到一些问题,这里详细罗列了AT编程过程中遇到的问题,及错误代码意义,希望对大家有用。
WAVECOM AT命令编程必读 2008-04-17 16:20 1.相关的GSM AT指令 与SMS有关的GSM AT指令(from GSM07.05)如表1所示: 表1 相关的GSM AT指令 AT 指令 功 能 AT+CMGC Send an SMS command(发出一条短消息命令) AT+...
1.8 How can I look at process in the system like ps does? 1.9 Given a pid, how can I tell if it's a running program? 1.10 What's the return value of system/pclose/waitpid? 1.11 How do I find out ...
Unix编程常见问题解答(FAQ/Frequently Asked Questions)(v1.37)(中文版 v0.1.0) 作者:天下一菜 来源:博客园 问题目录 ******** (译者:这里我有意保留原文以便于查询) 1. Process Control 进程控制 1.1 Creating ...
回答了在unix的C编程中容易碰到的问题和编程经验,包含进程控制、一般文件操作、终端输入/输出、系统信息和编程杂技等等,是不可多得的好资料
Java Comm API编程指南.doc Javax.comm简介.doc KEIL中如何用虚拟串口调试串口程序.doc Message PDU编码规则.doc QHDQ-29DDDAD3A0.LOG SMSLib串口通信.doc 串口常用参数.doc 关于java使用javacomm20.doc 常见的进制...
C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定...
问题1:Unhandled exception at 0x00007FFDB39AA839 in TesseractLACadd1.exe: Microsoft C++ exception: boost::filesystem::filesystem_error at memory location 0x000000EAFABFEED0. 解决方案:我只能说,这个的...
This document can be found on the CD delivered with the PTC04 or at http://www.melexis.com In a nutshell: IMPORTANT: ALL INSTALLATIONS HAVE TO BE DONE WITH ADMINISTRATOR RIGHTS. This means you need to...
编程语言可以使用 C 语言,使用 AT89X52.h 头文件来编写程序。 在实际应用中,步进电机 28BYJ-48 可以应用于各种自动控制系统,例如工业自动化、机器人、医疗设备等。它具有高精度、高速、可靠性强等优点,广泛应用...
互联网程序员都每天刷题嘛打字稿编程测试问题 一位朋友兼 C++/JS 开发人员 Dave 最近开始讨论编程测试。 他对采访中被问到的一些问题笑了笑,然后评论了如何在网上有很多关于这些问题的其他语言的信息,但不是 ...
2) 手机/Modem的调试主要通过AT命令,市面上的工具通常没有针对性的设计 “智能串口调试”重点解决这两个问题。 特性列表 串口的连接/断开 发送数据:异步,逐行同步 发送数据:支持Lua脚本 发送数据...
C++(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生 [17] ,最...C++拥有计算机运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力 本资源帮助你了解和学习C++
本书共分10章,内容主要包括数据通信的基本概念、串口通信的RS-232C/RS-485/RS-422标准、并口通信的IEEE 1284 1994标准、Modem的基础知识和AT命令集、传真机的传真协议、PLC(可编程逻辑控制器)和单片机等。...
我们常见的路灯、过道灯、草坪灯、广告箱灯、霓虹灯和厕所等公共场所用的一些照明灯往往彻夜通明,这不仅浪费能源,在某种程度上也造成了光污染。在今天电力能源供应比较紧张的情况下,在没有人员活动的深夜让这些灯...
英特尔 LPC接口规范,LPC总线,原名叫Low pin count ...LPC总线通常和主板上的南桥物理相连,南桥在IBM PC AT平台上通常连接了一系列的“老旧”设备,例如两个可编程中断控制器, 可编程计时器和两个 ISA DMA 控制器。
LPC总线,原名叫Low pin count Bus,是在IBM PC兼容机...LPC总线通常和主板上的南桥物理相连,南桥在IBM PC AT平台上通常连接了一系列的“老旧”设备,例如两个可编程中断控制器, 可编程计时器和两个 ISA DMA 控制器。
计算机在人们的日常生活中是比较常见的电子产品之一。可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计是用AT89S51单片机、LCD显示器、控制按键为元件来设计的计算器。利用此设计...