AT 指令开发指南
AT 指令基础
AT 指令(Attention Commands)源自 Hayes 调制解调器,是蜂窝模组最基础的控制接口。即使使用 QuecOpen/QuecPython,了解 AT 指令也是必要的。
AT 指令格式
基本格式:
AT<命令>[=<参数>]<CR>
响应格式:
<CR><LF><响应内容><CR><LF>
OK 或 ERROR
命令类型:
AT+CMD → 执行命令
AT+CMD? → 查询当前值
AT+CMD=? → 查询支持的参数范围
AT+CMD=<值> → 设置参数基础 AT 指令
bash
# 测试通信
AT
# 响应:OK
# 查询厂商信息
AT+GMI
# 响应:Quectel
# 查询模组型号
AT+GMM
# 响应:EC600M-CN
# 查询固件版本
AT+GMR
# 响应:EC600MCNAAR01A01M08_OCPU_BETA0902
# 查询 IMEI
AT+GSN
# 响应:867584030123456
# 查询 IMSI
AT+CIMI
# 响应:460001234567890
# 查询 ICCID(SIM 卡号)
AT+QCCID
# 响应:+QCCID: 89860012345678901234网络相关 AT 指令
网络注册
bash
# 查询网络注册状态
AT+CREG?
# +CREG: 0,1
# 第一个参数:0=不主动上报,1=主动上报,2=主动上报+位置信息
# 第二个参数:0=未注册,1=已注册本地,2=搜索中,3=注册被拒,5=漫游
# 查询 EPS 网络注册(4G/5G)
AT+CEREG?
# +CEREG: 0,1
# 查询当前运营商
AT+COPS?
# +COPS: 0,0,"CHINA MOBILE",7
# 参数:选择模式,格式,运营商名称,接入技术(7=LTE)
# 手动选择运营商
AT+COPS=1,2,"46000" # 强制注册中国移动
# 自动选择运营商
AT+COPS=0信号质量
bash
# 查询 RSSI(信号强度指示)
AT+CSQ
# +CSQ: 20,0
# RSSI 值:0-31(31=最强),99=未知
# 转换:RSSI(dBm) = -113 + 2 × 值
# 20 → -113 + 40 = -73dBm
# 查询扩展信号质量(推荐)
AT+QCSQ
# +QCSQ: "LTE",-75,-8,15,-95
# 参数:接入技术,RSRP,RSRQ,SINR,RSSI
# 信号质量判断:
# RSRP > -80dBm:优秀
# -80 ~ -100dBm:良好
# -100 ~ -110dBm:一般
# < -110dBm:差
# 查询服务小区详细信息
AT+QENG="servingcell"
# +QENG: "servingcell","NOCONN","LTE","FDD",460,00,1A2B3C,100,1,3,4,-75,-8,15,-95,11,-,-数据连接
bash
# 配置 PDP 上下文(APN)
AT+CGDCONT=1,"IP","cmnet"
# 参数:上下文ID,协议类型,APN
# 激活数据连接
AT+CGACT=1,1
# 参数:激活(1)/去激活(0),上下文ID
# 查询 IP 地址
AT+CGPADDR=1
# +CGPADDR: 1,"10.123.45.67"
# 去激活数据连接
AT+CGACT=0,1TCP/UDP 通信
QIOPEN/QISEND(推荐)
bash
# 打开 TCP 连接
AT+QIOPEN=1,0,"TCP","server.example.com",8080,0,1
# 参数:上下文ID,连接ID,协议,地址,端口,本地端口,访问模式
# 访问模式:0=缓冲,1=直接推送,2=透传
# 等待连接成功(URC)
# +QIOPEN: 0,0 (连接ID=0,错误码=0表示成功)
# 发送数据
AT+QISEND=0,13
> Hello, World!
# 等待 > 提示符后输入数据
# 响应:SEND OK
# 接收数据(直接推送模式,URC 自动上报)
# +QIURC: "recv",0,5
# Hello
# 关闭连接
AT+QICLOSE=0
# 查询连接状态
AT+QISTATE=1,0
# +QISTATE: 0,"TCP","server.example.com",8080,0,2,1,0,"wwan0"UDP 通信
bash
# 打开 UDP 连接
AT+QIOPEN=1,0,"UDP","192.168.1.100",5000,0,1
# 发送 UDP 数据
AT+QISEND=0,5
> Hello
# 发送到指定地址(无连接 UDP)
AT+QISEND=0,5,"192.168.1.200",5001
> HelloMQTT AT 指令
bash
# 打开 MQTT 网络
AT+QMTOPEN=0,"broker.emqx.io",1883
# +QMTOPEN: 0,0 (成功)
# 连接 MQTT 服务器
AT+QMTCONN=0,"clientID","username","password"
# +QMTCONN: 0,0,0 (成功)
# 订阅主题
AT+QMTSUB=0,1,"sensor/cmd",0
# +QMTSUB: 0,1,0,0 (成功)
# 发布消息
AT+QMTPUBEX=0,0,0,0,"sensor/data",25
> {"temperature":25.6}
# +QMTPUBEX: 0,0,0 (成功)
# 接收消息(URC 自动上报)
# +QMTRECV: 0,0,"sensor/cmd",10,{"cmd":"on"}
# 断开连接
AT+QMTDISC=0
# 关闭网络
AT+QMTCLOSE=0HTTP AT 指令
bash
# 配置 HTTP URL
AT+QHTTPURL=30,80
> http://httpbin.org/get
# 参数:URL长度,超时时间(秒)
# 发送 GET 请求
AT+QHTTPGET=80
# +QHTTPGET: 0,200,256 (成功,HTTP 200,响应长度 256 字节)
# 读取响应
AT+QHTTPREAD=80
# +QHTTPREAD: 0
# {
# "headers": {...},
# "url": "http://httpbin.org/get"
# }
# OK
# POST 请求
AT+QHTTPURL=35,80
> http://httpbin.org/post
AT+QHTTPPOST=25,80,80
> {"key":"value","num":42}
# +QHTTPPOST: 0,200,512短信 AT 指令
bash
# 设置短信格式(文本模式)
AT+CMGF=1
# 设置字符集
AT+CSCS="GSM"
# 发送短信
AT+CMGS="+8613800138000"
> Hello, this is a test SMS!
# 按 Ctrl+Z(0x1A)发送
# +CMGS: 1 (消息引用号)
# 读取短信
AT+CMGR=1 # 读取第1条短信
# 列出所有短信
AT+CMGL="ALL"
# 删除短信
AT+CMGD=1 # 删除第1条
AT+CMGD=1,4 # 删除所有短信电源管理 AT 指令
bash
# 查询电源状态
AT+CBC
# +CBC: 0,85,4100
# 参数:充电状态,电量百分比,电压(mV)
# 正常关机
AT+QPOWD=1
# 进入飞行模式(关闭射频)
AT+CFUN=4
# 恢复正常模式
AT+CFUN=1
# 配置慢时钟(省电)
AT+QSCLK=1
# 查询模组温度
AT+QTEMP
# +QTEMP: "XO_THERM",35,"PA_THERM",38,"PA_THERM1",36AT 指令调试工具
QCOM(移远串口调试工具)
QCOM 是移远提供的 Windows 串口调试工具:
- 支持 AT 指令发送和响应显示
- 支持日志抓取和保存
- 支持脚本自动化测试
- 下载:移远官网 → 工具下载使用 Python 自动化测试
python
import serial
import time
class ATClient:
def __init__(self, port, baudrate=115200):
self.ser = serial.Serial(port, baudrate, timeout=1)
def send(self, cmd, timeout=5):
"""发送 AT 指令并等待响应"""
self.ser.write((cmd + '\r\n').encode())
response = ""
start = time.time()
while time.time() - start < timeout:
if self.ser.in_waiting:
data = self.ser.read(self.ser.in_waiting).decode('utf-8', errors='ignore')
response += data
if 'OK\r\n' in response or 'ERROR\r\n' in response:
break
time.sleep(0.1)
return response.strip()
def close(self):
self.ser.close()
# 使用示例
client = ATClient('COM3')
# 基本测试
print(client.send('AT'))
print(client.send('AT+GMM'))
print(client.send('AT+CEREG?'))
print(client.send('AT+QCSQ'))
client.close()