664|0

6105

帖子

4

TA的资源

版主

楼主
 

【FireBeetle 2 ESP32 C6开发板】 4 mqtt uart透传 [复制链接]

本帖最后由 damiaa 于 2024-5-27 21:56 编辑
       【FireBeetle 2 ESP32 C6开发板】 4 mqtt uart透传

 

 

一、本实验用到esp32 的uart、 mqtt、freertos多任务和信号量。


1,首先我们 创建两个任务uart的收和发


 

2,在创建信号量和共享数据区供mqtt和uart之间共享数据


Mqtt送 数据到uart用到了信号量,uart到mqtt就直接在uart任务里面发了。


3,定义发送topic/topic/uarttomqtt
和接收topic /topic/mqtttouartq0 /topic/mqtttouartq1

 

 

4,处理topic数据:

 

二、部分代码

 

串口相关

int sendData_uart0(const char* logName, const char* data,int len)
{
   // const int len = strlen(data);
    const int txBytes = uart_write_bytes(UART_NUM_0, data, len);
    ESP_LOGI(logName, "Wrote %d bytes", txBytes);
    return txBytes;
}
static void tx_task(void *arg)
{
    static const char *TX_TASK_TAG = "TX_TASK";
    esp_log_level_set(TX_TASK_TAG, ESP_LOG_INFO);
    while (1) {
        if(  MtoUsema.xMSet != NULL ){
            xSemaphoreTake(  MtoUsema.xMSet, portMAX_DELAY ); 
            { 
                if( MtoUsema.flag ==1)
                {
                     MtoUsema.flag =0;
                    sendData_uart0(TX_TASK_TAG,  MtoUsema.buf, MtoUsema.len);
                     MtoUsema.len=0;
                }
            } 
            xSemaphoreGive(  MtoUsema.xMSet ); /* 互斥量必须归还! */ 
        }
        
        vTaskDelay(100 / portTICK_PERIOD_MS);
    }
}

static void rx_task(void *arg)
{
    static const char *RX_TASK_TAG = "RX_TASK";
    esp_log_level_set(RX_TASK_TAG, ESP_LOG_INFO);
    uint8_t* data = (uint8_t*) malloc(RX_BUF_SIZE + 1);
    while (1) {
        const int rxBytes = uart_read_bytes(UART_NUM_0, data, RX_BUF_SIZE, 1000 / portTICK_PERIOD_MS);
        if (rxBytes > 0) {
            data[rxBytes] = 0;
            ESP_LOGI(RX_TASK_TAG, "Read %d bytes: '%s'", rxBytes, data);
            ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO);

            UtoMsema.len=rxBytes+1; 
            snprintf(UtoMsema.buf,UtoMsema.len,"%s",data);
            UtoMsema.flag =1;
          	esp_mqtt_client_publish(client, "/topic/uarttomqtt", UtoMsema.buf, 0, 0, 0);
		}                      
    }
    free(data);
}

信号量的创建

typedef struct _SEMA
{
    SemaphoreHandle_t xMSet;
    char buf[300];
    char flag;
    int len;
}sema;
sema MtoUsema, UtoMsema;  



....
while(1){
...

    MtoUsema.flag=0;
    MtoUsema.len=0;
    MtoUsema.xMSet=NULL;
    UtoMsema.flag=0;
    UtoMsema.len=0;
    UtoMsema.xMSet=NULL;
    for(int i=0;i<300;i++)
    {
        MtoUsema.buf[i]=0;
        UtoMsema.buf[i]=0;
    } 
    vSemaphoreCreateBinary(  MtoUsema.xMSet );
    if(  MtoUsema.xMSet != NULL )
    {
    }
    if( MtoUsema.xMSet != NULL ){  printf("The semaphore xMSet1 was created successfully! can now be used.\n");}
    vSemaphoreCreateBinary(  UtoMsema.xMSet );
    if(  UtoMsema.xMSet != NULL )
    {
    }
    if( UtoMsema.xMSet != NULL ){  printf("The semaphore xMSet2 was created successfully! can now be used.\n");}
...
}

信号量的使用

...
case MQTT_EVENT_DATA:
        ESP_LOGI(TAG, "MQTT_EVENT_DATA");
        printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
        printf("DATA=%.*s\r\n", event->data_len, event->data);
        
        if( MtoUsema.xMSet != NULL ){
            xSemaphoreTake( MtoUsema.xMSet, portMAX_DELAY ); 
            { 
                MtoUsema.len=event->data_len%300+1;
                snprintf( MtoUsema.buf, MtoUsema.len,"%s",event->data);
                MtoUsema.flag =1;
            } 
            xSemaphoreGive( MtoUsema.xMSet ); /* 互斥量必须归还! */ 
        }
        break;

