程序功能说明
AT 指令初始化:
程序依次执行 MQTT 初始化、连接服务器并订阅主题 4G_TEST/led1。
消息监听:
主循环 loop() 持续监听从 4G 模块返回的 MQTT 消息内容,并进行关键字匹配:
如果消息内容包含 "on",则点亮 LED。
如果消息内容包含 "off",则熄灭 LED。
LED 控制:
通过 Arduino 的 13 引脚连接一个 LED,可根据 MQTT 消息实现开关控制。
#include <SoftwareSerial.h>
// 定义连接 4G 模块的 TX 和 RX 引脚
SoftwareSerial simModule(10, 11); // RX, TX
const int ledPin = 13; // Arduino 板上连接的 LED 引脚
//unsigned long lastPublishTime = 0; // 上次发送 "online" 消息的时间戳
//const unsigned long publishInterval = 5000; // 发送间隔(5秒)
void sendCommand(const char* command, int delayTime = 500) {
Serial.print("Sending: ");
Serial.println(command);
simModule.println(command); // 发送指令到 4G 模块
delay(delayTime); // 等待指令响应
while (simModule.available()) {
Serial.write(simModule.read()); // 打印模块的响应
}
}
void setup() {
// 初始化串口
Serial.begin(9600); // 用于调试
simModule.begin(9600); // 设置与 4G 模块通信的波特率
pinMode(ledPin, OUTPUT); // 设置 LED 引脚为输出模式
digitalWrite(ledPin, LOW); // 初始关闭 LED
delay(2000); // 等待模块启动
// 按顺序发送 AT 指令,初始化 MQTT 连接
sendCommand("AT+MDISCONNECT", 150);
sendCommand("AT+MIPCLOSE", 150);
sendCommand("AT+QICSGP=1,1,\"\",\"\",\"\"", 150);
sendCommand("AT+NETOPEN", 3000);
sendCommand("AT+MCONFIG=\"4G_TEST\",\"\",\"\",0,0,0,\"1883\",\"2024\"", 1500);
sendCommand("AT+MIPSTART=\"nbzch.cn\",1883,3", 3000);
sendCommand("AT+MCONNECT=0,60", 1500);
// 订阅主题 "4G_TEST/led1"
sendCommand("AT+MSUB=\"4G_TEST/led1\",0", 500);
// 发布主题 "4G_TEST/led2"
sendCommand("AT+MPUBEX=\"4G_TEST/led2\",0,0,7", 500);
sendCommand("connect", 500); // 发送消息体
}
void loop() {
// 检查是否有从 4G 模块返回的数据
if (simModule.available()) {
String receivedData = ""; // 存储接收的数据
while (simModule.available()) {
char c = simModule.read();
receivedData += c;
}
Serial.print("Received: ");
Serial.println(receivedData);
if (receivedData.indexOf("on") != -1) {
digitalWrite(ledPin, HIGH); // 打开 LED
Serial.println("LED ON");
sendCommand("AT+MPUBEX=\"4G_TEST/led2\",0,0,6", 500);
sendCommand("led on", 500); // 发送消息体
} else if (receivedData.indexOf("off") != -1) {
digitalWrite(ledPin, LOW); // 关闭 LED
Serial.println("LED OFF");
sendCommand("AT+MPUBEX=\"4G_TEST/led2\",0,0,7", 500);
sendCommand("led off", 500); // 发送消息体
}
}
// else {
// // 每 5 秒发送一次 "online" 消息
// unsigned long currentTime = millis();
// if (currentTime - lastPublishTime >= publishInterval) {
// lastPublishTime = currentTime;
// sendCommand("AT+MPUBEX=\"4G_TEST/led2\",0,0,6", 500); // 发布消息的指令
// sendCommand("online", 500); // 消息内容为 "online"
// Serial.println("Published: online");
// }
// }
delay(100); // 延时以避免循环过快
}