技巧杂烩

小米互联网音响

小米互联网音响固件降级

技巧

小米互联网音响

 本文仅供研究和学习使用,文中的操作可能因固件版本不同而有异,请自行辨别。

 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 地址的连接,即为连接成功

 6SSH 连接

在使用 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

这表示当前系统分区已经损坏,可以通过切换到另外一个分区进行修复

文章标题:小米互联网音响

文章作者:浅小沫

文章链接:https://blog.truimo.com/posts/xiaomi-mi-internet-speaker


您可以自由在任何媒介以任何形式分享本作品,但需署名,且不得用于商业目的或改编。若分发衍生作品,须采用相同的许可协议。

本博客的所有原创内容采用 CC BY-NC-ND 4.0 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。