串口经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(""); 
}

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值