背景
米家(小米智能家居)是国内最大的IoT平台之一,支持数千种智能设备。本文是实际打通米家设备控制的完整记录,包括技术方案、踩坑总结、安全分析等。
一、核心概念
1.1 MiIO vs MIoT 协议
| 协议 | 设备类型 | 特点 |
|---|
| miIO | 旧设备 | 需手动探索 |
| MIoT | 新设备 | 自动获取规格 |
1.2 设备模型
- siid:服务ID(电源、灯光等)
- piid:属性ID(状态、亮度等)
- aiid:操作ID(开、关等)
1.3 厂商差异
| 厂商 | 设备 | aiid=1 | params |
|---|
| 石头科技 | 扫地机器人 | 开始清扫 | [] |
| Yeelight | 智能灯 | 打开 | ["on"] |
| 追觅 | 吸尘器 | 打开 | [1] |
二、两种方案对比
| 特性 | mijia-api | python-miio |
|---|
| 控制参数 | 手动探索 | 自动获取 |
| 学习曲线 | 简单 | 较陡 |
| Stars | 506 | 4189 |
三、快速开始
3.1 安装
pip install mijiaAPI qrcode pillow
3.2 登录
from mijiaAPI import mijiaAPI
api = mijiaAPI()
result = api.login() # 阻塞120秒
3.3 控制
api.run_action({
"did": "设备ID",
"siid": 2,
"aiid": 1,
"params": ["on"]
})
四、已验证命令
| 设备 | siid | aiid | params | 功能 |
|---|
| 落地灯 | 2 | 1 | ["on"] | 开 |
| 落地灯 | 2 | 1 | ["off"] | 关 |
| 扫地机器人 | 2 | 1 | [] | 清扫 |
| 扫地机器人 | 2 | 2 | [] | 回充 |
| 扫地机器人 | 2 | 3 | [] | 停止 |
五、常见错误
| 错误 | 含义 | 解决 |
|---|
| -704040005 | Action不存在 | siid/aiid错误 |
| -8 | 参数类型错误 | params格式不对 |
| -4008 | 设备离线 | 检查网络 |
六、REST API服务
6.1 完整代码
from flask import Flask, request, jsonify
from mijiaAPI import mijiaAPI
import threading
app = Flask(__name__)
mi_api = None
@app.route("/login", methods=["POST"])
def login():
global mi_api
mi_api = mijiaAPI()
threading.Thread(target=mi_api.login).start()
return jsonify({"message": "请扫码"})
@app.route("/control", methods=["POST"])
def control():
data = request.json
return jsonify(mi_api.run_action(data))
app.run(port=8080)
6.2 调用示例
curl -X POST http://localhost:8080/control \
-d "{\"did\":\"xxx\",\"siid\":2,\"aiid\":1,\"params\":[\"on\"]}"
七、安全
7.1 token包含
- serviceToken:API凭证
- passToken:验证凭证
- userId:用户标识
7.2 防护措施
- 不暴露token到GitHub
- 定期检查登录设备
- 测试用小号
八、FAQ
Q1: 扫码超时怎么办?
A: 120秒内扫码,可重试
Q2: 设备不支持怎么办?
A: 使用python-miio或查询miot-spec.com
Q3: token有效期多久?
A: 数月到数年,官方可强制下线
九、总结
- 协议:MiIO需手动,MIoT自动
- 方案:mijia-api简单,python-miio强大
- 核心:厂商实现差异大,需探索
- 安全:token需保护
参考资料
- python-miio (4189 stars)
- mijia-api (506 stars)
- miot-spec.com