尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Flipper Zero 智能电表监控(Smart Meter Monitor)FAP 全解析:基于 CC1101 的 433/868/915 MHz 能量检测与 RSSI 波形监控

Flipper Zero 智能电表监控(Smart Meter Monitor)FAP 全解析:基于 CC1101 的 433/868/915 MHz 能量检测与 RSSI 波形监控 Flipper Zero 智能电表监控Smart Meter MonitorFAP 全解析基于 CC1101 的 433/868/915 MHz 能量检测与 RSSI 波形监控【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper本文以 Flipper Zero 应用 Smart Meter Monitorv1.11为对象系统讲解如何利用 Flipper Zero 内置 CC1101 sub-GHz 射频前端对北美、欧洲及全球通用的智能电表广播频段915 MHz ERT / 868.30 MHz / 433.92 MHz进行实时的 RSSI 能量检测、突发信号计数与广播间隔统计。读完本文你将掌握该应用的界面布局、按键控制、阈值与采样率调节方法、源码级实现原理以及使用 ufbt 从源码构建并安装.fap的完整流程。应用定位只做能量检测不做协议解码Smart Meter Monitor 是运行在 Flipper Zero 上的第三方外部应用External FAP。它的核心任务非常聚焦监视 433 MHz、868 MHz 与 915 MHz 三个频段上智能电表的无线电发射活动使用 Flipper Zero 板载的 CC1101 sub-GHz 收发器实时显示 RSSI信号强度滚动波形检测信号突发burst并跟踪两次发射之间的时间间隔。其背景知识是北美绝大多数电表和燃气表使用 ERTEncoder Receiver Transmitter编码接收发射机协议工作在 915 MHz以 30–90 秒的周期广播未加密的 SCMStandard Consumption Message标准消费消息数据包欧洲电表通常使用 868 MHz部分水表使用 433 MHz。本应用正是利用这些发射行为来做监控。需要特别强调该应用不进行任何数据包解码只做能量检测energy detection。这是它与其他嗅探/解码类 sub-GHz 工具的本质区别——它关心的是什么时候有信号、信号多强、多久来一次而不是数据包内容是什么。界面与显示信息应用运行时的典型界面布局如下摘自项目 README.md 的示意Meter Monitor 915MHz 500ms [RSSI waveform - 128 samples, newest on right] [dashed threshold line across waveform] -90dBm Cnt:003 Int: 47s Avg: 52s对应到源码 scene_monitor.c 的实际绘制逻辑界面由四个区域组成OLED 分辨率 128×64宏定义见 smart_meter.h顶部标题栏高 9px左侧固定绘制 SMM右侧动态显示当前频率标签、采样率标签当捕获处于暂停状态时会在右侧追加II暂停指示符。RSSI 波形区128×28 px每个采样点对应 1 像素宽的柱状条最新样本位于最右侧。RSSI 值从底部 -120 dBm 映射到顶部 -40 dBm映射范围 80 dB见SM_RSSI_MIN_DBM/SM_RSSI_MAX_DBM/SM_RSSI_RANGE。虚线阈值线以 2 点亮、2 点灭的虚线canvas_draw_dot每 4 像素画 2 个点横贯整个波形区标记突发检测阈值所在位置。统计区两行第一行当前 RSSI 值、累计突发计数 C、近 60 秒每分钟发射次数实际格式化格式为%4ddBm C:%03lu %2u/m例如-90dBm C:003 2/m。第二行当检测到少于 2 次突发时仅显示当前阈值Thr:-90dBm否则显示最近两次检测的时间间隔I:与所有间隔的指数移动平均A:格式为I:%3lus A:%3lus。以下两张截图为应用真实运行效果分别展示了监控静默态与检测到发射时的界面状态![Smart Meter Monitor 实时监控界面顶部显示频率与采样率虚线为阈值线下方为 RSSI 与统计读数](https://raw.gitcode.com/GitHub_Trending/fl/Flipper/raw/41fc08dbc4c53cf2c87dd4f2de3d3a5fe3eb016f/Applications/UberGuidoZ/smart_meter_monitor/Screenshots/08 Monitoring.png?utm_sourcegitcode_repo_files)![Smart Meter Monitor 检测到电表发射时的界面出现信号柱状波形计数与间隔统计更新](https://raw.gitcode.com/GitHub_Trending/fl/Flipper/raw/41fc08dbc4c53cf2c87dd4f2de3d3a5fe3eb016f/Applications/UberGuidoZ/smart_meter_monitor/Screenshots/09 Detecting.png?utm_sourcegitcode_repo_files)其中波形柱高度表示 RSSI 强弱虚线为突发检测阈值C为累计检测次数I/A分别为最近间隔与平均间隔。按键控制完整按键映射如下见 README.md 控制表与 scene_monitor.c 的输入回调一一对应按键动作OK短按暂停 / 恢复捕获顶部显示II指示符OK长按重置统计与波形历史UP短按提高阈值降低灵敏度DOWN短按降低阈值提高灵敏度UP / DOWN长按切换采样率LEFT短按切换上一频率在 433/868/915 MHz 间循环RIGHT短按切换下一频率BACK停止射频返回菜单需要留意源码中短按 OK 触发SmEventMonitorToggle实现暂停/恢复长按 OK 触发SmEventMonitorReset重置统计二者通过ok_long_consumed标志位互斥避免长按释放时误触发短按逻辑scene_monitor.c。应用内四页说明Instructions也确认了短按调阈值、长按调速率的操作习惯scene_instructions.c。频率与频段选择应用内置三组频率定义于 scene_monitor.c频率选择子菜单标签见 scene_freq.c频率适用区域对应表计类型433.92 MHz全球通用部分水表868.30 MHz欧洲电表 / 燃气表915.00 MHz北美电表 / 燃气表ERT/SCM监控过程中可用 LEFT/RIGHT 随时切换频率。从源码看切换频率的完整处理链路是更新freq_index→ 调用sm_radio_restart()先sm_radio_stop再sm_radio_start即把 CC1101 置为 idle 后重新设置频率并进入 RX→ 调用sm_reset_stats()清空统计scene_monitor.c。注意切换频率会重置统计并重启射频历史波形也会被清空。频率跳转的底层实现scene_monitor.cstatic void sm_radio_start(SmartMeterApp* app) { furi_hal_subghz_reset(); furi_hal_subghz_set_frequency_and_path(k_frequencies[app-freq_index]); furi_hal_subghz_rx(); app-radio_running true; }furi_hal_subghz_reset()复位 CC1101furi_hal_subghz_set_frequency_and_path()完成频点与射频通路配置furi_hal_subghz_rx()进入接收模式。默认频率为 915 MHz索引 2SM_DEFAULT_FREQ因为这是北美最常见的电表频段。采样率与历史窗口应用通过周期性定时器轮询 CC1101 的 RSSI。采样率共 5 档scene_monitor.c默认 500 ms索引 2。由于波形宽度固定为 128 像素、每像素一个样本历史窗口长度 采样率 × 128采样率128 样本覆盖历史100 ms约 13 秒250 ms约 32 秒500 ms约 64 秒默认1 s128 秒约 2 分钟2 s256 秒约 4 分钟长按 UP/DOWN 即可在监控中循环切换采样率。底层实现是停止并重启sample_timer定时器周期设为新的采样间隔scene_monitor.c。选择采样率时需权衡速率越快波形时间分辨率越高但能覆盖的历史越短且 CC1101 轮询更频繁速率越慢则反之。RSSI 样本存放在 128 项的环形缓冲区rssi_history[SM_HISTORY_SIZE]中定时器回调每次把最新读数写入rssi_head位置后自增取模并限制rssi_count不超过缓冲区容量scene_monitor.c。RSSI 读数来自furi_hal_subghz_get_rssi()并在写入前被钳位到 -120-40 dBm 区间。阈值调节与突发检测波形上的虚线即突发检测阈值决定多强的信号算一次发射。短按 UP/DOWN 以 5 dBm 步进调节范围 -110-60 dBm默认 -90 dBm宏定义见 smart_meter.h。调阈值的实用建议源自 README先从默认的 -90 dBm 开始观察环境噪声基底ambient RSSI noise floor。把阈值调高使其稳稳位于噪声基底之上、又低于电表发射的峰值之下典型噪声基底-100-105 dBm典型电表发射 RSSI-60-90 dBm随距离变化突发检测采用迟滞hysteresis机制防止瞬间噪声尖峰造成误计数宏定义与状态字段见 smart_meter.h进入突发连续 2 个采样点高于阈值SM_BURST_ENTER_SAMPLES 2退出突发连续 3 个采样点低于阈值SM_BURST_EXIT_SAMPLES 3。迟滞检测的完整状态机实现在定时器回调内scene_monitor.c未处于突发时累积高于阈值的连续样本数达到 2 即进入突发并记录进入时刻处于突发时累积低于阈值的连续样本数达到 3 即判定突发结束此时更新last_burst_samples本次突发包含的采样点数、last_burst_tick退出时刻、last_interval_ms与上次突发的间隔、burst_count累计计数并触发一次绿色 LED 闪烁通知sequence_blink_green_10。间隔平均值采用**指数移动平均EMA**更新avg (avg * 3 last) / 4即新间隔占 1/4 权重、历史占 3/4对突发波动起到平滑作用scene_monitor.c。此外源码还实现了一个基于能量时长的 SCM 帧提示scene_monitor.c若最近一次突发仅持续 1–2 个采样点显示~SCM提示——符合短促的电表数据包特征若持续 4 个及以上采样点显示INT?提示——更可能是持续干扰而非电表发射。注意这仅是能量估计不是真正的协议解码。与每分钟发射次数统计配合tx_per_min通过 30 项环形时间戳缓冲 60 秒窗口计算scene_monitor.c可以判断某频段是否存在规律性发射源。应用结构与源码导读该应用是一个典型的 Flipper Zero FAP 工程采用 Scene Manager场景管理器架构。项目文件结构见 README.mdApplications/UberGuidoZ/smart_meter_monitor/ Release/smart_meter_monitor.fap - 预编译成品 Screenshots/ - 运行截图 Source/ application.fam - ufbt 应用清单 smart_meter.h - 共享类型、常量、应用结构体 smart_meter_app.c - 入口点、资源分配/释放、场景处理器表 scene_splash.c - 启动画面3 秒自动进入主菜单 scene_menu.c - 主菜单 scene_freq.c - 频率选择子菜单 scene_monitor.c - CC1101 捕获、波形绘制、突发检测 scene_instructions.c - 4 页机内操作参考 scene_about.c - 关于界面 README.md - 本文档各文件职责与源码要点application.famufbt 应用清单声明appidsmart_meter_monitor、apptypeFlipperAppType.EXTERNAL、入口函数smart_meter_app、依赖模块gui与notification、栈大小 3 KiB、fap_categorySub-GHz、版本(1, 11)、图标smart_meter_icon.png。这决定了编译后 FAP 在 Flipper 文件系统中的归类/ext/apps/Sub-GHz/。smart_meter.h定义屏幕几何常量、RSSI 映射范围、阈值上下限与步进、迟滞参数、场景/视图/自定义事件枚举以及承载全部运行状态的SmartMeterApp结构体含环形 RSSI 缓冲区、突发检测状态、间隔统计、Tx/分钟统计、通知句柄等。smart_meter_app.c入口smart_meter_app()依次执行sm_alloc()分配场景管理器、视图分发器、子菜单、自定义视图、互斥锁与通知服务→ 进入 Splash 场景 →view_dispatcher_run()启动 GUI 主循环 → 退出时sm_free()逆序释放全部资源。六个场景的 on_enter/on_event/on_exit 处理器以静态表形式注册顺序与SmSceneId枚举严格对应。scene_monitor.c核心监控场景。进入时sm_reset_stats()清空统计与波形、sm_radio_start()启动射频、按当前采样率启动sample_timer定时器回调在 FreeRTOS 定时器服务任务中读取 RSSI 并执行突发检测绘制回调在 GUI 线程中通过互斥锁furi_mutex_acquire带 25 ms 超时安全读取共享状态后完成波形、阈值线与统计的渲染退出场景时停止定时器并关闭射频scene_monitor.c。scene_splash.c / scene_menu.c / scene_freq.c / scene_instructions.c / scene_about.c分别实现 3 秒启动画面任意按键可跳过、主菜单Start Monitor / Instructions / About主菜单按 BACK 直接退出整个应用、频率选择子菜单、4 页说明书LEFT/RIGHT 翻页页面指示1/4右对齐以及关于界面。构建与安装方式一从源码使用 ufbt 构建项目使用 ufbtUnofficial Flipper Build Tool作为构建工具链官方 README 给出的构建命令如下pip install --upgrade ufbt ufbt update cd smart_meter_monitor ufbt launch具体步骤解读pip install --upgrade ufbt安装/升级 ufbt Python 工具ufbt update拉取与 Flipper 固件匹配的 SDK 与工具链进入Source目录其中包含application.fam与全部.c/.h源文件ufbt launch编译并直接把生成的 FAP 推送到连接的 Flipper Zero 上启动等价于先ufbt build再ufbt install。编译产物输出到dist/smart_meter_monitor.fap可手动复制安装到 Flipper 存储卡/ext/apps/Sub-GHz/smart_meter_monitor.fap方式二使用预编译成品仓库已附带编译好的二进制文件 Release/smart_meter_monitor.fap可直接通过 qFlipper 或文件管理器将其放入 Flipper 的apps/Sub-GHz/目录后使用无需自行编译。使用注意事项射频独占应用直接使用 CC1101 的 HALfuri_hal_subghz_*因此不要在 Flipper 内置 Sub-GHz 应用正在扫描时启动本应用二者会争用同一射频前端。耐心等待数据ERT 协议按表计型号与电力公司配置通常每 30–90 秒广播一次。对间隔统计下结论前建议至少连续监控 2–3 分钟收集 2 次以上突发后再参考I:最近间隔与A:平均间隔读数。区分干扰与真信号结合~SCM/INT?提示判断——持续数个采样点的长突发更可能是干扰源短促突发更符合电表数据包特征。合理设置阈值阈值过低会把噪声误判为发射计数虚高阈值过高会漏掉较远距离的电表以噪声基底与发射峰值之间为调节目标。小结Smart Meter Monitor 以极简的架构实现了实用的功能闭环CC1101 轮询采样 → RSSI 环形缓冲 → 迟滞突发检测 → 间隔与频率统计 → 波形可视化。它不解析任何数据只回答这个频段上有无线电活动、强度如何、周期几何是了解 ERT/SCM 电表广播节奏、排查 433/868/915 MHz 频段占用情况的轻量级现场工具。其完整源码、构建清单与运行截图均位于 Applications/UberGuidoZ/smart_meter_monitor/ 目录读者可在此基础上进一步扩展为真正的协议解码器或数据记录器。【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表