广和通L610 4G Cat.1模块的AT指令 TCP/UDP通信实测流程
L610系列是广和通LTECat-1系列工业化模组。
L610系列一共有三个版本,全面覆盖亚洲、欧洲以及拉美地区主要运营商网络频段,包含L610-CN/L610-EU/L610-LA(支持Wi-Fi& BT)。
模组包含采用方便贴片的LCC+LGA封装以。与NL668系列PIN兼容,可直接替换。
模组支持FDDLTE/TDD-LTE、GSM制式的远距离通讯模式和支持WIFI、Bluetooth近距离无线传输技术。另外,模组具有丰富的扩展接口,支持UART/ SPI/I2C/USB等接口。内置Codec,支持TTS、recording以及VoLTE。
1. 环境准备1.1. 硬件准备
L610模组官方开发板:
供电需要插上下面的USB线。
如果想把串口引出来,按照图中这样接:
有读者留言说开发板上的模组是LC610,下面附上官网对比:
1.2. 软件准备
- QCOM串口助手
- L610通信模组测试AT命令脚本(L610.ini)
本文直接使用USB线连接到模组,使用板载USB转串口测试。
使用QCOM工具打开该串口,波特率115200-8-N-1:
1.3. 文档准备
- L610 TCP/IP应用手册:
此文档来自于广和通官方!阅读本教程时,关于AT指令的详细说明请参考该文档!
1.4. 模组开机方式
模组有开机引脚,需要拉低2s才能开机。
模组上有一个自动开机控制端子,接上之后上电自动开机,如图:
如果拔掉这个端子,则需要手动按开机键开机:
如果需要单片机来控制开机引脚,则拔掉端子,手动连接端子处的两个引脚:
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
功能:查询模组的信号强度,第一个值为0-31则正常,99为不正常
示例:
AT+CSQ +CSQ: 17,0 OK
此处有问题,模组实际返回+CSQ:22,99
AT+CREG?
指令:AT+CREG?
功能:查询模组是否注册上GSM网络,+CREG:0,1 表示已注册上本地网,+CREG:0,5表示注册上漫游网。
示例:
AT+CREG? +CREG: 0,1 OK
AT+CGREG?
指令:AT+CERGE?
功能:查询模组是否注册上GPRS网络,+CGREG:0,1 表示已注册上本地网,+CGREG:0,5表示注册上漫游网。
示例:
AT+CGREG? +CGREG: 0,1 OK3. 设置数据格式
指令:AT+GTSET=“IPRFMT”,X
功能:设置服务器数据上报格式
参数说明:x支持0、1、2、5四个参数。
x的值 | 格式 |
---|---|
0 | HEX 格式,不带大小,带标识头+MIPRTCP(默认) |
1 | 字符格式,不带标识头+MIPRTCP |
2 | 字符格式,带标识头+MIPRTCP |
5 | 缓存模式(需要使用+MIPREAD 指令读数据) |
示例:
AT+GTSET="IPRFMT",2 OK4. 激活移动场景
必须在查询GPRS网络已正常注册网络的情况下进行本节实验!
AT+MIPCALL?
指令:AT+MIPCALL?
功能:在激活GPRS场景之前先查询移动场景,如果开启的话先关闭GPRS场景,确保连接正确
示例:
在移动场景已激活的状态下:
AT+MIPCALL? +MIPCALL: 1,10.175.53.53 OK AT+MIPCALL=0 OK +MIPCALL: 0
在移动场景未激活的状态下:
AT+MIPCALL? +MIPCALL: 0 OK
AT+MIPCALL=1,“CMNET”
指令:AT+MIPCALL=1,“CMNET”
功能:设置GPRS的APN(移动CMNET,联通UNINET),并激活移动场景
示例:
AT+MIPCALL=1,"CMNET" OK +MIPCALL: 10.137.70.705. 基于 TCP 协议连接远程服务器通信实例
5.1. 搭建远程TCP服务器
首先我们需要搭建一个TCP服务器,有两种方式:
- 在服务器上使用Python、Java、C#等语言自行编写服务器程序;
- 在本地PC上使用网络调试助手开启TCP服务器;
因为EC20模组直接注册的是公网ip地址,所以这里我们使用第一种方式,在Linux服务器上运行一个Python编写的tcp测试服务器:
本地PC使用的是局域网,公网不可以直接根据ip地址访问到本PC,需要进行内网穿透,不推荐使用。
这里的Python程序如下:
# tcpserver.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
效果如下:
5.2. 模组连接服务器
模组建立socket的AT命令如下:
AT+MIPOPEN=<Socket_ID>,[<Source_Port>],<Remote_IP>,<Remote_Port>,<Protocol>
使用AT命令连接TCP服务器,其中参数说明如下:
参数 | 说明 |
---|---|
Socket_ID | socket号(1-6) |
Source_Port | 本地端口号(0-65535),可以不填 |
Remote_IP | 服务器ip,字符串类型 |
Remote_Port | 服务器端口,整型 |
Protocol | 协议,整型(0:TCP of IPV4,1 UDP of IPV4,2 SSL of IPV4) |
示例:
AT+MIPOPEN=1,,"117.50.111.72",8001,0 OK +MIPOPEN: 1,1
连接之后,在服务器端也可以看到:
5.3. 模组接收消息
模组连接到服务器后,服务器会自动发送消息,模组配置的接收格式是0,所以直接打印出了:
+MIPRTCP: 1,0,48656C6C6F2C20636C69656E7421
5.4. 模组主动发送消息(发送十六进制字符串)
该命令用于发送 16 进制字符串数据:
+MIPSEND=<Socket_ID>,<Data>
命令参数说明:
- Socket_ID:整型,socket ID,范围:1-6;
- Data:要发送多少个字节。
模组响应结果为:
- 发送成功:SEND OK
- 发送缓存已满:SEND FAIL
- 连接不存在:ERROR
示例:
AT+MIPSEND=1,15 > OK +MIPPUSH: 1,0 +MIPSEND: 1,0,2048
服务器接收结果为:
5.5. 关闭TCP连接
通信完毕之后,可以使用下面的命令关闭TCP连接:
AT+MIPCLOSE=<Socket_ID>
示例:
AT+MIPCLOSE=1 OK +MIPCLOSE: 1,06. 基于 UDP 协议连接远程服务器通信实例
6.1. 搭建远程UDP服务器
首先我们需要搭建一个UDP服务器,有两种方式:
- 在服务器上使用Python、Java、C#等语言自行编写服务器程序;
- 在本地PC上使用网络调试助手开启UDP服务器;
因为L610模组直接注册的是公网ip地址,所以这里我们使用第一种方式,在Linux服务器上运行一个Python编写的udp测试服务器:
本地PC使用的是局域网,公网不可以直接根据ip地址访问到本PC,需要进行内网穿透,不推荐使用。
这里的Python程序如下:
# udp-server.py from socket import * host = '' port = 8002 # 创建server socket server_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.py
效果如下:
6.2. 模组连接服务器
模组建立socket的AT命令如下:
AT+MIPOPEN=<Socket_ID>,[<Source_Port>],<Remote_IP>,<Remote_Port>,<Protocol>
使用AT命令连接TCP服务器,其中参数说明如下:
参数 | 说明 |
---|---|
Socket_ID | socket号(1-6) |
Source_Port | 本地端口号(0-65535),可以不填 |
Remote_IP | 服务器ip,字符串类型 |
Remote_Port | 服务器端口,整型 |
Protocol | 协议,整型(0:TCP of IPV4,1 UDP of IPV4,2 SSL of IPV4) |
示例:
AT+MIPOPEN=1,,"117.50.111.72",8002,1 OK +MIPOPEN: 1,1
6.3. 模组主动发送消息(发送十六进制字符串)
该命令用于发送 16 进制字符串数据:
+MIPSEND=<Socket_ID>,<Data>
命令参数说明:
- Socket_ID:整型,socket ID,范围:1-6;
- Data:要发送多少个字节。
示例:
AT+MIPSEND=1,15 > OK +MIPPUSH: 1,0 +MIPSEND: 1,0,2048
服务器接收结果为:
6.4. 模组接收UDP数据
模组发送消息到服务器后,服务器会自动发送消息,模组配置的接收格式是0,所以直接打印出了:
+MIPRUDP: 117.50.111.72,8002,1,0,48656C6C6F2C75647020636C69656E74210A
6.5. 关闭UDP连接
通信完毕之后,可以使用下面的命令关闭TCP连接:
AT+MIPCLOSE=<Socket_ID>
示例:
AT+MIPCLOSE=1 OK +MIPCLOSE: 1,07. 域名解析
指令:
AT+MIPDNS=<hostname>
功能:域名解析
示例:
AT+MIPDNS="www.mculover666.cn" +MIPDNS: "www.mculover666.cn",122.51.89.94 OK
解析百度:
AT+MIPDNS="www.baidu.com" +MIPDNS: "www.baidu.com",183.232.231.174 OK