我是靠谱客的博主 追寻小猫咪,最近开发中收集的这篇文章主要介绍串口经ESP8266(MQTT协议)实现与然也物联服务器通信(太极创客源码改),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#include <ESP8266WiFi.h>                                    //联网库
#include <PubSubClient.h>                                   //MQTT库
#include <Ticker.h>                                         //定时库
 

const char* ssid = "xxx";                                 //WIFI名称
const char* password = "xxxxxxxx";                          //WiFi密码
const char* mqttServer = "test.ranye-iot.net";              //联网地址


Ticker ticker;                                              //定时库的对象
WiFiClient wifiClient;                                      //联网库的对象
PubSubClient mqttClient(wifiClient);                        //MQTT库的对象
 
int count;                                                  //定时库计数用变量
String comdata = "";
 
void setup()
{                                              
  Serial.begin(9600);                                       //打开串口波特率9600
 
  pinMode(LED_BUILTIN, OUTPUT);
 
  // Ticker定时对象
  ticker.attach(1, tickerCount);                             // 1秒钟执行一次tickerCount,让count++

  WiFi.mode(WIFI_STA);                                      //设置ESP8266工作模式为无线终端模式
  
 
  connectWifi();                                              // 连接WiFi

  mqttClient.setServer(mqttServer, 1883);                   //联网地址和端口号
  mqttClient.setCallback(receiveCallback);                  //订阅消息后的消息回调函数
 

  connectMQTTServer();                                      // 连接MQTT服务器
}
 
void loop()
{
  if (mqttClient.connected())                                 // 如果开发板成功连接服务器
  {                                                       
     while (Serial.available() > 0)
    {
        comdata += char(Serial.read());  //每次读一个char字符,并相加
        delay(2);
    }
    if (comdata.length() > 0)
   {
        pubMQTTmsg();                                           //发布消息函数
        comdata = "";
   }

        
   
    mqttClient.loop();                                       // 保持心跳
  } 
  else 
  {                                                          // 如果开发板未能成功连接服务器
    connectMQTTServer();                                     // 则尝试连接服务器
  }
}
 
void tickerCount()                                           //定时计数函数
{
  count++;
}
 
void connectMQTTServer()
{

  String clientId = "8266";                             // 客户端ID
 

  if (mqttClient.connect(clientId.c_str())) {                //连接MQTT服务器
//    Serial.println("服务器已连接");
//    Serial.println("服务器地址 ");
//    Serial.println(mqttServer);                               //打印服务器地址
//    Serial.println("客户端ID:");
//    Serial.println(clientId);                                // 打印客户端ID
    subscribeTopic();                                           // 订阅指定主题 
  } else {
//    Serial.print("MQTT Server Connect Failed. Client State:");
//    Serial.println(mqttClient.state());                             //调用mqtt库中state(),返回连接失败的错误码
    delay(3000);
  }   
}
 

void pubMQTTmsg()                                                     // 发布信息
{
  String topicString = "尺狩send";                                    //发布消息的主题       字符串(topicString)
  char publishTopic[topicString.length() + 1];                        //将主题字符串转换为   字符数组(publishTopic)
  strcpy(publishTopic, topicString.c_str());                          //将主题字符串转换为   字符数组(publishTopic)
 

  String messageString = comdata;                                     //消息内容            字符串(messageString)
  char publishMsg[messageString.length() + 1];                        //将主题字符串转换为   字符数组(publishMsg)
  strcpy(publishMsg, messageString.c_str());                          //将主题字符串转换为   字符数组(publishMsg)
  

  if( mqttClient.publish(publishTopic, publishMsg) )                    // 实现ESP8266向主题(topicString)发布信息
  {                  
//    Serial.println("已发送主题:");
//    Serial.println(publishTopic);
//    Serial.println("内容为:");
    Serial.println(publishMsg);
//    Serial.println("");    
  } 
  else 
  {
//    Serial.println("发送失败"); 
  }
}
 
// 订阅指定主题
void subscribeTopic()
{
  String topicString = "尺狩receive";                                            //订阅消息的主题       字符串(topicString)
  char subTopic[topicString.length() + 1];                                    //将主题字符串转换为   字符数组(publishTopic)
  strcpy(subTopic, topicString.c_str());                                      //将主题字符串转换为   字符数组(publishTopic)
  

  if(mqttClient.subscribe(subTopic))                                          // 通过串口监视器输出是否成功订阅主题以及订阅的主题名称
  {
//    Serial.println("成功订阅主题:");
//    Serial.println(subTopic);
  } else {
//    Serial.print("订阅主题失败");
  }  
}
 
// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length) //主题名,具体消息内容,内容长度
{
//  Serial.print("订阅的消息主题为[");
//  Serial.print(topic);
//  Serial.print("] ");
  for (int i = 0; i < length; i++)                                     //串口打印收到消息
  {
    Serial.print((char)payload[i]);
  }
//  Serial.println("");
//  Serial.print("消息长度:");
//  Serial.println(length);
//  Serial.println("");
//(char)payload[0],内容第一个字符

}
 
// ESP8266连接wifi
void connectWifi(){
 
  WiFi.begin(ssid, password);
 
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
//    Serial.print(".");
  }
//  Serial.println("");
//  Serial.println("WiFi Connected!");  
//  Serial.println(""); 
}

最后

以上就是追寻小猫咪为你收集整理的串口经ESP8266(MQTT协议)实现与然也物联服务器通信(太极创客源码改)的全部内容,希望文章能够帮你解决串口经ESP8266(MQTT协议)实现与然也物联服务器通信(太极创客源码改)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部