MQTT移植到stm32开发板——使用TencentOS tiny操作系统

2023-05-16

mqttclient

一个高性能、高稳定性的跨平台MQTT客户端

一个高性能、高稳定性的跨平台MQTT客户端,基于socket API之上开发,可以在嵌入式设备(FreeRTOS/LiteOS/RT-Thread/TencentOS tiny)、Linux、Windows、Mac上使用,拥有非常简洁的API接口,以极少的资源实现QOS2的服务质量,并且无缝衔接了mbedtls加密库。开源地址:https://github.com/jiejieTop/mqttclient

开发平台说明

本次使用TencentOS tiny官方开发板——TencentOS_tiny_EVB_MX_Plus开发板作为移植实验,使用wifi模块连接到云平台。

TencentOS-EVB_MX

本次实验需要使用到TencentOS tiny操作系统,大家对于TencentOS tiny操作系统的移植不会的话,
可以看我之前录制的TencentOS tiny视频教程——【全网首发】TencentOS tiny物联网操作系统视频教程,
或者博客文档——TencentOS tiny 移植到STM32F103全教程(基于标准库)。

获取到TencentOS tiny的helloworld工程

我们可以将TencentOS tiny官方仓库拉取到你的电脑上,地址是:https://github.com/Tencent/TencentOS-tiny

mqtt-tos001

然后选择一个TencentOS_tiny_EVB_MX_Plus开发板的hello world例程就好了,当然这里面已经有移植完毕的mqttclient例程,我们现在是学习移植过程,就选个helloworld就好了。

mqtt-tos002

可以将它提取出来,我已经把它拿出来了(当然目录结构可能跟官方的有点不太一样,不过不影响我们的移植),目录结构如下:

mqtt-tos003

mqtt-tos004

只有一些比较简单的驱动,我们可以尝试将它编译并且下载到开发板行,跑一遍这个例程,是非常简单的现象:

mqtt-tos005

开始移植

拷贝at驱动源码

为了保证网络的底层,我们要移植TencentOS tiny的at框架:

  1. 在工程中创建一个文件夹,路径如下:net\at\src,然后将TencentOS-tiny\net\at\src路径下的tos_at.c拷贝到新建的文件夹目录下:

    mqtt-tos006

  2. 在工程中创建一个文件夹,路径如下:net\sal_module_wrapper,然后将TencentOS-tiny\net\sal_module_wrapper路径下的sal_module_wrapper.c与sal_module_wrapper.h拷贝到新建的文件夹目录下:

    mqtt-tos007

  3. 在工程中创建一个devices文件夹,然后将TencentOS-tiny\devices路径下的bc35_28_95文件夹与esp8266文件夹以及m26文件夹拷贝到新建的文件夹目录下:

    mqtt-tos008

  4. 在工程中创建一个文件夹,路径如下:platform\hal\st\stm32l4xx\src,然后将TencentOS-tiny\platform\hal\st\stm32l4xx\src路径下的tos_hal_usrt.c文件拷贝到新建的文件夹目录下:

    mqtt-tos009

在工程中创建对应的分组并添加文件

  1. 打开工程,添加at、devices、hal三个分组,具体操作如下:

    mqtt-tos010

  2. 然后添加相关的文件到分组中,这些文件是我们刚刚拷贝的文件:

    • tos_at.c、sal_module_wrapper.c文件放在at分组中:

    • bc35_28_95.esp8266.c文件放在devices分组中:

    • tos_hal_usrt.c文件放在hal分组中:

添加完成后分组的文件如下:

mqtt-tos011

然后尝试编译,可能会报错,因为相关头文件还没处理好。

拷贝相关头文件

  1. 拷贝at框架的头文件,在工程目录下创建以下路径的文件夹net\at\include,将TencentOS-tiny\net\at\include路径下的tos_at.h文件拷贝到新建的文件夹目录下:

    mqtt-tos012

添加头文件路径到工程

拷贝了头文件还需要将头文件添加进去到工程中,头文件路径如下:

mqtt-tos013

将at框架的后端介绍融入工程中

只需要在stm32l4xx_it_module.c文件的HAL_UART_RxCpltCallback函数中添加以下代码即可:

    extern uint8_t data;
    if (huart->Instance == LPUART1) {
        HAL_UART_Receive_IT(&hlpuart1, &data, 1);
        tos_at_uart_input_byte(data);
    }

