4G拨号上网 之 AT指令学习
常用的AT指令
目录
在做4G模块项目的时候,首先要完成串口通信编程的学习,这里就不赘述了,然后就是AT指令的学习,在本文中就记载一下一些常用的AT指令。
一、busybox
在嵌入式平台下,集成有minicom软件,可以实现串口调试功能,但是有的不会集成minicom软件。busybox的文件系统下,有一个更加简单的串口工具microcom。
1、下载busybox
sudo apt-get install busybox
2、查看busybus
busybos
可以看见,其中已经包含了microcom工具。
3、查看microcom用法:
说明:
-t 单位毫秒,无操作自动退出时间。
-s 单位bps,串口波特率。
另外两个参数一般不会用到。
二、检测4G模块
1、检测4G模块是否被系统识别
lsUSB
说明:
这里使用的是 EC20模块,这 是一款支持 PCI Express Mini Card 标准接口的 LTE 模块,EC20 模块封装成标准的 PCIe 接口,实际走的是 USB 信号,并虚拟出多个 ttyUSB 设备节点。
硬件方面连接 好EC20 模块,执行 lsusb 命令,如果出现如图内容,则表示模块已经成功被 Linux 系统识别到。其中,0x2C7C 和 0x0125 分别是 Quectel EC25/EC20 R2.0 的 VID 和 PID 编号。
2、检测USB模块是否载入系统
lsmod | grep usb
说明:
lsmod:是list modules的缩写,即 列出所有模块,所以该命令的作用就是显示已载入系统的模块。
3、列出USB设备
ls /dev |grep ttyUSB
三、开始AT指令集测试
1、先做准备测试
- 进入测试,并查看AT是否可用正常使用: AT
busybox microcom -s 115200 /dev/ttyUSB5
-
查看SIM卡是否到位,返回ready则表示正常: AT+CPIN?
-
测试信号: AT+CSQ
-
查看运营商: AT+COPS?
说明:该命令中可修改运营商和自动/手动连接等。 -
查看所有可用运营商:AT+COPS=?
说明:每一个()中的第一个数字就是stat,它会直接告诉我们哪些运营商可用:
0 未知
1 可用
2 当前
3 禁用 -
获取模块标识: AT+CGMM
- 获取模块厂商标识: AT+CGMI
- 网络注册。获得手机的注册状态: AT+CREG?
说明:
+GREG:0,0,表示未注册,终端在搜寻新的运营商;
+GREG:0,1表示注册本地网(正常);
+GREG:0,2表示未注册,终端正在搜寻基站;
+GREG:0,3表示SIM卡注册被拒绝;
+GREG:0,4未知错误;
+GREG:0,5表示注册漫游网络(正常)
注意(一些参数说明以及问题的解决办法)
在我上面手动改变了运营商之后,我发现出现了问题,就是我无法再进行拨打电话的操作了,查找一番发现是网络注册被撤销了。
此时我费了一番功夫,终于找到了解决办法:
就是输入 AT+CREG=1 设置允许网络注册主动提供结果代码,然后输入AT+COPS=0,将运营商转成自动模式,然后就发现可以继续进行拨号操作了。
由此我找出了这两个命令的各个参数的含义,记录在下:
(1)AT+CREG 网络注册和漫游
指令:AT+CREG=<mode>
响应:+CREG:<mode>,<stat> [,<lac>,<ci>]
参数说明:
<mode>
0: 禁止网络注册主动提供结果代码(默认设置)
1: 允许网络注册主动提供结果代码: +CREG:<stat>
2: 启用网络注册和位置信息非请求结果码: +CREG:<stat>[,<lac>,<ci>]
<stat>
0:未注册,终端当前并未在搜寻新的运营商
1:已注册本地网络
2:未注册,终端正在搜寻基站
4:未知代码
5:已注册,处于漫游状态
<lac> 位置区编号
<ci> 小区ID
注意:当设置AT+CREG成功时,调制解调器回复OK之后,会将网络注册状态通过响应返回。当网络注册状态发生改变时,调制解调器将状态通过响应反映上来。LAC及CI也可以从+CCED命令查询出来。
(2)AT+COPS( 强制选择和注册GSM网络运营 )
指令:AT+COPS=<mode>[,<format>[,<oper>]]
响应:OK
参数说明:
<mode>
0 自动模式 被忽略
1 手动选择
2 从网络中手动注销
3 选择尽有有格式
4 手动或自动选择,如果手动失败,则自动使能
<format>
0 支持长字节格式,能升到16字节长
1 短字节格式
2 数字格式
<oper> 运营商
但是这个操作只默认在有服务的情况下才可以使用。
2、拨打电话
- 拨打电话: ATD电话号码; (电话号码后面一定要加分号)
- 来电显示: AT+CLCC(有电话打过来串口会打印RING提示。)
- 接电话: ATA
- 挂电话: ATH
3、发短信:
- 查看目前的短信编码模式:AT+CMGF?
- 切换编码模式:
AT+CMGF=0 //PDU模式
AT+CMGF=1 //TEXT模式
(1)发送TEXT格式短信:
- 发送短信
AT+CMGS=”收信号码”
… (此处为发送内容)
键盘按键 ctrl+z(0x1A)结束
- 读取短信: AT+CMGR=index(index为读第几条短信)
- 设置存储区域为SM: AT+CPMS=”SM”
(2)发送pdu格式短信:
-
获取短信中心号码:AT+CSCA?
我这里的短信中心号码是13334262200 -
格式化短信中心号码
步骤:
(1)要去掉“+”号,然后看看长度要是奇数的话就在末尾追加一个“F”。
+8613334262200 ——> 8613334262200F
(2)将奇数位和偶数位交换位置。
8613334262200F ——> 683133242602F0
(3)在前面加上“91”,是国际化的意思。
683133242602F0 ——> 91683133242602F0
(4)最后算一算它有多长了,把长度除于2,再把结果转换为2位的16进制数,加在最前面。91683133242602F0 长16, 16/2=8, 8的16进制“08” (一定要注意是2位)
91683133242602F0 ——> 0891683133242602F0
短信中心号码就处理完了,处理完的短信中心号码:0891683133242602F0
-
格式化收信号码
这里为了安全保密,我就随便举了一个电话的例子哟!不是用的本人的号码。
(1) 要去掉“+”号,然后看看长度要是奇数的话就在末尾追加一个“F”。
+8618934935552 ——> 8618934935552F
(2) 将奇数位和偶数位交换位置。
8618934935552F ——> 688139945355F2
-
格式化发送内容
(1) 把字符串转换为Unicode格式。
我找了两种方式:
一种是直接用转码工具,这个小工具做字符串和unicode之间的转码还是非常方便的:字符串和unicode在线转换工具
Hello ——> 00480065006C006C006F
还有一种是可以用函数来实现,就需要自己写一下转码函数啦!
(2) 把串Unicode码的长度除于2,再把结果转换为2位的16进制数,加在最前面。 00480065006C006C006F 长 20; 20/2=10 10的16进制“0A”
0A00480065006C006C006F
-
总结一下所有的数据
格式化后的短信中心:0891683133242602F0
格式化后的收信号码: 688139945355F2
格式化后的发送内容:0A00480065006C006C006F -
组合处理
(1)算一下收信号码的长度,不包括“+”号。这个收信号码指的是+8618934935552。
+8618934935552 ——> 8618934935552 长度为“OD”(2位16进制数表示)
(2)在长度前后分别加“1100”。
OD ——> 1100OD
(3) 如果收信号码是手机的话就在后面追加“91”,如果是小灵通的话就要追加“81”。 +8618934935552是手机号码所以加“91”
11000D ——> 11000D91
(4)11000D91 + 格式化后的收信号码 + “000800” + 格式化后的发送内容
11000D91688139945355F20008000A00480065006C006C006F
-
记录一下上面字符串的长度,除于2。长度为50 ,50/2 = 25。
总结一下相关信息
格式化后的短信中心:0891683133242602F0
实际的发送内容:11000D91688139945355F20008000A00480065006C006C006F
发送内容的长度:25 -
通过AT命令发送PDU短信
将其设为PDU模式: AT+CMGF=0 //PDU模式
-
开始发送短信:
AT+CMGS=25
>0891683133242602F011000D91688139945355F20008000A00480065006C006C006F
<Ctrl+Z> (看到它返回“>” 在后面输入格式化的短信中心+实际的发送内容最后按Ctrl+Z发送)
可以看到我的手机上收到了 内容为 “Hello” 的短信:
更多推荐
所有评论(0)