【XR806开发板试用】自带mqtt的调试教学

  • 1、下载代码
mkdir xr806_openharmony
cd xr806_openharmony
repo init -u ssh://git@gitee.com/openharmony-sig/manifest.git -b OpenHarmony_1.0.1_release --no-repo-verify -m devboard_xr806.xml
repo sync -c
repo forall -c 'git lfs pull'   
**最近仓库在整合,如果下载不了可以去论坛找一下临时仓替换即可**
  • 2、环境配置
https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-lite-env-setup.md#/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-lite-env-setup-linux.md
  • 3、编译准备
https://xr806.docs.aw-ol.com/study/soft_compile/

要注意的是教程里面的这一步文件名是错的,要把deconfig替换成defconfig
在这里插入图片描述

之后的make menuconfig这一步不用修改,直接选择save生成.config文件即可

如果出现了替代文字

可以打开
/device/xradio/xr806/xr_shylark/project/image_cfg/readme.md
查看解决教程

或者根据报错代码修改
/device/xradio/xr806/xr_shylark/project/demo/wlan_ble_demo/image/xr806/image/image_wlan_ble.cfg文件
这是我的修改过的cfg文件,可以编译通过
在这里插入图片描述

  • 4、固件烧录
https://xr806.docs.aw-ol.com/study/soft_flash/
根据教程烧录即可,使用波特率921600可以烧录更快

windows下如果烧录时报错,可以跟我这样设置

在这里插入图片描述

  • 5、使用串口进行调试,波特率设置115200,这里使用的是windows下的SSCOM
    在这里插入图片描述

调试时如果不出现消息可以点击,打开串口->重新插拔数据线->按下复位键(XR806右下角)

  • 6、这里使用ubuntu下的mosquito作为服务端
ubuntu安装mosquitto可以参考这个链接
https://www.cnblogs.com/guyk/p/12405938.html
开启mosquito服务
mosquitto -c /etc/mosquitto/mosquitto.conf -d

如果显示1883端口已占用,可以强制结束mosquito后台然后重启服务,这里我使用1884端口
在这里插入图片描述

开启服务后板子就可以连接虚拟机进行操作了,可以在mosquito下进行订阅发布信息
如果想要在windows环境下进行订阅发布,可以下载MQTT.fx工具

http://mqttfx.jensd.de/index.php/download
  • 7、mqtt代码烧录
    XR806文件夹里面,是有很多例程的,这里的代码参考自/device/xradio/xr806/xr_shylark/project/example/mqtt/main.c
