凡夫

最近利用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. 短信猫编程的一些资料1(At指令发送短信)

    现在正在做TC35的项目, 下面分享一下这几天在网上找到的资料: 手机 SMS PDU 格式参考手册 1.相关的GSM   AT指令     与SMS有关的GSM   AT指令(from   GSM0 ...

  2. 2.5 使用ARDUINO做主控,手机发送短信控制开关LED

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  3. C# Ajax 手机发送短信验证码 校验验证码 菜鸟级别实现方法

    1.Ajax请求处理页面: using System; using System.Collections.Generic; using System.Linq; using System.Web; u ...

  4. Java实现发送手机验证码功能(短信+语音)

    利用第三方平台可以实现发送手机短信验证码和语音验证码的功能,本文使用框架是struts2+spring+hibernate,现就action层给出核心代码功能. public class Verify ...

  5. Java 实现手机发送短信验证码

    Java 实现手机发送短信验证码 采用引入第三方工具的方式,网上查了半天,发现简单的实现方式便是注册一个中国网建的账号,新建账号的时候会附带赠几条免费短信,彩信 ,之后想要在使用就得花钱了.简单的操作 ...

  6. Android 读取手机联系人、拨号、发送短信及长按菜单的操作

    本示例实现了读取手机联系人,拨号.发送短信及长按出现菜单选项的操作↓ 1.Andrid项目结构图↓主要操作图中红色方框内的文件. 2.首先布局代码如下↓ a, main.xml 程序运行的主界面,主要 ...

  7. 基于SMS短信平台给手机发送短信

    JAVA发送手机短信,我知道的有三种方式,恰逢项目需求,自己整理了基于SMS的短信发送,其他两种这里就说说一下 使用webservice接口发送手机短信,这个可以使用sina提供的webservice ...

  8. C#实现给手机发送短信

    public static void SendSMS(string FaSongUser, string ToUserList, string ContentStr)    {        //针对 ...

  9. Hbuilder给手机发送短信与拨打电话

    前言:业务场景 需要给手机号码拨打电话与发送短信.html5已经提供接口. methods: { Call: function() { var that = this; if(that.ptel == ...

随机推荐

  1. 怪盗基德的滑翔翼(还是最长x序列)

    //怪盗基德的滑翔翼 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstri ...

  2. 学习动态性能表(13)--v$open_cursor

    学习动态性能表 第13篇--V$OPEN_CURSOR  2007.6.8 本视图列出session打开的所有cursors,很多时候都将被用到,比如:你可以通过它查看各个session打开的curs ...

  3. 增加虚拟机ubuntu的硬盘

    20150526更新验证日记: (1)首先在虚拟机中增加ubuntu的硬盘大小. (2)在ubuntu中使用Gparted软件对新的空间进行分配(傻瓜式) (3)不能直接将磁盘挂载到home下,只能先 ...

  4. python3 之 格式化json

    import json json_string = None with open("json_file.json") as f: json_string = f.read() tr ...

  5. asp.net自动将页面中的所有空间置为不可用以及将所有文本框置空

    /// <summary> /// 遍历页面上所有控件 /// </summary> /// <param name="page">指定的Pag ...

  6. VisualGDB系列8:使用VS创建CMake Linux项目

    根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文介绍如何使用VS来创建.构建.调试一 ...

  7. Java: What is the difference between <init> and <clinit>?

    Stack Overflow 上的一个问题:Java: What is the difference between <init> and <clinit>?   JVM Sp ...

  8. Py修行路 Matplotlib 绘图及可视化模块

    Matplotlib是一个强大的Python绘图和数据可视化的工具包. 安装方法:pip install matplotlib 引用方法:import matplotlib.pyplot as plt ...

  9. python (面向对象相关的三个模块)

    hashlib,configparser,logging模块 一.常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希 ...

  10. Java中Object.hashCode contract

    面试时在这个问题上犯了个错误,只重写了equals方法,而没有覆盖hashCode()方法. 回来重读了Effective Java的Item 9,里面提到Object.hashCode contra ...