本文主要是以ESP8266对接Domoticz服务器,做MQTT的简单客户端连接验证实验,以便后面作为MQTT和nRF24的无线网关。
IDE使用Arduino。
首先,准备ESP8266模块,并安装Arduino IDE:
安装很简单,不赘述。
在安装过程中它可能会装一些驱动程序。
关于安装设置这个软件,可以参考:Arduino环境下开发NodeMCU(ESP8266)
下面我们需要对它进行一些基本设置,以支持ESP8266模块开发板。
在菜单栏找 “文件”=>“首选项”=》“设置”选项卡,在那个“附加开发板管理器网址”那里填入:
http://wechat.doit.am/package_esp8266com_index.json
或者
http://arduino.esp8266.com/stable/package_esp8266com_index.json
第一个链接只能支持到 2.0.0版,第二个链接可以支持到2.5.0版,笔者选用2.5.0版本。
“工具”=》“开发板:Arduion/Genuino Uno”=》“开发板管理器”,如图:
可以看到“正在下载平台索引”,等它下载完,正常情况下是会顺利下载完成的,如图所示:
如果这一步出错,会显示:
如果尝试几次出错的话,那么错误的原因是这个地址在你的网络中被墙了,需要设置番羽墻代理(怎么越墙请自行搜索。可以用ssr代理),在菜单栏找 “文件”=>“首选项”=》“网络”选项卡:
选“人工代理设置”,选中“SOCKS”,
主机名填入你的代理服务器IP地址,端口号填入代理服务器指定的代理端口号。
本人使用的是ssr,在ssr上设置好代理功能,在电脑本机上。于是,可以设置如下:
然后再回到“工具”=》“开发板:Arduion/Genuino Uno”=》“开发板管理器”,可以看到能正常下载了。
可以看到搜到了这个开发板,目前这个BSD最新版本是2.5.0。
点版号后面的“安装”,显示正在安装…。
可以看到,它下载相关的代码了,但是速度相当的慢,这没有办法,这要看你的网络连接这个esp8266.com官方网的速度速度如何。
这个过程中,甚至会多次失败,不过没关系,可以多次尝试安装,它每次已经下载好的数据包不会删掉,等于是有断点续传能力。这样直到最后下载完毕,进入安装过程。
装完之后:
点击 工具 –> 开发板,会看见esp8266 模块,选择相应的模块。之后,可以看到右下角出现了相应的信息。
我的ESP8266上面是ESP-12E模块,所以这里选对的模块。
回到Arduino IDE的主界面,修改一下代码,做个简单测试:
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.println(“Hello,NodeMCU!”);
}
然后,菜单栏,文件–》另存为…。
然后点击左上角的对勾,编译一下:
编译成功。
安装CP2102驱动(如果是CH340的USB转串口芯片就要下载安装相应的驱动)(请自行搜索下载),安装之后,把ESP8266开发板连上电脑USB,等待驱动匹配安装,成功之后显示:
这个CP210x …(COM6)就是ESP8266模块。
设置Arduino上的默认烧固件用的串口:
工具–》端口–》COM6:
设置好之后,界面右下角会显示默认的串口号:
左上角的向右箭头:
用串口工具打卡COM6,设置波特率为115200,可以看到:
到这里,ESP8266的烧录过程就搞定了。
这基本的前期工作就做完了。
工具–》管理库:
(需要注意的是,在下载管理库前,一定要确保开发板选择正确)
等待库的索引列表下载好,搜索“ESP8266 MQTT client ”:
选择这个库,然后安装:
在验证之前,需要修改原库代码中的一个宏定义:MQTT_MAX_PACKET_SIZE
该定义在C:\Users\Administrator\Documents\Arduino\libraries\PubSubClient\src\PubSubClient.h 中:
把它改为512。
因为我们要接收来自domoticz发来的消息,长度超过128,需要保证数据缓冲区有足够大小的空间(否则将接收失败),如图所示:
文件–》示例–》第三方库示例:PubSubClientt–》mqtt_esp8266
然后另存为一个新的项目。
我们修改其源代码,只验证接收数据部分的功能,其余删掉。如下:
#include
#include
// Update these with values suitable for your network.
const char* ssid = "ssid";//wifi的ssid
const char* password = "password";//wifi密码
const char* mqtt_server = "10.0.0.2";//MQTT broker的IP
const char* sub_topic = "domoticz/out";
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
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();
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// ... and resubscribe
client.subscribe(sub_topic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
然后把代码编译一下,烧录到ESP8266开发板上,运行测试,串口信息如图所示:
可以看到收到了数据。
如果单纯用ESP8266做控制处理,那么就可以利用这个数据进行消息解析,然后通过一些IO口的操作进行控制了。
发送消息的功能也很简单,就不验证了。
下一篇,我们将用一套ESP8266+NRF24L01来介绍完成一个基于MySensors通信协议的MQTT(通过wifi)和RF射频无线网络的网关。
后面,再用另一套ESP8266+NRF24L01做客户端,来完成和domoticz服务器的通信。