neonil123/BW4-ONVIF-RTSP-CAMERAS
GitHub: neonil123/BW4-ONVIF-RTSP-CAMERAS
将 Ingenic T23N 电池摄像头转换为标准 ONVIF/RTSP 设备,实现脱离厂商云、由任意 NVR 在局域网直接拉流。
Stars: 0 | Forks: 0
# BW4 → 原生 ONVIF / RTSP 摄像头(免云,本地)
将 **BW4** 电池/太阳能 Wi-Fi 摄像头(Ingenic **T23N**)—— *您自己的硬件* —— 转换为
一台**标准 ONVIF/RTSP 摄像头**,让任何 NVR 都可以直接在您的局域网中拉取视频流,并停用厂商 /
Eye4 云。摄像头运行一个设备端的 ONVIF/RTSP 守护进程,因此 Synology Surveillance Station、
Frigate、Blue Iris、Hikvision NVR 等可以像添加任何其他 IP 摄像头一样添加它:
```
rtsp://:554/live # H.264 2304×1296 15 fps + G.711 μ-law audio
http://:80/onvif/... # ONVIF Device/Media/Events + WS-Discovery
```
无需云服务,无需厂商应用,媒体链路中无需 PC。该更改以 **一个可刷写的 overlay 形式提供,
仅修改 `/system` 分区 (`mtd4`)** —— 厂商应用二进制文件永远不会被修改,并且
整个过程完全可逆。
## 支持与不支持的功能
图例:✅ 已在摄像头上实测验证 · 🟡 已构建并在主机端验证,需实际上机验证 · ⚠️ 进行中 · ❌ 死胡同
| 功能 | 状态 | 备注 |
|---|---|---|
| **RTSP `:554` H.264**(主码流 2304×1296 / 子码流 640×360) | ✅ | 主流媒体链路,设备端;在源 EOF 时自我恢复 |
| **ONVIF `:80`**(Device/Media/Events + WS-Discovery + 快照) | ✅ | 已实际加入到真实的 Synology NVR 中,在冷启动后依然存活 |
| **`camweb.so`** — 启用应用休眠的本地 `:81` H.264 服务 | ✅ | 绑定 `0.0.0.0:81`;`livestream.cgi` 提供视频流 |
| **Wi-Fi 在 LD_PRELOAD 链中正常工作** | ✅ | `camweb.so` 必须位于首位(其 `unsetenv` 保护机制会保护 udhcpc) |
| **OTA/互联网拦截**(拒绝非局域网路由) | ✅ | 为 WS-Discovery 保留组播,拒绝其余流量 |
| **麦克风 → RTSP**(G.711 μ-law,`PCMU/8000`,第二个 RTP 轨道) | ✅ | 原生 `IMP_AI` 纯读取垫片;与应用共存 — 详见 [AUDIO.md](docs/AUDIO.md) |
| **`battery_osd.so`** — 在 OSD 上显示真实电量百分比 | ✅ | 实时读取电压;标签无字母(OSD 字体不全) |
| **`wifi_sd.so`** — SD 卡 Wi-Fi 配网 | ✅ 切换 / 🟡 首次连接 | AP 切换已实测验证;干净的首次连接需要全新设备 |
| **`pir_sleep.so`** — 低电量 PIR 唤醒睡眠 | 🟡 | 启用/地址已重新验证;睡眠分支在测试台上需要电量 <50% |
| **Talk-back → 扬声器**(NVR → 摄像头音频输出) | ⚠️ **进行中 / 实验性** | 位于 [`talkback-experimental`](../../tree/talkback-experimental) 分支,**不**包含在默认镜像中:软件链路已到达 DAC(已通过回环证明),但扬声器级从未启用,**并且** AO 调用破坏了共享的 codec,导致**麦克风声音变得机械** — [AUDIO.md](docs/AUDIO.md#2-speaker--talk-back--not-audible--the-open-problem-️) |
| **`:81` 音频 CGI** 作为音频源 | ❌ | 厂商处理程序构建了帧容器,但从未调用 `IMP_AI` |
| **完整的 Thingino 固件**(Track B) | ⚠️ 受阻 | 可刷写并启动,但 AIC8800**U** Wi-Fi 从未枚举成功 — [FLASHING.md](docs/FLASHING.md#the-thingino-full-firmware-path) |
**结论:** 本地视频 + ONVIF + 单向(摄像头→NVR)音频已完成且非常稳定。**双向
talk-back 是唯一尚未解决的功能** — 证明音频已到达 codec DAC,但扬声器功放
级保持关闭。关于遇到的具体瓶颈和最有希望的线索,请参阅 [AUDIO.md](docs/AUDIO.md)。
## 目标硬件
| 部件 | 详情 |
|---|---|
| SoC | Ingenic **T23N**(MIPS32,内核 `3.10.14-Archon`,uClibc 0.9.33) |
| 传感器 | GalaxyCore **GC2083**(固件也会探测 OmniVision OS02N10);H.264 主码流 2304×1296 / 子码流 640×360 |
| Wi-Fi | **AIC8800**(通过 SDIO 连接的 AIC8800U/MC);由 U-Boot + `aic8800_netdrv.ko` 启动 |
| Codec | Ingenic 片上 **`jz-inner-codec`**(D 类扬声器),内置于内核 |
| 电源 MCU | 电池电量计,PIR 唤醒,深度睡眠电源门控(AIC keepalive) |
| Flash | 8 MiB SPI NOR;`/system` = **mtd4** |
| 电源 | USB-C + 太阳能;可选电池。板载无 ESP32。 |
## 工作原理(30秒版)
原厂摄像头拥有功能齐全的 H.264 编码器,但仅通过厂商
云暴露视频。本项目没有替换固件,而是**重新利用摄像头自身的软件**
并添加了一个轻量级层:
1. `/system/bin/vp_project` **包装器**(通过 PATH 覆盖真实二进制文件)设置 `LD_PRELOAD`
链并在开机时启动守护进程 — 磁盘上的原厂二进制文件永远不会被修改。
2. **`camweb.so`** 开启应用内置但被禁用的本地 Web 服务,因此
`livestream.cgi` 会在 `127.0.0.1:81` 上提供原始 H.264 流。
3. **`cam_onvifd`** — 摄像头上的一个静态 MIPS C 守护进程 — 读取该本地流,将其
重新打包为 **RTSP `:554`**,并提供 **ONVIF `:80`** 服务(SOAP + WS-Discovery + 快照)。它还混入
由 `mic_capture.so`(一个纯 `IMP_AI` 读取器)提供的实时 **G.711 音频轨道**。
4. 另外几个 `LD_PRELOAD` 垫片增加了电池 OSD、SD Wi-Fi 配网和 PIR 睡眠。(
实验性的 talk-back 垫片位于 `talkback-experimental` 分支,并且**被排除在
默认镜像之外** — 它会破坏麦克风;请参阅 [AUDIO.md](docs/AUDIO.md)。)
所有内容都打包成一个 XZ-squashfs `mtd4` overlay。深入探讨:[ARCHITECTURE.md](docs/ARCHITECTURE.md)。
## 快速开始
您需要:已完成 Wi-Fi 配网的摄像头,串行控制台(COM,115200 8N1,DTR/RTS
取消断言),安装了 `mksquashfs`/`xz` 用于构建的 WSL/Linux,并且 — 为了获得可用的流 — 您
**设备的 device password 和 device id (`vuid`)** — 这是两个独立的每台设备专属的值,读取方式各不相同(两种操作方法都在
[ARCHITECTURE.md](docs/ARCHITECTURE.md#4b-device-password-verified) 中)。
```
# 1. 在相机上的 root shell 中读取您设备的两个 per-unit 值。
# devpw -- per-unit 随机值,在 onboarding 时设置。docs/ARCHITECTURE.md -> "Device password"
dd if=/proc/$(pidof vp_project)/mem bs=1 skip=8513928 count=20 # 8513928 = 0x81E988
# vuid -- 出厂 programmed 的 "V"+11 位字母数字。docs/ARCHITECTURE.md -> "Device id (vuid)"
dd if=/proc/$(pidof vp_project)/mem bs=1 skip=8331137 count=16 # 8331137 = 0x7F1F81
# (vuid 也可以直接从 NVS 读取:dd if=/dev/mtd5 bs=1 skip=21376 count=13)
# 2. 构建一个携带您的 creds 的 image(需要 bin/ 中由 toolchain 构建的二进制文件;
# 要从源码重新构建它们,请参见 src/onvif_rtsp/build.sh 和 shim 说明)。
DEVPW= VUID= bash src/build_clean_image.sh mycam.bin
# 3. 在相机上:首先备份 mtd4(这是您的 revert image),然后进行 flash。
cat /dev/mtd4 > /mnt/sda0/mtd4_stock_backup.bin # <-- do not skip
md5sum mycam.bin # match your build output
kill -9 $(pidof vp_project) 2>/dev/null ; sleep 2
umount /system 2>/dev/null
flashcp -v mycam.bin /dev/mtd4
reboot
```
重启后,摄像头将启动 Wi-Fi、`:81`、RTSP `:554`、ONVIF `:80`、OTA 拦截以及
实时的 OSD/音频功能。将您的 NVR 指向 `rtsp://:554/live`(ONVIF 用户名/密码默认为
`admin`/`admin`)。完整流程、免 SD 卡的 TFTP 方法以及恢复指南:[FLASHING.md](docs/FLASHING.md).
## 仓库结构
```
firmware/ mtd4_integrated.bin clean flashable overlay (CHANGE_ME, no vendor media) + .md5
bin/ cam_onvifd, *.so our prebuilt MIPS binaries (daemon + 5 LD_PRELOAD shims)
src/
onvif_rtsp/src/ the on-device ONVIF/RTSP/audio daemon (C)
shims/ camweb, wifi_sd, pir_sleep, battery_osd, mic_capture
build_clean_image.sh build the public-safe overlay (from scratch, your creds via env)
build_integrated.sh build from YOUR camera's stock /system (keeps voice prompts)
docs/
ARCHITECTURE.md FLASHING.md ONVIF.md FEATURES.md AUDIO.md DISCOVERY.md TESTING.md
STOCK_SYSTEM.md
NOTICE.md LICENSE
```
## 文档
- **[ARCHITECTURE.md](docs/ARCHITECTURE.md)** — 硬件、Flash 布局、部署通道、
LD_PRELOAD 链、媒体路径以及如何读取每台设备专属的 device password。
- **[FLASHING.md](docs/FLASHING.md)** — 精确的刷写与还原,**切勿 DFU** 规则,免 SD
TFTP 方法,开机自启,恢复指南。
- **[ONVIF.md](docs/ONVIF.md)** — 守护进程的 ONVIF/RTSP 服务、认证和 NVR 配置指南。
- **[FEATURES.md](docs/FEATURES.md)** — 每个垫片的详细信息(地址、机制)。
- **[AUDIO.md](docs/AUDIO.md)** — 完整的麦克风(已完成)和 talk-back(待解决)说明。
- **[TESTING.md](docs/TESTING.md)** — 端到端测试矩阵。
- **[STOCK_SYSTEM.md](docs/STOCK_SYSTEM.md)** — 从您自己的原厂 dump 构建镜像 / 保留
语音提示。
## 安全与机密
- 管理员 **device password 是 `mtd5` NVS 中每个设备专属的随机值** — 不是默认值,也
不是本项目创造的。所有提交的构建产物都使用 **`CHANGE_ME`** 占位符;您需要在构建时提供您自己
设备的值。**切勿提交包含真实密码的镜像。**
- **只会写入 `mtd4`。** `mtd0/mtd2/mtd3/mtd5` 保持原厂状态,因此每次部署都是
可安全还原的。**不要使用 DFU**,除非摄像头完全无法启动 — 全芯片 DFU 会擦除 `mtd5`
和您的 Wi-Fi 凭据。请参阅 [FLASHING.md](docs/FLASHING.md)。
- 此 overlay 仅包含**我们自己的代码**和静态占位文本 — 此处不重新分发任何厂商固件、媒体
或二进制文件。详情:[NOTICE.md](NOTICE.md)。
## 许可证
我们的代码在 MIT 许可证 ([LICENSE](LICENSE)) 下发布。它通过已记录的地址/ABI 与 Ingenic 的
专有 IMP SDK 和厂商应用进行互操作;此处不包含任何厂商代码。
请参阅 [NOTICE.md](NOTICE.md)。
标签:ONVIF, RTSP, 客户端加密, 嵌入式开发, 摄像头, 流媒体服务, 物联网