ESP8266+ArduinoIDE实现MQTT发布功能学习笔记
一、硬/软件条件
硬件:
1、ESP8266-01S模块
2、USB TO TTL串口工具
3、ESP8266-01S最小配置电路
软件:
1、ArduinoIDE
2、串口调试助手(ArduinoIDE自带)
3、EMQ X Broker (MQTT 服务器)
EMQ X Broker 是基于高并发的 Erlang/OTP 语言平台开发,支持百万级连接和分布式集群架构,发布订阅模式的开源 MQTT 消息服务器。
EMQ X Broker 在全球物联网市场广泛应用。无论是产品原型设计、物联网创业公司、还是大规模的商业部署,EMQ X Broker 都支持开源免费使用。
4、MQTT Client Tool
二、ESP8266开发板及库文件安装
.打开首选项界面,配置如上图所示,开发板管理器网址 https://github.com/esp8266/Arduino/releases/download/2.7.2/package_esp8266com_index.json
打开 开发板管理器,输入过滤条件“ESP8266” 如图所示推荐选择较低版本安装。
开发板安装完成后,打开库管理器,安装图示示例
库文件和开发板安装完成后,将硬件电路连接正确后,准备进行编程
三、创建新的info文件
选择”工具“栏,配置如图所示
打开示例 文件->示例->Antares ESP8266 MQTT->AntaresMQTTPublish做为参考
这是我移植过来的,初始版本程序
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#define WIFISSID "WIFI 名称" /* WIFI 名称 */
#define PASSWORD "WIFI 密码" /* WIFI 密码 */
char *mqttServer = "MQTTserver";
int mqttPort = 1883;
String subscriptionTopic;
bool WifiConnect(String SSID, String wifiPassword)
{
WiFi.begin(SSID, wifiPassword);
Serial.print("Trying to connect to " + SSID + "...\r\n");
for (unsigned char count=0;count<20;count++)
{
delay(500);
Serial.print(".");
}
if(WiFi.status() != WL_CONNECTED) {
Serial.print("Could not connect to " + SSID + ".\r\n");
return false;
}
else {
WiFi.setAutoReconnect(true);
Serial.print("\n WiFi Connected!\n");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
return true;
}
}
WiFiClient esp8266Client;
PubSubClient client1(esp8266Client);
void SetMqttServer(char *mqttServer, unsigned int mqttPort)
{
if(WiFi.status() != WL_CONNECTED)
{
Serial.print("[ANTARES] Unable to connect to MQTT server.\r\n");
}
else
{
Serial.print("Setting MQTT server \"" + String(mqttServer) + "\" on port " + String(mqttPort) + "\r\n");
client1.setServer(mqttServer, mqttPort);
}
}
void CheckMqttConnection() {
subscriptionTopic = "test";
if(!client1.connected()) {
while(!client1.connected()) {
Serial.print(" Attempting MQTT connection...\n");
String clientId = "ESP8266-11";
char clientIdChar[clientId.length() + 1];
clientId.toCharArray(clientIdChar, clientId.length() + 1);
if(client1.connect(clientIdChar)) {
Serial.print("Connected! Client ID:");
Serial.print(clientIdChar);
Serial.print("\n");
char subscriptionTopicChar[subscriptionTopic.length() + 1];
subscriptionTopic.toCharArray(subscriptionTopicChar, subscriptionTopic.length() + 1);
Serial.println();
Serial.print("Topic: ");
Serial.println(subscriptionTopicChar);
client1.publish(subscriptionTopicChar, "connect!");
client1.subscribe(subscriptionTopicChar);
}
else {
Serial.print(" Failed, rc=" + String(client1.state()) + ", Will try again in 5 secs.\n");
delay(5000);
}
}
}
client1.loop();
}
void setup() {
Serial.begin(115200);
WifiConnect(WIFISSID, PASSWORD);
SetMqttServer(mqttServer, mqttPort);
}
void loop() {
CheckMqttConnection();
client1.publish("test", "dsadadsad");
delay(5000);
}
四、程序上传
首先将ESP8266模块GPIO0引脚拉低上电,使其进入程序下载模式,在程序编译成功的前提下点击如图所示的上传按钮
程序上传成功
将GPIO0引脚拉高上电,ESP8266模块进入运行模式,打开串口助手观察现象;
乱码部分是因为模块在程序初始化之前默认波特率是74880,打印出的模块信息为乱码,不用理会
可以看到,WIFI MQTT都连接成功发布的Topic为test
切换到服务器监控界面,可以看到主题
现在打开MQTT Client Tool,订阅Topic
通过串口助手发布一条讯息 “TEST Message”,MQTT Client Tool上可以看到信息已经收到。
五、结语
ArduinoIDE编程方式相对于安可信开发环境编程而言,简单应用上手要快,烧录方式也更简单方便。在较复杂的应用上,个人没有使用过安可信开发环境,就ArduinoIDE而言,有丰富的例程做支持,但是需要一定的C++/C基础。笔者水平有限,疏漏之处望不吝指正,谢谢。