Flipper Zero是一个比较有意思的电子宠物,最近发现它支持使用JS语言开发APP,简单写篇文章记录一下
固件
我的Flipper Zero固件是unleashed-firmware[1],在它的GitHub Release页面,打开Install via Web页面,使用USB将Flipper Zero与电脑连接,即可刷入该固件。


JS应用
源代码结构
拉取unleashed-firmware固件源代码后,在applications/system/js_app目录下,可以发现如下所示的目录结构,其中Scripts目录是JS APP源代码,modules目录是提供给JS APP调用的SDK的底层实现。Flipper Zero使用的JS解释引擎是MJS[3],这个解释引擎是专门为嵌入式场景设计的,实现了JS ES6标准的子集。

JS SDK
以badusb_demo.js为例,它的部分代码如下所示,它依赖于badusb, notification, flipper, dialog等SDK模块,这些模块的实现在modules目录下的js_badusb.c,js_notification.c等文件中。目前好像没有文档统计提供了哪些JS SDK,只能自己看这些文件确定。从文件列表来看提供的SDK接口还是非常全面的。
1 2 3 4 | let badusb = require("badusb");let notify = require("notification");let flipper = require("flipper");let dialog = require("dialog"); |
上传JS应用
把Flipper Zero的SD卡取下,插入读卡器,把JS应用上传进入apps/Scripts目录即可

启动JS应用
进入桌面,在Apps -> Scripts下,找到上传的JS应用文件即可执行。
BadUSB简单扩展
简单写了个JS应用,首先按下 WIN+R ,然后输入chrome,再按ENTER键,打开CHROME浏览器,然后在地址框输入www.baidu.com,按ENTER跳转到该地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | let badusb = require("badusb");let notify = require("notification");let dialog = require("dialog");badusb.setup({ vid: 0xAAAA, pid: 0xBBBB, mfr_name: "Flipper", prod_name: "Zero" });dialog.message("BadUSB DEMO For Windows", "Press OK to start");if (badusb.isConnected()) { notify.blink("green", "short"); print("USB is connected"); delay(1000); badusb.press("GUI", "r"); delay(1000); badusb.println("chrome"); badusb.press("ENTER"); delay(1000); badusb.println("www.baidu.com"); badusb.press("ENTER"); notify.success();} else { print("USB not connected"); notify.error();}// Optional, but allows to interchange with usbdiskbadusb.quit(); |
参考文献
[1] https://github.com/DarkFlippers/unleashed-firmware
[2] https://github.com/DarkFlippers/unleashed-firmware/releases/tag/unlshd-072
[3] https://github.com/cesanta/mjs