ESP8266使用Mongoose-os初体验
随着ESP8266的流行,基于ESP8266的FW发展也愈发兴旺,除了乐鑫原厂的AT、RTOS固件外,为促进IoT开发的效率,尤其是原型开发,基于各种脚本、动态语言的固件越来越受到欢迎。比如,nodemcu支持lua,各种micro python的固件,各种javascript固件等。
Mongoose-os是一个基于javascript的固件和IDE环境,其支持ESP8266、ESP32、以及CC3200。
Mongoose-os的官方站点是:https://mongoose-os.com/
其github地址是:https://github.com/cesanta/mongoose-os
镜像:https://gitcode.com/gh_mirrors/mo/mongoose-os?utm_source=csdn_blog_hover&isLogin=1
一、 Mongoose-os的下载和运行
Mongoose-os的框架go语言写的(固件本身当然还是C),最简单的办法是用官方提供的二进制包,只有一个mos.exe文件(windows环境),也没有安装,直接运行即可。
Mongoose-os使用界面是web,这一点不太寻常。不过考虑到Mongoose本身是个嵌入式的webserver,那么基于其的Mongoose-os使用web界面管理也就显得颇有道理了。Mongoose的功能相当多,感觉比lighthttp之类的要好,其收费版本功能更强,但价格实惠,商用也是不错的。
二、Mongoose-os的使用
执行mos.exe后,在浏览器中访问如下URL: http://localhost:1992
即可看到如下界面:(新版本长得不一样,需要根据官方文档设置即可)
硬件这里使用nodemcu,依次选择和填入串口、esp8266、和wifi信息,wifi信息可以选填。注意第一次使用时,必须要更新固件,且因固件需要在线获取的,要确保网络正常。
更新完固件,点击【start coding】,就进入主界面了。
首先点击左侧的【device config】,进行系统设置,log level默认是1,调试时建议改为3,调试JS时颇有帮助。如果有MQTT Broker,可以设置MQTT的相关信息。
点击上方的【Expert View】即可直接编辑设定文件本身,能设置很多高级选项,
这里我们主要关注I2C部分,如下:
1 | "i2c": { |
可以看到,I2C的默认SDA pin是12,SCL pin是14,对应着nodeMCU的D6和D5。
接线的时候,会发现这2个默认pin是经过精心挑选的。
三、bh1750驱动
Mongoose-os内置的传感器驱动较少,不支持bh1750,但是Mongoose-os提供了js接口的I2C库,
可利用其写一个简单的bh1750驱动。(bh1750的I2C协议比较简单)
1)I2C.scan
Mongoose-os还有一个颇为有趣的功能,称之为【Device Service】,其把常用的功能通过service的形式提供出来,其中有一个I2C.scan,可以用来测试I2C总线上挂的设备,如下图,bh1750接线后,显示有一个设备的地址是35,正是bh1750的默认I2C地址0x23。
2) init.js的修改
回到【Device file】,可以看到nodeMCU上的所有文件。和nodeMCU的默认lua固件一样,Mongoose-os也具备文件系统,同样类似于user.lua,也有一个名为init.js的初始执行文件。
默认情况下,这个init.js的功能是闪烁板载led灯,简单起见,直接修改这个文件如下:
1 | load('api_config.js'); |
**需要注意,这里使用的javascript是所谓的mjs,功能有大幅的裁剪,不支持任何js的库,语法的限制更加严格。比如不支持var,只支持let,没有String库等。
具体可以参考:
https://github.com/cesanta/mjs
镜像:https://gitcode.com/gh_mirrors/mj/mjs?utm_source=csdn_blog_hover&isLogin=1
另外,考虑到扩展的缘故,mongoose-os利用ffi,可直接调用C函数,大大提高了扩展性,不需要像lua需要写语言包裹层,非常的便利,很有JS与C齐飞,便利共功能一色的感觉。缺点是调用时函数签名太繁琐。
MQTT的消息的topic和内容都可以根据自身要求修改。
点击上方的【Save + Reboot】,就可以看到照度的数据被采集(lux),
如果设置过wifi和MQTT,则启动后会先进行wifi和MQTT的连接,并且将数据送至MQTT Broker.
如下图:
ESP8266使用Mongoose-os的体验2
关于本文
在【8. ESP8266使用Mongoose-os初体验(使用bh1750传感器)】一文中,介绍过在mongoose-os中利用javascript(mjs)进行bh1750数据读取的方法。脚本语言的灵活和非编译解释执行的特点表现的很鲜明,代码少,开发便利,这也是nodeMCU和各种脚本iot平台繁荣、大行其道的原因之一。
但是作为mongoose-os这样一个iot系统而言,mjs只是为提高效率、原型开发而加入的javascript的语法糖。其核心部分依然是C实现来主导,甚至mjs中的大量接口都是通过直接ffi映射C接口而来。当然,用mjs完全可以做开发(简单),但知其然也要知其所以然,复杂的应用、新设备的支持,用C来进行开发底层,或者功能接口映射到mjs是更自然的做法。这也就是官方所说【Advanced JavaScript】开发。
举例而言,mongoose-os对传感器的支持有限,官方的只有bme280等寥寥数种,对于不支持、不常见的传感器而言,用户必须自己进行驱动的开发。
本文以bh1750光度传感器为例(主要还是简单),简单介绍mongoose-os下,
开发环境的配置,I2C驱动的开发示例,以及mjs的导出和使用。
(bh1750的I2C接口很简单,只有用mjs也足以胜任,本文目的为介绍开发步骤和注意点)
1.开发环境的配置
mongoose-os虽说是opensource的,但利益驱动使然,其牢牢控制住了开发中的每一个步骤。
从空工程建立、依赖库下载,编译、固件刷入,都需要用其mos工具,除下载固件外,都必须在其云端完成。
环境在linux和windows上均可运行,编译、固件写入的入口均为官方的mos程序。
(本文的环境为win+git bash+mos.exe)
空工程创建
从github上下载工程模板,并重新命名为bh1750-app
1 | git clone https://github.com/mongoose-os-apps/empty bh1750-app |
文件列表如下:
1 | ./build |
2.代码实现介绍
bh1750使用I2C接口,因此需要根据bh1750的datesheet,增加数据访问接口(即驱动实现)。
另外bh1750支持1次测量、连续测量 + L分辨率和2种H分辨率等多种组合模式,
这里简便起见,驱动部分只实现了 连续 H 分辨率模式,并直接实现于src/main.c。如果实现完整的、标准的驱动,应当与main.c分离实现。
- 修改src/main.c文件实现驱动
src/main.c
1 |
|
- 增加fs/api_bh1750.js文件,导出mjs接口
内容如下:声明ffi接口,并导出无状态的全局对象BH1750。
如果驱动支持多种模式并且能切换模式,就需要在持有状态数据。
fs/api_bh1750.js
1 | let BH1750 = { |
- 增加初始脚本文件fs/init.js,在其中使用定时器打印传感器采集的流明数据
fs/init.js
1 | load('api_config.js'); |
3.编译配置修改
修改mos.yml文件,其为标准的YAML格式,具体格式、注意点可搜索。
1 | author: mongoose-os |
3.编译
在bh1750-app目录下执行编译命令行:
1 | e:/mos.exe --verbose build --arch esp8266 |
建议打开-verbose选项,可看到详细的日志,基本流程如下:
- 连接到https://mongoose.cloud,上传代码,构筑临时环境
- 在云端从github上checkout各种核心库和依赖库
- 在云端环境,各种mount配置好文件环境
- 用docker容器进行真正编译(语法错误会在此阶段提示)
- 编译后的用户固件、fs固件、ESP8266的初始配置固件等打包为zip文件置于build目录下
优点显而易见:一键编译,依赖处理,云端可以统一维护、调整编译环境,
缺点也是鲜明:所有代码上传,毫无秘密可言;编译细节无法得知(甚至不知道具体编译器是什么);必须联网、速度很慢、访问繁忙时无法编译。
成功后日志的最后会有如下消息:
1 | Success, built bh1750-app/esp8266 version 1.0 (20181007-145007). |
打包的Zip文件内容如下:
1 | 624K 10月 7 14:50 bh1750-app.bin |
其中,bh1750-app.bin为C语言的固件,fs.bin为存放mjs(包括依赖的底层mjs)的固件,manifest为刷入配置,其余为乐鑫官方提供的初始固件。
4.固件刷新
在bh1750-app目录下执行命令行如下(无须指定串口号,这点还没有调查是如何实现的):
e:/mos.exe –verbose flash
1 | $ e:/mos --verbose flash |
5.接线
ESP8266是安信可的NodeMCU板(ESP12系列的话,接线相同)
BH1750(GY-302) | ESP8266(NodeMCU) |
---|---|
VCC | 3V3 |
GND | GND |
SCL | D5(Pin14) |
SDA | D6(Pin12) |
Mongoose-os上的I2C的SCL和SDA的管脚是可配置的。
因为ESP8266没有硬件I2C,其I2C是软件模拟的。
注意:可以本地编译 mos build –local –platform esp8266
相关链接(侵删)
欢迎到公众号来唠嗑:
