概述
#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协议)实现与然也物联服务器通信(太极创客源码改)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复