程序功能说明

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); // 延时以避免循环过快
}

2024-12-06T14:51:38.png

发表评论