SIMCOM800C通信模组
SIMCOM800C 是SIMCom公司的工业级四频 GSM/GPRS 模块,工作频段四频:850/900/1800/1900MHz,可以低功耗实现语音、 SMS(短信)、 MMS(彩信)、蓝牙数据信息的传输.
1. 环境准备
1.1. 硬件准备
准备一个SIM800C模组和USB转串口,使用USB 5V给SIM800C模组供电:
模组扩展板板载一颗红色的状态指示LED,意义如下:
1.2. 软件准备
- QCOM串口助手
- SIMCOM800C通信模组测试AT命令脚本(
SIMCOM800C.ini
)
下载地址:https://github.com/Mculover666/QCOM_Tools_Scripts
1.3. 文档准备
此文档来自于simcom官方!阅读本教程时,关于AT指令的详细说明请参考该文档!
2. 模组信号查询与网络查询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: 25,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+CIPMUX=1
指令:
AT+CIPMUX=<mode>
功能:
- mode为1表示启用多路链接模式;
- mode为0表示不启用多路链接模式;
示例:
AT+CIPMUX=1
OK
AT+CSTT=“CMNET”
指令:
AT+CSTT=<apn>
功能:
- 参数apn设置GPRS的APN(移动CMNET、联通UNINET);
示例:
AT+CSTT="CMNET"
OK
AT+CIICR
指令:AT+CIICR
功能:建立无线链路
示例:
AT+CIICR
OK
AT+CIFSR
指令:AT+CIFSR
功能:查看模组获取的IP地址
示例:
AT+CIFSR
100.122.243.183
4. 基于 TCP 协议连接远程服务器通信实例
SIMCOM800C模组的TCP/IP应用有两种模式,分为单链路模式和多链路模式,使用指令AT+CIPMUX=<n>
来设置(0-单链路,1-多链路)。
在单链路模式下,SIM800C模组可以工作在透传模式和非透传模式,在这两种模式下,模组均可以被配置为TCP/UDP服务端或者TCP/UDP客户端。
在多链路模式下,SIM800C模组只工作在非透传模式,在这种模式下,模组仅仅可以被配置为TCP/UDP客户端,可以建立6路链接。
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 = 8001
# 创建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. 模组连接服务器
SIM800C模组作为 TCP 客户端的时候,连接TCP服务器的指令需要分以下两种情况对待。
① 如果是单链路模式(之前设置AT+QIMUX=0
),则指令如下:
AT+CIPSTART=<mode>,<IPaddress>/<domain name>,<port>
② 如果是多链路模式(之前设置AT+QIMUX=1
),则指令如下:
AT+CIPSTART=<index>,<mode>,<IPaddress>/<domain name>,<port>
其中每个参数的意义如下:
index
:0-5,多链路模式下有效,表示sokcet连接序号,SIM800C 支持 6 个 SOCKET 同时存在;mode
:字符串类型,“TCP”或者“UDP”,表示socket连接模式;Ipaddress
:字符串类型,表示服务器ip地址;domain name
:字符串类型,表示服务器域名地址;port
:整数类型,表示服务器端口号;
两条指令的响应:
① 如果格式正确,返回:
OK
如果格式错误,返回:
ERROR
② 如果连接成功,返回:
[<index>,] CONNECT OK
如果连接失败,返回:
[<index>,] CONNECT FAIL
如果该编号的socket已经存在,返回:
ALREAY CONNECT
示例:
AT+CIPSTART=0,"TCP","117.50.111.72",8001
OK
0, CONNECT OK
连接之后,在服务器端也可以看到:
4.2. 模组接收消息
SIM800C模组接收消息有两种模式,一种是接收到后直接打印,另一种是接收到缓存区中,使用AT指令读取,另外,还可以控制接收数据时的IP头是否显示。
4.2.1. 接收后直接打印模式
① 接收后直接打印,不显示IP头(默认模式):
+RECEIVE,0,14:
Hello, client!
② 接收后直接打印,显示IP头,需要配置(只有单链路模式下会生效):
AT+CIPHEAD=1
OK
接收效果如下:
+IPD14:Hello, client!
4.3. 模组主动发送消息
使用如下的命令即可向TCP服务器发送消息,首先设置要发送数据的字节数,等待模组返回>
后,输入要发送的数据即可,如果发送的数据超过了设置的n个字节,则只发送前n个字节,后面的数据被认为是无效数据,不会发送:
AT+CIPSEND
>hello<0x1a>
示例:
Hello, client!AT+CIPSEND
> hello
SEND OK
发送成功看服务器上运行的TCP服务器是否收到:
4.4. 关闭TCP连接
通信完毕之后,可以使用下面的命令关闭TCP连接:
AT+CIPCLOSE=<socket id>
示例:
AT+CIPCLOSE=0
0, CLOSE OK
5. 域名解析
指令:
AT+CDNSGIP=<domain name>
功能:域名解析
响应:
① 如果AT格式正确,返回
OK
如果AT格式错误,返回:
ERROR
② 如果解析成功,返回:
<IP address>
如果解析失败,返回:
ERROR: <err>
STATE: <state>
示例:
AT+CDNSGIP=mculover666.top
OK
+CDNSGIP: 1,"mculover666.top","117.50.111.72"
接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。