小米摄像头

关于监控摄像头刷固件问题
先看soc处理器有没有加密,先连接到uart串口,看看屏幕有没有显示sigmastart-key之类的,有的话就说明soc加密了,这个加密是一次性的,soc加密了就无法刷第三方固件了,除非换soc。

soc启用了加密,即便修改了它原厂固件,再刷回去设备也启动不了,因为Boot ROM运行,并从eFuse中读取根公钥。Boot ROM从Flash中加载U-Boot镜像。Boot ROM使用根公钥来验证U-Boot镜像的数字签名。
验证过程: 它会对Flash中的U-Boot镜像数据计算哈希值,然后用公钥解密附带的签名,得到厂商计算的原版哈希值。最后对比这两个哈希值。因为修改过的固件,其哈希值已经和原版不一样了,无法与用厂商私钥生成的签名匹配。

有uboot密码的需要找到uboot密码,没有uboot密码的话,保存固件,直接用编程器把openipc的固件刷到flash也可以。

买模组需要问的问题
第一看openipc支不支持这个soc,有没有sd卡槽跟wifi,wifi芯片是不是openipc支持的常见的,然后问卖家知不知道uboot密码

uboot密码相关:

今天,我们看到越来越多的摄像机可以访问引导加载程序控制台 用密码保护。因此,即使连接到相机的 UART 端口, 中断标准启动周期后,您只会看到提示 密码。在这种情况下,一个相对安全的解决方案是降级固件 到尚未实施密码保护的版本。例如 对于雄迈相机,引导加载程序密码保护开始弹出 大约在 2021 年 7 月左右,因此您需要从 较早的日期。成功将相机降级为无密码后 引导加载程序,您可以定期安装 OpenIPC 固件。

侧载解锁uboot
https://github.com/OpenIPC/burn

小米摄像头wifi配置文件:
WPA_SUPPLICANT_CONFIG_FILE="/tmp/wpa_supplicant.conf"

计划任务在 /mnt/data/etc/crontab文件
# ls -l /etc/crontab
lrwxrwxrwx 1 root root 21 Oct 30 2023 /etc/crontab -> /mnt/data/etc/crontab
里面有三个计划任务:log2mi.sh、log2tf.sh、traceroute.sh

同步时间:
如果我们不使用miio_agent的话,我们如果联网的话,让它自动同步时间,如果不联网,就开机使用sd卡临时文件最后的时间
#sync time every 30 min
*/30 * * * * /mnt/sdcard/busybox-armv7l ntpd -p ntp.aliyun.com -qNn &

网络服务脚本:
wifi_start.sh 负责启动WiFi的不同模式(AP模式或STA模式),而network_governor.sh 则负责监控网络状态并在出现问题时自动修复。

现在,我们来看一下wifi_start.sh脚本的主要功能:

定义了一些函数来更新wpa_supplicant.conf配置文件,包括:

update_wpa_conf: 根据传入的SSID和密码(可选)生成基本的配置文件。

update_wpa_conf_apsta: 生成一个空的网络配置,用于AP+STA模式。

hidden_update和hidden_insert: 用于处理隐藏SSID的网络配置。

master_update和master_insert: 用于处理主网络(已知SSID)的配置。

支持两种网络模式:

AP模式:摄像头作为热点,等待手机连接配置。

STA模式:摄像头作为客户端连接到指定的WiFi网络。

提供了连接隐藏SSID和已知SSID的功能。

支持双频(2.4G和5G)网络的配置。

使用mortoxc命令从NVRAM中读取配置信息,如SSID、密码、绑定状态等。

启动WiFi时,会根据绑定状态(是否已绑定)决定是进入STA模式还是AP模式。

还包含了一些辅助功能,如加密SSID和密码、信道同步、防火墙设置等。

脚本最后根据传入的参数执行不同的操作,例如:

SET_AP_MODE: 启动AP模式。

