❝
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 接口还是非常全面的。
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 跳转到该地址。
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 usbdisk
badusb.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
原文始发于微信公众号(网络空间威胁观察):使用JS开发Flipper Zero应用