bigbat 发表于 2024-5-2 19:02

【FireBeetle 2 ESP32 C6】Wifi无线组网测试

<p>ESP32C6的Wifi组网,组网的步骤分两个部分,</p>

<p>第一、使用无线的设置进行连接,就像网线连接一样,ESP32C6的无线支持802.11a/b/g/n/ac/ax标准,主要的函数是esp_netif_init(),整个函数的主要设置在sdkconfig文件中,这个文件的设置工具可是使用idf.py menuconfig进行设置,所以在app_main.c文件中没有设置的代码。</p>

<p>第二、如果连接完成后,就可以使用协议部分,乐鑫使用的lwIP协议作为各种网络的应用集成,本次使用MQTT协议进行测试。</p>

<p>首先,将测试程序拷贝到测试目录,</p>

<pre>
<code class="language-bash">X:\Espressif\frameworks\esp-idf-v5.2.1\examples\protocols\mqtt\tcp</code></pre>

<p>进入测试目录下</p>

<pre>
<code class="language-bash">idf.py set-target esp32c6</code></pre>

<p> &nbsp;</p>

<p>修改代码目标为esp32C6,接下可以设置了。</p>

<pre>
<code class="language-bash">idf.py menuconfig</code></pre>

<p> &nbsp;</p>

<p>通过设置工具设置,SSID和Password,还有一些设置在idf_component.yml文件中,设置</p>

<p> &nbsp;</p>

<p>设置MQTT的连接地址</p>

<pre>
<code class="language-bash">idf.py build
idf.py -p COM11 flash
idf.py -p COM11 monitor</code></pre>

<p>编译完成在烧写到开发板上。</p>

<p> &nbsp;</p>

<p>设置开始监控模式,可以看到mqtt的信息</p>

<pre>
<code class="language-cpp">/* MQTT (over TCP) Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/

#include &lt;stdio.h&gt;
#include &lt;stdint.h&gt;
#include &lt;stddef.h&gt;
#include &lt;string.h&gt;
#include "esp_wifi.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_event.h"
#include "esp_netif.h"
#include "protocol_examples_common.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "freertos/queue.h"

#include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"

#include "esp_log.h"
#include "mqtt_client.h"

static const char *TAG = "mqtt_example";


static void log_error_if_nonzero(const char *message, int error_code)
{
    if (error_code != 0) {
      ESP_LOGE(TAG, "Last error %s: 0x%x", message, error_code);
    }
}

/*
* @brief Event handler registered to receive MQTT events
*
*This function is called by the MQTT client event loop.
*
* @param handler_args user data registered to the event.
* @param base Event base for the handler(always MQTT Base in this example).
* @param event_id The id for the received event.
* @param event_data The data for the event, esp_mqtt_event_handle_t.
*/
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-&gt;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", "data_3", 0, 1, 0);
      ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);

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

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

      msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1");
      ESP_LOGI(TAG, "sent unsubscribe 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-&gt;msg_id);
      msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 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-&gt;msg_id);
      break;
    case MQTT_EVENT_PUBLISHED:
      ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event-&gt;msg_id);
      break;
    case MQTT_EVENT_DATA:
      ESP_LOGI(TAG, "MQTT_EVENT_DATA");
      printf("TOPIC=%.*s\r\n", event-&gt;topic_len, event-&gt;topic);
      printf("DATA=%.*s\r\n", event-&gt;data_len, event-&gt;data);
      break;
    case MQTT_EVENT_ERROR:
      ESP_LOGI(TAG, "MQTT_EVENT_ERROR");
      if (event-&gt;error_handle-&gt;error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) {
            log_error_if_nonzero("reported from esp-tls", event-&gt;error_handle-&gt;esp_tls_last_esp_err);
            log_error_if_nonzero("reported from tls stack", event-&gt;error_handle-&gt;esp_tls_stack_err);
            log_error_if_nonzero("captured as transport's socket errno",event-&gt;error_handle-&gt;esp_transport_sock_errno);
            ESP_LOGI(TAG, "Last errno string (%s)", strerror(event-&gt;error_handle-&gt;esp_transport_sock_errno));

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

static void mqtt_app_start(void)
{
    esp_mqtt_client_config_t mqtt_cfg = {
      .broker.address.uri = CONFIG_BROKER_URL,
    };
#if CONFIG_BROKER_URL_FROM_STDIN
    char line;

    if (strcmp(mqtt_cfg.broker.address.uri, "FROM_STDIN") == 0) {
      int count = 0;
      printf("Please enter url of mqtt broker\n");
      while (count &lt; 128) {
            int c = fgetc(stdin);
            if (c == '\n') {
                line = '\0';
                break;
            } else if (c &gt; 0 &amp;&amp; c &lt; 127) {
                line = c;
                ++count;
            }
            vTaskDelay(10 / portTICK_PERIOD_MS);
      }
      mqtt_cfg.broker.address.uri = line;
      printf("Broker url: %s\n", line);
    } else {
      ESP_LOGE(TAG, "Configuration mismatch: wrong broker url");
      abort();
    }
#endif /* CONFIG_BROKER_URL_FROM_STDIN */

    esp_mqtt_client_handle_t client = esp_mqtt_client_init(&amp;mqtt_cfg);
    /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */
    esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);
    esp_mqtt_client_start(client);
}

