从零打造一款会"听话"的智能设备:一文读懂AIOT产品核心技术
导读:你有没有想过,一句"嗨,Siri"或者"小艺小艺",设备是如何听懂你的话?本文用多张Mermaid图讲透AIOT设备的核心技术:硬件架构→BLE配网→云端认证→语音交互→WebSocket→安全机制,全程可视化。
一、AIOT设备是什么?
AIOT = AI(人工智能)+ IoT(物联网)
简单理解:一个会上网的智能硬件。它既能和云端"大脑"对话,又有本地"感官和手脚"。
flowchart TB
subgraph 云端["🔵 云端 - 大脑"]
BRAIN["听懂你说的话<br/>理解你的意思<br/>回答你的问题"]
end
subgraph 设备端["🟢 IoT 设备端 - 躯干"]
direction LR
MIC["麦克风<br/>耳朵"]
SCR["屏幕<br/>脸"]
LED["LED<br/>眼睛"]
end
BRAIN -->|"WebSocket<br/>双向实时"| 设备端
style 云端 fill:#E3F2FD,stroke:#1976D2
style 设备端 fill:#E8F5E9,stroke:#388E3C
二、硬件架构:设备端有什么?
2.1 核心硬件组成
flowchart TB
subgraph 主控["🟣 主控芯片"]
CPU["CPU<br/>运算控制"]
WIFI["WiFi<br/>联网"]
BLE["BLE<br/>蓝牙配网"]
MEM["内存管理<br/>数据存储"]
end
subgraph 传感输入["🔵 传感输入"]
MIC["麦克风<br/>音频采集"]
CAM["摄像头<br/>视觉(可选)"]
end
subgraph 显示输出["🟢 显示输出"]
DSP["DSP 芯片<br/>音频预处理"]
SPK["扬声器<br/>声音播放"]
LED["LED 指示灯<br/>状态显示"]
SCR["屏幕<br/>SPI接口"]
end
主控 --> 传感输入
主控 --> 显示输出
MIC --> DSP
style 主控 fill:#F3E5F5,stroke:#7B1FA2
style 传感输入 fill:#E3F2FD,stroke:#1976D2
style 显示输出 fill:#E8F5E9,stroke:#388E3C
2.2 各硬件模块作用
| 硬件 | 作用 | 类比 |
|---|---|---|
| 麦克风 | 采集声音 | 耳朵 |
| DSP芯片 | 音频预处理、降噪 | 耳朵里的神经 |
| 主控芯片 | 运行程序、网络通信 | 大脑 |
| WiFi模块 | 连接云端 | 神经纤维 |
| BLE模块 | 配网/控制 | 辅助神经 |
| 屏幕 | 显示信息 | 脸 |
| LED | 状态指示 | 眼睛 |
| 扬声器 | 播放声音 | 嘴 |
三、软件架构:三层结构
3.1 软件分层总览
flowchart TB
subgraph 应用层["🔵 应用层"]
A1["语音交互"]
A2["屏幕显示"]
A3["按键控制"]
A4["闹钟管理"]
end
subgraph 服务层["🟡 服务层"]
S1["唤醒服务"]
S2["配网服务"]
S3["云端连接"]
S4["音频播放"]
end
subgraph 系统层["🟢 系统层"]
SYS1["操作系统"]
SYS2["WiFi管理"]
SYS3["BLE通信"]
SYS4["键值存储"]
end
subgraph 硬件层["🔴 硬件层"]
H1["麦克风"]
H2["扬声器"]
H3["屏幕"]
H4["LED"]
end
应用层 --> 服务层
服务层 --> 系统层
系统层 --> 硬件层
style 应用层 fill:#E3F2FD,stroke:#1976D2
style 服务层 fill:#FFF8E1,stroke:#F57C00
style 系统层 fill:#E8F5E9,stroke:#388E3C
style 硬件层 fill:#FFEBEE,stroke:#D32F2F
3.2 核心软件模块
flowchart TB
subgraph 应用层["🔵 应用层"]
direction LR
APP1["语音交互"]
APP2["屏幕UI"]
APP3["按键响应"]
APP4["闹钟"]
end
subgraph 服务层["🟡 服务层"]
direction LR
SVC1["唤醒检测<br/>(本地)"]
SVC2["配网服务<br/>(BLE)"]
SVC3["云端连接<br/>(WebSocket)"]
SVC4["音频播放"]
end
subgraph 系统层["🟢 系统层"]
direction LR
SYS1["WiFi管理"]
SYS2["BLE通信"]
SYS3["文件系统"]
SYS4["键值存储"]
end
应用层 --> 服务层 --> 系统层
style 应用层 fill:#E3F2FD,stroke:#1976D2
style 服务层 fill:#FFF8E1,stroke:#F57C00
style 系统层 fill:#E8F5E9,stroke:#388E3C
四、配网流程:设备如何连上WiFi?
新设备第一次使用,需要告诉它:你家的WiFi密码是什么?
4.1 BLE配网流程
flowchart TB
subgraph 阶段一["🔵 阶段一:用户触发"]
P1["按下配网按钮(K3)"]
P2["设备开启BLE广播"]
P3["手机小程序发现设备"]
end
subgraph 阶段二["🟡 阶段二:BLE数据交换"]
B1["手机发送WiFi信息<br/>SSID + 密码"]
B2["设备返回身份信息<br/>productId + secretId"]
end
subgraph 阶段三["🟢 阶段三:Token获取"]
T1["手机→云端验证身份"]
T2["云端→手机返回Token"]
T3["手机→设备BLE发送Token"]
T4["设备存储Token到键值分区"]
end
subgraph 阶段四["🟣 阶段四:联网上线"]
W1["设备连接WiFi"]
W2["获取IP地址"]
W3["携带Token建立云端连接"]
W4["连接成功,设备在线!"]
end
阶段一 --> 阶段二 --> 阶段三 --> 阶段四
style 阶段一 fill:#E3F2FD,stroke:#1976D2
style 阶段二 fill:#FFF8E1,stroke:#F57C00
style 阶段三 fill:#E8F5E9,stroke:#388E3C
style 阶段四 fill:#F3E5F5,stroke:#7B1FA2
style P1 fill:#E3F2FD,stroke:#1976D2
style W4 fill:#E8F5E9,stroke:#388E3C
4.2 BLE配网数据包格式
设备通过BLE接收WiFi信息,协议设计精巧:
来自 linuxros.cn · linuxROS
flowchart TB
subgraph 数据包["BLE配网数据包 (20字节)"]
VER["ver<br/>1B"]
TYPE["type<br/>1B"]
LEN["len<br/>1B"]
FLAG["flag<br/>2B"]
OPCODE["opcode<br/>1B"]
DATA["data<br/>14B"]
end
subgraph 操作码["操作码说明"]
OP1["0xA001 开始配网"]
OP2["0xA002 发送SSID"]
OP3["0xA003 发送密码"]
OP4["0xA010 配网完成"]
OP5["0xA012 请求认证信息"]
end
OPCODE --> OP1
OPCODE --> OP2
OPCODE --> OP3
OPCODE --> OP4
OPCODE --> OP5
style VER fill:#E3F2FD,stroke:#1976D2
style TYPE fill:#E3F2FD,stroke:#1976D2
style LEN fill:#E3F2FD,stroke:#1976D2
style FLAG fill:#FFF8E1,stroke:#F57C00
style OPCODE fill:#FFF8E1,stroke:#F57C00
style DATA fill:#E8F5E9,stroke:#388E3C
五、云端认证:设备如何证明"我是正品"?
设备连接云端,不是谁都能连,需要证明身份。
5.1 三元组体系
flowchart TB
subgraph 三元组["🔵 设备身份三元组"]
PID["product_id<br/>产品ID"]
SID["secret_id<br/>密钥"]
DID["device_id<br/>设备ID"]
end
subgraph 云端生成["🟢 云端生成"]
G1["同产品所有设备相同"]
G2["同产品所有设备共享"]
end
subgraph 芯片生成["🟡 芯片硬件生成"]
G3["每个设备唯一<br/>由芯片UID生成"]
end
PID --> G1
SID --> G2
DID --> G3
style PID fill:#E3F2FD,stroke:#1976D2
style SID fill:#FFF8E1,stroke:#F57C00
style DID fill:#E8F5E9,stroke:#388E3C
类比理解:product_id 像"产品许可证号",secret_id 像"产品密码",device_id 像"设备身份证号"。
5.2 认证流程
flowchart TB
subgraph 设备端["🔵 设备端"]
D1["读取芯片唯一ID<br/>生成device_id"]
D2["SNTP时间同步"]
D3["生成checksum<br/>MD5(secret+device_id+时间戳)"]
D4["POST /auth/tokens<br/>发送认证请求"]
end
subgraph 云端["🟢 云端"]
C1["接收请求参数<br/>productId / deviceId / curtime / checksum"]
C2["用存储的secret<br/>重新计算并比对checksum"]
C3["生成JWT Token<br/>含productId+deviceId+有效期"]
C4["返回Token给设备"]
end
subgraph 验证["🟡 身份验证"]
V1["携带Token<br/>建立WebSocket连接"]
V2["云端验证Token签名"]
V3["验证通过!连接成功"]
end
D1 --> D2 --> D3 --> D4
D4 -->|"认证请求"| C1
C1 --> C2 --> C3 --> C4
C4 -->|"返回Token"| V1
V1 --> V2 --> V3
style 设备端 fill:#E3F2FD,stroke:#1976D2
style 云端 fill:#E8F5E9,stroke:#388E3C
style 验证 fill:#FFF8E1,stroke:#F57C00
style V3 fill:#E8F5E9,stroke:#388E3C
5.3 键值存储:配置如何保存?
设备断电后配置不能丢失,使用键值存储(Key-Value Store,类似小数据库):
| Key | Value | 说明 |
|---|---|---|
user.pid |
产品ID | 云端分配 |
user.sid |
密钥 | 云端分配 |
user.device.id |
设备ID | 芯片UID生成 |
user.wifi.0.ssid |
WiFi名称 | 用户输入 |
user.wifi.0.pwd |
WiFi密码 | 用户输入(加密存储) |
user.volume |
音量值 | 用户配置 |
user.brightness |
屏幕亮度 | 用户配置 |
六、语音交互:设备如何"听懂"你的话?
6.1 完整语音交互流程
flowchart TB
subgraph 设备采集["🔵 设备端:语音采集"]
A1["用户说话"]
A2["麦克风采集音频"]
A3["本地唤醒词检测"]
A4["VAD判断是否说话结束"]
A5["音频编码"]
end
subgraph 云端处理["🟢 云端:语义理解"]
B1["接收音频流"]
B2["ASR语音识别<br/>音频→文字"]
B3["NLU语义理解<br/>文字→意图"]
B4["LLM大模型<br/>生成回答"]
B5["TTS语音合成<br/>文字→语音"]
end
subgraph 设备执行["🟣 设备端:响应执行"]
C1["接收云端响应"]
C2["播放TTS音频"]
C3["更新屏幕显示"]
C4["返回待机状态"]
end
A1 --> A2 --> A3 --> A4 --> A5
A5 -->|"发送音频"| B1
B1 --> B2 --> B3 --> B4 --> B5
B5 -->|"返回TTS音频"| C1
C1 --> C2 --> C3 --> C4
style A3 fill:#E8F5E9,stroke:#388E3C
style B2 fill:#E3F2FD,stroke:#1976D2
style B3 fill:#E3F2FD,stroke:#1976D2
style B4 fill:#F3E5F5,stroke:#7B1FA2
style B5 fill:#E3F2FD,stroke:#1976D2
style C4 fill:#FFF8E1,stroke:#F57C00
6.2 各环节详解
| 环节 | 全称 | 功能 | 位置 |
|---|---|---|---|
| 唤醒检测 | Wake Word Detection | 检测唤醒词(如"小艺小艺") | 本地 |
| VAD | Voice Activity Detection | 判断是否在说话 | 本地 |
| ASR | Automatic Speech Recognition | 语音→文字 | 云端 |
| NLU | Natural Language Understanding | 理解意图 | 云端 |
| LLM | Large Language Model | 生成回答 | 云端 |
| TTS | Text To Speech | 文字→语音 | 云端 |
6.3 为什么要本地检测唤醒词?
flowchart TB
subgraph 方案A["🔴 方案A:全部云端处理(不推荐)"]
A1["一直录音"] --> A2["一直发送音频"]
A2 --> A3["一直联网"]
A3 --> A4["功耗极高<br/>设备很快没电"]
end
subgraph 方案B["🟢 方案B:本地唤醒+云端处理(推荐)"]
B1["待机状态<br/>仅运行唤醒检测 ~μW级"]
B1 -->|"检测到唤醒词"| B2["激活WiFi"]
B2 --> B3["连接云端发送音频"]
B3 --> B4["处理完毕返回待机"]
B4 --> B1
end
style A4 fill:#FFEBEE,stroke:#D32F2F
style 方案A fill:#FFEBEE,stroke:#D32F2F
style 方案B fill:#E8F5E9,stroke:#388E3C
B1 -.->|"低功耗待机<br/>几乎不耗电"| B4
七、WebSocket:云端和设备如何"保持通话"?
7.1 为什么用WebSocket?
flowchart TB
subgraph HTTP["🔴 HTTP 轮询模式"]
H1["设备→请求"] --> H2["云端→响应"]
H2 --> H3["连接断开"]
H3 -.->|"每次新建连接<br/>延迟高消耗大"| H1
end
subgraph WS["🟢 WebSocket 长连接模式"]
W1["设备←→云端"]
W1 ==> W1
end
style HTTP fill:#FFEBEE,stroke:#D32F2F
style WS fill:#E8F5E9,stroke:#388E3C
7.2 长连接交互模式
flowchart TB
subgraph 建立连接["🔵 阶段一:建立连接"]
C1["设备→云端 建立WebSocket连接"]
C2["云端→设备 返回连接成功确认"]
end
subgraph 语音对话["🟢 阶段二:语音对话"]
S1["设备发送 action:start"]
S2["云端返回 action:started"]
S3["设备发送BINARY音频数据"]
S4["云端返回JSON识别结果"]
S5["设备发送 action:end"]
S6["云端返回 action:finish"]
end
subgraph 复用连接["🟡 阶段三:连接复用"]
R1["设备发送 action:start 新一轮对话"]
R2["云端返回 action:started 复用已有连接"]
R3["长连接持续复用 无需重新建立!"]
end
建立连接 --> 语音对话 --> 复用连接
style 建立连接 fill:#E3F2FD,stroke:#1976D2
style 语音对话 fill:#E8F5E9,stroke:#388E3C
style 复用连接 fill:#FFF8E1,stroke:#F57C00
style R3 fill:#FFF8E1,stroke:#F57C00
八、云端配置下发:设备配置如何更新?
设备不只是被动执行,还能接收云端配置更新:
flowchart TB
subgraph 云端["🔵 云端配置"]
C1["产品配置"]
C2["主题配置"]
C3["TTS音色"]
C4["技能列表"]
C5["MCP工具"]
end
subgraph 设备["🟢 设备端"]
D1["接收配置"]
D2["存储配置"]
D3["应用到UI"]
D4["应用到功能"]
end
云端 -->|"配置下发"| 设备
D1 --> D2 --> D3 --> D4
style 云端 fill:#E3F2FD,stroke:#1976D2
style 设备 fill:#E8F5E9,stroke:#388E3C
8.1 云端可下发的配置
| 配置类型 | 说明 | 示例 |
|---|---|---|
| 主题 | 待机界面文字/动画 | 品牌定制内容轮播 |
| TTS音色 | 语音播报音色 | 儿童音/成人音 |
| 技能列表 | 支持的功能 | 闹钟/音乐/天气 |
| 唤醒词 | 唤醒词配置 | 品牌唤醒词 |
| 二维码 | 配网引导码 | 设备绑定 |
九、安全机制:设备如何保证安全?
9.1 安全分层
flowchart TB
subgraph 第一层["🔵 第一层:通信安全"]
L1A["HTTPS/WSS 加密传输"]
L1B["WebSocket over TLS"]
L1C["防止中间人攻击"]
end
subgraph 第二层["🟡 第二层:身份认证"]
L2A["productId + secret 验证"]
L2B["时间戳 + checksum 防重放"]
L2C["JWT Token 短期有效"]
end
subgraph 第三层["🟢 第三层:存储安全"]
L3A["键值分区与系统分区分离"]
L3B["敏感信息加密存储"]
end
第一层 --> 第二层 --> 第三层
style 第一层 fill:#E3F2FD,stroke:#1976D2
style 第二层 fill:#FFF8E1,stroke:#F57C00
style 第三层 fill:#E8F5E9,stroke:#388E3C
9.2 重放攻击防护
flowchart TB
subgraph 攻击场景["🔴 攻击者截获请求"]
ATT["攻击者复制请求<br/>curtime: 10:00:00<br/>checksum: abc123"]
end
subgraph 云端检测["🟢 云端检查机制"]
CHECK{"当前时间 - curtime > 5分钟?"}
REJECT["拒绝请求"]
PASS["通过验证"]
end
ATT -.->|"发送复制请求"| CHECK
CHECK -->|"是"| REJECT
CHECK -->|"否"| PASS
style 攻击场景 fill:#FFEBEE,stroke:#D32F2F
style CHECK fill:#FFF8E1,stroke:#F57C00
style REJECT fill:#FFEBEE,stroke:#D32F2F
style PASS fill:#E8F5E9,stroke:#388E3C
十、总结:AIOT设备的"灵魂"
10.1 核心架构图
flowchart TB
subgraph 用户["🟣 用户"]
U1["语音指令"]
U2["屏幕触摸"]
U3["按键操作"]
end
subgraph 设备端["🔵 设备端"]
E1["本地唤醒"]
E2["本地VAD"]
E3["云端通信"]
E4["本地执行"]
end
subgraph 云端["🟢 云端"]
C1["ASR 语音识别"]
C2["NLU 语义理解"]
C3["LLM 大模型"]
C4["TTS 语音合成"]
C5["技能服务"]
end
用户 --> 设备端
设备端 --> 云端
云端 --> 设备端 --> 用户
云端 --> C1 --> C2 --> C3 --> C4
C5 --> E4
style 用户 fill:#F3E5F5,stroke:#7B1FA2
style 设备端 fill:#E3F2FD,stroke:#1976D2
style 云端 fill:#E8F5E9,stroke:#388E3C
10.2 AIOT设备的特点
| 特点 | 说明 |
|---|---|
| 本地+云端协同 | 唤醒本地、云端智能 |
| 实时响应 | WebSocket保持连接 |
| 持续学习 | 云端模型更新 |
| 低功耗设计 | 待机仅唤醒检测 |
| 安全可靠 | 多层认证加密 |
10.3 一句话总结
一款"听话"的AIOT设备,本质是一个"本地感官+云端大脑"的协作系统:本地负责"听"和"做",云端负责"懂"和"想"。
附录:术语表
| 缩写 | 全称 | 中文 |
|---|---|---|
| AIOT | AI + IoT | 人工智能物联网 |
| ASR | Automatic Speech Recognition | 自动语音识别 |
| NLU | Natural Language Understanding | 自然语言理解 |
| LLM | Large Language Model | 大语言模型 |
| TTS | Text To Speech | 语音合成 |
| VAD | Voice Activity Detection | 语音活动检测 |
| WebSocket | WebSocket | 双工通信协议 |
| BLE | Bluetooth Low Energy | 低功耗蓝牙 |
| KV | Key-Value | 键值存储 |
| JWT | JSON Web Token | JSON网络令牌 |
| MCP | Model Context Protocol | 模型上下文协议 |
本文基于开源代码分析整理,以通俗易懂的方式解析AIOT设备的核心技术原理。