注:本教程属于功能验证性质
思维导图:
1、搭建MQTT服务器(腾讯云为例)
- 购买云服务器,镜像选择为ubuntu系统,服务器的概要页面的网络信息栏中点击管理规则,自行添加8083、1883、18083端口,(详情查看EMQX的文档说明:链接,其中18083为web控制端:链接)。
- 设置云服务器的登陆密码,腾讯云的ubuntu默认不能使用root用户,需修改(参考:链接))。
- ssh连接云服务器,在emqx的文档中找到shell脚本安装命令(链接))安装完成后启动EMQX服务(后台启动:链接)。
- 浏览器中输入 服务器公网ip+:18083 访问,默认账户admin,密码public在设置中更换中文显示,点击工具栏的Websocket,点击连接。
- 打开MQTT.fx,新建连接,测试发送消息是否能成功接收。
2、购买域名并配置SSL证书到MQTT服务器
(该部分参考emqx的文档说明)
- 购买域名后添加域名解析(mqtt.域名),再在域名解析中添加解析记录,类型为TXT,验证…
- 下载证书,选择“其他”,解压出后缀为.key和.pem的两个文件,修改为mqtt.key,mqtt.pem,将两个文件复制到服务器的 /bin/etc/emqx/certs 目录下。
- 修改nano /etc/emqx/emqx.conf文件,在emqx文档中找到要修改的配置项(链接)):
- listener.ssl.external.keyfile:指定SSL的私钥文件。
- listener.ssl.external.certfile:指定SSL的证书文件。
- listener.ssl.external.cacertfile:指定 SSL 的 CA 证书文件。
将文件名修改为mqtt.key,mqtt.pem,然后重启emqx服务。
3、esp8266测试
arduino代码:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>// WiFi
const char *ssid = "luobo"; //WiFi name
const char *password = "88888888"; //WiFi password// MQTT Broker
const char *mqtt_broker = "mqtt.luomingxiong.xyz"; //域名或IP地址
const char *topic = "esp8266/led"; //topic
const char *mqtt_username = "admin"; //默认为admin
const char *mqtt_password = "public";
const int mqtt_port = 1883; //1883端口WiFiClient espClient;
PubSubClient client(espClient);void setup() {// Set software serial baud to 115200;Serial.begin(115200);pinMode(LED_BUILTIN, OUTPUT);// connecting to a WiFi networkWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.println("Connecting to WiFi..");}Serial.println("Connected to the WiFi network");//connecting to a mqtt brokerclient.setServer(mqtt_broker, mqtt_port);client.setCallback(callback);while (!client.connected()) {String client_id = "esp8266-client-";client_id += String(WiFi.macAddress());Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {Serial.println("Public emqx mqtt broker connected");} else {Serial.print("failed with state ");Serial.print(client.state());delay(2000);}}// publish and subscribeclient.publish(topic, "hello emqx");client.subscribe(topic);
}void callback(char *topic, byte *payload, unsigned int length) {Serial.print("Message arrived in topic: ");Serial.println(topic);Serial.print("Message:");String message;for (int i = 0; i < length; i++) {message = message + (char) payload[i]; // convert *byte to string}Serial.print(message);if (message == "on") { digitalWrite(LED_BUILTIN, LOW); } // LED onif (message == "off") { digitalWrite(LED_BUILTIN, HIGH); } // LED offSerial.println();Serial.println("-----------------------");
}void loop() {client.loop();
}
复制到arduino IDE,下载的esp8266中,通过Websocket测试(域名+:18083),主题为esp8266/led,发送on开灯,off关灯
4、Linux下QT导入MQTT模(源码移植)
参考:链接
测试程序:
- 创建界面
- 编写代码
单击连接按钮的槽函数:
void Widget::on_connectBt_clicked()
{mqtt = new QMQTT::Client(QHostAddress(QString(ui->hostLe->text())),ui->portLe->text().toInt());connect(mqtt, SIGNAL(connected()), this, SLOT(mqtt_connect_success()));connect(mqtt, SIGNAL(disconnected()), this, SLOT(mqtt_disconnect()));connect(mqtt, SIGNAL(subscribed(QString,quint8)), this, SLOT(mqtt_sub_success()));connect(mqtt, SIGNAL(received(QMQTT::Message)), this, SLOT(mqtt_recv_msg(QMQTT::Message)));mqtt->setClientId("Qt-test0x10"); //客户端ID,任取mqtt->setUsername("admin"); //EMQx的默认用户名mqtt->setPassword("public"); //EMQx的默认密码mqtt->setCleanSession(true);mqtt->connectToHost(); //连接mqtt
}
- 测试
输入云服务器的ip地址、端口、主题,点击连接,订阅,发布:
EMQx的后台连接:
成功接收到“hello”
完整工程代码:
5、Linux安装QT for Android
安装参考链接
需要注意的地方:
-
版本尽量与参考链接里的保持一致,否则会有很多问题,特别是QT的版本
多次尝试均失败后(一直报错:”All essential packages installed …“)。百度了一圈链接,原来是在某个文件中显示安装的安卓环境是只支持Qt5.12.[0-5]以及5.13.[0-1]的,而我原来用的版本是5.12.9,这点在官方文档中并没有说明。 -
在配置环境变量的时候,如果修改后仍有问题,就在~/.bashrc中同样配置一次,并且执行source ~/.bashrc命令让配置生效。
-
如果在打开安卓模拟器时提示/dev/kvm device:permission denied,参考链接解决。
6、esp8266与手机APP通信
手机APP测试:
手机APP的订阅主题与esp8266代码中保持一致,即可通过手机APP发送”on“,”off“控制LED灯亮灭。
7、语音唤醒及识别
- 硬件部分:使用夸克开发板(全志H3芯片,也可使用树莓派或者其他能运行ubuntu的开发板)。
- 软件部分:参考开源项目wukong-robot(链接)
8、“小爱同学”离线唤醒关键词训练
离线唤醒关键词的识别使用的是一个开源引擎叫snowboy,但官方在2021年之后就关闭了线上训练功能,因此需要把源码下载到自己的ubuntu系统中进行本地训练关键词模型。snowboy源码地址,详细步骤可参考github中的文档说明。
注意:在开发板上搭建训练的环境可能会报错,因此建议在电脑的ubuntu系统中搭建(一定要是16版本的)。搭建好后用开发板录制音频,然后通过电脑训练出模型。
[参考链接](snowboy本地模型训练 基于树莓派4b | Never的个人博客 (gitee.io))
9、wukong通过mqtt控制esp8266
- wukong-robot的安装与配置参考文档。
- esp8266的代码参考wukong-robot文档。
10、wukong-robot与app控制esp8266
- 将订阅主题和发布主题修改为“开发板一”,发送“开灯”,“关灯”或者“on”,“off”即可控制esp8266的灯亮灭
- 通过语音识别“开灯”,“关灯”也可控制灯亮灭。
11、通过hass控制小米、华为、苹果等智能家居设备
待补充。。。