stm32开发之netxduo组件之mqtt客户端的使用记录

前言

1使用mqtt协议的简单示例记录

代码

MQTT服务端(C# 编写,使用MQTTnet提供的示例代码)

主程序


namespace ConsoleApp1;public class Program
{public static async Task Main(string[] args){await Run_Server_With_Logging();}}public static async Task Run_Server_With_Logging(){/** This sample starts a simple MQTT server and prints the logs to the output.** IMPORTANT! Do not enable logging in live environment. It will decrease performance.** See sample "Run_Minimal_Server" for more details.*/var mqttFactory = new MqttFactory(new ConsoleLogger());var mqttServerOptions = new MqttServerOptionsBuilder().WithDefaultEndpoint().Build();using (var mqttServer = mqttFactory.CreateMqttServer(mqttServerOptions)){await mqttServer.StartAsync();Console.WriteLine("Press Enter to exit.");Console.ReadLine();// Stop and dispose the MQTT server if it is no longer needed!await mqttServer.StopAsync();}}

NexDuo组件的编写

/** Copyright (c) 2024-2024,shchl** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2024-4-15     shchl   first version*/
#include "includes.h"#if APP_COMPONENT_NX_ENABLE
#include "nx_api.h"
#include "nx_stm32_eth_driver.h"#define     APP_NX_PACKET_SIZE              1536 /*数据包大小*/
#define     APP_NX_PACKET_POOL_SIZE         ((sizeof(NX_PACKET) + APP_NX_PACKET_SIZE) * 16)#define     APP_NX_IP_STACK_SIZE            2048
#define     APP_NX_IP_PRIORITY              10#define     APP_NX_ARP_CACHE_SIZE           1024#define     APP_NX_IP_ADDR                  IP_ADDRESS(192,168,8,9)
#define     APP_NX_IP_SUB_MASK              IP_ADDRESS(255,255,255,0)/*
*******************************************************************************************************
*                               外部引入变量
*******************************************************************************************************
*//*
*******************************************************************************************************
*                               变量
*******************************************************************************************************
*/void *loc_ip_area;
void *packet_pool_area;
void *arp_cache_area;NX_PACKET_POOL g_packet_pool;/*全局packet pool 池*/
NX_IP g_loc_ip; /*全局 本地ip实例*/
/*
*********************************************************************************************************
*                                       静态全局变量
*********************************************************************************************************
*//*
*********************************************************************************************************
*                                      函数声明
*********************************************************************************************************
*//*
*********************************************************************************************************
*                                      外部函数
*********************************************************************************************************
*/
int nx_application_define(void) {UINT status;/*内存分配*/packet_pool_area = app_malloc(APP_NX_PACKET_POOL_SIZE);loc_ip_area = app_malloc(APP_NX_IP_STACK_SIZE);arp_cache_area = app_malloc(APP_NX_ARP_CACHE_SIZE);nx_system_initialize();status = app_nx_ip_instance_create();if (status) {tx_printf("app_nx_ip_instance_create error:%d\r\n", status);}return NX_SUCCESS;
}TX_APP_DEFINE_EXPORT(nx_application_define); /*首先创建模块应用*/UINT app_nx_ip_instance_create() {UINT stat = 0;/*创建packet pool*/stat += nx_packet_pool_create(&g_packet_pool, "NX PACKET POOL",APP_NX_PACKET_SIZE,packet_pool_area, APP_NX_PACKET_POOL_SIZE);stat += nx_ip_create(&g_loc_ip,"NX IP",APP_NX_IP_ADDR,APP_NX_IP_SUB_MASK,&g_packet_pool,nx_stm32_eth_driver,loc_ip_area,APP_NX_IP_STACK_SIZE,APP_NX_IP_PRIORITY);/*ip 相关配置*/{/* 启用 ARP 并为 IP 实例  提供 ARP 缓存内存。 */stat += nx_arp_enable(&g_loc_ip, arp_cache_area, APP_NX_ARP_CACHE_SIZE);/* 启用 ICMP */stat += nxd_icmp_enable(&g_loc_ip);/* 为IP 实例启用 TCP 处理.  */stat += nx_tcp_enable(&g_loc_ip);/*禁止分包 */stat += nx_ip_fragment_disable(&g_loc_ip);}return stat;
}
/*
*********************************************************************************************************
*                                      内部函数
*********************************************************************************************************
*/#endif

MQTT 客户端任务线程

/** Copyright (c) 2024-2024,shchl** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2024-4-19     shchl   first version** @description mqtt 客户端任务*/
#include "includes.h"
#include "nxd_mqtt_client.h"#define QOS0 0
#define QOS1 1
#if 1#define APP_TASK_NET_MQTT_CLIENT_STACK_SIZE (4096)
#define APP_TASK_NET_MQTT_CLIENT_PRIORITY (10)#define APP_MQTT_CLIENT_STACK_SIZE 4096
#define APP_MQTT_CLIENT_PRIORITY 2/* MQTT 相关宏定义*/
#define MQTT_CLIENT_ID "client_id_stm32"
#define MQTT_SERVER_IP_ADDR IP_ADDRESS(192, 168, 8, 2)#define MQTT_KEEP_ALIVE_TIMER 300
#define STRLEN(p) (sizeof(p) - 1)
#define MQTT_SUB_TOPIC "/sub/topic1"
#define MQTT_SUB_TOPIC2 "/sub/topic2"
#define MQTT_PUB_TOPIC "/pub/topic"//-------------------------------事件标志位
#define MQTT_APP_CONNECT_ERROR_EVENT ((1) << 0)      // 客户端连接失败事件
#define MQTT_APP_SUB_TOPIC_RECEIVED_EVENT ((1) << 1) // 客户端订阅主题接收到数据事件
#define MQTT_APP_CLIENT_DISCONNECT_EVENT ((1) << 2)  // 客户端断开连接#define MATT_APP_ALL_EVENT (MQTT_APP_CONNECT_ERROR_EVENT | MQTT_APP_SUB_TOPIC_RECEIVED_EVENT \|MQTT_APP_CLIENT_DISCONNECT_EVENT)/*
*******************************************************************************************************
*                               外部引入变量
*******************************************************************************************************
*//*
*******************************************************************************************************
*                               变量
*******************************************************************************************************
*/TX_EVENT_FLAGS_GROUP mqtt_app_event_group; /*mqtt 事件组*/
NXD_ADDRESS mqtt_server_ip;                /*mqtt 服务地址*//*
*********************************************************************************************************
*                                       静态全局变量
*********************************************************************************************************
*/
static NXD_MQTT_CLIENT mqtt_client; /*声明 mqtt 客户端*/
static TX_THREAD net_mqtt_client_thread;
static void *area;static void *mqtt_client_area;
static UCHAR message_buffer[NXD_MQTT_MAX_MESSAGE_LENGTH];
static UCHAR topic_buffer[NXD_MQTT_MAX_TOPIC_NAME_LENGTH];
UINT topic_actual_len, topic_actual_msg_len;/*
*********************************************************************************************************
*                                      函数声明
*********************************************************************************************************
*/
static void net_mqtt_client_thread_entry(ULONG par);static VOID mqtt_disconnect_notify(NXD_MQTT_CLIENT *client);static VOID mqtt_receive_notify(NXD_MQTT_CLIENT *client_ptr, UINT message_count);/*
*********************************************************************************************************
*                                      外部函数
*********************************************************************************************************
*/
int app_task_net_mqtt_client_create() {area = app_malloc(APP_TASK_NET_MQTT_CLIENT_STACK_SIZE);tx_thread_create(&net_mqtt_client_thread,             /* 任务控制块地址 */"app net server",                    /* 任务名 */net_mqtt_client_thread_entry,        /* 启动任务函数地址 */0,                                   /* 传递给任务的参数 */area,                                /* 堆栈基地址 */APP_TASK_NET_MQTT_CLIENT_STACK_SIZE, /* 堆栈空间大小 */APP_TASK_NET_MQTT_CLIENT_PRIORITY,   /* 任务优先级*/APP_TASK_NET_MQTT_CLIENT_PRIORITY,   /* 任务抢占阀值 */TX_NO_TIME_SLICE,                    /* 不开启时间片 */TX_AUTO_START);                      /* 创建后立即启动 *//*内存分配*/mqtt_client_area = app_malloc(APP_MQTT_CLIENT_STACK_SIZE);/*创建mqtt 事件*/tx_event_flags_create(&mqtt_app_event_group, "mqtt event");/*服务端连接信息配置*/mqtt_server_ip.nxd_ip_version = 4;mqtt_server_ip.nxd_ip_address.v4 = MQTT_SERVER_IP_ADDR;return TX_SUCCESS;
}TX_THREAD_EXPORT(app_task_net_mqtt_client_create);/*
*********************************************************************************************************
*                                      内部函数
*********************************************************************************************************
*/
static inline UINT mqtt_client_sub_topic(CHAR *topic, UINT qos) {return nxd_mqtt_client_subscribe(&mqtt_client, topic, strlen(topic), qos);
}
static inline UINT mqtt_client_unsub_topic(CHAR *topic) {return   nxd_mqtt_client_unsubscribe(&mqtt_client,topic,strlen(topic));
}static void net_mqtt_client_thread_entry(ULONG par) {UINT status = 0;ULONG actual_status = 0;ULONG actual_event_flag;do {/* 等待 1 秒钟,让 内部 IP 线程完成其初始化。. */status = nx_ip_status_check(&g_loc_ip,NX_IP_INITIALIZE_DONE,&actual_status,NX_IP_PERIODIC_RATE);} while (status != NX_SUCCESS);/* 创建客户端实例. */status = nxd_mqtt_client_create(&mqtt_client,"mqtt client",MQTT_CLIENT_ID, strlen(MQTT_CLIENT_ID),&g_loc_ip, &g_packet_pool,mqtt_client_area,APP_MQTT_CLIENT_STACK_SIZE,APP_MQTT_CLIENT_PRIORITY,NX_NULL, 0);/* 设置通知回调函数 */// 客户端断开连接通知nxd_mqtt_client_disconnect_notify_set(&mqtt_client, mqtt_disconnect_notify);// 设置接收到数据通知回调nxd_mqtt_client_receive_notify_set(&mqtt_client, mqtt_receive_notify);while (1) {/* 开始与服务器的连接*/status = nxd_mqtt_client_connect(&mqtt_client,&mqtt_server_ip,NXD_MQTT_PORT,MQTT_KEEP_ALIVE_TIMER,0,NX_WAIT_FOREVER);if (status == NXD_MQTT_CONNECT_FAILURE) {logError("mqtt unable connect mqtt server[%d,%d,%d,%d:%d]", NX_IP_FMT(MQTT_SERVER_IP_ADDR), NXD_MQTT_PORT);tx_thread_sleep(1000);continue;}/* 订阅主题 */status = mqtt_client_sub_topic(MQTT_SUB_TOPIC, QOS0);status = mqtt_client_sub_topic(MQTT_SUB_TOPIC2, QOS0);switch (status) {case 0:break;case NXD_MQTT_NOT_CONNECTED:default:logError("nxd_mqtt_client_subscribe error:%#x", status);tx_thread_sleep(200);continue;}while (1) {status = tx_event_flags_get(&mqtt_app_event_group, MATT_APP_ALL_EVENT, TX_OR_CLEAR, &actual_event_flag,100);if (status == TX_SUCCESS) {/*接收来自topic 的数据*/if (MQTT_APP_SUB_TOPIC_RECEIVED_EVENT == actual_event_flag) {status = nxd_mqtt_client_message_get(&mqtt_client,topic_buffer, sizeof(topic_buffer), &topic_actual_len,message_buffer, sizeof(message_buffer), &topic_actual_msg_len);if (status == NXD_MQTT_SUCCESS) {/*添加结束符*/topic_buffer[topic_actual_len] = 0;message_buffer[topic_actual_msg_len] = 0;logInfo("topic = %s, message = %s", topic_buffer, message_buffer);}} else if (actual_event_flag == MQTT_APP_CLIENT_DISCONNECT_EVENT) {logInfo("client disconnect.....");break;}} else if (status == TX_NO_EVENTS) {/*没有事件通知*/// todo} else {break;}/*todo 推送状态数据*//*向发布主题推送数据*///    const char *send_data = "this is publish msg";//    status += nxd_mqtt_client_publish(&mqtt_client,//                                      MQTT_PUB_TOPIC,//                                      STRLEN(MQTT_PUB_TOPIC),//                                      (CHAR *) send_data,//                                      strlen(send_data),//                                      0,//                                      QOS1,//                                      NX_WAIT_FOREVER); /*等待超时*/}mqtt_client_unsub_topic(MQTT_SUB_TOPIC); /* Now unsubscribe the topic. */mqtt_client_unsub_topic(MQTT_SUB_TOPIC2); /* Now unsubscribe the topic. */nxd_mqtt_client_disconnect(&mqtt_client); /* Disconnect from the broker. */}/*删除客户端,释放资源(需要重新创建) */nxd_mqtt_client_delete(&mqtt_client);}static VOID mqtt_disconnect_notify(NXD_MQTT_CLIENT *client) {/**/logInfo("mqtt_disconnect_notify :%s", client->nxd_mqtt_client_id);tx_event_flags_set(&mqtt_app_event_group, MQTT_APP_CLIENT_DISCONNECT_EVENT, TX_OR);
}static VOID mqtt_receive_notify(NXD_MQTT_CLIENT *client_ptr, UINT message_count) {NX_PARAMETER_NOT_USED(client_ptr);
//    NX_PARAMETER_NOT_USED(message_count); /*接收的消息数*/logInfo("rec msg num:%d", message_count);tx_event_flags_set(&mqtt_app_event_group, MQTT_APP_SUB_TOPIC_RECEIVED_EVENT, TX_OR);
}#endif

测试结果(ok)

在这里插入图片描述

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

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

相关文章

js如何点击生成4位随机数

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Generat…

软件开发最近很吃香,嵌入式建议转行吗?

在当今时代&#xff0c;软件开发确实备受瞩目&#xff0c;也相当吃香。那么&#xff0c;对于嵌入式领域&#xff0c;我们是否应该考虑转行呢&#xff1f; 事实上&#xff0c;嵌入式工程师的薪资水平相较于互联网行业&#xff0c;在某些情况下可能会略低一些&#xff0c;尤其是…

对于AIGC(人工智能)我们应该如何看待

文章目录 前言一、AIGC技术的现状与特点二、AIGC技术在各个领域的应用三、AIGC技术对未来社会的影响四、AIGC技术的可能发展方向 前言 随着科技的飞速发展&#xff0c;人工智能与大数据的结合日益紧密&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;技术作为这一领域…

DRF 查询(排序、过滤、分页)

查询(排序、过滤、分页) 【0】准备 &#xff08;1&#xff09;Q查询 详细内容可见&#xff1a;Django模型层-CSDN博客Django 的 Q 对象提供了一种在数据库查询中构造复杂查询的方法。当你想在单个查询中组合多个过滤条件&#xff0c;并且这些条件之间不仅仅是简单的 AND 关系…

阿里云X魔搭社区Create@AI创客松第四届冠军:MumuLab

4月13日终于迎来了线下Demo Day&#xff0c;此前阿里云 X 魔搭社区 X Datawhale CreateAI创客松已经紧锣密鼓地准备了一个多月时间&#xff0c;全球150团队报名、创作出66作品、评选出25支团队进入决赛&#xff0c;作品范围覆盖从办公效率到法律调解再到游戏互动以及构建童话世…

构建交通新动脉 激活襄阳城市发展动力

—— 襄阳环线提速改造工程通车 即从巴峡穿巫峡,便下襄阳向洛阳。襄阳,这座位于汉江之滨的历史文化古城,自古便为交通要塞,正以崭新的姿态迈入一个新时代——城市交通快速化时代。4月26日,襄阳环线提速改造工程正式通车,“一轴三环九放射”城市骨架路网体系基本形成。它不仅是…

python 实现用户登录

1. JWT Token 参考&#xff1a;https://www.zhihu.com/question/364616467 jwt官网&#xff1a;https://jwt.io/#debugger-io 1.1. Token Token 是一个宽泛的术语&#xff0c;它可以指代任何一种用于身份验证的机制。Token 常常被用在验证和授权流程中。Token 可以有不同的形…

C语言笔试题之找出数组的最大公约数

找出数组的最大公约数 实例要求 1、给定一个整数数组 &#xff0c;返回数组中最大数和最小数的最大公约数&#xff1b;2、两个数的最大公约数是能够被两个数整除的最大正整数&#xff1b;示例&#xff1a; 实例分析 1、要找到数组中最大数和最小数的最大公约数&#xff1b…

python 中使用 ESP8266 实现语音识别(或热词检测)

介绍 我的大部分家庭自动化都是通过对网络中的设备执行 HTTP 请求来控制的。 (例如:开灯、打开收音机、控制加热系统...... 这可以使用ESP8266轻松完成。我有一个控制器和一个触摸传感器,当我在床上时用它来控制灯光和音乐。 像 Amazon Echo 或 Google Homepod 一样添加语…

Apache RocketMQ ACL 2.0 全新升级

作者&#xff1a;徒钟 引言 RocketMQ 作为一款流行的分布式消息中间件&#xff0c;被广泛应用于各种大型分布式系统和微服务中&#xff0c;承担着异步通信、系统解耦、削峰填谷和消息通知等重要的角色。随着技术的演进和业务规模的扩大&#xff0c;安全相关的挑战日益突出&am…

HPE Aruba Networking推出新一代Wi-Fi 7接入点 助力企业高效应对安全、AI与物联网挑战

HPE ArubaNetworking推出的全新Wi-Fi 7接入点&#xff0c;提供全面的AI就绪边缘IT解决方案&#xff0c;旨在为用户和物联网设备提供安全、高性能的连接服务&#xff0c;以实现数据的捕获和路由&#xff0c;从而满足AI训练和推理需求 休斯顿-2024年4月23日-慧与科技(NYSE: HPE)近…

vue+html5+css制作日历代码,工作日配置

目录 1.日历页面 2.工作日查询、自然日查询 js 3.修改工作日配置 4.数据库&#xff0c;表结构 5.初始化数据 因系统需要&#xff0c;需要制作一个功能--工作日配置。 需要的业务有&#xff1a; 1.初始化与国家放假情况一致&#xff0c;之后支持手动进行工作日配置&#…

Python 网络与并发编程(四)

文章目录 协程Coroutines协程的核心(控制流的让出和恢复)协程和多线程比较协程的优点协程的缺点 asyncio实现协程(重点) 协程Coroutines 协程&#xff0c;全称是“协同程序”&#xff0c;用来实现任务协作。是一种在线程中&#xff0c;比线程更加轻量级的存在&#xff0c;由程…

《欢乐钓鱼大师》攻略,钓友入坑必备!

欢迎来到《欢乐钓鱼大师》&#xff01;在这个游戏里&#xff0c;你可以尽情享受垂钓的乐趣&#xff0c;通过不断更换和升级高阶鱼竿&#xff0c;轻松地钓到各种稀有鱼类。因为许多玩家在挑战关卡时遇到了一些困难&#xff0c;所以今天我给大家带来了《欢乐钓鱼大师攻略指南》&a…

日志框架整合SpringBoot保姆级教程+日志文件拆分(附源码)

目录 介绍 日志概述 日志文件 调试日志 系统日志 日志框架 日志框架的作用 日志框架的价值 流行的日志框架 SLF4J日志门面 介绍 环境搭建简单测试 集成log4j logback Logback简介 Logback中的组件 Logback配置文件 日志输出格式 控制台输出日志 输出日志到…

vue-admin-template项目实现中英文切换

实现效果&#xff1a; 1.安装 *注意版本号 npm install vue-i18n8.24.5 -S2.新建文件夹 在src目录下新建lang文件夹&#xff0c;里面有3个文件 // index.js import Vue from vue import VueI18n from vue-i18n import Cookies from js-cookie import elementEnLocale fr…

OpenHarmony音视频—opus

简介 Opus是一种用于在互联网上进行交互式语音和音频传输的编解码器。它可以从低比特率窄带语音扩展到非常高的高品质立体声音乐。 下载安装 直接在OpenHarmony-SIG仓中搜索opus并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的opus库代码存在以下路径&a…

怎样选购内衣洗衣机?2024年5款最新推荐机型种草

随着科技的不断发展&#xff0c;内衣洗衣机成为了家家户户必备的小家电之一&#xff0c;为我们的生活带来了极大的便利。但面对市场上众多的内衣洗衣机品牌&#xff0c;如何选择一款质量好的内衣洗衣机呢&#xff1f;本文将为您推荐5款最新的内衣洗衣机品牌&#xff0c;从而帮助…

二倍体毛白杨(Populus tomentosa Carr.)基因组-春天都是杨树毛子???-文献精读-11

High quality haplotype-resolved genome assemblies of Populus tomentosa Carr., a stabilized interspecific hybrid species widespread in Asia 高质量二倍体解析的毛白杨&#xff08;Populus tomentosa Carr.&#xff09;基因组组装&#xff0c;这是一种在亚洲广泛分布的…

SCSS的基本使用(一)

目录 一、使用&符号来引用父选择器 二、scss的语法 三、变量&#xff08;Variables&#xff09; 四、嵌套&#xff08;Nesting&#xff09; 五、mixin 和 include 六、extend 继承 七、import 与 Partials 八、if简单判断 九、if复杂判断 一、使用&符号来引用父…