STM32
直播中

肖耳朵

12年用户 557经验值
私信 关注
[问答]

如何使用TencentOS tiny操作系统?

如何使用TencentOS tiny操作系统?

回帖(1)

刘甜甜

2021-9-30 16:40:24
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 tiny操作系统,大家对于TencentOS tiny操作系统的移植不会的话,
可以看我之前录制的TencentOS tiny视频教程——【全网首发】TencentOS tiny物联网操作系统视频教程
或者博客文档——TencentOS tiny 移植到STM32F103全教程(基于标准库)
获取到TencentOS tiny的helloworld工程

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





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





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










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





开始移植

拷贝at驱动源码

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


  • 在工程中创建一个文件夹,路径如下:netatsrc,然后将TencentOS-tinynetatsrc路径下的tos_at.c拷贝到新建的文件夹目录下:





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





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





  • 在工程中创建一个文件夹,路径如下:platformhalststm32l4xxsrc,然后将TencentOS-tinyplatformhalststm32l4xxsrc路径下的tos_hal_usrt.c文件拷贝到新建的文件夹目录下:






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



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





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



    • tos_at.c、sal_module_wrapper.c文件放在at分组中:
    • bc35_28_95.esp8266.c文件放在devices分组中:
    • tos_hal_usrt.c文件放在hal分组中:


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





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



  • 拷贝at框架的头文件,在工程目录下创建以下路径的文件夹netatinclude,将TencentOS-tinynetatinclude路径下的tos_at.h文件拷贝到新建的文件夹目录下:






添加头文件路径到工程

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





将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);    }




移植mqttclient



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





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





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





  • 简单介绍mqttclient仓库文件夹


    • common文件夹:是一些通用的文件内容,比如链表的处理,错误代码的处理、随机数生成器、日志库等内容。
    • mqtt文件夹:著名的paho mqtt库。
    • mqttclient文件夹:实现mqttclient的主要文件,并且包含了一个默认的配置文件。
    • network文件夹:网络抽象层,封装了mbedtls加密库、网络数据的通道类型,自动选择tls加密传输或者是tcp直连。
    • platform文件夹:平台抽象层,此处封装了各种平台的内存管理、互斥锁、线程管理、时间管理等内容,如linux平台,freertos平台、rt-thread平台、TencentOS tiny平台等。


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





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





  • 编译代码,发现没有错误,则可以添加对应的例程,在工程目录的BSPSrc文件夹下创将一个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:nt%sn", __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!rn");
  •         tos_task_delay(1000);
  •     }
  • }
  • 然后将其添加到工程中,最后,编译并下载到开发板上运行,注意需要修改你的wifi账号密码,效果如下:






举报

更多回帖

发帖
×
20
完善资料,
赚取积分