SELECT_HIDDEN: 连接隐藏SSID。

SELECT_MASTER: 连接已知的主SSID。

如果脚本没有参数,且设备未绑定,则默认启动AP模式。

这两个脚本共同工作,确保摄像头能够连接到WiFi并保持连接。wifi_start.sh负责初始连接,network_governor.sh负责维持连接。

注意:在wifi_start.sh中,使用了imi_encrypto工具对SSID和密码进行加密存储,提高安全性。

此外,脚本中使用了mortoxc来读写NVRAM,这是小米设备上用于存储持久化配置的工具。

如果你需要调试摄像头的网络问题,可以查看这些脚本的日志(通过logger -t governor记录)以及使用wpa_cli等工具来检查WiFi状态。

解密wifi密码:

#mortoxd命令查看一些nvram的配置信息

示例: imi_encrypto -i “mortoxd显示出来的miio_ssid” -k “miio_token” -d

# imi_encrypto -i 4p4qUwRhhYzfE782digMZw== -k e0WNBWEQY8Vkomff -d

# imi_encrypto -i XnAWzRf8+koL674w4aVecw== -k e0WNBWEQY8Vkomff -d

加密wifi密码:
# /mnt/data/bin/imi_encrypto -i "linmeng" -k "e0WNBWEQY8Vkomff" -e

查看所有可用配置
bash
# 查看所有NVRAM配置
mortoxc list nvram default

# 查看特定配置
mortoxc get nvram default <配置名>

备份配置:修改前建议备份当前配置

bash
mortoxc list nvram default > /tmp/nvram_backup.txt

修改mac地址和pin_code
bash
# 获取当前设备信息
mortoxc get nvram default did # 设备ID
mortoxc get nvram default mac # MAC地址
mortoxc get nvram default key # 设备密钥

# 设置新的pin_code和OOB
mortoxc set nvram default pin_code "摄像机底部二维码的值"
mortoxc set nvram default OOB "摄像机底部二维码的值"

打开或者关闭一些功能:

# 电源开关
mortoxc set nvram default power on

# 开启婴儿哭声检测
mortoxc set nvram default babycry_switch on

# 开启运动检测
mortoxc set nvram default motion_detection_enable on

# 设置运动报警间隔(秒)
mortoxc set nvram default motion_alarm_interval 10

# 设置运动检测区域(32个区域的敏感度,0-3)
mortoxc set nvram default motion_region "[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]"


设置wifi账号与密码,请在每次开机后尽快设置,摄像头运行的时间长了之后,输入这些命令会卡住,它有一个保护时间。
mortoxc set nvram default encry_flag "0"
mortoxc set nvram default miio_ssid "你的Wifi账号"
mortoxc set nvram default miio_passwd "你的Wifi密码"
mortoxc set nvram default key_mgmt "WPA-PSK"
mortoxc set nvram default bind_status "ok"

通过sd卡配置wifi账号与密码
下面的配置,在运行wpa_supplicant指定wifi配置后,必须使用udhcpc自动获取一遍ip,否则没有ip地址。

# cat /mnt/sdcard/wifi.sh
#!/bin/sh
wifi_conf="/mnt/sdcard/wpa_supplicant.conf"
if [ -f "$wifi_conf" ]; then
echo "$wifi_conf yes。"

/bin/kill 745 && wpa_supplicant -Dnl80211 -iwlan0 -c /mnt/sdcard/wpa_supplicant.conf -B && udhcpc -i wlan0 -t 9 -T 2 -n -S -x hostname:chuangmi_camera_029a02

else
echo "$FILE no。"
fi

# cat /mnt/sdcard/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
update_config=1
network={
ssid="linmeng"
psk="123456"
key_mgmt=WPA-PSK
proto=WPA WPA2
scan_ssid=1
}

获取ip:
wpa_cli status | grep ip_address | cut -d '=' -f 2

 

