查看: 665|回复: 11

[未解决] 新手求助arduino uno+esp8266接收mqtt消息时不稳定

[复制链接]
  • TA的每日心情
    开心
    2020-10-20 11:28
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2020-10-20 11:23 | 显示全部楼层 |阅读模式
    刚刚接触arduino,想制作一个智能小车给孩子玩一玩,碰到一个问题就是,arduino uno+esp8266能够连接到mqtt服务器,也能够发送数据,但是接收数据时经常esp8266与wifi断开连接或者与mqtt服务器断开连接。请问如何解决,代码是网上找的,自己修改一下。

    #include <WiFiEspClient.h>
    #include <WiFiEsp.h>
    #include <PubSubClient.h>
    #include "SoftwareSerial.h"

    #define WIFI_AP "205"
    #define WIFI_PASSWORD "bjxxzx205"

    const char* mqttServer = "******";
    const int mqttPort = 1883;
    const char* mqttUser = "******";
    const char* mqttPassword = "*****";
    const char* clientId = "car11111";
    const char* subTopic = "car/11111";
    const char* pubTopic = "car/11111/temp";
    // 初始化以太网客户端对象 -- WiFiEspClient.h
    WiFiEspClient espClient;
    // 初始化MQTT库PubSubClient.h的对象
    PubSubClient client(espClient);
    SoftwareSerial soft(3, 2); // RX, TX
    int status = WL_IDLE_STATUS;
    unsigned long lastSend;
    /*
       读取温湿度数据,然后发送到MQTT服务器上去
    */
    void getAndSendTemperatureAndHumidityData()
    {
      Serial.println("Collecting temperature data.");
      float h = 50;
      float t = 23;
      // 查看是否读取温湿度失败的
      if (isnan(h) || isnan(t)) {
        Serial.println("Failed to read from DHT sensor!");
        return;
      }
      Serial.print("Humidity: ");
      Serial.print(h);
      Serial.print(" %\t");
      Serial.print("Temperature: ");
      Serial.print(t);
      Serial.print(" *C ");
      String temperature = String(t);
      String humidity = String(h);
      // Just debug messages
      Serial.print( "Sending temperature and humidity : [" );
      Serial.print( temperature ); Serial.print( "," );
      Serial.print( humidity );
      Serial.print( "]   -> " );
      // 构建一个 JSON 格式的payload的字符串
      String payload = "{";
      payload += "\"temperature\":"; payload += temperature; payload += ",";
      payload += "\"humidity\":"; payload += humidity;
      payload += "}";
      // Send payload
      char attributes[100];
      payload.toCharArray( attributes, 100 );
      client.publish(pubTopic, attributes );
      Serial.print("[publish]-->>");
      Serial.println( attributes );
    }
    void InitWiFi()
    {
      // 初始化软串口,软串口连接ESP模块
      soft.begin(9600);
      // 初始化ESP模块
      WiFi.init(&soft);
      // 检测WiFi模块在不在,宏定义:WL_NO_SHIELD = 255,WL_IDLE_STATUS = 0,
      if (WiFi.status() == WL_NO_SHIELD) {
        Serial.println("WiFi shield not present");
        while (true);
      }
      Serial.println("[InitWiFi]Connecting to AP ...");
      // 尝试连接WiFi网络
      while ( status != WL_CONNECTED) {
        Serial.print("[InitWiFi]Attempting to connect to WPA SSID: ");
        Serial.println(WIFI_AP);
        // Connect to WPA/WPA2 network
        status = WiFi.begin(WIFI_AP, WIFI_PASSWORD);
        delay(500);
      }
      Serial.println("[InitWiFi]Connected to AP");
    }

    void callback(char* topic, byte* payload, unsigned int length) {
      Serial.print("Message arrived [");
      Serial.print(topic);
      Serial.print("] ");
      for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
      }
      Serial.println("-----------------------");
    }
    /**
       MQTT客户端断线重连函数
    */
    void reconnect() {
      // 一直循环直到连接上MQTT服务器
      while (!client.connected()) {
        Serial.print("[reconnect]Connecting to MQTT Server ...");
        // 尝试连接connect是个重载函数 (clientId, username, password)
        if ( client.connect(clientId, mqttUser, mqttPassword) ) {
          client.subscribe(subTopic);//这个是你让板子订阅的主题(接受该主题的消息)
          Serial.println( "[DONE]" );
        } else {
          Serial.print( "[FAILED] [ mqtt connect error code = " );
          Serial.print( client.state() );
          Serial.println( " : retrying in 5 seconds]" );// Wait 5 seconds before retrying
          delay( 5000 );
        }
      }
    }
    void setup() {
      Serial.begin(9600);
      //dht.begin();
      InitWiFi();                                // 连接WiFi
      client.setServer( mqttServer, mqttPort );      // 连接WiFi之后,连接MQTT服务器
      client.setCallback(callback);
      lastSend = 0;
    }
    void loop() {
      status = WiFi.status();
      if ( status != WL_CONNECTED) {
        while ( status != WL_CONNECTED) {
          Serial.print("[loop()]Attempting to connect to WPA SSID: ");
          Serial.println(WIFI_AP);
          // 连接WiFi热点
          status = WiFi.begin(WIFI_AP, WIFI_PASSWORD);
          delay(500);
        }
        Serial.println("[loop()]Connected to AP");
      }
      if ( !client.connected() ) {
        reconnect();
      }
      if ( millis() - lastSend > 10000 ) { // 用于定时1秒钟发送一次数据
        getAndSendTemperatureAndHumidityData(); // 获取温湿度数据发送到MQTT服务器上去
        lastSend = millis();
      }
      client.loop();
    }

    该用户从未签到

    发表于 2020-10-20 11:55 | 显示全部楼层
    无线断连不是很正常吗,断了再续不就好了
  • TA的每日心情
    开心
    2020-10-20 11:28
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-10-20 12:07 | 显示全部楼层
    98765kof 发表于 2020-10-20 11:55
    无线断连不是很正常吗,断了再续不就好了

    但是无法100%接收到订阅的数据,偶尔会收到数据。
  • TA的每日心情
    开心
    2020-10-20 11:28
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-10-20 12:12 | 显示全部楼层
    98765kof 发表于 2020-10-20 11:55
    无线断连不是很正常吗,断了再续不就好了

    发送数据不会断开,一接收就断。
  • TA的每日心情
    开心
    2020-11-7 20:36
  • 签到天数: 824 天

    [LV.10]以坛为家III

    发表于 2020-10-21 08:44 | 显示全部楼层
    做玩具小车 就不要用mqtt了 改用websocket吧
  • TA的每日心情
    开心
    2020-11-24 06:44
  • 签到天数: 130 天

    [LV.7]常住居民III

    发表于 2020-10-21 10:38 | 显示全部楼层
    自己搭建的Mosquotto MQTT Broker。  用PubSubClient库也是收不到数据,后来改用AsyncMqttClient库就好了。这个库支持Pub/Sub QoS 0,1,2。
  • TA的每日心情
    开心
    2020-10-20 11:28
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-10-21 12:38 | 显示全部楼层
    单片机菜鸟 发表于 2020-10-21 08:44
    做玩具小车 就不要用mqtt了 改用websocket吧

    好的,有时间试试。
  • TA的每日心情
    开心
    2020-10-20 11:28
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-10-21 12:41 | 显示全部楼层
    ifeue 发表于 2020-10-21 10:38
    自己搭建的Mosquotto MQTT Broker。  用PubSubClient库也是收不到数据,后来改用AsyncMqttClient库就好了。 ...

    在网上找到一篇教程使用#include <TinyGsmClient.h>和#include <PubSubClient.h>库后可以接收到数据了,但是控制sg90g舵机时舵机乱动,请问什么原因?
  • TA的每日心情
    开心
    2020-10-20 11:28
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-10-23 16:09 | 显示全部楼层
    单片机菜鸟 发表于 2020-10-21 08:44
    做玩具小车 就不要用mqtt了 改用websocket吧

    大神你有websocket库吗?方便给我一个吗?
  • TA的每日心情
    开心
    2020-10-20 11:28
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-10-23 16:39 | 显示全部楼层
    wanglei51308 发表于 2020-10-21 12:41
    在网上找到一篇教程使用#include 和#include 库后可以接收到数据了,但是控制sg90g舵机时舵机乱动,请问 ...

    大神 为什么接收数据多了,接收的过快就失败了?
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    摇杆控制电机正反转及速度
    摇杆控制电机正反转及速度
    希望使用摇杆搭配电机驱动模块来控制电机的正反转和曲线加速 基本信息------ 1.根
    arduino pid麦克纳姆轮小车程序详解
    arduino pid麦克纳姆轮小
    之前发过几个帖子,大家可以参考,但经过多次尝试,整套系统升级了,优化了很多地方目录:
    arduino uno板指示灯不亮,连接电脑后端口也没有显示
    arduino uno板指示灯不亮
    arduino uno板指示灯不亮,连接电脑后端口也没有显示。 之前拷过一个驱动直流电机的程
    siri+小爱+小度+天猫控制灯
    siri+小爱+小度+天猫控制
    以上是颜色代码 本程序控制的是8266的 io 0 默认上电LOW 有需求可以知己改写 siri
    关于给esp8266编程和给arduino编程的一些疑问
    关于给esp8266编程和给ard
    本人大一学生,目前正在做创新作业,已经进行到了最后一步:arduino从onenet上调取数
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表