ESC
输入关键词搜索文章标题和内容

从零打造一款会"听话"的智能设备:一文读懂AIOT产品核心技术

本文由 linuxROS 整理发布,首发于 linuxros.cn,转载请注明出处。

从零打造一款会"听话"的智能设备:一文读懂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设备的核心技术原理。

版权声明

作者linuxROS
协议本作品采用 CC BY-NC-SA 4.0 许可协议:署名-非商业性使用-相同方式共享
关注欢迎关注微信公众号 linuxROS,获取更多机器人 / 嵌入式 / Linux 干货
返回首页