i.MX8MP LPDDR4 EVK 作为 RT106L/S 语音识别百度云控制系统的核心客户端,依托 MQTT 协议实现与百度云端的通信交互,完成远程设备控制、指令解析与任务执行等核心功能,其设计围绕硬件适配、软件编译、协议对接、代码开发与联调测试全流程展开,最终实现了语音指令到设备动作的无缝衔接,也是嵌入式设备接入云平台实现远程控制的典型落地方案。
资料获取:i.MX8MP客户端的设计
1. i.MX8MP 客户端的核心应用场景与系统架构
在 RT106L/S 语音识别百度云控制系统中,i.MX8MP LPDDR4 EVK 与 MIMXRT1060-EVK 共同作为系统客户端,承担着远程指令接收、解析与设备控制的核心职责。整个系统以 SLN-LOCAL/2-IOT 语音识别开发板为前端,通过 “小恩小恩” 等唤醒词触发语音识别,可接收开 / 关红绿灯、灯闪烁、开 / 关远程灯、开 / 关音乐、开 / 关显示等多类语音指令。
其中,本地红绿灯控制指令由开发板直接执行,而远程灯、音乐、显示等控制指令,则由 SLN-LOCAL/2-IOT 通过 WIFI 模块接入互联网,基于 MQTT 协议将 JSON 格式数据包发布至百度云端;i.MX8MP LPDDR4 EVK 作为订阅端,接收云端数据并完成解析,最终转化为具体的设备控制动作。同时,PC 端可通过 MQTT.fx 软件直接与云端交互,实现对 i.MX8MP 客户端的手动远程控制,形成 “语音识别 - 云端转发 - 客户端执行” 的完整闭环。
在协议选择上,系统采用 MQTT 消息队列遥测传输协议,该协议基于 TCP/IP 协议族,专为硬件性能有限的远程设备和恶劣网络环境设计,具备轻量、简单、易实现的特性。实际开发中选用 Mosquitto 作为 MQTT 协议的实现工具,其核心优势在于可同时作为消息发布者、订阅者和服务器,功能全覆盖性满足了系统对协议实现工具的多维度需求,这也是其相较于其他 MQTT 实现工具的核心竞争力。
2. i.MX8MP 客户端开发的前期准备工作
开展 i.MX8MP LPDDR4 EVK 客户端设计,需完成硬件平台搭建与软件环境配置的双重准备,二者的适配性直接决定后续开发与测试的顺利推进,具体配置与操作如下:
2.1 核心硬件与软件基础配置
硬件层面需准备 i.MX8MP LPDDR4 EVK 开发板与 HDMI 屏,开发板作为核心运算与控制载体,HDMI 屏则用于实现显示类指令的结果输出,如视频播放等功能;软件层面选定 Linux LF6.1.1_1.0.0 版本 BSP 作为开发基础,开发主机需搭载 Windows 10 或 Ubuntu 20.04 系统,其中 Ubuntu 20.04 为源码编译的核心环境。
2.2 i.MX8MP 源码的编译操作
源码编译需在 Ubuntu 20.04 环境下完成,核心分为依赖包安装、Repo utility 配置、Yocto Project 设置与源码下载编译四步:
- 安装主机必备依赖包,通过 sudo apt-get install 命令安装 gawk、wget、git-core 等各类工具,覆盖编译、传输、解析等全流程需求;
- 配置 Repo utility,在 home 文件夹创建 bin 目录并下载 repo 工具,添加执行权限后将 bin 目录加入系统 PATH 环境变量,确保工具可全局调用;
- 完成 Yocto Project 基础设置,通过 git config 配置用户名与邮箱,验证配置信息后创建编译文件夹;
- 下载并编译源码,通过 repo init 命令关联 NXP 官方源码仓库,指定分支与版本后执行 repo sync 完成源码下载,再通过 DISTRO 与 MACHINE 指定编译参数,执行 bitbake imx-image-full 完成编译,生成 images 镜像文件与平台源代码。
2.3 Yocto 平台中 MQTT 功能的集成编译
系统源码中已内置 MQTT 代码包,无需额外下载,仅需在 Yocto 编译配置中添加 Mosquitto 组件即可实现 MQTT 功能集成。具体操作是在 /home/nxa07019/imx-yocto-bsp/buildwayland/conf/local.conf 配置文件中,添加 IMAGE_INSTALL:append = "mosquitto" 指令,完成配置后重新执行源码编译命令,生成的 images 镜像文件将直接支持 MQTT 协议,为后续客户端与云端的通信奠定基础。
3. i.MX8MP 客户端的固件烧写与设备启动
编译生成支持 MQTT 的镜像文件后,需将其烧写至 i.MX8MP LPDDR4 EVK 开发板的 EMMC 中,再完成设备启动设置,核心依托 NXP 官方的 UUU 工具实现,该工具是 mfgtool 的升级版本,适配所有 BSP 版本且操作便捷,具体步骤如下:
- 下载 UUU 工具,根据开发主机系统选择 Windows 版本的 uuu.exe 或 Linux 版本的 uuu,将工具拷贝至镜像文件所在目录,注意需选择与当前 BSP 版本匹配的 UUU 工具版本;
- 配置开发板下载模式,将开发板的 BOOT MODE 开关 SW4 修改为 0001,进入固件下载模式;
- 执行烧写命令,通过.\uuu.exe -b emmc_all 指令,指定烧写的 boot 文件与 rootfs 镜像文件,完成固件向 EMMC 的烧写;
- 切换开发板至启动模式,将 SW4 修改为 0010,设置为从 EMMC 启动,打开串口后启动开发板,可通过串口查看完整的启动信息,确认设备硬件与固件正常运行。
4. i.MX8MP 客户端的 MQTT 功能测试
设备正常启动后,需先完成 MQTT 功能的基础测试,验证客户端与百度云端的通信连通性,这是后续开发与联调的前提,核心注意事项与操作步骤如下:
4.1 网络环境配置要求
测试阶段需搭建独立网络环境,将路由器接入个人手机热点,避免使用公司网络(公司网络会屏蔽百度云端数据),导致通信失败。i.MX8MP LPDDR4 EVK 开发板自带千兆网网卡,支持有线和 WIFI 两种联网方式,可根据实际环境灵活选择,只需确保开发板与百度云端网络互通即可。
4.2 MQTT 通信连通性测试操作
测试的核心是通过 Mosquitto 工具实现开发板对百度云端指定主题的订阅,验证订阅指令执行后开发板能否被云端识别。订阅指令需明确云端域名、用户名、密码、订阅主题与端口号,具体指令为:./mosquitto_sub -h "akxfflk.iot.gz.baidubce.com" -u "thingidp@akxfflk|RT1060BTCDShadow|0|SHA256" -P "60859bbc10e4e32023bae0f232e4dcc0cdcef217f01f88054fd1ac20bc3f1a9e" -t '$iot/RT1060BTCDShadow/user/LEDStatus' -p 1883。
指令中,-h 指定百度云 MQTT 服务器域名,-u 和 - P 分别为云端认证的用户名与密码,-t 为订阅的核心主题,-p 指定通信端口 1883。若指令执行后开发板成功被云端识别,无报错信息,则说明 MQTT 协议通信正常,i.MX8MP LPDDR4 EVK 可作为合格的 MQTT 客户端开展后续开发。
5. i.MX8MP 客户端的代码开发与指令解析实现
完成 MQTT 通信测试后,需基于 Mosquitto 源码进行二次开发,实现云端数据的解析与设备控制指令的执行,核心围绕代码下载、JSON 数据处理、业务逻辑编写展开,这也是客户端实现 “数据接收 - 指令解析 - 动作执行” 的核心环节。
5.1 Mosquitto 源码的下载与编译
从 GitHub 官方仓库https://github.com/eclipse/mosquitto/tree/master下载 Mosquitto 源码,采用 cmake 工具完成编译,编译完成后进入 /master/client 目录进行代码修改,核心修改文件为 sub_client.c,该文件承担着云端接收数据的 payload 解析核心职责。
5.2 JSON 数据的转义处理要点
这是开发过程中的关键难点,也是容易出现问题的环节。无论是向云端发布的消息,还是从云端接收的消息,均不能直接使用标准 JSON 格式,必须进行压缩转义处理。例如标准 JSON 格式 {"reported": {"LEDstatus": false, "humid": 88, "temp": 22}},需通过 bejson 工具转义为 {""reported": { "LEDstatus": true, "humid": 88, "temp": 11 }},才能被代码正常解析。若跳过转义步骤,代码将无法识别 JSON 数据,导致指令解析失败。
5.3 核心业务逻辑的代码编写
代码开发的核心是基于转义后的 JSON 数据,编写条件判断逻辑,实现不同指令的差异化执行。以显示控制指令为例,代码中通过 strcmp 函数判断接收的 payload 数据是否为显示开启的转义 JSON 格式,涵盖 LEDstatus 和 voice 的不同状态组合,只要 display 字段为 true,即触发视频播放指令。
具体执行逻辑为:当识别到 display true 时,代码先打印 payload 数据与 “Play Video” 提示信息,再通过 system ("/usr/bin/gst-play-1.0 /home/root/client/ChinaTest1.mp4") 指令,调用开发板中的 gst-play-1.0 工具,播放预先存放于指定路径的测试视频,视频画面将通过 HDMI 屏输出;当识别到 display false 时,代码则打印提示信息,不执行任何显示操作。代码修改完成后重新编译,确保逻辑无报错后,即可开展联合测试。
6. i.MX8MP 客户端的联网联合测试与功能落地
联合测试是验证 i.MX8MP 客户端全流程功能的关键,需实现 “语音识别 - 云端发布 - 客户端接收 - 指令执行” 的端到端验证,核心完成客户端与服务器端的网络互通与指令联动,具体测试流程如下:
- 网络环境确认,确保 i.MX8MP LPDDR4 EVK 客户端与百度云服务器均接入同一可互通的网络,无防火墙或屏蔽限制;
- 客户端启动订阅,在编译好的代码路径下,重新执行 MQTT 订阅指令,使客户端进入等待云端消息的状态;
- 触发云端消息发布,通过语音识别系统说出 “开显示” 指令,SLN-LOCAL/2-IOT 开发板识别指令后,向百度云端发布指定 JSON 格式消息,发布指令为:mosquitto_pub -h "akxfflk.iot.gz.baidubce.com" -u "thingidp@akxfflk|RT1060BTCDShadow|0|SHA256" -P "60859bbc10e4e32023bae0f232e4dcc0cdcef217f01f88054fd1ac20bc3f1a9e" -t '$iot/RT1060BTCDShadow/user/LEDStatus' -m '{"reported":{"LEDstatus":false,"voice":false,"display":true}}' -p 1883;
- 客户端指令执行与结果验证,i.MX8MP 客户端接收到云端发布的 display true 消息后,自动解析并执行视频播放脚本,HDMI 屏上将正常播放预先存放的测试视频,至此完成整个远程控制流程的验证。
7. i.MX8MP 客户端设计的核心总结与设计价值
i.MX8MP LPDDR4 EVK 客户端的设计,本质是嵌入式设备基于 MQTT 协议接入云平台实现远程控制的标准化落地方案,其核心设计逻辑为:以 Linux BSP 为软件基础,通过 Yocto 平台集成 Mosquitto 实现 MQTT 协议支持,经固件烧写与设备启动完成硬件适配,再通过 Mosquitto 源码二次开发实现 JSON 数据解析与业务逻辑编写,最终通过联网联调实现与百度云端的无缝通信。
在实际应用中,该客户端可接收语音识别系统的远程控制指令,通过 “云端订阅 - 数据解析 - 指令执行” 的流程,实现灯控、音乐、显示等多类设备的远程操作,同时支持 PC 端手动云端控制,具备多端联动、操作灵活的特性。
从技术层面来看,该设计充分发挥了 MQTT 协议轻量、适配嵌入式设备的优势,解决了嵌入式设备与云平台的通信适配问题,同时明确了 JSON 数据转义、Mosquitto 二次开发等关键技术要点,为后续同类嵌入式客户端的设计提供了可复制、可参考的实施流程;从应用层面来看,该设计实现了语音识别技术与云平台、嵌入式设备的结合,为智能语音控制、远程物联网设备管理等场景提供了切实可行的硬件与软件解决方案,具备较强的实际落地价值。
382