mqtt-tos014

移植mqttclient

  1. 拷贝源码到工程目录下:首先在工程目录下创建一个components\connectivity文件夹,将TencentOS-tiny仓库中路径TencentOS-tiny\components\connectivity下的mqttclient文件夹拷贝到工程中:

    mqtt-tos015

  2. 在工程中创建分组:mqttclient、mqttclient/mqtt、mqttclient/salof、mqttclient/common、mqttclient/network、mqttclient/platform、mqttclient/config。

    mqtt-tos016

  3. 添加对应的文件,根据工程分组的目录进行添加即可,因为这些目录与工程分组的目录是一样的:

    mqtt-tos017

  4. 简单介绍mqttclient仓库文件夹

    • common文件夹:是一些通用的文件内容,比如链表的处理,错误代码的处理、随机数生成器、日志库等内容。

    • mqtt文件夹:著名的paho mqtt库。

    • mqttclient文件夹:实现mqttclient的主要文件,并且包含了一个默认的配置文件。

    • network文件夹:网络抽象层,封装了mbedtls加密库、网络数据的通道类型,自动选择tls加密传输或者是tcp直连。

    • platform文件夹:平台抽象层,此处封装了各种平台的内存管理、互斥锁、线程管理、时间管理等内容,如linux平台,freertos平台、rt-thread平台、TencentOS tiny平台等。

  5. 添加完成后的分组代码如下:

    mqtt-tos018

  6. 为工程添加mqttclient的头文件路径

    mqtt-tos019

  7. 编译代码,发现没有错误,则可以添加对应的例程,在工程目录的BSP\Src文件夹下创将一个mqttclient.c文件,然后添加以下代码:

    #include "stm32l4xx_hal.h"
    #include "mcu_init.h"
    #include "tos_k.h"
    #include "esp8266.h"
    #include "mqttclient.h"
    
    #define USE_ESP8266
    
    //#define USE_NB_BC35
    
    #ifdef USE_ESP8266 
    static hal_uart_port_t esp8266_port = HAL_UART_PORT_0;
    
    void mqtt_set_esp8266_port(hal_uart_port_t port) {
        esp8266_port = port;
    }
    #endif
    
    static void tos_topic_handler(void* client, message_data_t* msg)
    {
        (void) client;
        MQTT_LOG_I("-----------------------------------------------------------------------------------");
        MQTT_LOG_I("%s:%d %s()...\ntopic: %s, qos: %d. \nmessage:\n\t%s\n", __FILE__, __LINE__, __FUNCTION__, 
                msg->topic_name, msg->message->qos, (char*)msg->message->payload);
        MQTT_LOG_I("-----------------------------------------------------------------------------------\n");
    }
    
    
    void mqttclient_task(void)
    {
        int error;
    
        char buf[100] = { 0 };
        
        mqtt_client_t *client = NULL;
        
        mqtt_message_t msg;
        
        memset(&msg, 0, sizeof(msg));
        
    #ifdef USE_ESP8266 
        esp8266_sal_init(esp8266_port);
        esp8266_join_ap("wifii", "woshijiejie");
    #endif
    
    #ifdef USE_NB_BC35
        int bc35_28_95_sal_init(hal_uart_port_t uart_port);
        bc35_28_95_sal_init(HAL_UART_PORT_0);
    #endif
        
        mqtt_log_init();
    
        client = mqtt_lease();
        
        mqtt_set_port(client, "1883");
        mqtt_set_host(client, "www.jiejie01.top"); //111.230.189.156
        mqtt_set_client_id(client, random_string(10));
        mqtt_set_user_name(client, random_string(10));
        mqtt_set_password(client, random_string(10));
        mqtt_set_clean_session(client, 1);
    
        error = mqtt_connect(client);
        
        MQTT_LOG_D("mqtt connect error is %#x", error);
        
        mqtt_subscribe(client, "tos-topic", QOS0, tos_topic_handler);
        
        MQTT_LOG_D("mqtt subscribe error is %#x", error);
        
        memset(&msg, 0, sizeof(msg));
    
        for (;;) {
            
            sprintf(buf, "welcome to mqttclient, this is a publish test, a rand number: %d ...", random_number());
            
            msg.qos = QOS0;
            msg.payload = (void *) buf;
            
            error = mqtt_publish(client, "tos-topic", &msg);
    
            tos_task_delay(4000); 
        }
    }
    
    
    void application_entry(void *arg)
    {
        mqttclient_task();
        while (1) {
            printf("This is a mqtt demo!\r\n");
            tos_task_delay(1000);
        }
    }
    
  8. 然后将其添加到工程中,最后,编译并下载到开发板上运行,注意需要修改你的wifi账号密码,效果如下:

    mqtt-tos020

