M26 是一款超小的四频 (850/900/1800/1900MHz)LCC 封装 GSM/GPRS 模块,尺寸仅为15.8mm×17.7mm×2.3mm,主要特点有:
- 供电电压3.3V~4.6V,待机电流低至1.3mA
- 支持音频功能、蓝牙功能
- 支持移远远程升级技术 QuecFOTATM 升级
- 内嵌网络服务协议栈,支持多个 Socket 及 IP 地址
- 支持的协议:TCP/UDP/PPP/FTP/HTTP/SMTP/CMUX/SSL
1.1. 硬件准备
- 小熊派开发板
- M26通信模组
小熊派开发板右上角的开关拨到AT-PC一端,则模组直接与PC相连,方便调试。
1.2. 软件准备
- QCOM串口助手
- M26通信模组测试AT命令脚本(
M26.ini
)
下载地址:https://github.com/Mculover666/QCOM_Tools_Scripts
下载之后在QCOM中导入M26测试脚本的方法如下:
1.3. 文档准备
2. 模组信号查询与网络查询AT指令此文档来自于移远官方!阅读本教程时,关于AT指令的详细说明请参考该文档!
AT
指令:AT
功能:测试AT指令功能是否正常
示例:
AT
OK
AT+CPIN?
指令:AT+CPIN?
功能:查询SIM卡是否正常,返回ready则表示SIM卡正常
示例,如果SIM卡插入成功,则返回结果为:
AT+CPIN?
+CPIN: READY
OK
如果未插入SIM卡,则返回结果为:
AT+CPIN?
+CME ERROR: 10
AT+CSQ
指令:AT+CSQ
功能:查询模组的信号强度
响应:第一个值rssi为信号值,0-31则正常,第二个值ber为误码率,99为不可测。
+CSQ: <rssi>,<ber>
示例:
AT+CSQ
+CSQ: 17,0
OK
AT+CREG?
指令:AT+CREG?
功能:查询模组是否注册上GSM网络
响应:第一个参数n为0表示禁用网络注册非请求结果码,第二个参数stat为1表示已注册上本地网,为5表示注册上漫游网,其余值表示注册不成功。
+CREG:<n>,<stat>
示例:
AT+CREG?
+CREG: 0,1
OK
AT+CGREG?
指令:AT+CERGE?
功能:查询模组是否注册上GPRS网络
响应:第一个参数n为0表示禁用网络注册非请求结果码,第二个参数stat为1表示已注册上本地网,为5表示注册上漫游网,其余值表示注册不成功。
+CGREG:<n>,<stat>
示例:
AT+CGREG?
+CGREG: 0,1
OK
3. 激活移动场景,获取ip地址
必须在查询GPRS网络已正常注册网络的情况下进行本节实验!
AT+QIFGCNT=0
指令:AT+QIFGCNT=0
功能:配置当前场景
示例:
AT+QIFGCNT=0
OK
AT+QICSGP=1, “CMNET”
指令:
AT+QICSGP=<mode>, <apn>
功能:
- 参数mode设置连接模式,0表示CSD连接模式,1表示GPRS连接模式;
- 参数apn设置GPRS的APN(移动CMNET、联通UNINET);
示例:
AT+QICSGP=1, "CMNET"
OK
AT+QIDEACT
指令:AT+QIDEACT
功能:在激活GPRS场景之前先关闭GPRS场景,确保连接正确
示例:
AT+QIDEACT
DEACT OK
AT+QIMUX=1
指令:
AT+QIMUX=<mode>
功能:
- mode为1表示启用多路链接模式;
- mode为0表示不启用多路链接模式;
示例:
AT+QIMUX=1
OK
AT+QIMODE=0
指令:
AT+QIMODE=<mode>
功能:设置数据传输模式,mode为0表示非透传模式,mode为1表示透传模式
示例:
AT+QIMODE=0
OK
AT+QIREGAPP
指令:AT+QIREGAPP
功能:启动任务设置接入点APN
示例:
AT+QIREGAPP
OK
AT+QIACT
指令:AT+QIACT
功能:激活移动场景
示例:
AT+QIACT
OK
AT+QILOCIP
指令:AT+QILOCIP
功能:查看模组获取的IP地址
示例:
AT+QILOCIP
100.125.208.23
4. 基于 TCP 协议连接远程服务器通信实例
4.1. 搭建远程TCP服务器
首先我们需要搭建一个TCP服务器,有两种方式:
- 在服务器上使用Python、Java、C#等语言自行编写服务器程序;
- 在本地PC上使用网络调试助手开启TCP服务器;
因为M26模组直接注册的是公网ip地址,所以这里我们使用第一种方式,在Linux服务器上运行一个Python编写的tcp测试服务器:
本地PC使用的是局域网,公网不可以直接根据ip地址访问到本PC,需要进行内网穿透,不推荐使用。
这里的Python程序如下:
# tcp-server.py
from socket import *
host = ''
port = 8000
# 创建server socket
server_socket = socket(AF_INET,SOCK_STREAM)
# 绑定socket监听地址
server_addr = (host,port)
server_socket.bind(server_addr)
# 开始监听,最大允许连接数5
server_socket.listen(5)
# 处理连接请求
try:
while True:
print('waiting for connect...')
#阻塞等待客户端的连接
client_socket, client_addr = server_socket.accept()
# 连接成功后,打印客户端信息
print('a client connnect from:', client_addr)
while(True):
# 向客户端发送数据
client_socket.send('Hello, client!'.encode())
# 接收客户端的数据
data = client_socket.recv(1024)
print('recv data is ', data.decode())
# 接收到quit则关闭socket
if "quit" in data.decode():
break
# 关闭socket
client_socket.close()
server_socket.close()
print("socket closed.")
break
except:
client_socket.close()
server_socket.close()
print("socket closed.")
运行:
python3 tcp-server.py
效果如下:
4.2. 模组连接服务器M26作为 TCP 客户端的时候,连接TCP服务器的指令需要分以下两种情况对待。
① 如果是单链路模式(之前设置AT+QIMUX=0
),则指令如下:
AT+QIOPEN=<mode>,<IPaddress>/<domain name>,<port>
② 如果是多链路模式(之前设置AT+QIMUX=1
),则指令如下:
AT+QIOPEN=<index>,<mode>,<IPaddress>/<domain name>,<port>
其中每个参数的意义如下:
-
index
:0-5,多链路模式下有效,表示sokcet连接序号,M26 支持 6 个 SOCKET 同时存在; -
mode
:字符串类型,“TCP”或者“UDP”,表示socket连接模式; -
Ipaddress
:字符串类型,表示服务器ip地址; -
domain name
:字符串类型,表示服务器域名地址; -
port
:整数类型,表示服务器端口号;
两条指令的响应:
① 如果格式正确,返回:
OK
如果格式错误,返回:
ERROR
② 如果连接成功,返回:
[<index>,] CONNECT OK
如果连接失败,返回:
[<index>,] CONNECT FAIL
如果该编号的socket已经存在,返回:
ALREAY CONNECT
示例:
AT+QIOPEN=0,"TCP","117.50.111.72",8902
OK
0, CONNECT OK
连接之后,在服务器端也可以看到:
4.2. 模组接收消息
M26模组接收消息有两种模式,一种是接收到后直接打印,另一种是接收到缓存区中,使用AT指令读取,另外,还可以控制接收数据时的IP头是否显示。
4.2.1. 接收后直接打印模式
① 接收后直接打印,不显示IP头(默认模式):
+RECEIVE: 0, 14
Hello, client!
② 接收后直接打印,显示IP头,需要配置:
AT+QIHEAD=1
OK
接收效果如下:
+RECEIVE: 0, 14
IPD14:Hello, client!
4.2.2. 接收后保存到缓存区中
这种模式需要使用AT指令进行配置。
指令:
AT+QINDI=<m>
功能:配置是否缓存接收到的数据
参数说明:
-
m = 0
:默认模式,接收后直接输出到串口; -
m = 1
:缓存模式1,接收到数据将会向串口上报提示(此时可以通过 AT+QIRD 读取缓存的数据),格式为:
+QIRDI: <id>,<sc>,<sid>
-
m = 2
:缓存模式 2;接收到数据将会向串口上报提示,格式为:
+QIRDI: <id>,<sc>,<sid>,<num>,<len>,<tlen>
每个 Socket 将建立一个缓存,接收的数据将被保存在缓存中,直到通过 AT+QIRD 读取缓存的数据,缓存数据不应超过400KB。
示例:
AT+QINDI=1
OK
配置之后,模组接收到数据后就只会上报,如下:
+QIRDI: 0,1,0
使用AT指令读取数据:
AT+QIRD=0,1,0,128
+QIRD: 117.50.111.72:8902,TCP,14
Hello, client!
OK
4.3. 模组主动发送消息
使用如下的命令即可向TCP服务器发送消息,首先设置要发送数据的字节数,等待模组返回>
后,输入要发送的数据即可,如果发送的数据超过了设置的n个字节,则只发送前n个字节,后面的数据被认为是无效数据,不会发送:
AT+QISEND
>hello<0x1a>
示例:
Hello, client!AT+QISEND
> hello
SEND OK
发送成功看服务器上运行的TCP服务器是否收到:
4.4. 关闭TCP连接
通信完毕之后,可以使用下面的命令关闭TCP连接:
AT+QICLOSE
示例:
AT+QICLOSE
CLOSE OK
5. 域名解析
指令:
AT+QIDNSGIP=<domain name
功能:域名解析
响应:
① 如果AT格式正确,返回
OK
如果AT格式错误,返回:
ERROR
② 如果解析成功,返回:
<IP address>
如果解析失败,返回:
ERROR: <err>
STATE: <state>
示例:
AT+QIDNSGIP="www.mculover666.cn"
OK
122.51.89.94
接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。