eew_cT3H5d 发表于 2024-5-27 22:30

【Beetle ESP32 C6迷你开发板】多功能桌面空气质量检测仪-04蓝牙通讯

<div class='showpostmsg'> 本帖最后由 eew_cT3H5d 于 2024-5-27 23:05 编辑

<p node=""><span style="font-size:16px;"><strong>一、蓝牙相关知识概述</strong></span></p>

<p node="">ESP32-C6是一款集成了多种无线通信协议的芯片,包括Wi-Fi 6、低功耗蓝牙(BLE)、Zigbee和Thread。以下是关于ESP32-C6蓝牙通讯的详细信息:</p>

<p node="">ESP32-C6支持蓝牙 5.0 (LE),并且已经获得了蓝牙 LE 5.3 认证。这意味着它能够提供更高的数据传输速率和更低的能耗。</p>

<ol>
        <li>
        <p node=""><strong>蓝牙功能和应用</strong>:</p>

        <ul>
                <li><strong>BluFi</strong>:ESP32-C6提供了一个名为BluFi的Wi-Fi网络配置功能,通过蓝牙通道传递Wi-Fi配置和凭据,从而使ESP32-C6能够连接到AP或建立软AP。</li>
                <li><strong>蓝牙串口服务</strong>:可以在ESP32-C6上创建蓝牙串口服务,用于设备间的数据传输。例如,可以使用两块ESP32-C6开发板进行双机通讯,并实现蓝牙开关功能。</li>
        </ul>

        <p node="">ESP32-C6中的蓝牙协议栈是一个分层架构,可以在ESP32-C6系列芯片上实现蓝牙功能。相关文档和应用示例可以在ESP-IDF中找到。</p>
        </li>
        <li>
        <p node=""><strong>开发板和模块</strong>:</p>

        <ul>
                <li><strong>Beetle ESP22 C6迷你开发板</strong>:基于ESP32-C6芯片,支持Wi-Fi 6、蓝牙、Zigbee、Thread等无线协议,并且具备完整的低功耗蓝牙功能。</li>
                <li><strong>FireBeetle 2 ESP32-C6</strong>:这款开发板也支持Wi-Fi 6、蓝牙5、Zigbee 3.0、Thread 1.3通讯协议,并且可以通过Type-C、3V DC、太阳能供电。</li>
        </ul>

        <p node="">在实际应用中,可以通过手机端安装蓝牙调试助手,与ESP32-C6进行数据传输。这种方式常用于测试和调试过程中。</p>
        </li>
</ol>

<p node="">ESP32-C6不仅支持蓝牙 5.0,还提供了丰富的蓝牙功能和应用示例,使其成为物联网设备开发中的理想选择。</p>

<p node="">&nbsp;</p>

<h4>ESP32-C6的蓝牙协议栈分层架构是如何设计的,以及它如何支持多种蓝牙功能?</h4>

<p node="">ESP32-C6的蓝牙协议栈分层架构设计如下:</p>

<ol>
        <li>
        <p node=""><strong>物理层(Physical Layer)</strong>:这是蓝牙协议的最底层,负责信号的传输和接收。ESP32-C6通过其内置的蓝牙模块实现这一层的功能。</p>
        </li>
        <li>
        <p node=""><strong>数据链路层(Data Link Layer)</strong>:在物理层的基础上,数据链路层负责将原始比特流转换为可靠的帧,并进行错误检测和纠正。ESP32-C6通过其蓝牙模块实现这一层的功能。</p>
        </li>
        <li>
        <p node=""><strong>网络层(Network Layer)</strong>:网络层负责将数据包从源头传输到目的地。ESP32-C6通过其蓝牙模块实现这一层的功能。</p>
        </li>
        <li>
        <p node=""><strong>传输层(Transport Layer)</strong>:传输层负责提供端到端的数据传输服务,确保数据的顺序和完整性。ESP32-C6通过其蓝牙模块实现这一层的功能。</p>
        </li>
        <li>
        <p node=""><strong>会话层(Session Layer)</strong>:会话层负责管理连接和通信协议。ESP32-C6通过其蓝牙模块实现这一层的功能。</p>
        </li>
        <li>
        <p node=""><strong>表示层(Presentation Layer)</strong>:表示层负责数据格式和加密。ESP32-C6通过其蓝牙模块实现这一层的功能。</p>
        </li>
        <li>
        <p node=""><strong>应用层(Application Layer)</strong>:应用层负责具体的应用程序,如文件传输、电话通信等。ESP32-C6通过其蓝牙模块实现这一层的功能。</p>
        </li>
