Siemens3508手机AT指令发送短信的实验
凡夫
最近利用Siemens3508旧手机做了AT指令发送短信的实验。有人可能认为我费那么大劲折腾累不累,告诉你这可是废物再利用,可以利用旧手机里的GSM/GPRS模块做无线远程多点分布数据采集、监控、遥控等,主要是想与RFID模块结合,远程读取电子标签。现在GPRS按流量计费,可以24小时连续在线,无传输数据也就不产生流量,很方便。可以用单片机、GSM/GPRS模块、数据采集模块(如传感器、RFID模块)组成远程终端。这就要求用单片机的串口与GSM/GPRS模块通信。基于这样的目的进行了AT指令控制GSM/GPRS模块的实验。
Siemens3508手机的GSM模块和西门子的TC35i模块的AT命令集基本一样,TC35i模块的AT命令集资料网上可以搜索到的。由于没有手机数据线,就拆开了手机,Siemens 3508手机数据线接口,一共12脚分别定义为:
1)充电IN-(充电负级或DATA地)
2)AUDIO_L(耳机左声道)
3)充电IN+(充电正级)
4)DC+(3.6V供电正极)
5)DATA_OUT(数据输出)
6)DATA_IN(数据输入)
7)MODE(线控MIC模式选择)
8)CTRL(线控按键输入端)
9)GND(话筒地)
10)MIC_IN(话筒正极)
11)AUDIO_R(耳机右声道)
12)AUDIO_GD(音频地)
我们只需把1、5、6脚引出即可,它的串口是3.3V的TTL电平,要和电脑串口连接,还需用232接口电路芯片转换为232电平。接口电路做好后连接好各部分,用超级终端建立串口连接,我的台式电脑设置是COM1、波特率19200、数据位8、停止位1、奇偶校验无、流控制无,连接成功。注意,我的笔记本没有串口,用USB转串口线也可以连接,在执行AT指令时基本正常,发短信可以发出,但是串口死掉了。我的Nokia3230手机用蓝牙(映射串口)和电脑超级终端连接不成功,不知何故,不然可以做做GPRS实验,留待日后研究。
好了以上准备工作做好了,可以发AT指令玩转手机了。
一)基本指令:
发送指令
AT
返回
OK
表示连接成功。
AT+CGMI
SIEMENS
OK
返回厂家信息。
AT+CGMM
3508i
OK
返回模块信息。
AT+CGMR
12
OK
返回固件版本号。
AT+CGSN
449247374930903
OK
返回IMEI序列号。
AT+CIMI
460007251202938
OK
返回SIM卡的IMSI。
AT+CCLK?
+CCLK: "09/11/04,11:11:41"
OK
查看当前日期和时间。
二)发送短消息
先看看手机支持哪些字符集:
AT+CSCS=?
+CSCS: ("GSM","UCS2")
OK
可以看到Siemens3508手机支持"GSM"和"UCS2"两种字符集。
设置对象使用UCS2字符集:
AT+CSCS=UCS2
OK
这样就可以发中英文字符了。
AT+CMGF=?
+CMGF: (0)
OK
查看短消息支持的格式,其格式只有PDU模式一种,没选择。
下面开始发短信:
接收手机号: 13812345678
短信中心号:8613800270500
短信内容:你好,Hello!
方法一:
AT+CMGS=32 //设置后面要输入的PDU字串的长度(实际长度/2-1)
> 0011000B813118325476F80008A7124F60597DFF0C00480065006C006C006F0021 //输 入的PDU字串,包含了接收手机号码、信息内容等有效内容。稍后详细分析如何得到这个字串。输入后要按“ctrl+z”,显示->
+CMGS: 210
OK //表示发送成功,如果返回ERROR表示发送不成功。
现在我们来详细分析一下如何得到那个PDU字符串。
1)首先分析原PDU串中最前面的0011000B81
按顺序依次表示:
00--短消息中心信息的长度,这里的0意味着,采用modem中已存的短消息中心的信息。
11--说明信息体格式的字段,普通短信和wap push在这个字段上会有区别的。(普通短信就用11)
00--一般取00,采用默认的发送号码。
0B--接收手机号码长度的十六进制表示。中国大陆应该都是0B(11=0BH)。
81--本部分表明了接受手机号码的类型。这里采用81。
2)接下来是3118325476F8
接收的手机号码是13812345678,手机号是11位奇数,末尾加F,将原号码变为13812345678F,然后我们把第一位和第二位交换,第三位和第四位交换,以此类推。这样就得到3118325476F8。
3)再接着是0008A7
00--协议标识(TP-PID) 是普通GSM类型,点到点方式。
08--用户信息编码方式UCS2。
在PDU Mode中,可以采用三种编码方式来对发送的内容进行编码,它们是7-bit、8-bit和UCS2(16-bit)编码。
7-bit编码用于发送普通的ASCII字符,它将一串7-bit的字符(最高位为0)编码成8-bit的数据;
8-bit编码通常用于发送数据消息,比如图片和铃声等;
UCS2编码用于发送Unicode字符。
PDU串的用户信息(TP-UD)段最大容量是140字节,所以在这三种编码方式下,可以发送的短消息的最大字符数分别是160、140和70。这里,将一个英文字母、一个汉字和一个数据字节都视为一个字符。
A7--信息有效期
4)最后是124F60597DFF0C00480065006C006C006F0021
“你好,Hello!”字符串转化为UNICODE代码即为4F60597DFF0C00480065006C006C006F0021,而12(16进制)则等于unicode字符串的长度除以2,即36/2。UniCode编码转换,以中文为例,一个中文字符是两个字节,直接对高位字节和低位字节进行十六进制转换就可以了。如“欢迎”,UniCode 编码是 6B22 8FCE ,这同时也就是转换的结果,如果发送的串中有英文字符,那么在前面补全00 ,以保证一个字符对应两个字节。
方法二:
AT+CMGS=41 //设置后面要输入的PDU字串的长度(实际长度/2-1)
> 0891683108200705F011000D91683118325476F8000800124F60597DFF0C00480065006C006C006F0021
按“ctrl+z”,显示->
+CMGS: 211
OK //发送成功
两种方法的PDU码有什么区别呢?还是顺序分析:
08 - 指的是短信中心号的长度,也就是指(91)+(683108200705F0)的长度。
91 - 指的是短信息中心号码类型,91是TON/NPI遵守International/E.164标准,指在号码前需加 '+ '号,此外还有其它数值。
683108200705F0 - 短信息中心号码。这需要根据不同的地域作相应的修改。前面的(08)+(91)+(683108200705F0)实际上就是短消息中心地址(Address of the SMSC)。
11 - 文件头字节
00 - 信息类型(TP-Message-Reference)
0D - 被叫号码长度
91 - 被叫号码类型
683118325476F8 -被叫号码,经过了位移处理,实际号码为 "8613812345678 "。上面的(00)+(0D)+(91)+(683118325476F8),构成了整个短信的第二部份目的地址(TP-Destination-Address)。
00 - 协议标识TP-PID,这里一般为00 。
08 - 数据编码方案TP-DCS(TP-Data-Coding-Scheme),采用前面说的USC2(16bit)数据编码 。
00 - 有效期TP-VP(TP-Valid-Period)。
12 - 长度TP-UDL(TP-User-Data-Length),也就是后面紧跟的短信内容的UniCode编码4F60597DFF0C00480065006C006C006F0021的长度 36 / 2 = 18 的十六进制12 。
方法二是在PUD码中指定了短信中心号8613800270500,和国际代号86,注意用方法二在手机里不能预设短信中心号,方法一手机里有没有设置短信中心号,都发送成功了。
以上是在查阅有关资料后对PDU字符串的分解分析,不尽全面或有偏差,但是按这个基本规律对其它信息进行编码发送也是成功的。当然手工计算产生PUD码很繁琐易出错,网上也有人编了程序自动产生PDU码。
还有很多指令可以玩,如电话、电话簿、振铃、音量、密码等等,这里就不跑题赘述了。
Siemens3508手机AT指令发送短信的实验的更多相关文章
- 短信猫编程的一些资料1(At指令发送短信)
现在正在做TC35的项目, 下面分享一下这几天在网上找到的资料: 手机 SMS PDU 格式参考手册 1.相关的GSM AT指令 与SMS有关的GSM AT指令(from GSM0 ...
- 2.5 使用ARDUINO做主控,手机发送短信控制开关LED
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- C# Ajax 手机发送短信验证码 校验验证码 菜鸟级别实现方法
1.Ajax请求处理页面: using System; using System.Collections.Generic; using System.Linq; using System.Web; u ...
- Java实现发送手机验证码功能(短信+语音)
利用第三方平台可以实现发送手机短信验证码和语音验证码的功能,本文使用框架是struts2+spring+hibernate,现就action层给出核心代码功能. public class Verify ...
- Java 实现手机发送短信验证码
Java 实现手机发送短信验证码 采用引入第三方工具的方式,网上查了半天,发现简单的实现方式便是注册一个中国网建的账号,新建账号的时候会附带赠几条免费短信,彩信 ,之后想要在使用就得花钱了.简单的操作 ...
- Android 读取手机联系人、拨号、发送短信及长按菜单的操作
本示例实现了读取手机联系人,拨号.发送短信及长按出现菜单选项的操作↓ 1.Andrid项目结构图↓主要操作图中红色方框内的文件. 2.首先布局代码如下↓ a, main.xml 程序运行的主界面,主要 ...
- 基于SMS短信平台给手机发送短信
JAVA发送手机短信,我知道的有三种方式,恰逢项目需求,自己整理了基于SMS的短信发送,其他两种这里就说说一下 使用webservice接口发送手机短信,这个可以使用sina提供的webservice ...
- C#实现给手机发送短信
public static void SendSMS(string FaSongUser, string ToUserList, string ContentStr) { //针对 ...
- Hbuilder给手机发送短信与拨打电话
前言:业务场景 需要给手机号码拨打电话与发送短信.html5已经提供接口. methods: { Call: function() { var that = this; if(that.ptel == ...
随机推荐
- 怪盗基德的滑翔翼(还是最长x序列)
//怪盗基德的滑翔翼 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstri ...
- 学习动态性能表(13)--v$open_cursor
学习动态性能表 第13篇--V$OPEN_CURSOR 2007.6.8 本视图列出session打开的所有cursors,很多时候都将被用到,比如:你可以通过它查看各个session打开的curs ...
- 增加虚拟机ubuntu的硬盘
20150526更新验证日记: (1)首先在虚拟机中增加ubuntu的硬盘大小. (2)在ubuntu中使用Gparted软件对新的空间进行分配(傻瓜式) (3)不能直接将磁盘挂载到home下,只能先 ...
- python3 之 格式化json
import json json_string = None with open("json_file.json") as f: json_string = f.read() tr ...
- asp.net自动将页面中的所有空间置为不可用以及将所有文本框置空
/// <summary> /// 遍历页面上所有控件 /// </summary> /// <param name="page">指定的Pag ...
- VisualGDB系列8:使用VS创建CMake Linux项目
根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文介绍如何使用VS来创建.构建.调试一 ...
- Java: What is the difference between <init> and <clinit>?
Stack Overflow 上的一个问题:Java: What is the difference between <init> and <clinit>? JVM Sp ...
- Py修行路 Matplotlib 绘图及可视化模块
Matplotlib是一个强大的Python绘图和数据可视化的工具包. 安装方法:pip install matplotlib 引用方法:import matplotlib.pyplot as plt ...
- python (面向对象相关的三个模块)
hashlib,configparser,logging模块 一.常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希 ...
- Java中Object.hashCode contract
面试时在这个问题上犯了个错误,只重写了equals方法,而没有覆盖hashCode()方法. 回来重读了Effective Java的Item 9,里面提到Object.hashCode contra ...