damiaa 发表于 2024-5-26 12:40

【FireBeetle 2 ESP32 C6开发板】 3 mqtt实验

<div class='showpostmsg'> 本帖最后由 damiaa 于 2024-5-27 08:51 编辑

<div><span style="font-size:24px;">&nbsp;&nbsp;&nbsp;&nbsp; <strong>【FireBeetle 2 ESP32 C6开发板】 3 mqtt实验</strong></span></div>

<div>&nbsp;</div>

<div>&nbsp;</div>

<div>既然是物联网芯片,测试它的无线连接是有必要的,下面就测试一下mqtt,因为它包括了wifi的连接和mqtt tcp等的通信。</div>

<div>&nbsp;</div>

<p><span style="font-size:18px;">一、<strong>准备idf开发环境,和vscode下的配置。</strong></span></p>

<p>&nbsp;</p>

<p>目前配置的是idf v5.21最新稳定版本。<br />
官网下载idf5.21稳定版离线安装版本安装,windows桌面出现图标,就算安装好了。<br />
<br />
在vscode安装ESP-IDF扩展,安装了就不需要重复。<br />
<br />
Vscode的view里面 进去Command Palette&hellip;<br />
<br />
选择ESP-IDF:Configure ESP-IDF Extension<br />
<br />
里面会显示上图的选后面的Use EXISTING SETUP,然后选择你要的版本 我这里选5.21<br />
<br />
这样环境就好了。</p>

<p>&nbsp;</p>

<p><strong><span style="font-size:18px;">二、实验程序准备和编译烧录</span></strong></p>

<p><br />
我们导入一个例程来修改做这个实验,把这个例子保存到一个目录<br />
<br />
<br />
配置芯片型号idf.py set-target esp32c6<br />
配置menuconfig<br />
idf.py menuconfig<br />
对芯片参数进行修改 这里主要修改芯片的spi为QIO 芯片的flah为4M mqtt的broker网址 wifi的ssid和password<br />
<br />
<br />
<br />
修改c程序的publish内容 c程序代码如下:</p>

