色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

          EEPW首頁(yè) > 博客 > 「電子DIY」使用ESP32的BLE功能

          「電子DIY」使用ESP32的BLE功能

          發(fā)布人:電子資料庫(kù) 時(shí)間:2023-02-14 來(lái)源:工程師 發(fā)布文章

          最美麗的特征之一ESP32已經(jīng)超過(guò)了ESP-12e事實(shí)上,除了WiFi,它還有另外兩個(gè)通訊模塊。ESP32配備車載經(jīng)典藍(lán)牙和低功耗藍(lán)牙技術(shù)模塊。在今天的教程中,我們將探討如何在項(xiàng)目中使用ESP-32上的藍(lán)牙低能耗模塊。

          image.png


          介紹到低能耗藍(lán)牙

          藍(lán)牙協(xié)議可以分為兩種類型:經(jīng)典藍(lán)牙和較新的藍(lán)牙低能量協(xié)議(也稱為藍(lán)牙4.0)。這兩種協(xié)議在2.4ghz ISM頻段內(nèi)工作,但它們都具有不同的數(shù)據(jù)速率、不同的功耗速率,并針對(duì)不同的應(yīng)用進(jìn)行了優(yōu)化。藍(lán)牙低能量(blue)的誕生是為了克服傳統(tǒng)藍(lán)牙的缺陷,它有點(diǎn)不適合用于物聯(lián)網(wǎng)和電池供電的智能設(shè)備,后者只需要在特定的時(shí)間間隔發(fā)送短時(shí)間的數(shù)據(jù)。與傳統(tǒng)藍(lán)牙的連續(xù)數(shù)據(jù)流不同,BLE的設(shè)計(jì)僅消耗傳統(tǒng)藍(lán)牙設(shè)備傳輸數(shù)據(jù)時(shí)所消耗的能量的一小部分,而不傳輸數(shù)據(jù)時(shí)則保持睡眠模式。這使得BLE設(shè)備更省電,更適合物聯(lián)網(wǎng)產(chǎn)品和其他電池供電的智能設(shè)備,這些設(shè)備通常希望在一次電池充電時(shí)盡可能長(zhǎng)時(shí)間使用。

          下圖顯示了兩種藍(lán)牙類型之間的詳細(xì)比較。

          image.png


          BLE與經(jīng)典藍(lán)牙

          BLE設(shè)備運(yùn)行動(dòng)態(tài)的一個(gè)缺點(diǎn)是消息傳遞系統(tǒng)的復(fù)雜性或健壯性(取決于您如何看待它)。在經(jīng)典藍(lán)牙中,串行端口協(xié)議(SPP)通常用于在設(shè)備之間發(fā)送數(shù)據(jù),因?yàn)橥ㄐ虐l(fā)生時(shí)沒(méi)有太多開銷,但是對(duì)于BLE,通信期間的數(shù)據(jù)是使用GATT(通用屬性)的配置文件來(lái)組織的。

          在兩個(gè)BLE設(shè)備之間的通信中,基本上有兩個(gè)協(xié)議是重要的;差距和關(guān)貿(mào)總協(xié)定. 理解這兩個(gè)工作原理對(duì)于編程設(shè)備通過(guò)BLE協(xié)議進(jìn)行通信非常重要。

          GAP協(xié)議

          GAP是通用訪問(wèn)配置文件,它控制藍(lán)牙中的連接和廣告(使設(shè)備可見(jiàn)并為連接打開)。它定義了設(shè)備在通信中扮演的角色,還確定了如何廣播廣告(或掃描,取決于設(shè)備角色)負(fù)載。

          基于GAP,BLE器件基本上可以發(fā)揮兩種作用;中央設(shè)備和外圍設(shè)備 . these two devices are the ble's representation for the more popular words顧客 Holmium and holmium服務(wù)器“分別說(shuō)。外圍設(shè)備通常是由電池供電的小型設(shè)備,它們廣播廣告數(shù)據(jù),等待來(lái)自準(zhǔn)備接收數(shù)據(jù)有效載荷的中央設(shè)備的連接。在基于物聯(lián)網(wǎng)的解決方案中,外圍設(shè)備通常是傳感器等,而中央設(shè)備通常是網(wǎng)關(guān)、智能手機(jī)等。在連接之前,通用接入配置文件將持續(xù)廣播廣告有效載荷,直到出現(xiàn)匹配的掃描響應(yīng)。一旦外圍設(shè)備和中央設(shè)備之間建立了連接,廣告過(guò)程將停止,并且您通常不再能夠發(fā)送廣告包,此時(shí),關(guān)貿(mào)總協(xié)定服務(wù)和特性的作用是促進(jìn)雙向交流。

          GATT協(xié)定

          關(guān)貿(mào)總協(xié)定是通用屬性配置文件它定義了兩個(gè)藍(lán)牙低能耗設(shè)備如何使用稱為服務(wù)和特征的概念在彼此之間來(lái)回傳輸數(shù)據(jù)。它使用一種稱為屬性協(xié)議(attributeprotocol,ATT)的通用數(shù)據(jù)協(xié)議,將服務(wù)、特征和相關(guān)數(shù)據(jù)存儲(chǔ)在一個(gè)簡(jiǎn)單的查找表中,對(duì)表中的每個(gè)條目使用16位id。關(guān)貿(mào)總協(xié)定分層數(shù)據(jù)結(jié)構(gòu)包括三個(gè)主要要素;配置文件 ,服務(wù),和特點(diǎn) .

          image.png


          GATT協(xié)定

          配置文件是預(yù)定義的服務(wù)集合它是由藍(lán)牙SIG或外圍設(shè)計(jì)人員編譯的。例如,在心率監(jiān)視器中,心率配置文件可以包括心率服務(wù)、電池壽命服務(wù)和設(shè)備信息服務(wù)。一份正式通過(guò)的關(guān)貿(mào)總協(xié)定的清單是可用的在這里 .

          服務(wù)用于將數(shù)據(jù)分組到邏輯實(shí)體中,并包含稱為特征的特定數(shù)據(jù)塊. 一個(gè)服務(wù)可以有一個(gè)或多個(gè)特征,每個(gè)服務(wù)通過(guò)一個(gè)稱為UUID的唯一數(shù)字ID來(lái)區(qū)別于其他服務(wù),UUID可以是16位(對(duì)于正式采用的BLE服務(wù))或128位(對(duì)于定制服務(wù))。正式采用的BLE服務(wù)的完整列表可以在Bluetooth開發(fā)人員門戶的服務(wù)頁(yè)面上看到。為了更好地理解服務(wù)是如何工作的,再次考慮心率示例,它可以包含多達(dá)3個(gè)特征,其中正式采用的服務(wù)例如,包括:心率測(cè)量、身體傳感器位置和心率控制點(diǎn)。因此,本質(zhì)上是對(duì)相關(guān)數(shù)據(jù)進(jìn)行分組的服務(wù)。

          特征是關(guān)貿(mào)總協(xié)定結(jié)構(gòu)中最底層的概念。它封裝了一個(gè)數(shù)據(jù)點(diǎn),就像服務(wù)一樣,它使用一個(gè)唯一的數(shù)字ID(UUID)來(lái)區(qū)別于其他特征。特征是在兩個(gè)設(shè)備之間傳輸數(shù)據(jù)的主要容器。

          說(shuō)到這里,今天的教程將展示如何將ESP32設(shè)置為顧客(中央設(shè)備)和as服務(wù)器(外圍設(shè)備)。為了正確演示,我們將使用兩個(gè)ESP32板。其中一塊板將被編程為充當(dāng)服務(wù)器,具有發(fā)送隨機(jī)數(shù)據(jù)的特性,而另一塊ESP32板將被編程為BLE掃描儀來(lái)查找服務(wù)器。

          所需組件
          1. 必須是ESP32 DevKit(2個(gè))

          2. 電源組/電池

          正如導(dǎo)言中提到的,我們只需要ESP32模塊,因?yàn)樗呀?jīng)具備了項(xiàng)目所需的全部功能。powerbank有助于在獨(dú)立模式下輕松地為Devkit供電。您可以通過(guò)添加傳感器將實(shí)時(shí)數(shù)據(jù)發(fā)送到中心設(shè)備來(lái)輕松修改本教程。

          我們將只使用ESP32板,所以沒(méi)有示意圖,我們直接去項(xiàng)目的代碼。

          代碼

          因?yàn)槲覀儾粫?huì)連接任何組件,所以讓我們直接跳到代碼。如引言中所述,我們將把ESP32設(shè)置為客戶機(jī)和服務(wù)器。我們需要一張又一張的素描,這意味著我們需要一張又一張。

          需要注意的是,此項(xiàng)目的代碼將使用Arduino IDE編寫,如果您的IDE沒(méi)有安裝ESP 32 Arduino板包,則無(wú)法上載代碼。此安裝、下載和安裝Arduino的ESP32板文件在我們的ESP32教程簡(jiǎn)介. 一定要檢查一下

          一旦安裝了線路板文件,它會(huì)自動(dòng)將幾個(gè)ESP32庫(kù)加載到Arduino IDE中。今天教程中的兩個(gè)草圖都將嚴(yán)重依賴于其中的一個(gè)庫(kù) ESP32 BLE Arduino庫(kù). 這個(gè)庫(kù)由函數(shù)和聲明組成,這些函數(shù)和聲明使得通過(guò)復(fù)雜的協(xié)議(至少比串行協(xié)議更復(fù)雜)發(fā)送數(shù)據(jù),比如BLE。

          BLE服務(wù)器草圖

          我將從BLE服務(wù)器開始對(duì)這兩個(gè)草圖做一個(gè)簡(jiǎn)短的解釋。BLE服務(wù)器的算法遵循上述介紹中的解釋。我們首先創(chuàng)建一個(gè)BLE服務(wù),然后在該服務(wù)下創(chuàng)建BLE特征,然后在特征下創(chuàng)建BLE描述符。然后我們啟動(dòng)服務(wù)并開始廣告,以便掃描BLE設(shè)備時(shí)可以看到設(shè)備。

          我們通過(guò)在bleaduino庫(kù)中導(dǎo)入代碼所需的庫(kù)來(lái)開始繪制草圖。



          #include <BLEDevice.h>

          #include <BLEUtils.h>

          #include <BLEServer.h>

          接下來(lái),我們提供 UUID系統(tǒng)服務(wù)和特點(diǎn)。這些uuid可以通過(guò)以下網(wǎng)站生成 UUID發(fā)生器

          #define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"

          #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

          接下來(lái),我們編寫無(wú)效設(shè)置()功能。我們首先初始化串行通信以用于調(diào)試目的,然后創(chuàng)建 氣泡裝置類并將對(duì)象設(shè)置為服務(wù)器。

          void setup() {

          Serial.begin(115200);

          Serial.println("Starting BLE work!");

          BLEDevice::init("Long name works now");

          BLEServer *pServer = BLEDevice::createServer();

          接下來(lái),我們?yōu)榉?wù)器創(chuàng)建一個(gè)服務(wù)和一個(gè)服務(wù)特征,在這兩種情況下都指定了UUID。還指定了特征屬性(在本例中是讀和寫)。

          BLEService *pService = pServer->createService(SERVICE_UUID);

          BLECharacteristic *pCharacteristic = pService->createCharacteristic(

          CHARACTERISTIC_UUID,

          BLECharacteristic::PROPERTY_READ |

          BLECharacteristic::PROPERTY_WRITE

          );

          接下來(lái),我們?yōu)樘卣髟O(shè)置一個(gè)值。如前所述,我們將在本教程中使用一個(gè)隨機(jī)值,但這可能是一個(gè)傳感器值,或者您希望發(fā)送給客戶機(jī)的任何其他信息。

          pCharacteristic->setValue("Hello World says Neil");

          最后,我們啟動(dòng)服務(wù),設(shè)置廣告參數(shù),并開始發(fā)送廣告負(fù)載。

          pService->start();

          // BLEAdvertising *pAdvertising = pServer->getAdvertising(); // this still is working for backward compatibility

          BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();

          pAdvertising->addServiceUUID(SERVICE_UUID);

          pAdvertising->setScanResponse(true);

          pAdvertising->setMinPreferred(0x06); // functions that help with iPhone connections issue

          pAdvertising->setMinPreferred(0x12);

          BLEDevice::startAdvertising();

          對(duì)于這個(gè)演示,我們將留空循環(huán)部分,但您可以選擇在其中執(zhí)行進(jìn)一步的任務(wù)。您可以瀏覽bleaduino庫(kù)下的所有示例以更好地理解。

          void loop() {

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

          }

          服務(wù)器的完整代碼在下面提供,它也附在教程末尾的下載部分。

          /*

          Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleServer.cpp

          Ported to Arduino ESP32 by Evandro Copercini

          */

          #include <BLEDevice.h>

          #include <BLEUtils.h>

          #include <BLEServer.h>

          // See the following for generating UUIDs:

          // https://www.uuidgenerator.net/

          #define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"

          #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

          void setup() {

          Serial.begin(115200);

          Serial.println("Starting BLE work!");

          BLEDevice::init("Long name works now");

          BLEServer *pServer = BLEDevice::createServer();

          BLEService *pService = pServer->createService(SERVICE_UUID);

          BLECharacteristic *pCharacteristic = pService->createCharacteristic(

          CHARACTERISTIC_UUID,

          BLECharacteristic::PROPERTY_READ |

          BLECharacteristic::PROPERTY_WRITE

          );

          pCharacteristic->setValue("Hello World says Neil");

          pService->start();

          // BLEAdvertising *pAdvertising = pServer->getAdvertising(); // this still is working for backward compatibility

          BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();

          pAdvertising->addServiceUUID(SERVICE_UUID);

          pAdvertising->setScanResponse(true);

          pAdvertising->setMinPreferred(0x06); // functions that help with iPhone connections issue

          pAdvertising->setMinPreferred(0x12);

          BLEDevice::startAdvertising();

          Serial.println("Characteristic defined! Now you can read it in your phone!");

          }

          void loop() {

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

          delay(2000);

          }

          BLE掃描儀草圖

          在ESP 32 BLE Arduino庫(kù)中提供了與服務(wù)器草圖類似的掃描儀草圖示例。

          像往常一樣,我們從包含所需庫(kù)開始繪制草圖。

          #include <BLEDevice.h>

          #include <BLEUtils.h>

          #include <BLEScan.h>

          #include <BLEAdvertisedDevice.h>

          接下來(lái),我們指示掃描有效負(fù)載廣播和創(chuàng)建布萊斯掃描班級(jí)

          int scanTime = 5; //In seconds

          BLEScan* pBLEScan;

          接下來(lái),我們編寫無(wú)效設(shè)置()功能。我們首先初始化串行監(jiān)視器,然后初始化BLE,它會(huì)自動(dòng)激活ESP32上的BLE模塊。參數(shù)設(shè)置為空,因?yàn)槲覀儾恍枰O(shè)備的名稱。

          void setup() {

          Serial.begin(115200);

          Serial.println("Scanning...");

          BLEDevice::init("");

          把設(shè)置()函數(shù),我們調(diào)用scan函數(shù),設(shè)置掃描所需的所有參數(shù)。

          pBLEScan = BLEDevice::getScan(); //create new scan

          pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());

          pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster

          pBLEScan->setInterval(100);

          pBLEScan->setWindow(99); // less or equal setInterval value

          }

          接下來(lái),我們編寫無(wú)效循環(huán)()功能。背后的算法無(wú)效循環(huán)()函數(shù)用于簡(jiǎn)單地檢查是否找到任何設(shè)備,并將這些設(shè)備打印在其編號(hào)旁邊。結(jié)果被清除,循環(huán)重新開始。

          void loop() {

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

          BLEScanResults foundDevices = pBLEScan->start(scanTime, false);

          Serial.print("Devices found: ");

          Serial.println(foundDevices.getCount());

          Serial.println("Scan done!");

          pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory

          delay(2000);

          }

          掃描器的完整代碼如下所示,并附在下載部分下的zip文件中。

          /*

          Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp

          Ported to Arduino ESP32 by Evandro Copercini

          */

          #include <BLEDevice.h>

          #include <BLEUtils.h>

          #include <BLEScan.h>

          #include <BLEAdvertisedDevice.h>

          int scanTime = 5; //In seconds

          BLEScan* pBLEScan;

          class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

          void onResult(BLEAdvertisedDevice advertisedDevice) {

          Serial.printf("Advertised Device: %s n", advertisedDevice.toString().c_str());

          }

          };

          void setup() {

          Serial.begin(115200);

          Serial.println("Scanning...");

          BLEDevice::init("");

          pBLEScan = BLEDevice::getScan(); //create new scan

          pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());

          pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster

          pBLEScan->setInterval(100);

          pBLEScan->setWindow(99); // less or equal setInterval value

          }

          void loop() {

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

          BLEScanResults foundDevices = pBLEScan->start(scanTime, false);

          Serial.print("Devices found: ");

          Serial.println(foundDevices.getCount());

          Serial.println("Scan done!");

          pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory

          delay(2000);

          }

          演示

          復(fù)制代碼并粘貼到Arduino IDE中(或從示例文件啟動(dòng)代碼),然后一個(gè)接一個(gè)地將服務(wù)器草圖上載到指定為服務(wù)器的板上,并將掃描儀代碼上載到指定為掃描儀的板上。要使此演示生效,兩塊板都需要“打開”,因?yàn)槿绻?wù)器“關(guān)閉”,客戶端將無(wú)法看到服務(wù)器,因此您可以將其中兩塊板保持連接到您的PC,或者將服務(wù)器連接到電源組或任何其他電源。排序后,啟動(dòng)串行監(jiān)視器,確保它設(shè)置為客戶端連接的串行端口。幾秒鐘后,您將看到找到的藍(lán)牙設(shè)備的數(shù)量以及串行監(jiān)視器上顯示的名稱。

          今天的教程到此為止。你可以通過(guò)將一個(gè)傳感器連接到BLE服務(wù)器并在另一個(gè)ESP32板上運(yùn)行BLE客戶端示例來(lái)立即擴(kuò)展項(xiàng)目,或者最好還是使用支持BLE設(shè)備的移動(dòng)應(yīng)用程序與服務(wù)器交互。BLE是目前智能設(shè)備中使用最廣泛的通信方法之一,我希望本教程能為您提供在您自己的項(xiàng)目中使用它所需的信息。

          像往常一樣,請(qǐng)隨時(shí)通過(guò)評(píng)論區(qū)與我聯(lián)系,提出關(guān)于本教程的問(wèn)題或一般性意見(jiàn)。


          *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



          關(guān)鍵詞: 電子 BLE

          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