为移动HDC-55监控设备刷入Thingino,所有功能完美运行!!!
前言
寒假在家里闲着翻到了以前中国移动送的监控摄像头 和家亲HDC-55,里面安装的是中国移动自己定制的系统。
隐私安全是我们的头等大事,监控设备是涉及家庭隐私的设备,而且近期运营商监控被破解上传的视频又逐渐增多。就算没有人刻意破解你的监控,但你的数据还是可以被运营商很容易的调取出来!所以,只有将所有服务掌握在在自己手里,使用可信的软件,才能更大化的保证安全。
我便萌生了为摄像头刷入自定义固件的想法。起初我尝试使用OpenIPC,但在反复折腾编译后始终无法令摄像头工作,最后发现这貌似是OpenIPC在某次更新后出现的BUG(issue #1631),于是转战对君正SOC有更好适配的Thingino固件。
而且Thingino的社区人员也很热情积极,希望大家在使用开源代码后,也可以为社区贡献一份自己的力量,不论大小
本教程需要
- 一个中国移动HDC-55网络摄像头(请根据下文确认CPU型号、CMOS图像传感器型号、网卡型号、Nor大小)
- 一个USB to TTL工具
- 一张空闲的SD卡(建议256M以上总空间)
- 一台电脑
- 有一定的动手能力与足够细心的你
注意事项
- Thingino基于MIT协议开源,确保你了解其内容
- 本程序/文章不做任何担保
- 创作不易,转载还请注明出处~~
探索过程
拆解,获得终端输出
破解这种嵌入式设备的第一步思路就是确定CPU型号和原始固件类型了,这些信息都可以在设备的tty日志中得到。
但难点之一出现了: 如何找到设备的UART引脚?
找到UART引脚并连接
大部分这种智能设备(包括电视盒子、网络监控等等)在设计时都会预留一个UART引脚用于调试,但隐藏的深度和引脚易用性就因设备而异了。
在拆解HDC-55监控设备后,我找到了这样一个可疑的引脚J5
:
那么如何确定这究竟是不是UART引脚,以及引脚定义呢?
我使用了一种暴力的手段:试 (当然,你也可以用万用表测量得到)
首先我可以确定,如果这些引脚确实是串口,那么它们必定分别是GND
, RX
, TX
。而且我只需要插两根线GND
, RX
就可以轻易判断了。
那么使用一点简单的排列知识,可以得出共有6种排列,所以纯纯的试工作量并不大,在试了4遍后我就得出了引脚定义,如下图,注意在TX
引脚的右侧有一个三角形指示。
使用你的tty转USB工具,我的是CH340,接在摄像机的UART端口上:
1 | CH340 | 监控 |
具体接线方式不限,只要你能把线接通就好,我是这么接的:
打开串口:
Windows建议使用Putty,将COM5
换成你在设备管理器里看到的COM
Linux可以使用sudo minicom -D /dev/ttyUSB0
打开串口
获得终端输出并分析芯片型号与储存大小
终端部分输出信息如下:
1 | U-Boot SPL 2013.07 (Mar 29 2019 - 09:52:27) |
由Board: ISVP (Ingenic XBurst T20 SoC)
得到CPU型号为君正T20芯片
由DRAM: 128 MiB
得到NOR储存大小为16MB,DRAM: 64MiB
等同于8MB NOR,以此类推。
由00:00:11|trace CConf[ 11.982106] tx_isp: Registered sensor subdevice sc2235 0-0030
得到CMOS图像传感器型号为sc2235
由[ 5.781696] RTL871X: rtl8189fs v4.3.24.11_26052.20180108
得到wifi模块为RTL8189F系列的,拆机后发现是RTL8189FTV
定制专属于HDC-55监控的Thingino
在Thingino官网查找后,发现虽然有一个HDC-55型号,但是芯片、图像传感器的型号都对不上。
于是我决定自己从源码构建设备固件
注意事项
请确保你的监控参数与下面所述一致,否则你可能需要做一些自己的修改
- CPU:君正T20 (Ingenic XBurst T20 SoC)
- 储存大小和类型:16MB NOR
- CMOS图像传感器型号:SC2235
- 无线网卡型号:RTL8189FTV (rtl8189fs)
如果完全一致,那么你可以直接照抄目光呆滞下面的教程
环境搭建
Windows
Windows用户建议使用Windows Subsystem for Linux(WSL)。
安装方式见官方文档。
安装后请使用最新的Ubuntu 24.04.1 LTS发行版,低版本Ubuntu发行版的
dd
命令版本较低,编译到最后会出现错误。- 输入
dd --version
确保你的dd命令版本在9.0以上
- 输入
配置你的
PATH
变量,确保没有空格出现1
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/snap/bin
安装必要的工具
1
2sudo apt-get update
sudo apt install git dialog u-boot-tools unzip make libncurses-dev flex cmake cpio bison build-essential whiptail wget rsync gawk file curl bc配置代理
建议配置代理编译,否则会非常慢,而且有文件下载失败风险
- 在开始菜单中打开WSL Settings,调整”网络”选项如下图
Linux
Linux用户请自行确保dd
工具版本在9.0以上,之后根据自己的发行版安装依赖
以Ubuntu为演示:
1 | sudo apt-get update |
克隆代码
将Thingino源码克隆至本地
1 | git clone --depth=1 --recurse-submodules \ |
进入目录并标记依赖安装完成
1 | cd thingino-firmware |
自定义监控配置文件
经过我的研究,最终编写出了适配文件
监控配置 wanjiaan_hdc55_t20_sc2235
1 | nano configs/cameras/wanjiaan_hdc55_t20_sc2235 |
写入以下内容:
1 | # NAME: Wanjiaan HDC55 (T20, SC2235, RTL8189FTV) |
Ctrl + S
保存,Ctrl + X
退出
模板文件 t20x_sc2235_rtl8189ftv
1 | nano configs/modules/t20x_sc2235_rtl8189ftv |
写入以下内容:
1 | # NAME: T20X, SC2235, RTL8189FTV |
环境变量 wanjiaan-hdc55-t20-sc2235.uenv.txt
这个文件内的几个GPIO引脚定义我最后都是一个一个试出来的
真是太难了>﹏<
1 | nano environment/wanjiaan-hdc55-t20-sc2235.uenv.txt |
写入以下内容:
1 | day_night_color=true |
编译固件
下面就是根据写好的配置文件来编译固件了,Thingino提供了一个TUI界面来方便的编译。
启动引导式安装
1
./user-menu.sh
打开 ”2 Guided Compilation“
选择监控设备配置文件
- 打开“Step 2: Select Device”,选择刚才编写的
wanjiaan_hdc55_t20_sc2235
配置文件,按Enter
确认
- 打开“Step 2: Select Device”,选择刚才编写的
选择 “Step 3: Make Firmware”开始编译固件,之后便是漫长的等待了
编译完成后,固件被输出到了上级目录中,即为
../output/wanjiaan_hdc55_t20_sc2235/images/
目录
刷写固件与设置环境
文件准备
- 准备一张SD卡,格式化为FAT32文件系统。
- 将输出固件目录中的
thingino-wanjiaan_hdc55_t20_sc2235.bin
复制到SD卡根目录下 - 在SD卡根目录下创建
uenv.txt
,根据自己的情况写入下面内容(保证文件最后空着一行):1
2
3
4wlanssid=WIFI名称
wlanpass=WIFI密码
hostname=喜欢的名字(可选) - 将SD卡插入监控设备
正式刷写
确保你的监控处于断电状态,UART接线正常,SD卡正常
在给监控通电的同时,在终端按
Ctrl + C
中断引导确保SD卡正常,输入
mmc rescan; mmcinfo
来检查SD卡如果你的卡被成功识别,则输出应类似于这样:
1
2
3
4
5
6
7
8
9
10
11
12isvp_t20# mmc rescan; mmcinfo
Device: msc
Manufacturer ID: 1b
OEM: 534d
Name: 00000
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 59.6 GiB
Bus Width: 4-bit
isvp_t20#运行
fatls mmc 0
来查看SD卡内文件,并确认你的固件文件名,我此处是thingino-wanjiaan_hdc55_t20_sc2235.bin
1
2
3
4
5
6
7
8isvp_t20# fatls mmc 0
system volume information/
16777216 thingino-wanjiaan_hdc55_t20_sc2235.bin
69 uenv.txt
2 file(s), 1 dir(s)
isvp_t20#对于16MB NOR设备,运行
setenv flashsize 0x1000000;
; 对于8MB NOR设备,运行setenv flashsize 0x800000;
逐行运行下面刷写命令,注意第三条命令要替换为你的实际文件名
1
2
3
4
5setenv baseaddr 0x82000000;
mw.b ${baseaddr} 0xff ${flashsize};
fatload mmc 0:1 ${baseaddr} thingino-wanjiaan_hdc55_t20_sc2235.bin;
sf probe 0; sf erase 0x0 ${flashsize};
sf write ${baseaddr} 0x0 ${filesize};如果运行正常,输出应该类似于下图
使用
reset
重启设备
启动设备
最激动人心的时候到了
装回去之前…
还是接好UART串口,观察串口输出。
如果一切正常,你可以使用root
用户root
密码登录shell
登陆后会要求修改root密码,正常修改即可,进入后你可以找到监控的IP地址(或者你可以按一下监控后面的按键聆听IP地址)
安装回去
如果你认为一切正常,就可以把监控装回去了,之后可以通过ssh访问设备
然后你可以在浏览器上通过IP访问监控页面,用户名密码即为root和刚才修改的密码
记得在 Settings -> RTSP/ONVIF Access 页面修改设备的ONVIF/RTSP密码
远程访问
IPv6
如果你的监控有IPv6,那么意味着你可以直接使用RTSP协议获取监控的视频画面,只需在光猫中关闭防火墙或者放行相应端口即可。
但是中国大部分家庭宽带都会封80端口,这意味着无法使用onvif协议来进一步控制监控,也无法访问监控网页。
我尝试了修改onvif.conf
,但似乎onvif端口仍然是80,这可能是Thingino的一个BUG。
如果仍然要使用,可能需要端口转发或者反向代理等手段,我没有尝试
IPv6手段的缺点是目前的普及率仍不理想,可能在其他没有IPv6的Wifi环境下无法使用,需要开启流量
内网穿透
我们可以使用内网穿透来将监控设备暴露到公网,这样做的好处是IPv4/v6支持取决于服务器,而且80端口通常是开放的
下载frpc
从https://github.com/fatedier/frp/releases/latest下载最新版的frp, 选择mipsle
架构,解压后将frpc复制到SD卡中,并根据你的情况创建配置文件frpc.toml
持久化运行
之后创建系统服务,实现持久化运行
在/etc/init.d
中创建S97frpc
文件
1 | vi /etc/init.d/S97frpc |
写入以下内容:
1 |
|
设置为可执行:
1 | chmod +x /etc/init.d/S97frpc |
之后可以使用service frpc start|stop|restart
控制
手机应用
Thingino是支持onvif协议的,手机应用推荐使用tinyCam(谷歌商店中可以搜到)
或者onvier也可以正常连接
最后……
都看到这里了,也希望你可以支持一下作者。
可以发条评论什么的(