<pre>
<code class="language-cpp">/*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
/* MQTT (over TCP) Example with custom outbox

   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 &quot;AS IS&quot; 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 &quot;esp_system.h&quot;
#include &quot;nvs_flash.h&quot;
#include &quot;esp_event.h&quot;
#include &quot;esp_netif.h&quot;
#include &quot;protocol_examples_common.h&quot;

#include &quot;esp_log.h&quot;
#include &quot;mqtt_client.h&quot;

static const char *TAG = &quot;MQTT_EXAMPLE&quot;;


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

/*
* <a href="home.php?mod=space&amp;uid=159083" target="_blank">@brief </a>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, &quot;Event dispatched from event loop base=%s, event_id=%&quot; PRIi32 &quot;&quot;, 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, &quot;MQTT_EVENT_CONNECTED&quot;);
      msg_id = esp_mqtt_client_publish(client, &quot;/topic/qos1&quot;, &quot;eeworld DFRobtGitrNrrylr2esp32-c6 test qos1&quot;, 0, 1, 0);
      ESP_LOGI(TAG, &quot;sent publish successful, msg_id=%d&quot;, msg_id);

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

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

      break;
    case MQTT_EVENT_DISCONNECTED:
      ESP_LOGI(TAG, &quot;MQTT_EVENT_DISCONNECTED&quot;);
      break;

    case MQTT_EVENT_SUBSCRIBED:
      ESP_LOGI(TAG, &quot;MQTT_EVENT_SUBSCRIBED, msg_id=%d&quot;, event-&gt;msg_id);
      msg_id = esp_mqtt_client_publish(client, &quot;/topic/qos0&quot;, &quot;eeworld DFRobtGitrNrrylr2esp32-c6 test qos0&quot;, 0, 0, 0);
      ESP_LOGI(TAG, &quot;sent publish successful, msg_id=%d&quot;, msg_id);
      break;
    case MQTT_EVENT_UNSUBSCRIBED:
      ESP_LOGI(TAG, &quot;MQTT_EVENT_UNSUBSCRIBED, msg_id=%d&quot;, event-&gt;msg_id);
      break;
    case MQTT_EVENT_PUBLISHED:
      ESP_LOGI(TAG, &quot;MQTT_EVENT_PUBLISHED, msg_id=%d&quot;, event-&gt;msg_id);
      break;
    case MQTT_EVENT_DATA:
      ESP_LOGI(TAG, &quot;MQTT_EVENT_DATA&quot;);
      printf(&quot;TOPIC=%.*s\r\n&quot;, event-&gt;topic_len, event-&gt;topic);
      printf(&quot;DATA=%.*s\r\n&quot;, event-&gt;data_len, event-&gt;data);
      break;
    case MQTT_EVENT_ERROR:
      ESP_LOGI(TAG, &quot;MQTT_EVENT_ERROR&quot;);
      if (event-&gt;error_handle-&gt;error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) {
            log_error_if_nonzero(&quot;reported from esp-tls&quot;, event-&gt;error_handle-&gt;esp_tls_last_esp_err);
            log_error_if_nonzero(&quot;reported from tls stack&quot;, event-&gt;error_handle-&gt;esp_tls_stack_err);
            log_error_if_nonzero(&quot;captured as transport&#39;s socket errno&quot;,event-&gt;error_handle-&gt;esp_transport_sock_errno);
            ESP_LOGI(TAG, &quot;Last errno string (%s)&quot;, strerror(event-&gt;error_handle-&gt;esp_transport_sock_errno));

      }
      break;
    default:
      ESP_LOGI(TAG, &quot;Other event id:%d&quot;, 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, &quot;FROM_STDIN&quot;) == 0) {
      int count = 0;
      printf(&quot;Please enter url of mqtt broker\n&quot;);
      while (count &lt; 128) {
            int c = fgetc(stdin);
            if (c == &#39;\n&#39;) {
                line = &#39;\0&#39;;
                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(&quot;Broker url: %s\n&quot;, line);
    } else {
      ESP_LOGE(TAG, &quot;Configuration mismatch: wrong broker url&quot;);
      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);

    /*Let&#39;s enqueue a few messages to the outbox to see the allocations*/
    int msg_id;
    msg_id = esp_mqtt_client_enqueue(client, &quot;/topic/qos1&quot;, &quot;data_3&quot;, 0, 1, 0, true);
    ESP_LOGI(TAG, &quot;Enqueued msg_id=%d&quot;, msg_id);
    msg_id = esp_mqtt_client_enqueue(client, &quot;/topic/qos2&quot;, &quot;QoS2 message&quot;, 0, 2, 0, true);
    ESP_LOGI(TAG, &quot;Enqueued msg_id=%d&quot;, msg_id);

    /* Now we start the client and it&#39;s possible to see the memory usage for the operations in the outbox. */
    esp_mqtt_client_start(client);
}

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

    esp_log_level_set(&quot;*&quot;, ESP_LOG_INFO);
    esp_log_level_set(&quot;mqtt_client&quot;, ESP_LOG_VERBOSE);
    esp_log_level_set(&quot;MQTT_EXAMPLE&quot;, ESP_LOG_VERBOSE);
    esp_log_level_set(&quot;TRANSPORT_BASE&quot;, ESP_LOG_VERBOSE);
    esp_log_level_set(&quot;esp-tls&quot;, ESP_LOG_VERBOSE);
    esp_log_level_set(&quot;TRANSPORT&quot;, ESP_LOG_VERBOSE);
    esp_log_level_set(&quot;custom_outbox&quot;, 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 &quot;Establishing Wi-Fi or Ethernet Connection&quot; section in
   * examples/protocols/README.md for more information about this function.
   */
    ESP_ERROR_CHECK(example_connect());

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

<p><br />
编译:Idf.py build<br />
烧写:Idf.py -p COM73 flash</p>

<p>&nbsp;</p>

<p><strong><span style="font-size:18px;">三、实验</span></strong></p>

<p>&nbsp;</p>

<p>因为这个板子信号好像比较弱,所以稍微远点的wifi连不上,所以用手机开了个热点,但热点和我的电脑ip不是一个段里。所以只好用了外网的公共mqtt broker ip</p>

<p>&nbsp;</p>

<div>MQTT.fx-1.7.1 配置如下(和板子的一个broker 和同一端口)</div>

<div></div>

<div>MQTT.fx-1.7.1发送数据到板子如下:</div>

<div></div>

<div></div>

<div>板子发送数据到MQTT.fx-1.7.1</div>

<div></div>

<div>实验先到这里,谢谢。</div>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2024-5-27 07:34

<p>MQTT 客户端设置是不是要在代码中设置 MQTT 服务器的地址、端口、客户端ID等信息吧</p>

damiaa 发表于 2024-5-27 08:48

Jacktang 发表于 2024-5-27 07:34
MQTT 客户端设置是不是要在代码中设置 MQTT 服务器的地址、端口、客户端ID等信息吧

<p>是的。这三项必须 客户端id必须唯一。 还有有qos0 qos1 qos2设置。可以设置密码等。</p>
页: [1]
查看完整版本: 【FireBeetle 2 ESP32 C6开发板】 3 mqtt实验