</ol>

<p node="">ESP32-C6支持多种蓝牙功能,主要包括:</p>

<ol>
        <li>
        <p node=""><strong>传统蓝牙(Bluetooth)</strong>:基于Bluedroid堆栈,支持传统蓝牙协议,适用于需要同时使用传统蓝牙和BLE的场景。</p>
        </li>
        <li>
        <p node=""><strong>BLE(Bluetooth Low Energy)</strong>:基于Apache NimBLE堆栈,仅支持BLE,适用于仅需要BLE的场景。</p>
        </li>
        <li>
        <p node=""><strong>Wi-Fi 6 + Bluetooth 5 (LE)</strong>:ESP32-C6集成了Wi-Fi 6和Bluetooth 5 (LE),并且优化了对IoT设备的支持。</p>
        </li>
        <li>
        <p node=""><strong>Thread/Zigbee</strong>:ESP32-C6还支持Thread和Zigbee协议,这些协议广泛应用于物联网设备中。</p>
        </li>
</ol>

<h4>ESP32-C6蓝牙5.3认证的具体优势和性能改进是什么?</h4>

<p node="">ESP32-C6 蓝牙5.3认证的具体优势和性能改进主要体现在以下几个方面:</p>

<ol>
        <li>
        <p node=""><strong>高性能处理器</strong>:ESP32-C6 搭载了高性能的RISC-V 32位处理器,这使得其在处理复杂任务时具有较强的能力。此外,ESP32-C6 还集成了向量指令,用于加速神经网络计算和信号处理等工作,从而显著提升了整体性能。</p>
        </li>
        <li>
        <p node=""><strong>多协议支持</strong>:ESP32-C6 不仅支持蓝牙5.3,还支持Wi-Fi 6、Zigbee 3.0及Thread 1.3协议。这意味着它可以在多种无线通信技术之间进行切换,提供更灵活的连接选项。</p>
        </li>
        <li>
        <p node=""><strong>低功耗设计</strong>:ESP32-C6 采用了低功耗设计,适合需要长时间运行的物联网设备。这对于延长设备的使用寿命和降低能耗非常重要。</p>
        </li>
        <li>
        <p node=""><strong>安全性</strong>:ESP32-C6 提供了可靠的安全特性,确保数据传输的安全性。这对于保护敏感信息尤为重要。</p>
        </li>
        <li>
        <p node=""><strong>内存资源丰富</strong>:ESP32-C6 配备了丰富的内存资源,包括高性能的RAM和可编程的GPIO管脚,这些都有助于提高设备的处理能力和扩展性。</p>
        </li>
        <li>
        <p node=""><strong>蓝牙5.3认证</strong>:通过蓝牙5.3认证,ESP32-C6 在蓝牙连接方面表现出色,能够提供更稳定和高效的连接性能。这对于需要高效蓝牙通信的应用场景(如智能家居、健康监测设备等)来说是一个重要优势。</p>
        </li>
</ol>

<p node="">ESP32-C6 在蓝牙5.3认证方面的具体优势和性能改进主要包括高性能处理器、多协议支持、低功耗设计、可靠的安全特性、丰富的内存资源以及优秀的蓝牙连接性能。</p>

<p node="">&nbsp;</p>

<p node=""><strong>二、实例操作</strong></p>