#!/bin/sh
#set time
last_time=`ls --full-time /mnt/sdcard/MIJIA_RECORD_VIDEO/tmp.mp4 |awk -F ' ' '{print $6,$7}'`
/bin/date -s "$last_time"

#stop no need service
FILE="/mnt/sdcard/linmeng"
if [ -f "$FILE" ]; then
echo "$FILE yes。"
/usr/sbin/perpctl d miio_agent &
/usr/sbin/perpctl p miio_client &
/usr/sbin/perpctl d miio_cloudv2 &
/usr/sbin/perpctl d miio_devicekit &
/usr/sbin/perpctl d miio_miss &
mv /mnt/data/bin/miio_agent /mnt/data/bin/miio_agent.bak &
else
echo "$FILE no。"
mv /mnt/data/bin/miio_agent.bak /mnt/data/bin/miio_agent
fi

#start httpd service
#httpd -h /mnt/sdcard/MIJIA_RECORD_VIDEO/

sleep 60
#start rtsp server
/mnt/data/bin/script/mi_rtsp_server &

#set time

/mnt/sdcard/busybox-armv7l ntpd -p ntp.aliyun.com -qNn &

服务控制:
# /mnt/sdcard/busybox-armv7l pwdx pid 此命令可以查询进程是哪个文件启动的。
服务启动目录在/mnt/data/etc/perp/。目录中有一个隐藏目录.boot,目录下有两个文件rc.log,rc.perp。这两个文件是总控制所有服务的日志保存、服务启动。
如果禁用miio_agent服务的话,miio_devicekit,miio_miss,miio_agent会不停的向/var/log/message写日志,可以将它的rc.log日志改个名,不启动它。

日志命令:
logger、sissylog,这两个命令会将你想说的话写到/var/log/miio_client 和/var/log/message

network_governor.sh
fsck_check.sh

# perpls -G 列出所有的服务
[+ +++ +++] fetch_av uptime: 1475s/1475s pids: 627/626
[+ +++ +++] miio_agent uptime: 1475s/1475s pids: 650/629
[+ +++ ---] miio_algo uptime: 1475s/-s pids: 633/-
[+ +++ ---] miio_client uptime: 1475s/-s pids: 636/-
[+ +++ +++] miio_client_helper uptime: 1475s/1475s pids: 640/639
[+ +++ ---] miio_cloudv2 uptime: 1475s/-s pids: 644/-
[+ +++ ---] miio_devicekit uptime: 1475s/-s pids: 646/-
[+ +++ ---] miio_miss uptime: 1475s/-s pids: 649/-
[+ +++ ---] miio_nas uptime: 1475s/-s pids: 653/-
[- --- ---] miio_ota (service not activated)
[- --- ---] miio_pincode (service not activated)
[+ +++ ---] miio_record uptime: 1475s/-s pids: 659/-
[+ +++ ---] miio_sdcard uptime: 1475s/-s pids: 663/-
[+ +++ ---] mortox uptime: 1475s/-s pids: 610/-

#perpctl 控制服务的启动,停用。
#perpctl d miio_agent 停用服务
#perpctl p miio_agent 休眠服务
#perpctl u miio_agent 重新启动服务

# factory get pin_code 蓝牙配对码
# factory get OOB 蓝牙配对

+ miio_agent -当kill掉它的时候,你不能从你的手机连接到米家实时查看。
连接到miio_client。它不仅仅是代理,它还负责同步设备与真实时间,
系统默认时间是1970-01-01,如果系统判定当前时间是默认时间,
miio_record就不会工作,不会把录像文件保存到sdcard。

+ miio_devicekit -第二个实例尝试连接到127.0.0.1:54320,初始化GPIO引脚,可能是为了控制电机。
停止进程会导致无法旋转摄像机,视频流仍然存在。

+ miio_client -第二个实例试图监听端口54322,但没有成功,导致程序崩溃。
kill过程没有留下明显的痕迹。它也被认为监听54320端口。

