现在的位置: 首页 > 综合 > 正文

有关短信息回执的解析处理

2018年02月08日 ⁄ 综合 ⁄ 共 2348字 ⁄ 字号 评论关闭

以下为转发内容,尊重作者原创。

---------------------------------------------

最近本人在做一个关于短消息的回执的程序,费了十牛三虎之力,又查了许多资料,再加上自己的实际试验、应用,在前人的基础上做下总结,添加点自己经验,,并且发现网上关于短信回执的有一定的错误,下面本人经过整理的足疗,介绍给大家,以飨读者。
一、硬件接口
GSM MODEM支持GSM07.05、GSM07.07所定义的的AT指令集。通过串口与计算机相连
二、短消息回执设置
AT CNMI=2,2,0,1,1 //新收到的短信直接发送至TE终端,不存储在SM卡中,这是关键的一步,如果设置不对,可能收不到短信回执,切记!下面将它的意思说明如下:

AT CNMI=<mode>,<mt>,<bm>,<ds>,<brf>
参数:
mode:
0——缓存在终端
1——直接发送到TE
mt:
0——接收到新的SMS不返回事件
1——如果接收到的SMS存储在na ,则返回
CMTI:<mem>,<index>
2——除了Class2 SMS,新的SMS直接发送到终端,返回:
CMT:<length><CR><LF><PDU>
3——Class3 SMS使用mt=2的方法返回,其他类型的使用mt=1的方法返回。
bm:
0——小区广播不通知
2——新的小区广播通知,返回
CBM:<length><CR><LF ><pdu>
3——Class3格式的小区广播通知,使用bm=2格式
ds:
0——状态报告不通知
1——新的状态报告通知,返回:
CDS:<length><CR><LF><pdu>
2——如果新的状态报告存储到ME,则返回:
CDSI:<mem>,<index>
brf:
1——始终为1
三、代码设置
一般GSM MODEM硬件厂商,都会提供一段现成的代码,把代码里的11该成31即可,这条也是必须设置正确,否则也是看不到短信回执的,下面本人将厂商提供的Delphi代码给大家列出来。

function TForm_Main.SmsSend(comm : TComm;csca, dst: string; content: WideString): Boolean;
var
s : string;
t : string;
l : Integer;
tp : Integer;
begin
if csca = '' then
s := '00'
else
begin
t := '91' TelNumEncode(csca);
FmtStr(t, '%2.2X%s', [Length(t) div 2, t]);
s := t;
end;
l := Length(s) div 2;
tp := $11; //把此处的11改成31
tp := tp or $80;
FmtStr(t, '%2.2X', [tp]);
s := s t;
s := s '00';

t := TelNumEncode(dst);
FmtStr(t, '%2.2X91%s', [Length(t) - Count(t, 'F'), t]);
s := s t;
s := s '000801';

if Length(content) > MAX_SMS_LENGTH then
Delete(content, MAX_SMS_LENGTH 1, Length(content) - MAX_SMS_LENGTH);
t := USC2Encode(content);
FmtStr(t, '%2.2X%s', [Length(t) div 2, t]);
s := s t;
FmtStr(s, 'AT CMGS=%d' #13 '%s' #$1A, [(Length(s) div 2) - l, s]);
PushCmd(comm,s);
Result := True;
end;

四、操作
在超级终端设置cnmi
at+cnmi=1,1,0,1,1
OK
再发送一条短信返回OK后大概5s终端返回了
CDS: 26
0006320D91683161721356F6506071415354005060714153640000

第一段000632
000632的意思是,此sim卡号从启用到在,你当前发送的短信总数量.不信你可以连续发送两条,看看递增结果,这个是16进制格式.0D接收方号码长度
0D//接收方号码长度
91 //短信中心号码类型
683161721356F6//接收方号码
50607141535400//信息到达短信中心的时间
5060714153640000//信息发送到接收方的时间

0006320D91683161721356F6506071415354005060714153640000
这条消息就是短信中心返回的发送方发送给接收方短信回执,以后要做的事就是把这段回执信息解析出来就行了,经过奇偶对换位置,就得到了如:

“短消息中心在‘2005-06-17 14::35:45’收到了本号发给13162731656的消息,’13162731656’在’2005-06-17 14:35:46’时收到了本号发出的信息

至此已完成了短信回执的全部任务,后续要做的事就是在接到回执的时候把手机号码解析出来,就可以进行统计分析了,简单吧,会了不难,难了不会呀,呵呵。
五、体会
本文就两处需要修改,一条就是:AT CNMI=2,2,0,1,1另一条:把代码中的11改成31.只有修改了这两条才可能有短信回执,否则再怎么做也不会出现回执的,呵呵。简单吧,这非得让移动、联通公司给气死,因为要开通此业务是要moeny的,呵呵,不管怎样做短信回执的使命是完成了,希望能给正在寻求此题目的朋友带来好处,少走误区,这才是我最大了愿望呀!

另外一篇关于短信回执文章的位置在:http://blog.csdn.net/9527/archive/2007/02/06/1503482.aspx 

 

更多技术文章请参看施昌权的个人网站: http://www.joyvc.cn

 

抱歉!评论已关闭.