ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Flipper Zero 固件 JS SDK:flipper 模块设备信息查询 API(getModel / getName / getBatteryCharge)详解

Flipper Zero 固件 JS SDK:flipper 模块设备信息查询 API(getModel / getName / getBatteryCharge)详解 Flipper Zero 固件 JS SDKflipper 模块设备信息查询 APIgetModel / getName / getBatteryCharge详解【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware本文基于 Flipper Zero 固件官方文档 js_flipper.md系统讲解 JavaScript SDK 中flipper模块的加载方式、两个只读属性firmwareVendor、jsSdkVersion与三个查询方法getModel()、getName()、getBatteryCharge()的语义与使用边界并结合 js_flipper.c 等固件源码逐一对应底层实现帮助你在 JS 应用中可靠地读取设备型号、海豚名与电量并避免用厂商/SDK 版本号做功能判断的常见误区。模块加载与定位flipper模块是 JS SDK 中用于查询设备信息与属性的内置模块提供一组只读方法与常量。首次使用前必须通过内置的require函数加载let flipper require(flipper);从源码结构看flipper属于固件内置模块注册表。在 js_modules.c 中modules_builtin数组声明了{flipper, js_flipper_create, NULL, NULL}即模块名flipper映射到构造函数js_flipper_createrequire(flipper)时框架会调用该构造函数生成模块对象并缓存后续调用直接复用同一实例。require()本身及其余内置方法delay、print、load等在 js_builtin.md 中有完整说明。构造函数 js_flipper_create 会创建一个 JS 对象并通过JS_ASSIGN_MULTI/JS_FIELD宏一次性挂上 5 个字段JS_ASSIGN_MULTI(mjs, flipper_obj) { JS_FIELD(getModel, MJS_MK_FN(js_flipper_get_model)); JS_FIELD(getName, MJS_MK_FN(js_flipper_get_name)); JS_FIELD(getBatteryCharge, MJS_MK_FN(js_flipper_get_battery)); JS_FIELD(firmwareVendor, mjs_mk_string(mjs, JS_SDK_VENDOR, ~0, false)); JS_FIELD(jsSdkVersion, sdk_vsn); }其中JS_ASSIGN_MULTI与JS_FIELD是 js_modules.h 中提供的对象构建语法糖MJS_MK_FN将 C 函数包装为可被 JS 调用的原生函数。只读属性firmwareVendor 与 jsSdkVersionfirmwareVendor字符串表示设备上安装的固件的厂商。官方固件报告值为flipperdevices。实现上该字段直接取自编译期宏JS_SDK_VENDOR在 js_modules.h 中定义#define JS_SDK_VENDOR flipperdevices #define JS_SDK_MAJOR 1 #define JS_SDK_MINOR 0重要提示继承自原文档不要使用firmwareVendor来判断某项功能是否存在或不存在。正确的做法是使用 SDK 兼容性检查机制见 SDK compatibility methods。jsSdkVersionJavaScript SDK 的版本类型为一个二元组数组[major, minor]。构造时由JS_SDK_MAJOR/JS_SDK_MINOR两个宏压入数组js_flipper.c。当前仓库中该值为[1, 0]而 TypeScript 声明文件标注这些成员自 JS SDK 0.1 起即可用version Added in JS SDK 0.1见 flipper/index.d.ts说明版本号会随 SDK 演进脚本侧不应假设固定值。与firmwareVendor一样不要用它做功能探测而应改用 js_builtin.md 中定义的sdkCompatibilityStatus(major, minor)、isSdkCompatible、checkSdkCompatibility、doesSdkSupport、checkSdkFeatures等内置兼容性方法。这些方法在固件侧对应 js_modules.h 中声明的js_sdk_compatibility_status等原生函数。方法getModel()返回设备型号字符串。flipper.getModel(); // Flipper Zero底层实现为 js_flipper_get_modelstatic void js_flipper_get_model(struct mjs) { mjs_val_t ret mjs_mk_string(mjs, furi_hal_version_get_model_name(), ~0, true); mjs_return(mjs, ret); }它调用 HAL 层的furi_hal_version_get_model_name()该函数按硬件目标分别实现f7Flipper Zero目标下返回Flipper Zero与文档示例一致符号在 f7/api_symbols.csv 中导出f18 目标下furi_hal_version_device.c 中实现返回Flipper Nano对应型号代码FN.1。同一套 HAL 接口还被 furi_hal_info.c 用于向 CLI 的property系统输出hardware/model属性因此 JS 侧读到的型号与系统属性源一致。方法getName()返回虚拟海豚dolphin的名字。flipper.getName(); // Fur1pp44实现见 js_flipper_get_nameconst char* name_str furi_hal_version_get_name_ptr(); if(name_str NULL) { name_str Unknown; }furi_hal_version_get_name_ptr()读取存储在设备版本信息中的用户自定义名字从源码结构看当名字尚未设置返回NULL时JS 模块会兜底返回字符串Unknown所以脚本在拿到返回值后可以据此判断海豚名是否已配置。设备侧该名字同样会作为hardware/name属性输出见 furi_hal_info.c与桌面端设备信息显示的名字同源。方法getBatteryCharge()返回电池电量百分比数值0–100。flipper.getBatteryCharge(); // 100实现见 js_flipper_get_batterystatic void js_flipper_get_battery(struct mjs) { Power* power furi_record_open(RECORD_POWER); PowerInfo info; power_get_info(power, info); furi_record_close(RECORD_POWER); mjs_return(mjs, mjs_mk_number(mjs, info.charge)); }调用链清晰可见通过 Furi 记录机制打开RECORD_POWERPower 服务单例调用power_get_info()填充PowerInfo结构power_get_info的签名void (Power*, PowerInfo*)在 f7/api_symbols.csv 中登记取出其中的charge字段返回给 JS随后立即关闭记录。从源码结构看Power 服务底层的电量数据来源于 bq27220 电量计芯片HAL 函数furi_hal_power_get_pct()通过 I2C 获取燃料计状态state of charge见 furi_hal_power.c驱动代码在 lib/drivers/bq27220.c因此getBatteryCharge()返回的是硬件实测的电量百分比而非缓存值。完整示例在 JS 应用中打印设备信息结合三个方法与两个属性一个典型的信息展示脚本如下let flipper require(flipper); print(Firmware vendor :, flipper.firmwareVendor); print(JS SDK version :, flipper.jsSdkVersion[0] . flipper.jsSdkVersion[1]); print(Device model :, flipper.getModel()); print(Dolphin name :, flipper.getName()); print(Battery charge :, flipper.getBatteryCharge() %);注意两点print()支持字符串与数字参数见 js_builtin.md 中print()一节如需在脚本开头做环境自检请优先使用sdkCompatibilityStatus()/checkSdkFeatures()等内置机制而不是比较jsSdkVersion的数组值——jsSdkVersion仅用于展示与记录。TypeScript 类型声明如果你使用仓库自带的 fz-sdk 包做类型化开发flipper模块的声明位于 applications/system/js_app/packages/fz-sdk/flipper/index.d.tsexport declare function getModel(): string; export declare function getName(): string; export declare function getBatteryCharge(): number; export declare const firmwareVendor: string; export declare const jsSdkVersion: [number, number];该声明文件对firmwareVendor和jsSdkVersion均附有与文档一致的警告注释不要用它们判断功能存在性应参考checkSdkFeatures/checkSdkCompatibility并标注各成员自 JS SDK 0.1 引入与运行时行为一致。小结与适用边界成员类型来源源码用途与注意firmwareVendorstring编译期宏JS_SDK_VENDORjs_modules.h标识固件厂商官方固件为flipperdevices不可用于功能探测jsSdkVersion[number, number]JS_SDK_MAJOR/JS_SDK_MINORjs_flipper.cJS SDK 主/次版本号功能探测请用 SDK 兼容性方法getModel()stringfuri_hal_version_get_model_name()f7 为Flipper Zerof18 为Flipper Nano区分硬件平台getName()stringfuri_hal_version_get_name_ptr()空名兜底Unknown读取海豚名getBatteryCharge()numberPower 服务power_get_info()→PowerInfo.charge底层为 bq27220 电量计实时电量百分比flipper模块所有成员均为只读查询无副作用、不改变设备状态可安全地在任意 JS 应用中首次加载模块后随时调用它是 JS SDK 应用获取设备上下文信息型号、身份、电量的标准入口。【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表