Air720模块实战指南:如何轻松发送JSON格式数据
在物联网(IoT)应用开发中,设备与服务器之间的数据交互是核心环节,JSON(JavaScript Object Notation)因其轻量级、易于阅读和解析的特性,已成为物联网数据交换的事实标准,广和通(Fibocom)的Air720是一款功能强大的LTE Cat 1通信模块,非常适合各类物联网终端设备,本文将详细介绍如何使用Air720模块,通过AT指令集,向指定服务器发送JSON格式的数据。
准备工作:理解核心概念
在开始编码之前,我们需要明确几个关键点:
- Air720的角色:Air720本身是一个通信模块,它负责“打通”设备与互联网之间的通道,它本身不直接处理数据,而是根据主控MCU(微控制器单元)的指令,执行网络连接、数据收发等操作。
- AT指令:这是与Air720模块通信的语言,我们通过串口向模块发送特定的AT指令,来控制其行为,如:
AT+CSQ查看信号质量,AT+CGATT=1附着到网络,AT+QICSGP设置APN,AT+QIOPEN建立TCP/UDP连接等。 - JSON数据:我们需要在主控MCU上将需要发送的数据组织成JSON格式的字符串,一个包含温度和湿度的数据包可以是:
{"temperature": 25.5, "humidity": 60, "device_id": "SN12345"}。
发送JSON数据的完整流程
整个过程可以分解为四个主要步骤:模块初始化 -> 建立网络连接 -> 发送数据 -> 关闭连接。
模块初始化与网络附着
我们需要确保Air720模块已经正确连接到主控MCU(通过串口),并且已经成功附着到LTE网络。
-
检查模块响应:
AT
模块应返回
OK,表示模块已就绪。 -
设置APN(根据运营商SIM卡设置):
AT+QICSGP=1,"CMNET" // 以中国移动为例,APN为"CMNET"
返回
OK即可。 -
附着到GPRS/网络:
AT+CGATT=1
等待返回
OK,并持续查询AT+CGATT?直到返回+CGATT: 1,表示网络附着成功。
建立与服务器的TCP/UDP连接
JSON数据通常通过TCP或UDP协议传输,这里以最常用的TCP协议为例,假设我们要连接到一个公网的TCP服务器(IP地址和端口请替换为您的实际地址)。
-
定义Socket ID:Air720支持多个并发连接,我们可以使用
0号Socket。 -
配置TCP客户端:
AT+QIOPEN=0,"TCP","your_server_ip",your_server_port,0
0:Socket ID。"TCP":协议类型。"your_server_ip":服务器的IP地址或域名。your_server_port:服务器的端口号。0:是否立即激活连接(0表示不立即激活,后续手动激活)。
-
检查连接状态: 模块会返回
CONNECT OK或ERROR,如果返回OK,需要再查询一次状态:AT+QISTATE=0
在返回信息中,找到
+QISTATE: 0,0,第二个0表示STATE为CONNECT OK,即连接已成功建立。
发送JSON数据
连接成功后,就可以通过这个Socket发送我们准备好的JSON数据字符串了。
-
准备JSON字符串:在您的MCU端,将数据拼接成合法的JSON字符串。
{"temperature": 25.5, "humidity": 60, "device_id": "SN12345"}注意:这个字符串必须是完整的,不能包含多余的空格或换行符。
-
使用AT+QISEND指令发送:
AT+QISEND=0,46
0:Socket ID。46:要发送的数据长度,请务必计算您的JSON字符串的字节长度(一个中文字符通常占3个字节,一个英文字符或数字占1个字节),上面的字符串{"temperature":25.5,"humidity":60,"device_id":"SN12345"}共46个字符,长度就是46。
-
等待
>提示符并发送数据: 模块收到AT+QISEND指令后,会返回一个>符号,表示此时可以输入数据。 在>后面,紧接着输入您的JSON字符串,然后按回车键(发送\r字符):> {"temperature":25.5,"humidity":60,"device_id":"SN12345"}模块发送成功后,会返回
SEND OK。
关闭连接(可选但推荐)
数据发送完毕后,为了节省功耗和释放资源,建议关闭Socket连接。
AT+QICLOSE=0
模块会返回 CLOSE OK。
完整示例代码(伪代码/逻辑流程)
以下是一个在MCU上实现上述逻辑的伪代码示例,可以帮助您更好地理解:
#include <string.h>
// 定义服务器信息
#define SERVER_IP "192.168.1.100"
#define SERVER_PORT 8080
#define SOCKET_ID 0
// 定义要发送的JSON数据
const char* json_data = "{\"temperature\":25.5,\"humidity\":60,\"device_id\":\"SN12345\"}";
int data_len = strlen(json_data);
// 主函数中的发送逻辑部分
void send_json_data_via_air720() {
char at_cmd[128];
char response[256];
int i = 0;
// 1. 检查模块
send_at_command("AT", response, 1000);
if (strstr(response, "OK") == NULL) {
printf("Module not ready!\n");
return;
}
// 2. 附着网络 (假设已设置好APN)
send_at_command("AT+CGATT=1", response, 5000);
while (strstr(response, "+CGATT: 1") == NULL && i++ < 10) {
send_at_command("AT+CGATT?", response, 1000);
delay(1000);
}
// 3. 建立TCP连接
sprintf(at_cmd, "AT+QIOPEN=%d,\"TCP\",\"%s\",%d,0", SOCKET_ID, SERVER_IP, SERVER_PORT);
send_at_command(at_cmd, response, 5000);
if (strstr(response, "CONNECT OK") == NULL && strstr(response, "OK") == NULL) {
printf("Failed to connect to server!\n");
return;
}
// 再次确认连接状态
sprintf(at_cmd, "AT+QISTATE=%d", SOCKET_ID);
send_at_command(at_cmd, response, 1000);
if (strstr(response, "+QISTATE: 0,0") == NULL) {
printf("Connection is not established!\n");
return;
}
// 4. 发送JSON数据
sprintf(at_cmd, "AT+QISEND=%d,%d", SOCKET_ID, data_len);
send_at_command(at_cmd, response, 1000);
if (strstr(response, ">") == NULL) {
printf("Failed to get '>' prompt for sending data!\n");
return;
}
// 发送数据内容
send_raw_data(json_data); // 直接发送原始数据,不添加\r\n
send_at_command("", response, 1000); // 发送一个空命令(相当于\r\n)来结束数据发送
if (strstr(response, "SEND OK") == NULL) {
printf("Failed to send data!\n");
} else {
printf("Data sent successfully!\n");
}
// 5. 关闭连接
sprintf(at_cmd, "AT+QICLOSE=%d", SOCKET_ID);
send_at_command(at_cmd, response, 2000);
}
常见问题与调试技巧
ERROR:检查AT指令拼写是否正确,参数是否符合要求。+CME ERROR:这是模块硬件或网络层面的错误,如SIM卡未插好、网络未附着、APN错误等,请查阅模块手册,根据错误码排查。



还没有评论,来说两句吧...