凡夫

最近利用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. 还是畅通工程(peime算法最小生成树)

    个人心得:就是最小生成树的运用,还是要理解好每次都是从已搭建好的生成树里面选择与她的补集中最短距离,所以那个book数组的更新 需要好生体会.不过还是有缺陷,算法的复杂度为O(n^2),看介绍说用优先 ...

  2. [ Laravel 5.5 文档 ] 数据库操作 —— 在 Laravel 中轻松实现分页功能

     简介 在其他框架中,分页是件非常痛苦的事,Laravel 让这件事变得简单易于上手.Laravel 的分页器与查询构建器和 Eloquent ORM 集成在一起,并开箱提供方便的.易于使用的.基于 ...

  3. Linux sed 批量替换多个文件中的字符串【转载】

    原文网址:http://blog.sina.com.cn/s/blog_730edb930100qzz5.html     比如,要将目录/modules下面所有文件中的zhangsan都修改成lis ...

  4. 前端跨域问题,以及ajax,jsonp,json的区别

    看了很多网上的资料,小七感觉都没有完全解决我的疑惑以及问题,所以特意拿出通俗易懂的话讲解跨域问题,以及ajax,jsonp,json的区别.首先先说跨域问题什么时候需要跨域?[1]域名不同(即网址不同 ...

  5. 三层自动生成 完整源代码(for oracle)

    using Oracle.DataAccess.Client; using System; using System.Collections.Generic; using System.Compone ...

  6. The lesser known pitfalls of allowing file uploads on your website

    These days a lot of websites allow users to upload files, but many don’t know about the unknown pitf ...

  7. 2015.3.7 Dll CString不能作为传入参数而要用char*

    extern "C" __declspec(dllexport) void CalcArc_2(Point2D& pm, double am, double an, CSt ...

  8. NSOperation/NSOperationQueue详细使用介绍

      一.简介 (1)是使用GCD实现的一套Objective-C的API (2)是面向对象的线程技术 (3)提供了一些在GCD中不容易实现的特性,如:限制最大并发数量.操作之间的依赖关系   NSOp ...

  9. DAY18-Django之form表单

    构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的模板: <form action="/your-name/" method=" ...

  10. TCP/IP 笔记 1.1 概 述

    四个层次 每一层负责不同的功能:1) 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节.2) ...