通信猫物联网平台配置

通信猫物联网平台配置

image-20260504202913626

image-20260504202855911

实验代码:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* WIFI_SSID     = "aaaa";              // WiFi名
const char* WIFI_PASSWORD = "1234567890";        // WiFi密码
const char* MQTT_SERVER   = "120.27.235.176";    // mqtt通讯地址
const int   MQTT_PORT     = 1883;                // mqtt端口
const char* MQTT_CLIENTID = "esp8266_client_01"; // 改成你自己的唯一ID
const char* MQTT_TOPIC1    = "test/chat1";       // 订阅主题
const char* MQTT_TOPIC2    = "test/chat2";       // 发布主题

WiFiClient espClient;
PubSubClient client(espClient);

void callback(char* topic, byte* payload, unsigned int length) {
  // 只打印必要信息,减少串口负载
  Serial.print("收到消息: ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("连接MQTT...");
    if (client.connect(MQTT_CLIENTID)) {
      Serial.println("成功!");
      client.subscribe(MQTT_TOPIC1);
    } else {
      Serial.print("失败,状态码: ");
      Serial.println(client.state());
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi已连接");

  client.setServer(MQTT_SERVER, MQTT_PORT);
  client.setCallback(callback);
  client.setKeepAlive(15); // 15秒心跳包,防止被踢
}

void loop() {
  // WiFi断线自动重连
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.reconnect();
    delay(5000);
    return;
  }

  // MQTT断线自动重连
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // 降低发送频率,减少服务器压力
  static unsigned long lastSend = 0;
  if (millis() - lastSend > 5000) { // 5秒发一次,不要太频繁
    lastSend = millis();
    String msg = "ESP8266在线: " + String(millis()/1000) + "秒";
    client.publish(MQTT_TOPIC2, msg.c_str());
    Serial.println("已发送消息");
  }
}

image-20260504203937144

实现单片机串口通信

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// ======================== 【配置区】========================
const char* WIFI_SSID     = "aaaa";              // WiFi名称
const char* WIFI_PASSWORD = "1234567890";        // WiFi密码
const char* MQTT_SERVER   = "120.27.235.176";    // MQTT服务器IP
const int   MQTT_PORT     = 1883;                // MQTT端口
const char* MQTT_CLIENTID = "esp8266_client_01"; // 客户端ID(唯一)
const char* MQTT_TOPIC1   = "test/chat1";        // 订阅主题(接收消息)
const char* MQTT_TOPIC2   = "test/chat2";        // 发布主题(发送消息)
// ==========================================================

WiFiClient espClient;
PubSubClient client(espClient);

// LED 状态指示灯引脚
#define LED_PIN 2

// 定时器变量(用于LED闪烁、心跳)
unsigned long ledTime = 0;
bool ledState = false;

// ==========================================================
// 【MQTT回调函数】:当收到订阅主题的消息时,自动进入这里
// ==========================================================
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("【MQTT收到】");
  Serial.print(topic);
  Serial.print(" → ");
  
  // 打印收到的消息内容
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

// ==========================================================
// 【MQTT重连函数】:断开后自动重连,并重新订阅主题
// ==========================================================
void reconnect() {
  // 循环尝试重连,直到成功
  while (!client.connected()) {
    Serial.print("正在连接MQTT服务器...");
    
    // 尝试连接MQTT
    if (client.connect(MQTT_CLIENTID)) {
      Serial.println("连接成功!");
      client.subscribe(MQTT_TOPIC1);  // 重新订阅
      Serial.print("已订阅主题:");
      Serial.println(MQTT_TOPIC1);
    } else {
      // 连接失败,打印错误码,5秒后重试
      Serial.print("失败,错误码:");
      Serial.println(client.state());
      Serial.println("5秒后重试...");
      delay(5000);
    }
  }
}

// ==========================================================
// 【初始化】:只执行一次
// ==========================================================
void setup() {
  Serial.begin(115200);         // 初始化串口波特率115200
  pinMode(LED_PIN, OUTPUT);     // 设置LED引脚为输出模式
  digitalWrite(LED_PIN, HIGH);  // 上电默认熄灭LED

  Serial.println("\n==================================");
  Serial.println("   ESP8266 串口+MQTT 透传程序");
  Serial.println("==================================\n");

  // ========== 连接WiFi ==========
  Serial.print("正在连接WiFi:");
  Serial.println(WIFI_SSID);
  
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("\nWiFi 连接成功!");
  Serial.print("IP地址:");
  Serial.println(WiFi.localIP());

  // ========== MQTT初始化 ==========
  client.setServer(MQTT_SERVER, MQTT_PORT);    // 设置服务器地址+端口
  client.setCallback(callback);                // 设置消息接收回调
  client.setKeepAlive(15);                     // 心跳包:15秒一次(防止掉线)
}

// ==========================================================
// 【主循环】:反复执行
// ==========================================================
void loop() {
  // ========== 1. WiFi 掉线自动重连 ==========
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi 断开,正在重连...");
    WiFi.reconnect();
    delay(3000);
    return;  // 没连WiFi前不执行后续代码
  }

  // ========== 2. MQTT 掉线自动重连 ==========
  if (!client.connected()) {
    reconnect();
  }

  // ========== 3. MQTT 心跳维持 ==========
  client.loop();

  // ========== 4. LED 状态指示灯 ==========
  // WiFi + MQTT 都在线 → 常亮
  // 任意一个断开 → 闪烁
  if (WiFi.status() == WL_CONNECTED && client.connected()) {
    digitalWrite(LED_PIN, LOW);  // 常亮
  } else {
    // 500ms闪烁一次
    if (millis() - ledTime > 500) {
      ledTime = millis();
      ledState = !ledState;
      digitalWrite(LED_PIN, ledState ? LOW : HIGH);
    }
  }

  // ========== 5. 串口透传 → MQTT发送 ==========
  if (Serial.available() > 0) {
    // 读取串口数据(直到换行)
    String msg = Serial.readStringUntil('\n');
    msg.trim();  // 去掉多余空格、换行符
    
    if (msg.length() > 0) {
      Serial.print("【串口发送】→ ");
      Serial.println(msg);
      
      // 把串口收到的内容通过MQTT发出去
      client.publish(MQTT_TOPIC2, msg.c_str());
    }
  }
}

image-20260504205212944

posted @ 2026-05-04 20:53  Q&25  阅读(24)  评论(0)    收藏  举报