#include <stdio.h>
#include "ohos_init.h"
#include "kernel/os/os.h"
#include <string.h>
#include "wifi_device.h"
#include "wifi_hotspot.h"
#include "common/framework/platform_init.h"
#include "net/wlan/wlan.h"
#include "common/framework/net_ctrl.h"
#include "net/mqtt/MQTTClient-C/MQTTClient.h"
#define WIFI_DEVICE_CONNECT_AP_SSID "Redmi"
#define WIFI_DEVICE_CONNECT_AP_PSK "00000000"
#define MQTT_DEMO_THREAD_STACK_SIZE (8 * 1024) /* ssl need more stack */
static OS_Thread_t mqtt_demo_thread;
static OS_Thread_t g_main_thread;
static MQTTPacket_connectData mqtt_demo_connectData = MQTTPacket_connectData_initializer;
static Client mqtt_demo_client;
static Network mqtt_demo_network;#define MQTT_DEMO_CLIENT_ID "mqt"
#define MQTT_DEMO_HOST_NAME "192.168.43.251"
#define MQTT_DEMO_PORT      "1884"
#define MQTT_DEMO_USERNAME  "root"
#define MQTT_DEMO_PASSWORD  ""
#define MQTT_DEMO_TOPIC     "/vo84Hm3xbUj/xr806_senor_set0/data"#define MQTT_DEMO_BUF_SIZE (2*1024)
#define WIFI_START 1
#define MQTT_DEMO_MSG_TEXT "mqtt demo test"void wifi_scan_connect(){if(WIFI_SUCCESS != EnableWifi()){printf("Error:wifi enable fail!\n");return;}if(WIFI_SUCCESS != Scan()){printf("Error:wifi scan fail!\n");}printf("WIFI SCAN STARTED!\n");OS_Sleep(3);WifiScanInfo scan_result[30];unsigned int scan_num = 30;if(WIFI_SUCCESS != GetScanInfoList(scan_result, &scan_num)){printf("Error: get scan result fail!\n");return;}printf("Scan successful,you've got:\n");for(int i = 0;i < scan_num;i++){printf("SSID: %s ",scan_result[i].ssid);printf("RSSI: %d",scan_result[i].rssi);}printf("Scan End \n");const char ssid_want_connect[] = WIFI_DEVICE_CONNECT_AP_SSID;const char psk[] = WIFI_DEVICE_CONNECT_AP_PSK;printf("Connecting...");if(WIFI_STA_ACTIVE == IsWifiActive()){printf("Wifi is active.\n");}OS_Sleep(1);WifiDeviceConfig config = {0};int netId = 0;int i;for(i = 0;i < scan_num;i++){if(0 == strcmp(scan_result[i].ssid, ssid_want_connect)){memcpy(config.ssid, scan_result[i].ssid, WIFI_MAX_SSID_LEN);memcpy(config.bssid, scan_result[i].bssid, WIFI_MAC_LEN);strcpy(config.preSharedKey, psk);config.securityType = scan_result[i].securityType;config.wapiPskType = WIFI_PSK_TYPE_ASCII;config.freq = scan_result[i].frequency;break;}}if(i >= scan_num){printf("Error: No SSID SET FOUND!\n");return;}printf("Found Correct SSID in Scan List!\n");if(WIFI_SUCCESS != AddDeviceConfig(&config, &netId)){printf("Error: Add Device config failed!\n");return;}printf("Add Device Config successful!\n");if(WIFI_SUCCESS != ConnectTo(netId)){printf("Error: Connect to Wifi FAILED!\n");return;}printf("Connect to %s successful!\n",config.ssid);OS_Sleep(3);
}
static int mqtt_demo_init(void)
{char *send_buf;char *recv_buf;/* init client id */mqtt_demo_connectData.clientID.cstring = MQTT_DEMO_CLIENT_ID;/* init keep alive interval */mqtt_demo_connectData.keepAliveInterval = 30; // 30s/* enable session reuse */mqtt_demo_connectData.cleansession = 0;/* set mqtt version */mqtt_demo_connectData.MQTTVersion = 4; //Version of MQTT 3.1.1/* send/recv buffer must free when mqtt deinit */send_buf = malloc(MQTT_DEMO_BUF_SIZE);if (send_buf == NULL) {printf("no memory\n");return -1;}recv_buf = malloc(MQTT_DEMO_BUF_SIZE);if (recv_buf == NULL) {free(send_buf);printf("no memory\n");return -1;}/* init network */NewNetwork(&mqtt_demo_network);/* init mqtt client object */MQTTClient(&mqtt_demo_client, &mqtt_demo_network, 6000,(unsigned char *)send_buf, MQTT_DEMO_BUF_SIZE,(unsigned char *)recv_buf, MQTT_DEMO_BUF_SIZE);/*** set will function, when this client disconnect,* server will sent the message to every client in MQTT_DEMO_TOPIC*/mqtt_demo_connectData.willFlag = 1;mqtt_demo_connectData.will.topicName.cstring = MQTT_DEMO_TOPIC;mqtt_demo_connectData.will.message.cstring = "I am disconnected";mqtt_demo_connectData.will.retained = 0;mqtt_demo_connectData.will.qos = 0;/* set username and password */mqtt_demo_connectData.username.cstring = MQTT_DEMO_USERNAME;mqtt_demo_connectData.password.cstring = MQTT_DEMO_PASSWORD;return 0;
}static int mqtt_demo_connect(char *host_name, char *host_port)
{int ret = -1;/* need connect the server in tcp level first, if use ssl, use TLSConnectNetwork() */ret = ConnectNetwork(&mqtt_demo_network, host_name, atoi(host_port));if (ret != 0) {printf("mqtt connect faild, ret:%d, host:%s, port:%s\n", ret, host_name, host_port);goto exit;}/* if tcp level connected, then connect mqtt level */ret = MQTTConnect(&mqtt_demo_client, &mqtt_demo_connectData);if (ret != 0) {printf("mqtt connect faild, ret:%d\n", ret);/* disconnect the tcp level */mqtt_demo_network.disconnect(&mqtt_demo_network);goto exit;}printf("mqtt connected\n");exit:return ret;
}static void mqtt_demo_msg_cb(MessageData *data)
{printf("get a message, topic: %.*s, msg: %.*s\n", data->topicName->lenstring.len,data->topicName->lenstring.data, data->message->payloadlen,(char *)data->message->payload);
}static int mqtt_demo_subscribe(char *topic)
{int ret = -1;if (mqtt_demo_client.isconnected) {/* set the message callback */ret = MQTTSubscribe(&mqtt_demo_client, topic, 0, mqtt_demo_msg_cb);if (ret != 0)printf("mqtt subscribe faild ret:%d\n", ret);}return ret;
}static int mqtt_demo_unsubscribe(char *topic)
{int ret = -1;if (mqtt_demo_client.isconnected) {ret = MQTTUnsubscribe(&mqtt_demo_client, topic);if (ret != 0)printf("mqtt unsubscribe faild, ret:%d\n", ret);}return ret;
}static int mqtt_demo_publish(char *topic, char *msg)
{int ret = -1;MQTTMessage message;memset(&message, 0, sizeof(message));message.qos = 0;message.retained = 0; /* disable retain the message in server */message.payload = msg;message.payloadlen = strlen(msg);ret = MQTTPublish(&mqtt_demo_client, topic, &message);if (ret != 0)printf("mqtt publish faild, ret:%d\n", ret);return ret;
}static int mqtt_demo_disconnect(void)
{int ret = -1;if (mqtt_demo_client.isconnected) {/* need disconnect mqtt level first */ret = MQTTDisconnect(&mqtt_demo_client);if (ret != 0)printf("mqtt disconnect fail, ret:%d\n", ret);/* then disconnect tcp level */mqtt_demo_network.disconnect(&mqtt_demo_network);}return ret;
}static void mqtt_demo_deinit(void)
{if (mqtt_demo_client.buf) {free(mqtt_demo_client.buf);mqtt_demo_client.buf = NULL;}if (mqtt_demo_client.readbuf) {free(mqtt_demo_client.readbuf);mqtt_demo_client.readbuf = NULL;}
}static void mqtt_demo_fun(void *arg)
{int ret;int reconnect_times = 0;/* mqtt init */mqtt_demo_init();/* mqtt connect */
re:ret = mqtt_demo_connect(MQTT_DEMO_HOST_NAME, MQTT_DEMO_PORT);if (ret != 0)OS_MSleep(500);goto re;/* subscribe topic */ret = mqtt_demo_subscribe(MQTT_DEMO_TOPIC);if (ret != 0)goto exit;while (1) {/* publish message to topic */mqtt_demo_publish(MQTT_DEMO_TOPIC, MQTT_DEMO_MSG_TEXT);ret = MQTTYield(&mqtt_demo_client, 300);if (ret != 0) {printf("mqtt yield err, ret:%d\n", ret);
reconnect:printf("mqtt reconnect\n");mqtt_demo_disconnect();ret = mqtt_demo_connect(MQTT_DEMO_HOST_NAME, MQTT_DEMO_PORT);if (ret != 0) {reconnect_times++;if (reconnect_times > 5)goto exit;OS_MSleep(5000); //5sgoto reconnect;}}OS_MSleep(1000); //1s}exit:mqtt_demo_unsubscribe(MQTT_DEMO_TOPIC);mqtt_demo_disconnect();mqtt_demo_deinit();OS_ThreadDelete(&mqtt_demo_thread);
}static void MainThread(void *arg){
#if WIFI_START == 1wifi_scan_connect();
#endif
}int main(void)
{if(OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL, OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK){printf("[ERR] Create MainThread Failed\n");}if (OS_ThreadCreate(&mqtt_demo_thread, "mqtt_demo_thread", mqtt_demo_fun, NULL,OS_THREAD_PRIO_APP,4 * 1024) != OS_OK) {printf("[ERR] Create MainThread Failed\n");}}
SYS_RUN(main);
#define WIFI_DEVICE_CONNECT_AP_SSID "Redmi"
#define WIFI_DEVICE_CONNECT_AP_PSK "00000000"
  • 在这里可以设置XR806连接的wifi SSID和密码
#define MQTT_DEMO_CLIENT_ID "mqt"
#define MQTT_DEMO_HOST_NAME "192.168.43.251"
#define MQTT_DEMO_PORT      "1884"
#define MQTT_DEMO_USERNAME  "root"
#define MQTT_DEMO_PASSWORD  ""
#define MQTT_DEMO_TOPIC     "/vo84Hm3xbUj/xr806_senor_set0/data"
  • 这里的HOST_NAME根据你的虚拟机ip进行修改,查看虚拟机ip可以使用ifconfig -a进行查看,另外我的虚拟机网络选择的是直接复制物理网络连接状态

  • MQTT_DEMO_TOPIC为你订阅的主题,可以随便设置,订阅的时候代码做出相应修改即可

  • MQTT_DEMO_USERNAME是刚才在mosquito配置的账号root

wifi_scan_connect()
  • 这个函数是连接wifi,连接wifi后mqtt就可以连接上虚拟机的服务端
int main(void)
{if(OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL, OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK){printf("[ERR] Create MainThread Failed\n");}if (OS_ThreadCreate(&mqtt_demo_thread, "mqtt_demo_thread", mqtt_demo_fun, NULL,OS_THREAD_PRIO_APP,4 * 1024) != OS_OK) {printf("[ERR] Create MainThread Failed\n");}}
  • 这个是main函数,创建两个线程,一个连接wifi一个,连接mqtt

要注意的是使用SYS_RUN的时候要包含这个头文件,否则编译出错

#include "ohos_init.h"

在这里插入图片描述

  • 可以看到只有一个mqtt文件夹和main.c文件,非常简单

在这里插入图片描述

  • 这个是ohosdemo目录下的BUILD.gn

在这里插入图片描述

  • 这个是mqtt目录下的BUILD.gn
    包含wifi头文件和mqtt头文件即可

  • 8、编译文件

执行hb build -f//首次编译加-f,之后不用
执行 sudo cp ~/xr806_openharmony/device/xradio/xr806/xr_skylark/out/xr_system.img /home/用户名/将编译后的xr_system.img复制到用户目录

最后进行烧录即可运行mqtt,我使用的是安卓手机开wifi给电脑和XR806连接,虚拟机复制物理网络同时运行mosquito,mqtt连接上mosquito即可进行订阅和发布

使用mosquitto订阅XR806的消息
mosquitto_sub -h 192.168.43.251 -p 1884 "你设置的主题名字" -u "root"
使用mosquitto给XR806发布消息
mosquitto_pub -h 192.168.43.251 -p 1884 "你设置的主题名字" -m "想要给XR806发的消息" -u "root"
  • 要注意的是-p选项填你在mosquito.conf文件设置的端口,-h选项填你的服务端ip地址,在这里是我的ubuntu的ip地址

成功进行mqtt连接后就可以进行wifi和mqtt的学习了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Classifier-Guided] Diffusion Models Beat GANs on Image Synthesis

1、介绍 针对diffusion models不如GAN的原因进行改进&#xff1a; 1&#xff09;充分探索网络结构 2&#xff09;在diversity和fidelity之间进行trade off 2、改进 1&#xff09;在采样步数更少的情况下&#xff0c;方差设置为固定值并非最优。需要将表示为网络预测的v ​​​…

前端开发攻略---Vue通过自定义指令实现元素平滑上升的动画效果(可以自定义动画时间、动画效果、动画速度等等)。

1、演示 2、介绍 这个指令不是原生自带的&#xff0c;需要手动去书写&#xff0c;但是这辈子只需要编写这一次就好了&#xff0c;后边可以反复利用。 3、关键API IntersectionObserver IntersectionObserver 是一个用于监测元素是否进入或离开视口&#xff08;viewport&#x…

08 - 镜像管理之:镜像仓库harbor介绍

本文参考&#xff1a;原文1 1 Harbor仓库介绍 Docker容器应用的开发和运行离不开可靠的镜像管理&#xff0c;虽然Docker官方也提供了公共的镜像仓库&#xff0c;但是从安全和效率等方面考虑&#xff0c;部署我们私有环境内的Registry 也是非常必要的。 之前介绍了Docker私有仓…

priority_queue的使用以及模拟实现

前言 上一期我们对stack和queue进行了使用的介绍&#xff0c;以及对底层的模拟实现&#xff01;以及容器适配器做了介绍&#xff0c;本期我们在来介绍一个容器适配器priority_queue&#xff01; 本期内容介绍 priority_queue的使用 仿函数介绍 priority_queue的模拟实现 什么…

自动驾驶规划方法综述

自动驾驶规划方法综述 附赠自动驾驶学习资料和量产经验&#xff1a;链接 最近看到一篇非常好的关于自动驾驶规划方法的综述&#xff08;A Review of Motion Planning Techniques for Automated Vehicles&#xff09;&#xff0c;写的非常好&#xff0c;总结了近几十年来总动驾…

YOLOv5实战记录06 Gradio搭建Web GUI

个人打卡&#xff0c;慎看。 指路大佬&#xff1a;【手把手带你实战YOLOv5-入门篇】YOLOv5 Gradio搭建Web GUI_哔哩哔哩_bilibili 先放一张效果图&#xff1a; 零、虚拟环境激活 之前up说要激活环境时&#xff0c;我没当回事儿&#xff0c;今天突然想&#xff0c;激活环境然后…

LangChain教程 | 实践过程报错集 | 持续更新

这是本人最近在做langchain教程过程中的遇到的报错&#xff0c;不分先后顺序。 报错&#xff1a;TypeError: NoneType object is not iterable 这个报错很常见&#xff0c;咱们要看原始报错的位置是哪里&#xff0c;下面是我的截图&#xff1a; 找到源头之后&#xff0c;就在源…

缝合的作品(并查集/逆序)

、思路&#xff1a;首先是并查集来做&#xff0c;首先给给每个单词一个id&#xff0c;然后把它放到ans[i]处。 对于操作1&#xff1a;把a单词换为单词b&#xff0c;就相当于a、b两个集合结合。然后再给a单词赋一个新的id&#xff0c;用来进行操作2&#xff0c;因为之后的操作2…

蓝桥杯-【二分】肖恩的苹果林

思路:有点类似于找最大值的最小化。 代码及解析 常规的模板引用40% #include <bits/stdc.h> using namespace std; #define ll long long const ll N1e53; ll a[N]; ll m,n; ll chack(ll mid) {int res1,last0;for(int i1;i<n;i){ if(a[i]-a[last]>mid){res;las…

DeepStream做对象模糊的几种方法

有时候&#xff0c;我们需要对视频的敏感信息做模糊处理&#xff0c;比如模糊人脸&#xff0c;车牌。 有时候&#xff0c;也需要对整帧做模糊&#xff0c;或者遮挡。比如这个例子。 下面介绍几种模糊的办法。 1. 通过nvosd deepstream-test1是DeepStream最简单的一个例子&…

代码随想录训练营day36

第八章 贪心算法 part05 1.LeetCode. 无重叠区间 1.1题目链接&#xff1a;435. 无重叠区间 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;B站卡哥视频 1.2思路&#xff1a;我来按照右边界排序&#xff0c;从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区…

Transformer - 注意⼒机制 Attention 中的 Q, K, V 解释(2)

Transformer - 注意⼒机制 Attention 中的 Q, K, V 解释&#xff08;2&#xff09; flyfish Transformer - 注意⼒机制 Scaled Dot-Product Attention 计算过程 Transformer - 注意⼒机制 代码实现 Transformer - 注意⼒机制 Scaled Dot-Product Attention不同的代码比较 Tran…

【数字化转型】上市公司智能制造词频统计数据(1991-2022年)

数据来源&#xff1a;上市公司年报 时间跨度&#xff1a;1991-2022年 数据范围&#xff1a;上市公司 数据指标&#xff1a; 版本一 智能制造 智能机器 智能生产 机器人 全自动 全机器 版本二 宏观政策 中国制造2025 工业4.0 互联网 范式特征 自动化 信息化 信息…

Socks5代理IP使用教程及常见使用问题

当我们在互联网上浏览网页、下载文件或者进行在线活动时&#xff0c;隐私和安全问题常常被提及。在这样的环境下&#xff0c;一个有效的解决方案是使用Sock5IP。本教程将向您介绍Sock5IP的使用方法&#xff0c;帮助您保护个人隐私并提升网络安全。 一、什么是Sock5IP&#xff1…

QT学习day5

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),socket(new QTcpSocket(this)) {ui->setupUi(this);//初始化界面ui->msgEdit->setEnabled(false);//不可用ui->sendBtn-&g…

[Kubernetes[K8S]集群:master主节点初始化]:通过Calico和Coredns网络插件方式安装

文章目录 操作流程&#xff1a;前置&#xff1a;Docker和K8S安装版本匹配查看0.1&#xff1a;安装指定docker版本 **[1 — 7] ** [ 配置K8S主从集群前置准备操作 ]一&#xff1a;主节点操作 查看主机域名->编辑域名->域名配置二&#xff1a;安装自动填充&#xff0c;虚拟…

如何借助AI高效完成写作提纲

AI变革力量&#xff1a;未来数据中心的智能化之旅&#xff01; 在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;在众多领域展现出了它的能力&#xff0c;特别是在写作领域。AI写作工具不仅能够帮助我们高效地生成内容&#xff0c;还能在一定程度上提升…

代码随想录算法训练营第三十一天| 455.分发饼干、376.摆动序列、53.最大子序和

系列文章目录 目录 系列文章目录455.分发饼干贪心算法大饼干喂胃口大的&#xff08;先遍历胃口&#xff09;胃口大的先吃大饼干(先遍历饼干&#xff09;小饼干先喂胃口小的&#xff08;先遍历胃口&#xff09;胃口小的先吃小饼干&#xff08;先遍历饼干&#xff09; 376. 摆动序…

14-pyspark的DataFrame使用总结

目录 前言DataFrame使用总结 DataFrame的构建方法1&#xff1a;通过列表构建方法2&#xff1a;通过Row对象构建方法3&#xff1a;通过表Schema构建 方法4&#xff1a;rdd结合字符串构建 DataFrame的方法 PySpark实战笔记系列第五篇 10-用PySpark建立第一个Spark RDD(PySpark实战…

CSGO游戏搬砖,落袋为安才是王道

1.市场燃了&#xff0c;都在赚钱&#xff0c;谁在赔钱&#xff1f; 首先要分清“纸面富贵”和“落袋为安”。市场燃了&#xff0c;你库存里的渐变大狙从5000直接涨到了1W&#xff0c;你赚到5000了吗&#xff1f;严格讲&#xff0c;你需要把库存里的渐变大狙卖出去&#xff0c;提…