ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Arduino-esp32学习(七)freeRTOS任务应用

2021-08-01 11:05:18  阅读:756  来源: 互联网

标签:freeRTOS Arduino app event mqtt client Serial include esp32


#include <Arduino.h>

/*1---wifi include files*/

#include <WiFi.h>

#include <WiFiClient.h> 

const char* ssid     = "##########";

const char* password = "************";

/*2---mqtt include files*/

#include "mqtt_client.h"

#include "freertos/event_groups.h"

/*3---socket include files*/

#include "tcpip_adapter.h"

#include "lwip/sockets.h"

#include "lwip/sys.h"

#include "lwip/err.h"

/*4---ftp include files*/

#include <ESP32_FTPClient.h>

#include "octocat.h"

/*5---freeRTOS include files*/

#include "freertos/FreeRTOS.h"

#include "freertos/task.h"

#include "freertos/semphr.h"

#include "freertos/queue.h"

#include "freertos/timers.h"

void app_aerial_init(uint32_t baud) {

  Serial.begin(baud);

}

void app_led_init(uint8_t mode) {

  pinMode(12,mode);

  pinMode(13,mode);

  pinMode(15,mode);

}

void app_wifi_init(void) {

  Serial.println();

  Serial.println();

  Serial.print("Connecting to ");

  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {

        static uint8_t connectTimes;

        connectTimes++;

        if(connectTimes > 10) {

            esp_restart();

        }

        delay(500);

        Serial.print(".");

    }

  Serial.println("");

  Serial.println("WiFi connected");

  Serial.println("IP address: ");

  Serial.println(WiFi.localIP());

}

#define BROKER_URL "mqtt://xxx.xxx.xx.xx:1883"

static const char *TAG = "pppos_example";

static EventGroupHandle_t event_group = NULL;

static const int CONNECT_BIT  = BIT0;

static const int STOP_BIT     = BIT1;

static const int GOT_DATA_BIT = BIT2;

esp_mqtt_client_handle_t mqttClient;

static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event) {

    esp_mqtt_client_handle_t client = event->client;

    int msg_id;

    switch (event->event_id) {

        case MQTT_EVENT_CONNECTED:

            ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");

            msg_id = esp_mqtt_client_subscribe(client, "/topic/esp-pppos", 0);

            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/esp-pppos", "esp32-pppos", 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");

            if(strstr(event->data,"buddy")) {

                printf("get data from broker\r\n");

            }

            // printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);

            // printf("DATA=%.*s\r\n", event->data_len, event->data);

            xEventGroupSetBits(event_group, GOT_DATA_BIT);

            break;

        case MQTT_EVENT_ERROR:

            ESP_LOGI(TAG, "MQTT_EVENT_ERROR");

            break;

        default:

            ESP_LOGI(TAG, "MQTT other event id: %d", event->event_id);

            break;

    }

    return ESP_OK;

}

esp_mqtt_client_handle_t app_mqtt_init(void) {

    esp_mqtt_client_handle_t mqtt_client;

    esp_mqtt_client_config_t mqtt_config = {

            .event_handle = mqtt_event_handler, 

            .uri = BROKER_URL 

    };

  mqtt_client = esp_mqtt_client_init(&mqtt_config);

  esp_mqtt_client_start(mqtt_client);

  xEventGroupWaitBits(event_group, GOT_DATA_BIT, pdTRUE, pdTRUE, portMAX_DELAY);

    return mqtt_client;

}

void app_mqtt_publish(esp_mqtt_client_handle_t client, const char *topic, const char *data, int len, int qos, int retain) {

    esp_mqtt_client_publish(client, topic, data, len, qos, retain);

}


 

#define HOST_IP_ADDR "xxx.xxx.xx.xxx"

#define PORT 80

int sock_client;


 

int app_tcp_client_init(void) {

    char host_ip[] = HOST_IP_ADDR;

    int addr_family = 0;

    int ip_protocol = 0;

    struct sockaddr_in dest_addr;

    dest_addr.sin_addr.s_addr = inet_addr(host_ip);

    dest_addr.sin_family = AF_INET;

    dest_addr.sin_port = htons(PORT);

    addr_family = AF_INET;

    ip_protocol = IPPROTO_IP;

    int sock =  socket(addr_family, SOCK_STREAM, ip_protocol);

    if (sock < 0) {

        ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);

    }

    ESP_LOGI(TAG, "Socket created, connecting to %s:%d", host_ip, PORT);

    int err = connect(sock, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in6));

    if (err != 0) {

        ESP_LOGE(TAG, "Socket unable to connect: errno %d", errno);

    }

    ESP_LOGI(TAG, "Successfully connected");

    return sock;

}

