SIMCOM800C GSM模组(2G通信模组)AT指令测试 TCP 通信过程

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

效果如下:

Tcp服务器程序

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』。

猜你喜欢

转载自blog.csdn.net/Mculover666/article/details/106165153