关注了就能看到更多这么棒的文章哦~
By John CoggeshallJune 15, 2020
原文来自:https://lwn.net/Articles/822516/
Internet of Things (IoT,物联网) 领域有无数种微处理器。我们之前多次介绍 过Arduino这个生态系统。我们再来介绍一下在Arduino社区中另一个人们感兴趣的平台:支持WiFi的Espressif ESP8266 芯片.
ESP8266芯片对于家用IoT领域是一个非常理想的芯片。它非常便宜,内置2.4GHz WiFi能力,支持17个独立的GPIO pin,可以利用Arduino社区中的扩展库。有许多商用IoT设备都使用了ESP8266芯片,其中部分厂商的设备(例如Sonoff的),大家已知是可以重刷firmware的,也还有其他一些不知名品牌的设备本身就是unlock状态的。不过ESP8266有个缺点是SDK是闭源的,发布包中只有头文件以及一些二进制库文件,发布采用的不是自由软件协议,从而禁止用在非ESP8266的设备上。
SDK没有附带源代码是件很可惜的事情,不过其实有一个围绕着这个芯片建立的开源社区,能提供不少帮助。为了让那些不太熟悉ESP8266的读者方便阅读,我们先来讲讲它在Arduino生态系统中的地位。
开始进行ESP8266开发之前,有必要先来了解一下使用这颗芯片有哪些方式,以及它在Arduino项目中的开发前景。
大多数ESP8266芯片都配备了Espressif AT firmware,通过串口提供了AT命令接口,来进行各种TCP/IP请求处理(可以在这里看到一些可用的AT命令 https://nurdspace.nl/ESP8266#AT_Commands )。其实,很常见的一种用法是把Arduino设备和ESP8266芯片配合在一起使用。比如用Arduino来控制传感器和各种马达,而通过串口使用ESP8266来跟网络进行通讯。在这种情况下,主要的firmware是运行在Arduino设备中的,ESP8266只是提供网络功能,那么就不太需要重新烧写ESP8266自己的firmware。
其实,很多时候可以把Arduino彻底拿掉,只留下ESP8266芯片,利用它的I/O接口来接管其他外设。这种情况下,需要把出厂时的ESP8266 firmware替换成定制版本,从而能把之前Arduino做得工作也承担下来。首先要有Espressif ESP8266 SDK,之前提到过这是一个闭源开发包。它的C API在官网上有文档介绍,可以用来修改firmware实现定制功能。
只要这一个SDK就可以完成编写代码调用底层API以及部署到ESP8266的工作。不过多数开发者不会直接使用这个SDK,而是喜欢使用Arduino Core for ESP8266,这是一个LGPL license的代码,将Espressif SDK采用了一种跟Arduino生态兼容的方式提供了出来。这样开发者可以直接在ESP8266设备上写Arduino风格的代码。在这种情况下,开发者需要先把ESP8266的board定义文件加入Arduino IDE,接下来就可以跟正常开发Arduino开发板一样了。它还是会利用一些闭源SDK的内容,比如TCP/IP和WiFi协议栈,不过多数代码都是开源的,跟其他Arduino生态的代码是同步的。
大家花了许多功夫,让ESP8266 Arduino Core可以比起原生SDK有更多的好处,而不仅仅局限在是一个开源替代品而已。Arduino Core包括用来支持web server (包括SSL/TLS)的C++类,也支持文件系统,还有DNS和mDNS服务器。还拥有通过TCP/IP进行通讯的工具,例如发起HTTP请求。
Arduino Core可以使用绝大多数Arduino project的module了。根据它的文档,绝大多数Arduino库应该可以直接使用,都不需要修改。包括VNC客户端,REST API支持库,MQTT客户端等等。因为ESP8266有好几个GPIO pin,所以那些需要跟外接硬件配合工作的温度传感器和LED等都可以直接使用。这些库函数对外都会暴露一个bit操作接口,这样开发者就可以使用一个简单API来访问比如温度传感器的数值。
ESP8266价格便宜,并且购买很方便,因此尽管它的SDK不太友好,但是Arduino社区中需要网络连接功能的地方都很喜欢它。同时,人们也就很有动力来对这个闭源的SDK进行反向工程,希望能替代掉原本的SDK。
ESP Open SDK就是针对ESP8266的一个非常全面的开源SDK。它把原有的闭源SDK和许多开源项目结合在一起,提供了一个完全独立的SDK,包括开发工具。此项目近年来看起来有点停滞了,不过对于那些希望尽量使用开源方案的人来说,还是一个很好的开发firmware的选择。同时,因为开发进度暂缓了下来,它需要一来旧版本的闭源SDK才能工作。
另一个有用的开源项目是一个open-source bootloader,名为rBoot。这是由Richard Burton开发的。此bootloader在ESP8266上会是上电之后最先执行的代码,负责完成一些application执行之前需要完成的工作,比如在OTA升级之后切换成新的firmware版本。
rBoot通过linker(链接器)的一些技巧来在SDK编译时替换掉某个函数,之后rBoot就能骗过SDK,让它先加载rBoot而不是eBoot。跟其他类似的工作一样,rBoot除了通过开源来让我们对芯片上执行的代码更放心之外,比起原生的eBoot也提供了更多的功能。比较重要的功能包括支持多个firmware image,可以通过GPIO选择firmware,如果firmware损坏的话可以无缝回退,并且有更强的firmware教研功能。为了使用rBoot的校验功能,Burton还重写了一个ESP8266 ROM打包工具,命名为esptool2。这个工具会用ROM里的 .irom0.text p来进行校验计算。Burton的博客有对这个项目很详细的介绍。
由于rBoot使用了linker的一些技巧,因此它有点难于使用。主要的困难在于,通常人们便衣ESP8266 firmware是用Arduino IDE的,它就没法支持rBoot。要用rBoot的话,就需要使用以前传统的 ld 和 make 等工具了。编译完成后也需要会用 esptool2 来打包并更新ESP8266的ROM。
在社区中,其实挺多人都很喜欢这些脱离Arduino IDE的做法,因为Arduino IDE自己的一些固有的缺点,让有经验的开发者其实挺喜欢脱离Arduino IDE来进行ESP8266开发的,这样的话,可以看一下makeEspArduino项目。这个项目的目标是能彻底脱离Arduino IDE,可以直接进行ESP8266开发,同时又仍然可以使用绝大多数的Arduino库。本质上来说,这个项目是一个很复杂的makefile系统,负责确保所有东西都会被正确编译生成出来。它会分析Arduino IDE的board定义文件,因为这些文件会经常更新。如果对编译工具和makefile有一些了解的话,很适合使用makeEspArduino来进行rBoot编译,并替代原生的SDK bootloader。
同样还有一个Arduino CLI项目也是脱离Arduino IDE使用的。这是用Go语言开发的命令行工具,替代了Arduino IDE中的许多重要功能,例如library and board manager,这样开发者完全可以使用shell来安装Arduino library并管理库函数的一来关系。在跟makeEspArduino这类项目配合使用的时候,在编译ESP8266时就完全不需要使用Arduino IDE了。
对于那些希望在Arduio中使用一些不是C++的开发环境的开发者,还有其他一些语言的替代选择。比如MicroPython,NodeMcu提供了Lua支持,甚至还有Espruino项目提供了JavaScript。所有这些项目肯定都需要依赖官方SDK里面的那些binary,不过无论如何对于那些希望用到C++之外的语言的开发者来说,还是很有用的。
支持了这么多种预言,并且也有不少GPIO可用,也就难怪我们可以看到这么多使用了ESP8266的项目了。对于Home Assistant智能网关的使用者来说,esphomelib就可以跟Home Assistant配合得很好,号称可以让开发者能为自己的智能hub加入传感器和IoT设备并且不需要写哪怕一行代码。还有Tasmota这样的项目用来方便人们利用ESP8266 firmware来开发许多种通用设备。
对于要在ESP8266芯片来说,开发网络相关设备的时候有那么多种方式可供选择。从直接使用官方SDK,到Arduino Core,再有支持Python和JavaScript等语言,这个芯片已经非常好用了,尤其是考虑到这一切的最开始都是从一个闭源SDK而来的。此外,这个芯片还有各种形式的变种,分别有不同的价位以及功能,这样它几乎可以用在各种不同级别的项目上。这些特点,使得这款芯片成为了黑客们感兴趣的一个主要目标,都想用它来制作自己的IoT设备。再配上开源的智能网关例如Home Assistant,这使得构建一个大范围open-source的智能家居的目标更加可行了。
全文完
LWN文章遵循CC BY-SA 4.0许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~