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

news2024/11/24 18:47:07

前言

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.coloradmin.cn/o/1626838.html

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

相关文章

HarmonyOS ArkUI实战开发—状态管理

一、状态管理 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染&…

电子负载仪的远端控制

前言 最近研究了电子负载仪的远端控制&#xff08;区别于前面板控制&#xff09;&#xff0c;主要是用于程序控制&#xff0c;避免繁琐复杂的人工控制&#xff0c;举了南京嘉拓和艾维泰科的例子。 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com …

CoReFace:深度人脸识别的样本引导对比正则化

CoReFace: Sample-Guided Contrastive Regularization for Deep Face Recognition 一、摘要 人脸识别对比正则化&#xff08;CoReFace&#xff09;&#xff08;损失函数&#xff09;&#xff0c;将图像级正则化应用于特征表示学习。 具体来说&#xff0c;采用样本引导对比学习…

base64算法

1 介绍 将二进制数据编码为文本字符串的算法 理解&#xff1a;把一个能看懂的明文变成一个看不懂的密文数据统称为加密 2 使用 A 在浏览器控制台使用 加密 window.btoa(加密的数据) 解密 window.atob(MTIzNDQ) B 在VSconde中使用 加密 解密

【算法基础实验】图论-UnionFind连通性检测之quick-union

Union-Find连通性检测之quick-union 理论基础 在图论和计算机科学中&#xff0c;Union-Find 或并查集是一种用于处理一组元素分成的多个不相交集合&#xff08;即连通分量&#xff09;的情况&#xff0c;并能快速回答这组元素中任意两个元素是否在同一集合中的问题。Union-Fi…

基于Springboot的点餐平台

基于SpringbootVue的点餐平台的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页展示 菜品信息 菜品资讯 购物车 后台登录 用户管理 菜品分类管理 菜品信息管理 …

怎么把图片转换为二维码?3个步骤轻松制作图片二维码

图片的二维码是怎么做成的呢&#xff1f;现在很多场景下的二维码&#xff0c;用手机扫码可以展现出对应的图片信息。通过这种方式来传递图片对于用户体验与很好的效果&#xff0c;而且也方便制作者通过这种方式来快速完成图片信息的传递&#xff0c;与传统方式相比成本更低&…

【前端】4. CSS综合案例

1. 模拟新闻界面 <!-- 1.模拟实现新闻界面 --><!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

茴香豆:搭建你的RAG智能助理-作业三

本次课程由书生浦语社区贡献者【北辰】老师讲解【茴香豆&#xff1a;搭建你的 RAG 智能助理】课程。分别是&#xff1a; RAG 基础介绍茴香豆产品简介使用茴香豆搭建RAG知识库实战 课程视频&#xff1a;https://www.bilibili.com/video/BV1QA4m1F7t4/ 课程文档&#xff1a;ht…

【鸟叔的Linux私房菜】计算机概论

文章目录 电脑CPU架构单位 电脑架构与设备组件CPUCPU和GPU区别 内存显卡硬盘与存储设备主板 软件程序运行操作系统内核的功能 总结 电脑 五个部分&#xff1a;输入单元、输出单元、CPU的运算单元和逻辑控制单元、内存。 主机机箱的设备大多通过主板连接线在一起&#xff0c;主…

STM32、GD32驱动SHT30温湿度传感器源码分享

一、SHT30介绍 1、简介 SHT30是一种数字湿度和温度传感器&#xff0c;由Sensirion公司生产。它是基于物理蒸发原理的湿度传感器&#xff0c;具有高精度和长期稳定性。SHT30采用I2C数字接口&#xff0c;可以直接与微控制器或其他设备连接。该传感器具有低功耗和快速响应的特点…

Unity入门实践小项目

必备知识点 必备知识点——场景切换和游戏退出 必备知识点——鼠标隐藏锁定相关 必备知识点——随机数和Unity自带委托 必备知识点——模型资源的导入 实践项目 需求分析 UML类图 代码和资源导入 开始场景 场景装饰 拖入模型和添加脚本让场景动起来 开始界面 先用自己写的GUI…

Feign功能详解、使用步骤、代码案例

简介&#xff1a;Feign是Netflix开发的声明式&#xff0c;模板化的HTTP客户端&#xff0c;简化了HTTP的远程服务的开发。Feign是在RestTemplate和Ribbon的基础上进一步封装&#xff0c;使用RestTemplate实现Http调用&#xff0c;使用Ribbon实现负载均衡。我们可以看成 Feign R…

Linux CentOS调用打印机

文章目录 一、lpstat及cups安装二、配置打印机1.启动cups2.配置cups3.配置打印机1.打开浏览器&#xff0c;输入CUPS服务器地址访问web界面&#xff0c;地址一般是&#xff1a;http://localhost:631。这里的"localhost"代表当前机器&#xff0c;如果你的CUPS服务器在别…

【网络安全】安全事件管理处置 — windows应急响应

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、账户排查 二、windows网络排查 三、进程排查 四、windows注册表排查 五、内存分析 总结 一、账户排查 账户排查主要包含以下几个维度 登录服务器的途径弱口令可疑账号 新增…

C语言入门课程学习记录5

C语言入门课程学习记录5 第23课 - C 语言中的常量第24课 - 初探程序中的数组第25课 - 数组特性深入剖析第26课 - 多维数组的概念与示例 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 第23课 - C 语言中…

C++解方程组的库

解决多元多次方程组的问题&#xff0c;你可以考虑以下几个C库&#xff1a; Eigen: Eigen库是一个高性能的C模板库&#xff0c;用于线性代数运算。它提供了强大的矩阵运算功能&#xff0c;可以用来解多元一次方程组。对于多次方程组&#xff0c;你可能需要结合Eigen和一些数值优…

关于conda占C盘内存的问题

文章目录 前言一、C盘中.conda文件中的envs二、C盘中.conda文件中的pkgs 前言 最近发现C盘空间越来越少&#xff0c;于是就去清理了一下conda在C盘的存储&#xff0c;不看不知道&#xff0c;一看吓一跳&#xff0c;足足十几G&#xff01;于是去网上搜索了相关的包能不能删除&a…

解决问题:TypeError:unsupported operand type(s) for -: ‘float‘ and ‘decimal.Decimal‘

文章目录 一、现象二、解决方案 一、现象 用Pandas 处理数据的时候&#xff0c;想得到增长率&#xff0c;没想到翻车了&#xff1f; import pandas as pddf pd.read_csv(data.csv)df[增长率] ((df[今年] - df[去年]) / (df[今年]))执行一下语句发现报错 TypeError&#xf…

揭秘快手互动神器:自动评论助力转化!

在这个信息爆炸的时代&#xff0c;每个内容创作者和企业都在寻找提升用户互动和转化的有效途径。无论是短视频、直播还是文章&#xff0c;如何让自己的内容脱颖而出&#xff0c;成为大家关注的焦点呢&#xff1f;今天&#xff0c;我们就要揭秘一款神奇的工具——快手自动评论软…