本文共 5617 字,大约阅读时间需要 18 分钟。
SIMCOM A7670C 4G Cat.1 模组
SIMCOM A7670C 是一款支持多频段 LTE-TDD/LTE-FDD/GSM/GPRS/EDGE LTE CAT1 模块。
这款模组的特点如下:
- 支持最高 10Mbps 下载速率和 5 Mbps 上传速率;
- 具有强大的扩展能力,包括UART,I2C,GPIO等丰富的接口;
- 封装形式是LGA,与SIM7070系列模块封装兼容;
1. 环境准备
1.1. 硬件准备
SIMCOM A7670 模组官方开发套件:
左侧分别是:- ① USB转串口线;
- ② 电源线;
1.2. 软件准备
- QCOM串口助手
- AC7670通信模组测试AT命令脚本(
AC7670.ini
)
本文直接使用USB线连接到模组,使用板载USB转串口测试,连接之后打开设备管理器,可以看到有两个串口,选择图中圈出的串口。
使用QCOM工具打开该串口,波特率115200-8-N-1:
1.3. 文档准备
此文档来源于芯讯通官方。
1.4. 模组开机方式
开发套件上已经预留了开机按键,长按两秒即可开机,如图:
2. 模组信号查询与网络查询AT指令
AT
指令:AT
功能:测试AT指令功能是否正常
示例:
ATOK
AT+CPIN?
指令:AT+CPIN?
功能:查询SIM卡是否正常,返回ready则表示SIM卡正常
示例,如果SIM卡插入成功,则返回结果为:
AT+CPIN?+CPIN: READYOK
如果未插入SIM卡,则返回结果为:
AT+CPIN?+CME ERROR: 10
AT+CSQ
指令:AT+CSQ
功能:查询模组的信号强度,第一个值为0-31则正常,99为不正常
示例:
AT+CSQ+CSQ: 30,99OK
此处有问题,模组实际返回+CSQ:22,99
AT+CREG?
指令:AT+CREG?
功能:查询模组是否注册上GSM网络,+CREG:0,1 表示已注册上本地网,+CREG:0,5表示注册上漫游网。
示例:
AT+CREG?+CREG: 0,1OK
AT+CGREG?
指令:AT+CERGE?
功能:查询模组是否注册上GPRS网络,+CGREG:0,1 表示已注册上本地网,+CGREG:0,5表示注册上漫游网。
示例:
AT+CGREG?+CGREG: 0,1OK
3. 激活移动场景
必须在查询GPRS网络已正常注册网络的情况下进行本节实验!
3.1. 设置TCP/IP应用模式(关闭透传)
指令:
AT+CIPMODE=
功能:设置是否透传
参数:
参数 | 说明 |
---|---|
0 | 非透传模式 |
1 | 透传模式 |
示例:
AT+CIPMODE=0OK
3.2. 启动 Socket 服务
指令:AT+NETOPEN
功能:启动 Socket 服务
示例:
AT+NETOPENOK+NETOPEN: 0
3.3. 查询本机IP地址
指令:AT+IPADDR
功能:查询本机IP地址
示例:
AT+IPADDR+IPADDR: 10.26.195.233OK
3.4. 停止 Socket 服务
指令:AT+NETCLOSE
功能:停止 Socket 服务
示例:
AT+NETCLOSEOK+NETCLOSE: 0
4. TCP/IP接收数据上报格式配置
默认状态下,模组接收到服务器上报的数据后,上报格式如下:
RECV FROM:117.50.111.72:8001+IPD14Hello, client!
4.1. 开启显示远程IP和端口
指令:
AT+CIPSRIP=
功能:是否显示远程IP和端口
参数:
参数 | 说明 |
---|---|
0 | 不显示 |
1 | 显示 |
示例:
AT+CIPSRIP=1OK
开启之后,模组接收到服务器的数据上报时,会加上下面的一行,用来指示是哪个socket的数据:
RECV FROM:117.50.111.72:8001
4.2. 开启数据上报IPD头
指令:
AT+CIPHEAD=
功能:是否显示IPD头
参数:
参数 | 说明 |
---|---|
0 | 不显示 |
1 | 显示 |
示例:
AT+CIPHEAD=1OK
开启之后,模组接收到服务器的数据上报时,会在数据前加上:
+IPD(data length)
5. 基于 TCP 协议连接远程服务器通信实例
5.1. 搭建远程TCP服务器
首先我们需要搭建一个TCP服务器,有两种方式:
- 在服务器上使用Python、Java、C#等语言自行编写服务器程序;
- 在本地PC上使用网络调试助手开启TCP服务器;
因为 AC7670 模组直接注册的是公网ip地址,所以这里我们使用第一种方式,在Linux服务器上运行一个Python编写的tcp测试服务器:
本地PC使用的是局域网,公网不可以直接根据ip地址访问到本PC,需要进行内网穿透,不推荐使用。
这里的Python程序如下:
# tcpserver.pyfrom socket import *host = ''port = 8001# 创建server socketserver_socket = socket(AF_INET,SOCK_STREAM)# 绑定socket监听地址server_addr = (host,port)server_socket.bind(server_addr)# 开始监听,最大允许连接数5server_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.") breakexcept: client_socket.close() server_socket.close() print("socket closed.")
运行:
python3 tcp-server.py
效果如下:
5.2. 模组连接服务器
AT命令:
AT+CIPOPEN=, , , [, ]
功能:在多socket模式下建立TCP/UDP链接,最大支持10个socket。
其中参数说明如下:
参数 | 说明 |
---|---|
link_num | socket号(0-9) |
type | 协议类型,"TCP"表示建立 TCP socket,"UDP”表示建立UDP Socket |
serverIP | 服务器ip,字符串类型 |
Remote_Port | 服务器端口,整型(0-65535) |
localPort | 本地端口号(0-65535),可以不填 |
示例:
AT+CIPOPEN=0,"TCP","117.50.111.72",8001OK+CIPOPEN: 0,0
连接之后,在服务器端也可以看到:
5.3. 模组接收消息
接收消息的上报格式配置见第 4 节,此处不再赘述。
模组连接到服务器后,服务器会自动发送消息,所以模组接收之后直接打印出了:
RECV FROM:117.50.111.72:8001+IPD14Hello, client!
5.4. 模组主动发送消息
该命令用于发送字符串数据:
AT+CIPSEND=,
命令参数说明:
- link_num:整型,socket ID,范围:0-9;
- length:要发送多少个字节,范围:1-1500;
注意:当length为0时,数据中出现0x1a
即表示结束;当length不为0时,数据长度达到length即结束。
示例:
① 第一种发送方式(指定数据大小)
AT+CIPSEND=0,5>helloOK+CIPSEND: 0,5,5
服务器接收结果为:
② 第二种发送方式(不指定数据大小,使用0x1a
结束) AT+CIPSEND=0>hiOK+CIPSEND: 0,2,2
5.5. 关闭TCP连接
通信完毕之后,可以使用下面的命令关闭TCP连接:
AT+CIPCLOSE=
示例:
AT+CIPCLOSE=0OK+CIPCLOSE: 0,0
6. 基于 UDP 协议连接远程服务器通信实例
6.1. 搭建远程UDP服务器
首先我们需要搭建一个UDP服务器,有两种方式:
- 在服务器上使用Python、Java、C#等语言自行编写服务器程序;
- 在本地PC上使用网络调试助手开启UDP服务器;
因为 AC7670 模组直接注册的是公网ip地址,所以这里我们使用第一种方式,在Linux服务器上运行一个Python编写的udp测试服务器:
本地PC使用的是局域网,公网不可以直接根据ip地址访问到本PC,需要进行内网穿透,不推荐使用。
这里的Python程序如下:
# udp-server.pyfrom socket import *host = ''port = 8002# 创建server socketserver_socket = socket(AF_INET,SOCK_DGRAM)# 绑定socket监听地址server_addr = (host,port)server_socket.bind(server_addr)print('UDP Server Start...')# 处理连接请求while(True): # 接收客户端的数据 data, addr = server_socket.recvfrom(1024) print("Receive from %s:%s" % addr % data) if data == b"quit": server_socket.sendto(b"Good bye!\n", addr) continue server_socket.sendto(b"Hello,udp client!\n", addr)
运行:
python3 udp-server-8002.py
效果如下:
6.2. 模组建立socket
AT命令:
AT+CIPOPEN=,”UDP”,,,
功能:在多socket模式下建立UDP链接,最大支持10个socket。
其中参数说明如下:
参数 | 说明 |
---|---|
link_num | socket号(0-9) |
type | 协议类型,"UDP”表示建立UDP Socket |
localPort | 本地端口号(0-65535) |
示例:
AT+CIPOPEN=0,"UDP",,,6031+CIPOPEN: 0,0OK
6.3. 模组主动发送UDP消息
该命令用于发送字符串数据:
AT+CIPSEND=,[ ], ,
命令参数说明:
- link_num:整型,socket ID,范围:0-9;
- length:要发送多少个字节(可选),范围:1-1500。
示例:
① 第一种方式,指定数据大小:
AT+CIPSEND=0,5,"117.50.111.72",8002>helloOK+CIPSEND: 0,5,5
服务器接收结果为:
① 第二种方式,不指定数据大小,使用0x1a
结束: AT+CIPSEND=0,,"117.50.111.72",8002>hiOK+CIPSEND: 0,2,2
服务器接收结果为:
6.4. 模组接收UDP数据
模组发送消息到服务器后,服务器会自动发送消息,所以直接打印出了:
RECV FROM:117.50.111.72:8002+IPD18Hello,udp client!
6.5. 关闭UDP连接
通信完毕之后,可以使用下面的命令关闭UDP连接:
AT+CIPCLOSE=
示例:
AT+CIPCLOSE=0OK+CIPCLOSE: 0,0
7. 域名解析
指令:
AT+CDNSGIP=
功能:域名解析
示例:
AT+CDNSGIP="www.mculover666.cn"+CDNSGIP: 1,"www.mculover666.cn","106.75.169.32"OK
接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。
转载地址:https://mculover666.blog.csdn.net/article/details/109756984 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!