本次移植教程结束。

源代码获取

可以关注微信公众号:
在这里插入图片描述
在后台回复“25”即可获取源代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MQTT移植到stm32开发板——使用TencentOS tiny操作系统 的相关文章

  • ANO匿名飞控STM32代码解读(一)任务调度——Ano_Scheduler.c

    我所学习的代码是匿名飞控使用STM32芯片ANO PioneerPro 20190825的版本 匿名飞控的整体代码是跑裸机的 xff0c 任务调度是用STM32F4芯片中的系统时钟计时 xff0c 做了一个任务调度系统 xff0c 举个例子
  • 地面坐标系与机体坐标系的转换和欧拉角

    大家在入门四旋翼飞行器数学模型时第一个遇到的就是坐标系的转换 这篇文章用尽量浅显的语言为大家讲解坐标系的转换的欧拉角 机体坐标系 原点O取在飞机质心处 Xb轴指向机头 Yb轴指向机身右方 Zb指向机身下方 地面坐标系 在地面上选一点Og x
  • 飞桨AIStudio基础操作

    目录 执行和调试 多文件代码编辑 上传Notebook Notebook快捷键 Notebook中使用Shell命令 查看文件夹目录 使用pip来安装自己需要的package 但不支持apt get 查看当前环境中安装的package 持久
  • VSCode与CMake搭配使用之基本配置

    1 首先安装VSCode插件CMake和CMake Tools CMake插件主要功能是CMake语法高亮 自动补全CMake Tools的功能主要是结合VSCode IDE使用CMake这个工具 xff0c 比如生成CMake项目 构建C
  • 九、设置元素等待

    转载于 xff1a http www testclass net selenium python element wait WebDriver提供了两种类型的等待 xff1a 显式等待和隐式等待 显式等待 显式等待使WebdDriver等待
  • Unity Tweak Tool使用

    这年头 xff0c 都讲究个性 Unity刚出来的时候 xff0c 就觉着新奇 xff0c 其他也没啥 xff0c 就是有些小不顺手 最开始使用的Ubuntu Tweak到后来的Gnome Tweak Tool都有点偏 xff0c ubun
  • MYSQL–my.cnf配置中文详解

    basedir 61 path 使用给定目录作为根目录 安装目录 character sets dir 61 path 给出存放着字符集的目录 datadir 61 path 从给定目录读取数据库文件 pid file 61 filenam
  • vscode中C/C++的Clang-format的使用

    一 介绍 Clang format是一个功能强大的格式化工具 在vs code通过C C 43 43 扩展后即可使用Clang format工具进行代码的格式化 其自带的排版格式主要有 xff1a LLVM Google Chromium
  • ShardingJDBC核心概念与快速实战

    目录 ShardingSphere介绍 ShardingSphere特点 ShardingSphere简述 ShardingSphere产品区分 ShardingJDBC实战 核心概念 实战 ShardingJDBC的分片算法 Shardi
  • 野火嵌入式学习笔记:第47讲 按键检测输入

    野火 第一期 Linux系列教学视频之 零基础入门 篇 xff0c 手把手教学 xff0c 从0开始 xff0c 基于野火i MX6ULL Pro MINI开发板 第47讲 检测按键输入 哔哩哔哩 bilibili 检测用户按键3 key按
  • 学习野火嵌入式笔记 第48讲:进程的由来

    野火 第二期 Linux系列教学视频之 内核编程 篇 xff0c 手把手教学 xff0c 硬件基于野火i MX6ULL Pro MINI开发板 野火 第二期 Linux系列教学视频之 内核编程 篇 xff0c 手把手教学 xff0c 硬件基
  • 学习野火嵌入式笔记:第68讲 I.MX^ULL 启动方式

    野火 第三期 Linux系列教学视频之 裸机开发 篇 xff0c 手把手教学 xff0c 基于野火i MX6ULL Pro MINI开发板 哔哩哔哩 bilibili 先了解其芯片手册以及linux开发板的原理图 全篇就在讲启动方式的引脚设
  • C语言 字符串-字符串的匹配

    字符串匹配函数 const char strstr const char str1 const char str2 搜索字符串在另一个字符串中首次出现的位置 const char p 61 strstr 34 how are you 34
  • Lambda表达式

    什么是Lambda表达式 Lambda 表达式是 Java8 新增的重要特性 xff0c Lambda 使 Java 具有了函数式编程的思想 xff0c 它的实质也是由编译器根据表达式推断最终生成原始语法的字节码方式 函数式编程思想是 强调
  • MPU6050多次发送数据,但第一次读取的数据为0

    实际现象并不是第一次数据为0 xff0c 一直读取数据 xff0c 中间也会出现数据为0的现象 xff0c 原因是 xff1a 跟采样频率有关 xff0c 如果采样频率为50Hz xff0c 那么读取数据间隔时间必须大于20ms xff0c
  • gazebo多机仿真时出现的问题解决方法

    多机仿真过程中出现的飞机不动的情况是 xff1a 下面几个步骤要严格执行 xff1a cd PX4 span class token operator span Autopilot git submodule update span cla
  • Linux c多线程与c++多线程的基础写法

    最近工作需要 xff0c 对多线程做了一点了解 xff0c 现在将多线程的创建 xff0c 函数传参做个小结 一 linux c多线程 1 头文件 xff1a include lt pthread h gt 2 创建线程 xff1a pth
  • 姿态误差问题

    前段同学问了一个关于飞机姿态误差的问题 xff0c 将飞机姿态直接做差与px4里面先z轴对齐然后将过渡矩阵的姿态量赋值给滚转俯仰姿态误差对比 xff0c 发现直接做差后在飞机做大的机动时误差量会变大 xff0c 曲线的拟合非常不好 xff0
  • px4 avoidance笔记

    最近在用px4官方的avoidance代码跑硬件避障 xff0c 官方介绍了只要生成符合sensor msgs PointCloud2点云信息就能使用 xff0c 因此为了应用长基线双目 xff0c 没有使用realsense的相机 xff
  • PX4源代码下载编译

    sudo git clone https github com PX4 PX4 Autopilot git recursivegit submodule update init recursivegit submodule update r