+ miio_algo -第二个副本运行没有任何问题。例如,检测图像变得太暗,有必要包括红外视觉。
杀死进程有一个明显的问题——当miio_record启动时,它返回一个错误

+ miio_miss -第二个实例尝试连接到miio_client,然后在日志中直接连接到127.0.0.1:54320。
此外,第二个实例逻辑事件控制摄像机的电机。在日志中也提到了一些tutk。
这是物联网摄像头的某种解决方案,但具体来说,这是一个应用程序——还不清楚。

+ miio_nas - 可以禁用,将录像存储到网络nas上。kill掉不会影响任何程序。

+ miio_ota -从名字来看,这是一种ota更新服务。kill掉,没用。

+ mortox -守护进程,它处理存储在nvram中的一些per6值。此外,它控制变量is_sdcard_ok的状态。
如果重新启动,变量将保持不变,例如,miio_record将不会写入临时文件,因为它将看到sd卡的chtior不正确。

+ fetch_av -一个守护进程,可以从SoC摄像头获得视频和音频。

我发现把miio_client关掉以后录像没有声音。

当 miio_agent这个程序不打开的时候,miio_record把录像保存到sd卡的程序会提示以下信息,时间不对。
1970-01-01 00:13:18.752 [ debug] time is not right now: 798, min 1438992488.
当miio_agent打开以后会更新系统时间,miio_record会提示以下信息
[ info] record thread start.
is_sdcard_ok = 1

当 miio_agent这个程序不打开的时候,miio_record把录像保存到sd卡的程序会提示以下信息,时间不对。
1970-01-01 00:13:18.752 [ debug] time is not right now: 798, min 1438992488.
1970-01-01 00:13:19.252 [ debug] time is not right now: 799, min 1438992488.
1970-01-01 00:13:19.753 [ debug] time is not right now: 799, min 1438992488.

当miio_agent打开以后miio_record会提示以下信息
2025-01-14 10:09:27.554 [ debug] mortox_value_cb start....
2025-01-14 10:09:27.554 [ debug] mortox_value_cb key = power
2025-01-14 10:09:27.556 [ debug] power = 1
2025-01-14 10:09:27.558 [ debug] mortox_value_cb start....
2025-01-14 10:09:27.559 [ debug] mortox_value_cb key = motion_record
2025-01-14 10:09:27.560 [ debug] motion_record = 0
2025-01-14 10:09:27.558 [ info] record thread start.
2025-01-14 10:09:27.563 [ debug] mortox_value_cb start....
2025-01-14 10:09:27.565 [ debug] mortox_value_cb key = time_motor
2025-01-14 10:09:27.566 [ debug] mortox_value_cb start....
2025-01-14 10:09:27.567 [ debug] mortox_value_cb key = time_wdr
2025-01-14 10:09:27.567 [ debug] mortox_value_cb start....
2025-01-14 10:09:27.568 [ debug] mortox_value_cb key = time_flip
2025-01-14 10:09:27.569 [ debug] mortox_value_cb start....
2025-01-14 10:09:27.570 [ debug] mortox_value_cb key = time_night
2025-01-14 10:09:27.570 [ debug] mortox_value_cb start....
2025-01-14 10:09:27.571 [ debug] mortox_value_cb key = sdcard_rw
2025-01-14 10:09:27.572 [ debug] is_sdcard_ok = 1
^C2025-01-14 10:09:38.199 [ info] program has exit.
2025-01-14 10:09:38.201 [ info] video_record_stream receiver closed!
2025-01-14 10:09:38.202 [ info] audio_record receiver closed!
2025-01-14 10:09:38.204 [ info] md_event_stream receiver closed!
2025-01-14 10:09:38.205 [ info] snapshot_stream receiver closed!
2025-01-14 10:09:38.206 [ debug] record exit.
2025-01-14 10:09:38.220 [ info] miio_record stop.

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注