...
static void tx_task(void *arg)
{
    static const char *TX_TASK_TAG = "TX_TASK";
    esp_log_level_set(TX_TASK_TAG, ESP_LOG_INFO);
    while (1) {
        if(  MtoUsema.xMSet != NULL ){
            xSemaphoreTake(  MtoUsema.xMSet, portMAX_DELAY ); 
            { 
                if( MtoUsema.flag ==1)
                {
                     MtoUsema.flag =0;
                    sendData_uart0(TX_TASK_TAG,  MtoUsema.buf, MtoUsema.len);
                     MtoUsema.len=0;
                }
            } 
            xSemaphoreGive(  MtoUsema.xMSet ); /* 互斥量必须归还! */ 
        }
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
}

 

mqtt事件响应

static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
{
    ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32 "", base, event_id);
    esp_mqtt_event_handle_t event = event_data;
    esp_mqtt_client_handle_t client = event->client;
    int msg_id;
    switch ((esp_mqtt_event_id_t)event_id) {
    case MQTT_EVENT_CONNECTED:
        ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
        msg_id = esp_mqtt_client_publish(client, "/topic/qos1", "eeworld DFRobtGitrNrrylr2esp32-c6 test qos1", 0, 1, 0);
        ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);

        msg_id = esp_mqtt_client_subscribe(client, "/topic/mqtttouartq0", 0);
        ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);

        msg_id = esp_mqtt_client_subscribe(client, "/topic/mqtttouartq1", 1);
        ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);

        break;
    case MQTT_EVENT_DISCONNECTED:
        ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
        break;

    case MQTT_EVENT_SUBSCRIBED:
        ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
        msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "eeworld DFRobtGitrNrrylr2esp32-c6 test qos0", 0, 0, 0);
        ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);
        break;
    case MQTT_EVENT_UNSUBSCRIBED:
        ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
        break;
    case MQTT_EVENT_PUBLISHED:
        ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
        break;
    case MQTT_EVENT_DATA:
        ESP_LOGI(TAG, "MQTT_EVENT_DATA");
        printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
        printf("DATA=%.*s\r\n", event->data_len, event->data);
        
        if( MtoUsema.xMSet != NULL ){
            xSemaphoreTake( MtoUsema.xMSet, portMAX_DELAY ); 
            { 
                MtoUsema.len=event->data_len%300+1;
                snprintf( MtoUsema.buf, MtoUsema.len,"%s",event->data);
                MtoUsema.flag =1;
            } 
            xSemaphoreGive( MtoUsema.xMSet ); /* 互斥量必须归还! */ 
        }
        break;
    case MQTT_EVENT_ERROR:
        ESP_LOGI(TAG, "MQTT_EVENT_ERROR");
        if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) {
            log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err);
            log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err);
            log_error_if_nonzero("captured as transport's socket errno",  event->error_handle->esp_transport_sock_errno);
            ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno));

        }
        break;
    default:
        ESP_LOGI(TAG, "Other event id:%d", event->event_id);
        break;
    }
}

 

三、实验结果如下:

 

Mqtt到uart
Uart到mqtt
 
1

 
 
谢谢。
此帖出自RF/无线论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
硬件工程师必备知识

硬件工程师必须知道的知识目的:基于实际经验与实际项目详细理解并掌握成为合格的硬件工程师的最基本知识。 1) 基本设计规范 2 ...

我国自主研发----北斗导航系统核心芯片

我国又一自主研发的核心芯片又新鲜出炉了!。“领航一号”是我国自主开发的完全国产化的首个卫星导航基带处理芯片,并将替代“北 ...

嵌入式TCP/IP的优化设计与硬件实现

摘要 提出一种嵌入式系统中实现TCP/IP的解决方案。通过优化设计清晰的TCP/IP和应用层接口、防止多余的内存拷贝和实现数据包 ...

几款经典的LPC213x/LPC214x开发板原理图

最近在网络上找到了几款经典的LPC213x/LPC214x开发板原理图,感觉非常专业,所以发上来大家分享。 49432 本帖最后由 zhaoju ...

Helper2416-19——裸机第十弹——S3C2416中断控制器+定时器中断实践(附源码)

本帖最后由 yuanlai2010 于 2014-7-26 20:16 编辑 裸机第十弹——S3C2416中断控制器+定时器中断实践 参与Helper2416开发板助 ...

应用笔记(AN4672)LPS22HB/LPS25HB 数字压力传感器:系统硬件集成指南

本帖最后由 littleshrimp 于 2020-5-29 18:29 编辑 本应用笔记的目的是提供硬件集成指南,用于将意法半导体的 LPS22HB 和 LPS ...

惠斯通电桥的精确测量是怎么体现出来的?

487984测量电阻值时,经常会提到惠斯通电桥,为什么用它能提高测试的精度呢? 如果要测电阻,两个电阻也可以测得出来。 用 ...

运放与ADC的搭配问题

如图所示 584804 正负15V供电的运放后级5V供电的ADC,按照AD7790给的输入范围无缓冲时 584805 GND-30mV到Vdd+30mV, ...

【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A 蓝牙BLE通信

本帖最后由 六尘不改 于 2023-11-22 19:50 编辑 本篇文章使用Bleak库驱动开发板蓝牙BLE,实现开发板BLE主机和蓝牙板BLE从机的 ...

有奖直播报名:大联大世平集团&恩智浦 | AI 无所不在,单板电脑也可以

直播主题:AI 无所不在,单板电脑也可以 直播时间: 11 月 14 日(周四) 10:00 - 11:00 如何报名? (1)>>进入 ...

快速回复 返回顶部 返回列表