随机推荐

  • 踩坑记录

    ERROR Session line number was not unique in database History logging moved to new session 66 在生成tfrecord时 总报如下错误 找了很长时间
  • git强制覆盖本地代码

    git强制覆盖本地 xff1a git fetch all 拉取所有更新 git reset hard origin master 本地代码同步线上最新版本 会覆盖本地所有与远程仓库上同名的文件 git pull git强制覆盖本地命令 x
  • 【毕业设计】基于STM32及OpenMV的云台追踪装置

    目录 修改记录1 摘 要2 整体功能分析3 硬件选型3 1 OpenMV4 Cam H73 2 STM32F103ZET63 3 DS3120舵机3 4 LED补光板3 5 供电及稳压3 6 硬件连接 4 软件功能实现4 1 OpenMV部
  • firewall-cmd 使用总结

    firewalld的简要说明 firewalld firewall cmd firewall offline cmd它们Python脚本 xff0c 通过定义的在 usr lib firewalld下面的xml配置信息 xff0c 在启动时
  • 机架与机柜

    随着计算机网络的发展 xff0c 数据中心的服务器以及网络通信设备等IT设施 xff0c 正逐步向着网络化 机架化的方向发展 机架是用于综合布线 xff0c 安装配线架和理线架 xff0c 实现对电缆和光缆布线系统的管理 在网络机柜中不具备
  • cmake和makefile区别和cmake指定编译器(cmake -G)

    一 cmake和makefile区别 要说明区别 xff0c 我们先要区分下面三类工具 xff1a 1 项目构建生成工具 首先cmake是项目构建生成工具 xff0c cmake的代码可以与平台系统和编译器无关 类似cmake的工具还有au
  • Gazebo使用过程中的问题

    1 运行命令gazebo没有反应 在虚拟机安装好gazebo后 xff0c 使用ALT 43 F2打开命令行运行命令gazebo没有反应 首先尝试内存不够的情况 xff0c 给虚拟机加到了4g内存 没有用 xff0c 运行gazebo还是没
  • 一张图理解板卡硬件调试流程

    最近在调试从焊板厂打样回来的板卡 xff0c 简单总结了下板卡的硬件测试流程 xff0c 如下图 xff1a 写在后面的话 xff1a 我之所以选择做技术这一行 xff0c 是觉得做技术的人简单 直接 xff0c 当你面对一个技术问题 xf
  • 关于Linux进程你所需要知道的一切都在这里!!

    文章目录 进程简单了解进程查看进程进程ID父进程ID父进程与子进程 程序与进程程序进程程序变成进程总结 进程状态进程状态转换启动新进程system fork exce系列函数 终止进程等待进程wait waitpid 进程 说明 xff1a
  • MQTT协议简介及协议原理

    文章目录 MQTT协议MQTT协议简介MQTT通信模型MQTT客户端的功能 xff1a MQTT客户服务器功能 xff1a 消息主题与服务质量MQTT控制报文固定报头可变报头CONNECT报文CONNACK报文 有效载荷 MQTT协议 MQ
  • 你不得不看的图文并茂的MQTT协议通信过程!!!

    文章目录 MQTT连接服务器MQTT订阅主题MQTT发布消息服务质量等级 QoSQoS0的PUBLISH控制报文QoS1的PUBLISH控制报文QoS2的PUBLISH控制报文 取消订阅断开连接 MQTT连接服务器 客户端到服务器的网络连接
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient简介与使用

    文章目录 mqttclient简介与使用优势 xff1a 在线代码生成工具占用资源大小整体框架支持的平台版本问题版权和许可linux平台下测试使用安装cmake xff1a 测试程序编译 amp 运行编译成动态库libmqttclient
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient代码生产工具介绍

    文章目录 mqttclient代码生产工具介绍连接参数配置订阅主题相关的代码配置发布消息相关的代码配置生成代码 mqttclient代码生产工具介绍 mqttclient代码生产工具主要是用于配置MQTT的参数 xff0c 并且生成相应的代
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient配置及裁剪工具

    文章目录 mqttclient配置及裁剪工具salof相关的配置使用mqttclient裁剪配置工具 mqttclient配置及裁剪工具 MQTT TOPIC LEN MAX 配置客户端支持最大的主题名长度 xff0c 主题是支持通配符的
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient设计与实现方式

    文章目录 mqttclient设计与实现方式设计思想API接口MQTT客户端的核心结构mqttclient实现申请一个mqtt客户端释放已申请的mqtt客户端设置MQTT客户端的信息连接服务器订阅报文取消订阅发布报文内部线程核心的处理函数发
  • mqtt连接百度天工物接入平台

    文章目录 mqtt连接到百度天工物接入百度天工物接入简介使用百度天工物接入创建项目创建策略创建身份创建用户测试连接 MQTT软件测试连接手动安装相关的依赖包拉取mqttclient仓库简单介绍mqttclient仓库文件夹编译运行测试代码使
  • mqttclient连接到OneNET云平台

    文章目录 mqttclient连接到OneNET云平台使用OneNET测试连接手动安装相关的依赖包拉取mqttclient仓库简单介绍mqttclient仓库文件夹编译运行代码使用到的API mqttclient连接到OneNET云平台 有
  • 2022年最新《谷粒学院开发教程》:1 - 构建工程篇

    资料资料资料地址代码地址 后台管理系统目录前台展示系统目录1 构建工程篇7 渲染前台篇2 前后交互篇8 前台登录篇3 文件上传篇9 前台课程篇4 课程管理篇10 前台支付篇5 章节管理篇11 统计分析篇6 微服务治理12 项目完结篇 目录
  • MQTT移植到stm32开发板——使用RT-Thread操作系统

    文章目录 mqttclientENV介绍env工具下载安装通过env移植MQTT客户端打开 env 控制台打开env并更新软件包列表移植MQTT客户端 编写自己的代码 xff1a 连接参数配置订阅主题相关的代码配置发布消息相关的代码配置生成
  • MQTT移植到stm32开发板——使用TencentOS tiny操作系统

    mqttclient 一个高性能 高稳定性的跨平台MQTT客户端 一个高性能 高稳定性的跨平台MQTT客户端 xff0c 基于socket API之上开发 xff0c 可以在嵌入式设备 xff08 FreeRTOS LiteOS RT Th