int app_set_socket_timeout(uint32_t seconds){

  struct timeval tv;

  tv.tv_sec = seconds;

  tv.tv_usec = 0;

  int ans = 0;

  ans = setsockopt(sock_client, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));

  if(ans < 0) {

      return -1;

  } else {

      return ans;

  }

}

ssize_t app_socket_send(int s,const void *dataptr,size_t size,int flags) {

    ssize_t ans = -1;

    ans = send(s, dataptr, size, flags);

    return ans;

}


 

char ftp_server[] = "xxx.xxx.xxx.xx";

char ftp_user[]   = "##########";

char ftp_pass[]   = "*************";

ESP32_FTPClient ftp (ftp_server,1050,ftp_user,ftp_pass);

void app_ftp_init(void) {

  const char * fileName = "FILE05.txt";

  size_t       fileSize = 0;

  String       list[128];

  ftp.OpenConnection();

  ftp.ChangeWorkDir("/ftpTest");

  ftp.InitFile("Type A");

  ftp.ContentList("", list);

  Serial.println("list");

  for( uint8_t i = 0; i < sizeof(list); i++)

  {

    uint8_t indexSize = 0;

    uint8_t indexMod  = 0;

    if(list[i].length() > 0)

    {

      if( list[i].indexOf(fileName) > -1 )

      {

        list[i].toLowerCase();

        Serial.println(list[i]);

        indexSize = list[i].indexOf("size") + 5;

        Serial.printf("indexSize = %d\r\n",indexSize);

        indexMod  = list[i].indexOf("file05") - 2;

        Serial.printf("indexMod = %d\r\n",indexMod);

        fileSize = list[i].substring(indexSize, indexMod).toInt();

        Serial.println("\nFile size is: " + String(fileSize));

      }

    }

    else {

      break;

    }

  }

  unsigned char * downloaded_file = (unsigned char *) malloc(fileSize);

  ftp.InitFile("Type I");

  ftp.DownloadFile(fileName, downloaded_file, fileSize, false);

  Serial.println("ftp.DownloadFile sucessed!");

  for(size_t i = 0; i < fileSize; i++) {

    Serial.printf("%c",downloaded_file[i]);

  }

  Serial.println(" ");

  ftp.CloseConnection();

  Serial.println("CloseConnection");

}

SemaphoreHandle_t socket_sem;

void app_task_socket(void *parameter) {

    while(1) {

        //xSemaphoreTake(socket_sem,portMAX_DELAY);

        if(pdTRUE == xSemaphoreTake(socket_sem,2000)) {

            app_socket_send(sock_client,"hello,world!",12,0);

        } else {

            app_socket_send(sock_client,"got nothing from server!",24,0);

        }

        

        vTaskDelay(2000);

    }

}

void app_task_mqtt(void *parameter) {

    while(1) {

        app_mqtt_publish(mqttClient, "DEV-EC600N-04", "hello,world!", 12, 0, 0);

        vTaskDelay(2000);

    }

}

void setup() {

  // put your setup code here, to run once:

  //1---串口调试

  app_aerial_init(115200);

  event_group = xEventGroupCreate();

  //2---IO控制

  app_led_init(OUTPUT);

  //3---WIFI连接

  app_wifi_init();

  //4---MQTT初始化

  mqttClient = app_mqtt_init();

  //5---Socket初始化

  sock_client = app_tcp_client_init();

  app_set_socket_timeout(1);

  //6---FTP测试

  app_ftp_init();

  socket_sem = xSemaphoreCreateBinary();

  xTaskCreate(app_task_socket, "app_task_socket", 2048, NULL, 8, NULL);

  xTaskCreate(app_task_mqtt, "app_task_mqtt", 2048, NULL, 8, NULL);

}

//7---fressRTOS任务、信号量应用

uint8_t ledStatus = 0;

char rx_buffer[128];

void loop() {

  // put your main code here, to run repeatedly:

  

  Serial.println("hello,world");

  if(ledStatus == 0) {

    ledStatus = 1;

  } else {

    ledStatus = 0;

  }

  digitalWrite(12,ledStatus);

  digitalWrite(13,ledStatus);

  digitalWrite(15,ledStatus);

  int len = recv(sock_client, rx_buffer, sizeof(rx_buffer) - 1, 0);

  if (len < 0){

        printf("not got packet from server!\r\n");

    } else {

        Serial.println("get packet from server!");

        xSemaphoreGive(socket_sem);

    }

  // app_mqtt_publish(mqttClient, "DEV-EC600N-04", "hello,world!", 12, 0, 0);

  // app_socket_send(sock_client,"hello,world!",12,0);

  delay(1000);

}

标签:freeRTOS,Arduino,app,event,mqtt,client,Serial,include,esp32
来源: https://blog.csdn.net/lucky_luoam/article/details/119295556

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有