本项目对 CAT S61 手机内置的 FLIR Lepton 3.5 热成像传感器进行逆向工程分析,探索三种二次开发方案。
| 项目 | 规格 |
|---|---|
| 手机型号 | CAT S61 |
| 热成像传感器 | FLIR Lepton 3.5 |
| 传感器分辨率 | 160 x 120 (原始) / 80 x 60 (输出) |
| 测温范围 | -20°C ~ 150°C (High Gain) |
| 接口 | SPI (图像) + I2C (控制) |
原理: 从官方 APK 提取 SDK 类和 Native 库,在自定义 App 中调用。
成果:
- 成功提取
libsystemimage.so等 Native 库 - 反编译获得 SDK Java 接口
- 创建了 Android Demo 项目框架
- 实现了从 FLIR JPG 图片提取温度数据
工具:
flir_heatmap_v2.py- 分析 FLIR 图片,生成温度热力图flir_analyzer.py- 提取温度数据
使用方法:
python3 flir_heatmap_v2.py <flir_image.jpg>原理: 通过 Binder IPC 直接与系统服务通信。
发现:
- 服务名:
ThermalCameraService - 客户端库:
libthermalcamera_client.so - 接口:
IThermalCameraService
主要接口:
setProperty(key, value)
getProperty(key)
writeCalibration(data)
readCalibration()
ioctlGetFrameStatus()
read_frame()
原理: 通过系统测试工具直接读取 Lepton 原始帧数据。
关键发现:
-
设备节点:
/dev/lepton_drv- Lepton SPI 驱动 (root only)/dev/i2c-6- Lepton I2C 控制 (root only)
-
系统测试工具:
/system/bin/ThermalCameraTestClient# 读取原始帧 ThermalCameraTestClient readframe # 检查帧状态 ThermalCameraTestClient getframestatus # I2C 读写 ThermalCameraTestClient readi2c <reg> <words> ThermalCameraTestClient writei2c <reg> <data>
-
数据格式:
- 帧大小: 10332 字节
- 格式: VoSPI 类似,每行 164 字节
- 像素: 16-bit,范围 0x0C00-0x1000
工具:
lepton_realtime.py- 实时读取温度数据
使用方法:
# 单次读取
python3 lepton_realtime.py
# 循环读取 (每3秒)
python3 lepton_realtime.py --loop 3
# 保存热力图
python3 lepton_realtime.py --save/Users/jqwang/175-热成像/
├── 文档
│ ├── flir_development_analysis.pdf # 技术分析报告 (LaTeX)
│ └── README.md # 本文件
│
├── 方案 A - SDK 复用
│ ├── demo_app/ # Android Demo 项目
│ ├── decompiled/ # 反编译的 SDK 源码
│ ├── FlirCamera.apk # 官方 APK
│ ├── libsystemimage.so # 核心处理库
│ ├── flir_heatmap_v2.py # FLIR 图片分析工具
│ └── flir_analyzer.py # 温度提取工具
│
├── 方案 C - 硬件直接访问
│ ├── lepton_realtime.py # 实时温度读取工具
│ ├── parse_raw_frame_v3.py # 原始帧解析工具
│ ├── ThermalCameraTestClient # 系统测试工具 (提取)
│ └── raw_frame_*.txt # 原始帧数据样本
│
└── 输出样本
├── flir_20260126T211533_heatmap.png # 温度热力图
├── flir_20260126T211533_temp.csv # 温度矩阵
└── lepton_*.png # 实时热力图
从 FLIR EXIF 数据获取校准参数:
T = B / ln(R1/(R2*(S+O)) + F) - 273.15
参数:
R1 = 17988.6
R2 = 0.0125
B = 1435
F = 1
O = -1813
T(°C) ≈ (raw - 3200) × 0.04 + 25
- 完善方案 A: 用 Android Studio 构建 Demo App,实现实时预览
- 深入方案 B: 逆向 AIDL 接口,实现自定义服务调用
- 优化方案 C: 获取 root 权限后直接读取
/dev/lepton_drv - 校准优化: 获取出厂校准数据,提高温度精度
- Python 3.x
- numpy, pillow
- adb (Android Debug Bridge)
- exiftool
pip3 install numpy pillow
brew install exiftool逆向工程分析 - 2026-01-27