void app_main(void)
{
    ESP_LOGI(TAG, " Startup..");
    ESP_LOGI(TAG, " Free memory: %" PRIu32 " bytes", esp_get_free_heap_size());
    ESP_LOGI(TAG, " IDF version: %s", esp_get_idf_version());

    esp_log_level_set("*", ESP_LOG_INFO);
    esp_log_level_set("mqtt_client", ESP_LOG_VERBOSE);
    esp_log_level_set("mqtt_example", ESP_LOG_VERBOSE);
    esp_log_level_set("transport_base", ESP_LOG_VERBOSE);
    esp_log_level_set("esp-tls", ESP_LOG_VERBOSE);
    esp_log_level_set("transport", ESP_LOG_VERBOSE);
    esp_log_level_set("outbox", ESP_LOG_VERBOSE);

    ESP_ERROR_CHECK(nvs_flash_init());
    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
   * Read "Establishing Wi-Fi or Ethernet Connection" section in
   * examples/protocols/README.md for more information about this function.
   */
    ESP_ERROR_CHECK(example_connect());

    mqtt_app_start();
}
</code></pre>

<p>这个程序中通过MQTT_EVENT_DATA事件来执行对应的代码。</p>

<pre>
<code class="language-cpp"> 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-&gt;client;
    int msg_id;
    switch ((esp_mqtt_event_id_t)event_id) {

        ......

    case MQTT_EVENT_DATA:
      ESP_LOGI(TAG, "MQTT_EVENT_DATA");
      printf("TOPIC=%.*s\r\n", event-&gt;topic_len, event-&gt;topic);
      printf("DATA=%.*s\r\n", event-&gt;data_len, event-&gt;data);
      break;
    case MQTT_EVENT_ERROR:

        ......

    }
}</code></pre>

<p>我在这里加入在开关led的代码,</p>

<pre>
<code class="language-cpp">case MQTT_EVENT_DATA:
      ESP_LOGI(TAG, "MQTT_EVENT_DATA");
      printf("TOPIC=%.*s\r\n", event-&gt;topic_len, event-&gt;topic);
      printf("DATA=%.*s\r\n", event-&gt;data_len, event-&gt;data);
      led=!led;
      gpio_set_level(GPIO_OUTPUT_IO_0, led);
      break;
case MQTT_EVENT_ERROR:</code></pre>

<p>接下来使用MQTT-Explorer-0.4.0-beta1.exe测试MQTT连接</p>

<p> &nbsp;</p>

<p>输入的URL一定要和配置的地址一致。</p>

<p> &nbsp;</p>

<p>连接上服务器后,以 /topic/qos0发送数据。</p>

<p> &nbsp;</p>

<p>已经将消息发送到开发板。</p>

<p>&nbsp;</p>

lugl4313820 发表于 2024-5-3 12:04

这IDF用起来,还真的是非常方便。

chejm 发表于 2024-5-3 15:08

<p>楼主分享的ESP32 C6 wifi组网技术内容非常详实,图文并茂,通俗易懂,值得收藏学习</p>
页: [1]
查看完整版本: 【FireBeetle 2 ESP32 C6】Wifi无线组网测试