<p node="">打开案例库</p>

<p node=""> &nbsp;</p>

<p node="">案例代码:</p>

<pre>
<code>/*
    Video: https://www.youtube.com/watch?v=oCMOYS71NIU
    Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
    Ported to Arduino ESP32 by Evandro Copercini

   Create a BLE server that, once we receive a connection, will send periodic notifications.
   The service advertises itself as: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
   Has a characteristic of: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E - used for receiving data with "WRITE"
   Has a characteristic of: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E - used to send data with"NOTIFY"

   The design of creating the BLE server is:
   1. Create a BLE Server
   2. Create a BLE Service
   3. Create a BLE Characteristic on the Service
   4. Create a BLE Descriptor on the characteristic
   5. Start the service.
   6. Start advertising.

   In this example rxValue is the data received (only accessible inside that function).
   And txValue is the data to be sent, in this example just a byte incremented every second.
*/
#include &lt;BLEDevice.h&gt;
#include &lt;BLEServer.h&gt;
#include &lt;BLEUtils.h&gt;
#include &lt;BLE2902.h&gt;

BLEServer *pServer = NULL;
BLECharacteristic * pTxCharacteristic;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint8_t txValue = 0;

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID         "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"


class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
    };

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
    }
};

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      String rxValue = pCharacteristic-&gt;getValue();

      if (rxValue.length() &gt; 0) {
      Serial.println("*********");
      Serial.print("Received Value: ");
      for (int i = 0; i &lt; rxValue.length(); i++)
          Serial.print(rxValue);

      Serial.println();
      Serial.println("*********");
      }
    }
};


void setup() {
Serial.begin(115200);

// Create the BLE Device
BLEDevice::init("UART Service");

// Create the BLE Server
pServer = BLEDevice::createServer();
pServer-&gt;setCallbacks(new MyServerCallbacks());

// Create the BLE Service
BLEService *pService = pServer-&gt;createService(SERVICE_UUID);

// Create a BLE Characteristic
pTxCharacteristic = pService-&gt;createCharacteristic(
                  CHARACTERISTIC_UUID_TX,
                  BLECharacteristic::PROPERTY_NOTIFY
                  );

pTxCharacteristic-&gt;addDescriptor(new BLE2902());

BLECharacteristic * pRxCharacteristic = pService-&gt;createCharacteristic(
                      CHARACTERISTIC_UUID_RX,
                      BLECharacteristic::PROPERTY_WRITE
                  );

pRxCharacteristic-&gt;setCallbacks(new MyCallbacks());

// Start the service
pService-&gt;start();

// Start advertising
pServer-&gt;getAdvertising()-&gt;start();
Serial.println("Waiting a client connection to notify...");
}

void loop() {

if (deviceConnected) {
    pTxCharacteristic-&gt;setValue(&amp;txValue, 1);
    pTxCharacteristic-&gt;notify();
    txValue++;
    delay(10); // bluetooth stack will go into congestion, if too many packets are sent
}

// disconnecting
if (!deviceConnected &amp;&amp; oldDeviceConnected) {
    delay(500); // give the bluetooth stack the chance to get things ready
    pServer-&gt;startAdvertising(); // restart advertising
    Serial.println("start advertising");
    oldDeviceConnected = deviceConnected;
}
// connecting
if (deviceConnected &amp;&amp; !oldDeviceConnected) {
    // do stuff here on connecting
    oldDeviceConnected = deviceConnected;
}
}
</code></pre>

<p node="">烧写程序,打开蓝牙串口小程序,通过手机蓝牙发送数据给Beetle ESP32 C6</p>

<p node=""> &nbsp;</p>

<p node="">&nbsp;</p>

<p node="">接收到发送数据</p>

<p node=""> &nbsp;</p>
</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>
页: [1]
查看完整版本: 【Beetle ESP32 C6迷你开发板】多功能桌面空气质量检测仪-04蓝牙通讯