Particle Photon 给我印象最深的两个特性是:其内置的WiFi,以及通过无线(OTA)更新设备的可能性。但是,使用 Photon 作为一个简单的温度传感器是相当昂贵的,在这里购买 23.00 欧元以上。
相比之下,ESP 家族的微控制器是更加便宜,我订购了几个所谓的 NodeMCU 开发工具包(每个 3.89 欧元)和 Wemos D1(每个 3.63 欧元)。在价格上,我没有弄错, 他们甚至包括从中国过来的邮资和处理。我们所需要的是两周的耐心。
这两个都是基于 ESP8266,因此他们有板载 WiFi。 NodeMCU 可以使用支持 Lua 编程语言的固件(甚至是 BASIC)。我已经决定使用一个我或多或少感到舒服的环境,即 Arduino for ESP8266 固件,这个固件通过 Arduino IDE 进行安装是非常简单的。
这些小的微控制器能工作,但是有点麻烦的是不得不发明样板(boilerplate)代码,以便于重新连接、错误重启等。
我偶然发现了由马文·罗杰(Marvin Roger)创建的一个叫做 homie-esp8266 的项目。 它基本上是一个小型的框架,它能将 ESP8266连接到 MQTT,并提供自动连接/重新连接处理、JSON配置、可选的 Web UI 以配置最初在接入点模式下启动的微控制器,以及支持我创建的用于更新代码的 Over-the-Air (OTA)。 是的:OTA 支持和TLS。
Martin 显然仔细考虑了:一个设备应该如何与其环境进行交互,代码反映了这一点。因此,举个例子,当我的一个传感器启动时,它会发布这些保留的 MQTT 消息:
sensors/homie/cf3a07e0/$nodes light:light,temperature:temperature,relay:relay
sensors/homie/cf3a07e0/$online true
sensors/homie/cf3a07e0/$name Livingroom bookshelf
sensors/homie/cf3a07e0/$localip 192.168.1.192
sensors/homie/cf3a07e0/$fwname h-sensor
sensors/homie/cf3a07e0/$fwversion 1.0.1
sensors/homie/cf3a07e0/temperature/unit c
sensors/homie/cf3a07e0/$signal 96
sensors/homie/cf3a07e0/temperature/degrees 23.38
$nodes
通知消费者,我在设备上提供的端点类型。 $online
表示设备当前是否处于活动状态,$name
是最初分配给设备的描述,$signal
是微控制器看到的 WiFi 覆盖的指示等。然后,设备开始发布我希望从设备中,提供的温度以及其他任何传感器数据。
homie-esp8266 框架还能监听 MQTT 消息:例如,我可以使用以下命令切换已连接到 Wemos-D1 的继电器:
mosquitto_pub -t 'sensors/homie/cf3a07e0/relay/on/set' -m true
当 Homie 收到上面的发布信息时,我为该设备创建的代码被调用,然后它可以做一些事情,例如, 打开继电器,并指示 Homie 注意到发生了行动,于是 Homie 将发布一个指示当前状态的保留值(注意在本主题结尾处的 /set ):
sensors/homie/cf3a07e0/relay/on true
使用 homie-esp8266
框架可以做到这一点:
#include <Homie.h>
#define RELAY_PIN 16
HomieNode relayNode("relay", "relay");
bool relayHandler(String message)
{
if (message == "true") {
digitalWrite(RELAY_PIN, HIGH);
Homie.setNodeProperty(relayNode, "on", "true");
} else if (message == "false") {
digitalWrite(RELAY_PIN, LOW);
Homie.setNodeProperty(relayNode, "on", "false");
} else {
return false;
}
return true;
}
void setup()
{
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
Homie.setFirmware("h-sensor", "1.0.1");
relayNode.subscribe("on", relayHandler);
Homie.registerNode(relayNode);
Homie.setup();
}
void loop()
{
Homie.loop();
}
我上面提到的 Homie,可以通过一个基于 Web 的界面进行配置,当一个设备最初启动时(非常清楚:截图中的站点只是托管 HTML 来与您的 Homie ESP 通讯;设备本身不会与云对话):...
一旦完成,设备将连接到您在配置期间指定的 WiFi 网络,并开始对其进行操作。 或者,我们可以将 JSON 配置文件上传到设备上的闪存文件系统,或者以编程方式创建(我使用的是一个小程序)。与实际的 Homie 固件分开存储配置的最大好处是,我可以在设备上重新编写(例如 OTA)不同的程序,并使用之前的配置设置(例如MQTT代理,端口等)。
OTA 更新是通过向 $ota
节点发布版本号来触发的;然后,Homie 验证收到的版本是否高于正在运行的版本,并指示 ESP 启动并通过 HTTP/HTTPS 获取更新。(这里的工作原理在这里有相当好的解释。)我认为有必要提到 homie-esp8266 框架是无云(cloudless)的; 它不需要云服务,而是与您配置的服务器交谈。
Homie 的文档很好,丰富,有一些例子可以让我们很快开始。 Marvin 一直非常有帮助,他很快就实现了在我请求时为 MQTT 发布一个 base_topic
的可能性。
带有板载 WiFi 和 4MB 闪存的邮票大小的芯片,可通过 TLS 使用 MQTT,并可在 4.00 欧元以下能更新OTA。非常令人兴奋。
扩展阅读:
观光\评论区