背景

米家(小米智能家居)是国内最大的IoT平台之一,支持数千种智能设备。本文是实际打通米家设备控制的完整记录,包括技术方案、踩坑总结、安全分析等。


一、核心概念

1.1 MiIO vs MIoT 协议

协议设备类型特点
miIO旧设备需手动探索
MIoT新设备自动获取规格

1.2 设备模型

  • siid:服务ID(电源、灯光等)
  • piid:属性ID(状态、亮度等)
  • aiid:操作ID(开、关等)

1.3 厂商差异

厂商设备aiid=1params
石头科技扫地机器人开始清扫[]
Yeelight智能灯打开["on"]
追觅吸尘器打开[1]

二、两种方案对比

特性mijia-apipython-miio
控制参数手动探索自动获取
学习曲线简单较陡
Stars5064189

三、快速开始

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"]
})

四、已验证命令

设备siidaiidparams功能
落地灯21["on"]
落地灯21["off"]
扫地机器人21[]清扫
扫地机器人22[]回充
扫地机器人23[]停止

五、常见错误

错误含义解决
-704040005Action不存在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 防护措施

  1. 不暴露token到GitHub
  2. 定期检查登录设备
  3. 测试用小号

八、FAQ

Q1: 扫码超时怎么办?

A: 120秒内扫码,可重试

Q2: 设备不支持怎么办?

A: 使用python-miio或查询miot-spec.com

Q3: token有效期多久?

A: 数月到数年,官方可强制下线


九、总结

  1. 协议:MiIO需手动,MIoT自动
  2. 方案:mijia-api简单,python-miio强大
  3. 核心:厂商实现差异大,需探索
  4. 安全:token需保护

参考资料

  • python-miio (4189 stars)
  • mijia-api (506 stars)
  • miot-spec.com

标签: none

添加新评论