AT指令发送PDU短信详解(TC35I)
【楼主位】 mqh003 乙玥积分:36
派别:
等级:------
来自:山东
在坛子里众多好心人的帮助下,
经过一上午&午休的时间,终于用西门子TC35I手机模块成功发送了中文短信!
用串口调试助手发送AT指令到TC35I。本人借鉴网上一篇文章,部分数据更改为自己的真实数据,这样可信度较大,至少本人发送成功了,别人的数据或许也可以,有待验证!希望能给调试TC35I的同好们提供一点帮助。
下面进入正题:
注意将短消息中心号码和目标手机都换成自己的哦^&^
AT指令发送PDU短信详解
本文以一个实例来解说AT指令发送PDU短信的全过程,假如我要发送下面的短信:
接收号码:+8613602433649
短信内容:abc你好!
短信中心号码:+8613800546500
一、短信中心号码处理:用字符串 addr 表示
1、将短信息中心号码去掉+号,看看长度是否为偶数,如果不是,最后添加F
即 addr = "+8613800200500"
=> addr = "8613800546500F"
2、将奇数位和偶数位交换。
=> addr = "683108506405F0"
3、将短信息中心号码前面加上字符91,91是国际化的意思
=> addr = "91683108200005F0"
4、算出 addr 长度,结果除2,格式化成2位的16进制字符串,16 / 2 = 8 => "08"
=> addr = "0891683108200005F0"
二、手机号码处理:用字符串 phone
1、将手机号码去掉+号,看看长度是否为偶数,如果不是,最后添加F
即 phone = "+8613602433649"
=> phone = "8613602433649F"
2、将手机号码奇数位和偶数位交换。
=> phone = "683106423346F9"
三、短信息部分处理:用字符串 msg 表示
1、转字符串转换为Unicode代码,例如“abc你好!”的unicode代码为 0061006200634F60597DFF01,
2、将 msg 长度除2,保留两位16进制数,即 0061006200634F60597DFF01 = 24 / 2 => "0C",再加上 msg
=> msg = "0C0061006200634F60597DFF01"
四、组合
1、手机号码前加上字符串 11000D91(1100:固定,0D:手机号码的长度,不算+号,十六进制表示,91:发送到手机为91,发送到小灵通为81。但是我用81也能往手机上发送成功),
即 phone = "11000D91" + phone
=> 11000D91683106423346F9
2、手机号码后加上 0008A7 和刚才的短信息内容,0008A7也写死就可以了,具体含义我也不太清楚!
即 phone = phone + "0008A7" + msg
即 11000D91683106423346F9 + 0008A7 + 0C0061006200634F60597DFF01
=> phone = 11000B815160066703F10008A70C0061006200634F60597DFF01
3、phone 长度除以2,格式化成2位的十进制数
即 11000B815160066703F10008A70C0061006200634F60597DFF01 => 52位 / 2 => 26
五、所以要发送的内容为
AT+CMGF=0 <回车><换行>
OK
AT+CMGS=26<回车><换行>
> 891683108506405F011000B815160066703F10008A70C0061006200634F60597DFF01 <Ctrl+Z> <回车><换行>(注意:这里的Ctrl+Z的ASCII值是26,用16进制发送时是1A)
六、如果电脑旁有开着的音箱,就会出现熟悉的“吱吱”声了,
如果返回不是ERROR,恭喜你,发送成功了^_^
欢迎指正错误~
欢迎共同探讨!
__________________________
我不知道风,在那个方向吹...
2009-02-07,15:39:38 资料邮件 本主题状态:等待审核编辑删除
【1楼】 Appcat
积分:1021
派别:
等级:------
来自:
功德圆满!顶一个!
__________________________
耕田放牧打豺狼,风雨一肩挑
2009-02-07,16:22:52 资料邮件
自己恢复,减少老大工作量! 顶了 好!学习了! 顶了!! 前后文都不对应 大家好,我想问一个关于发送TCP消息指令,我用的是GTM900,发送TCP消息指令是:AT%IPSEND,
回复,%IPSEND:15 //注意:这个返回的buffer序号,每发送一包数据不管大小,都占用一个buffer空间。总计16个。如果返回的buffer序号在减小,表示当前的网络传送受阻,当返回的buffer序号为0时模块回复ERROR:20,这时我应该做什仏处理,是要重新建立连接吗? 顶下~~~ 正需要谢谢! 解释的够详细. 美女你太帅了。 呵呵,学习了 记号"TC35I" 太旧了~N年前就搞定PDU的~复杂的是WAP PUSH 记号"TC35I" 美女,你的这串指令用的是串口助手发送,我用超级终端,有区别么? To:【12楼】
WAP PUSH 目前应用有限制,移动已经取消了点对点的wap push的权限 我也试了很多遍,难道缺少什么设置
AT+CMGF=0
OK
AT+CMGS=27
> 0891683108506105F011000D9168317776xxxxF50004000C0061006200634F60597DFF01
+CMGS: 194
OK
发送正常
却收到的是乱码,无语了 改了一下终于可以了,谢天谢地啊
不是乱码了
AT+CMGF=0
OK
AT+CMGS=26
> 0891683108506105F011000B813177767xxxF50008A70C0061006200634F60597DFF01
+CMGS: 195
OK
小小解放
有人能知道原因就告诉小菜一声,多谢 手机号码后加上 0008A7 和刚才的短信息内容,0008A7也写死就可以了,具体含义我也不太清楚!
即 phone = phone + "0008A7" + msg
即 11000D91683106423346F9 + 0008A7 + 0C0061006200634F60597DFF01
=> phone = 11000B815160066703F10008A70C0061006200634F60597DFF01
前后怎么不一样呢上面是11000D91
下面却是 11000B81 0891683108506105F011000D9168317776xxxxF50004000C0061006200634F60597DFF01
改为
0891683108506105F011000D9168317776xxxxF50008000C0061006200634F60597DFF01
^这里改成8
试试
// 用户信息编码方式
#define GSM_7BIT 0
#define GSM_8BIT 4
#define GSM_UCS2 8
PDU模式里边编码的是unicode,编码方式是GSM_UCS2,就是8,而不是4 试了几次终于明白,原来0D91后面要带上86以后的号码转换
而OB81则是不需要带,可以直接输入号码的转换
今天的任务完成 最近无疑中来了一条PDU信息
0891683108200005F04410A1212510430544990021009040010120152314050003F10101F2E976DA7DD685C5E3986C06
偶看来看去都没能正确解码~谁能正确解码短信内容呢?其中含有"abc123"内容的
虽然是多短信格式,带头内容,但其实际内容确实还没摸清楚
这不是常见的那种类型,故来求助 我用MTK平台的发模块
移动号码加不加+86都可以正常发送中文短信
联通卡+86无法发送,串口假死很长一段时间后返回ERROR
PDU编码没问题。。
求解释。。。谢谢~ mark "0D:手机号码的长度"
是怎样算出来的
而短信中心码和他长度都是16
确为08
高手解答 0D:只指手机号码的长度13位
861********** 记下,待用 请求下LZ手机号码为短信特服号码(比如:10654040),然后还有个 目的应用端口地址号:16998。
这个时候目标应该怎么写呢?????????? 同18楼问题:
手机号码后加上 0008A7 和刚才的短信息内容,0008A7也写死就可以了,具体含义我也不太清楚!
即 phone = phone + "0008A7" + msg
即 11000D91683106423346F9 + 0008A7 + 0C0061006200634F60597DFF01
=> phone = 11000B815160066703F10008A70C0061006200634F60597DFF01
前后怎么不一样呢上面是11000D91683106423346F9+0008A7
下面却是 11000B815160066703F1+0008A7
这个变化时什么意思呢?哪位高人指点一下啊??? 顶顶.. 记号"TC35I" 要玩玩 记号 至于PDU的编码,7BIT ,8BIT,UCS2,或是手机号加不加86,这都无谓,只需了解其中的一种即可成功发送短信。
但对于接收的短信就不这么回事了,得了解各种解码规则,有没有大侠可以介绍一下 mark mark 记下了,谢谢 MARK AT指令 mark 用TC35I发送超过42个字符PDU短信不能成功,
AT+CMGF=0
AT+CMGS=145
0011000D91683178777777F70008008200310032003300340035003600370038003900300031003200330034003500360037003800390030003100320033003400350036003700380039003000310032003300340035003600370038003900300031003200330034003500360037003800390030003100320033003400350036003700380039003000310032003300340035
是不是PDU码没对?求解,谢谢 回复【24楼】slipknot_ns活结
我用mtk平台的发模块
移动号码加不加+86都可以正常发送中文短信
联通卡+86无法发送,串口假死很长一段时间后返回error
pdu编码没问题。。
求解释。。。谢谢~
-----------------------------------------------------------------------
应该是号码问题,和pdu无关,能复打开debug看看 回复【12楼】lysoft
太旧了~n年前就搞定pdu的~复杂的是wap push
-----------------------------------------------------------------------
说到点上了,再搞什么PDU没意思了,发发彩信吧 不输入Ctrl+Z也可以的吧?
如果是用超级终端,那怎么输入Ctrl+Z呢?
O(∩_∩)O先谢谢朋友回答啊…… phone 长度除以2,格式化成2位的十进制数
什么意思,怎么转换?? 马克 回复【楼主位】mqh003小乙
-----------------------------------------------------------------------
81表示国内不用加86,91是国际需加86,并不是指小灵通。小灵通是A1. 好啊,学习了 您好。您能去帮我看下我的是怎么回事不。忙了很久。着急了。。不胜感激
页:
[1]