小米互联网音响
⛔ 本文仅供研究和学习使用,文中的操作可能因固件版本不同而有异,请自行辨别。
1. 基本信息:
型号:MDZ-16-DA
固件 model
xiaomi.wifispeaker.v1
version: 1.4.0
xiaomi.wifispeaker.v3
version: 1.19.112
若你不是此型号的设备将不适用本文!
2. 如何重置固件
⚠️ 适用于旧版本
a. 断开设备的电源连接
b. 按住 CH 键
c. 将设备接入电源
d. 按住 CH 键 30 秒
⚠️ 适用于新版本
a. 长按 PLAY + CH 键 10 秒以上
b. 听到语言提示后松开
3. 获取 root 权限
3.1. 适用于老固件
在同一局域网访问以下链接:
http://{ip}:9999/{ssdp id}Upnp/resource/sys?command=nslookup&host='echo 192.168.0.2'&dns_server='telnetd /bin/sh'
• ip - 音响设备的 ip
• ssdp id - UUID
获取 UUID - Python 脚本
import socket
msg = '\r\n'.join([
'M-SEARCH * HTTP/1.1',
'HOST: 239.255.255.250:1900',
'MAN: "ssdp:discover"',
'MX: 1',
'ST: ssdp:all',
'', ''
]).encode('utf-8')
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.settimeout(3)
sock.sendto(msg, ('239.255.255.250', 1900))
try:
while True:
data, addr = sock.recvfrom(65507)
text = data.decode('utf-8', errors='ignore')
if 'uuid:' in text.lower():
print(f"From {addr}:")
for line in text.splitlines():
if 'uuid:' in line.lower():
print(" ", line.strip())
except socket.timeout:
pass
你会到了类似的输出:
...
From ('192.168.0.10', 1900):
USN: uuid:b27f0af1-51b0-499d-a6e9-96f5ae8bc0f2
ST: uuid:b27f0af1-51b0-499d-a6e9-96f5ae8bc0f2
From ('192.168.0.10', 1900):
USN: uuid:b27f0af1-51b0-499d-a6e9-96f5ae8bc0f2::upnp:rootdevice
...
ssdp id: b27f0af1-51b0-499d-a6e9-96f5ae8bc0f2
找到音响设备所在 ip 的 uuid 后面的字符串,每个设备都是不一样的,请勿使用文中字符串。
使用 telnet (例如,通过 putty),使用 passwd 命令将密码更改为 root
启用 ssh dropbear
uci set dropbear.@dropbear[0].enable=1
uci commit
reboot
接下来,你可以使用 ssh 链接了
注意:通过 ssh 无法正常创建或恢复备份,也无法修改引导分区
3.2 适用于任意固件
需要准备一个 USB 转 TTL 适配器、PuTTY 软件
断开设备电源,翻转设备把底部的二维码贴纸揭开,拧开下面的两颗螺丝
使用塑料卡片沿着底部边缘,撬开边缘卡扣,并断开控制排线,请注意不要伤到排线
找到电源插口附近的 COM 串口(图中黄色高亮处),电源插口对着自己接口分别是:TXD RXD GND
在电脑上打开 PuTTY 软件,填入或选择:
Connection type: Serial
在设备管理器中查看适配器分配的 COM 端口,COM1 为示例
Serial line: COM1
Speed: 115200
然后点击 Open 打开控制台,然后你可以看到:
root@OpenWrt:/#
使用 passwd 命令修改 root 密码,输入两遍 root 即可
开启 dropbear ssh 老固件参考上面的,新版固件自行研究
4. 退回到旧版本固件
最新版本 1.19.112 开发版,阉割了绝大多数功能,例如:AirPlay、本地播放等,并且音质较差
如果你不小心升级了两次,你将没办法使用重置的方式退回到旧版本 1.4.0
4.1 准备
需要刷写的固件连接到设备的 samba media 文件夹,将固件放入根目录
将设备通过串口连接到电脑,在设备启动过程中看到:
Press the [f] key and hit [enter] to enter failsafe mode
Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level
按 F 键然后按回车键,使设备以 failsafe 模式启动
4.2 查看当前使用的系统分区
在设备控制台输入:
/usr/bin/fwenv -r bootcmd | grep "store read boot 82000000"
若返回内容,则使用的是 boot0 没有返回内容则使用的是 boot1
4.3 boot 的区别
boot0
• /dev/system
• /dev/mmcblk0p7
boot1
• /dev/system1
• /dev/mmcblk0p10
4.4 刷写固件
dd if=/media/public/system.img of=/dev/system1
前面是你存放固件的路径,后面指向你需要刷写的系统分区
然后耐心等待执行完成,然后输入:
reboot
重启设备,切换到新分区:
/usr/bin/fwenv -w boot1
或者在重启设备时,连按回车键,进入 uboot 然后输入:
printenv
setenv bootargs root=/dev/mmcblk0p10 rootfstype=ext4 rootwait init=/sbin/init console=ttyS0,115200n8 no_console_suspend debug nohlt a9_clk=600M clk81=200M storage=2
其中 /dev/mmcblk0p10 表示选中的系统启动分区,然后保存并重启:
saveenv
reset
5. 配置 Wi-Fi
旧固件需要使用小米音响 APP 但是已经不受支持了,使用 root 权限连接到设备输入:
/bin/wifiwebconfig.sh SSID名称 密码 加密方式
根据自己的 Wi-Fi 配置来设置,加密方式可选:
• WPA2-PSK
• WPA-PSK
• WPA
若连续输出 OK 字符串,且在路由器后台可见此设备 mac 地址的连接,即为连接成功
6. SSH 连接
在使用 ssh 连接到旧版本固件的设备时,可能会出现:
% ssh root@192.168.1.2
Unable to negotiate with 192.168.1.2 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,kexguess2@matt.ucc.asn.au
这表示设备上的 SSH 服务只支持非常老的密钥交换算法 (KEX),你的 ssh 客户端已经禁用了这些算法
手动指定算法:
ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 \
-oHostKeyAlgorithms=+ssh-rsa \
root@192.168.1.2
在使用时,将文中 ip 替换为你的设备 ip 地址
7. 固件及备份
由于无法确认固件的完整性,故文中不提供固件的下载地址,你可以通过备份设备获得当前设备的固件
使用串口连接到设备,查看设备当前使用的系统分区:
ubootenv
找到输出中的类似字符串:
...
[bootargs] = [root=/dev/mmcblk0p7 rootfstype=ext4 rootwait init=/sbin/init console=ttyS0,115200n8 no_console_suspend debug nohlt a9_clk=600M clk81=200M storage=2]
....
这一行中的 /dev/mmcblk0p7 是你使用的分区名称,备份到 media 文件夹:
dd if=/dev/mmcblk0p7 of=/media/public/system.img
接下来使用 samba 连接到设备的 media 文件夹,其中的 system.img 就是你备份的系统固件
8. 结尾
若你在使用 dd 命令时遇到以下情况:
dd: writing '/dev/mmcblk0p10': No space left on device
则表示你选择错了分区,请确认你的需要复写的分区
若你输入任何命令,返回 Segmentation fault 例:
date
# Segmentation fault
这表示当前系统分区已经损坏,可以通过切换到另外一个分区进行修复