注:本教程属于功能验证性质
思维导图:
- 购买云服务器,镜像选择为ubuntu系统,服务器的概要页面的网络信息栏中点击管理规则,自行添加8083、1883、18083端口,(详情查看EMQX的文档说明:链接,其中18083为web控制端:链接)。设置云服务器的登陆密码,腾讯云的ubuntu默认不能使用root用户,需修改(参考:链接))。ssh连接云服务器,在emqx的文档中找到shell脚本安装命令(链接))安装完成后启动EMQX服务(后台启动:链接)。浏览器中输入 服务器公网ip+:18083 访问,默认账户admin,密码public在设置中更换中文显示,点击工具栏的Websocket,点击连接。打开MQTT.fx,新建连接,测试发送消息是否能成功接收。
(该部分参考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#include // 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 network WiFi.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 broker client.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 brokern", 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 subscribe client.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 on if (message == "off") { digitalWrite(LED_BUILTIN, HIGH); } // LED off Serial.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灯亮灭。
- 硬件部分:使用夸克开发板(全志H3芯片,也可使用树莓派或者其他能运行ubuntu的开发板)。软件部分:参考开源项目wukong-robot(链接)
离线唤醒关键词的识别使用的是一个开源引擎叫snowboy,但官方在2021年之后就关闭了线上训练功能,因此需要把源码下载到自己的ubuntu系统中进行本地训练关键词模型。snowboy源码地址,详细步骤可参考github中的文档说明。
注意:在开发板上搭建训练的环境可能会报错,因此建议在电脑的ubuntu系统中搭建(一定要是16版本的)。搭建好后用开发板录制音频,然后通过电脑训练出模型。
[参考链接](snowboy本地模型训练 基于树莓派4b | Never的个人博客 (gitee.io))
wukong-robot的安装与配置参考文档。esp8266的代码参考wukong-robot文档。 10、wukong-robot与app控制esp8266
将订阅主题和发布主题修改为“开发板一”,发送“开灯”,“关灯”或者“on”,“off”即可控制esp8266的灯亮灭通过语音识别“开灯”,“关灯”也可控制灯亮灭。 11、通过hass控制小米、华为、苹果等智能家居设备
待补充。。。



