arduino 低功耗模式專題及常見問題 - CSDN

2021-01-10 CSDN技術社區
一. 藍牙基礎知識1. 藍牙4.0和BLE的區分

通常在了解一點藍牙的朋友看來,往往將BLE等同於藍牙4.0,其實不然。

藍牙4.0是協議,4.0是協議版本號,藍牙4.0是2010年6月由SIG(Special Interest Group)發布的藍牙標準,它有2種模式:

BLE(Bluetooth low energy)只能與4.0協議設備通信,適應節能且僅收發少量數據的設備(如家用電子);

BR/EDR(Basic Rate / Enhanced Data Rate),向下兼容(能與3.0/2.1/2.0通信),適應收發數據較多的設備(如耳機)。這個模式常常也有人稱之為「傳統藍牙」或「經典藍牙」。

可以這樣理解,藍牙4.0協議包含BLE,BLE隸屬於藍牙4.0協議的一部分

2. BLE和雙模藍牙的概念

Bluetooth Low Energy (也被稱為Bluetooth 4.0、BLE、BTLE),下面記作BLE,是使用2.4GHz的無線短距離無線通信標準。 迄今為止,雖然高速藍牙已經實現,但BLE在通訊速度上比較普通,主要強調一個紐扣電池能夠工作幾年的這種省電性能。

設備端和主機端使用GATT(Generic ATTribute) profile進行通信。 如果你聽到GATT這個名詞,就可以將其想成使用BLE,這沒什麼問題。

由於與傳統藍牙不兼容,在主機端,和藍牙3.0合併做為雙模,實現成兩者都可以使用的情況比較多。

3. BLE藍牙架構圖(了解)

最上面綠色的部分是應用層,主要是gatt和att我們可以把它看作是同一層。
sm是安全管理層,負責管理安全。
最下面link layer層和phy層基本上就是一些rf的處理。

4. GATT概念

GATT已經成為BLE通信的規定,每一個設備中存在很多的「service」(服務),service中還包含有多個「Characteristic」(特徵值)。
在藍牙實際數據交換中,就是通過讀寫這些「Characteristic」來實現的。

一個滑鼠是一個BLEDevice一個BLEDevice建立了一個BLE伺服器 BLEServer一個BLE伺服器裡有多個服務BLEService一個服務裡有多個特徵值BLECharacteristic 每個特徵值是一種數據.就是通過讀寫這些「Characteristic」實現讀寫數據

每個characteristic的值可以在不加密的狀態下讀寫,但配對的操作是加密的。 還有當characteristic的值已改變時,可接收通知(notify)。關於通知的概念請見下面小節.

5. UUID

服務和characteristic是通過UUID來進行識別的。

UUID是32位的,但那些被藍牙技術聯盟的標準中定義的UUID是以四個數字來表示的。UUID既有16位的也有128位的,我們需要了解的是16位的UUID是經過藍牙組織認證的,是需要購買的,當然也有一些通用的16位UUID。

UUID:由藍牙設備廠商提供的UUID,UUID是在硬體編程裡已經確定了的,想要操作特定的服務、特徵值都需要通過UUID來找。

6. notify通知的概念

如果主機的一個特徵值characteristic發生改變, 可以使用通知notify來告訴客戶端. 這是伺服器主動給客戶端發的信息, 並非是響應客戶端的請求.

這樣做有很多好處, 比如ESP32採集到了溫度的變化, 可以將數據寫入對應的特徵值characteristic,然後notify通知客戶端.

我們創建特徵值時, 把它規定為通知類型, 當這個特徵值發生變化時,可以通知客戶端,像這樣:

pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY); //創建一個(讀)特徵值, 它是通知下發類型的特徵值

其實客戶端可以不接受伺服器發送的notify,方法是修改自己的Descriptor. BLE伺服器看到你對自己的描述中標識了不想接收notify,也就不會再給你發了.詳見下面的視頻.

7. write寫入的概念

我們可以把特徵值定為寫入類型, 這樣客戶端可以給我們寫入, 觸發寫入回調函數

BLECharacteristic *pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE);//創建一個(寫)特徵, 它是寫入類型的特徵值  pCharacteristic->setCallbacks(new MyCallbacks());  //為特徵添加一個回調

除了通知和寫入, 還有好幾種特徵值類型, 請後續了解

其實BLE理論非常複雜,但我們理解到這個程度即可.附上一個幫助我們理解的視頻:
https://www.bilibili.com/video/bv17v41117sq

二. ESP32 arduino 藍牙BLE通訊的實現1. 思路

把藍牙設備看作伺服器, 把手機看作一個客戶端, 客戶端可以給伺服器發送數據, 伺服器可以給客戶端下發通知

實現思路:

創建BLE設備 BLEDevice::init(ble_name);創建BLE伺服器 BLEServer *pServer = BLEDevice::createServer();創建若干服務 BLEService *pService = pServer->createService(SERVICE_UUID);創建服務的特徵值

下面的例子中, 我們創建了一個叫做pService 的服務, 這個服務其實是為了模擬串口
為了實現"串口",我們在這個服務下添加了兩個特徵值, 一個是TX. 一個是RX.

#include <Arduino.h>#include <BLEDevice.h>#include <BLEServer.h>#include <BLEUtils.h>#include <BLE2902.h>#include <String.h>BLECharacteristic *pCharacteristic; //創建一個BLE特性pCharacteristicbool deviceConnected = false;       //連接否標誌位uint8_t txValue = 0;                //TX的值long lastMsg = 0;                   //存放時間的變量String rxload = "BlackWalnutLabs";  //RX的預置值#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)  {    std::string rxValue = pCharacteristic->getValue();    if (rxValue.length() > 0)    {      rxload = "";      for (int i = 0; i < rxValue.length(); i++)      {        rxload += (char)rxValue[i];        Serial.print(rxValue[i]);      }      Serial.println("");    }  }};void setupBLE(String BLEName){  const char *ble_name = BLEName.c_str(); //將傳入的BLE的名字轉換為指針  BLEDevice::init(ble_name);              //初始化一個藍牙設備  BLEServer *pServer = BLEDevice::createServer(); // 創建一個藍牙伺服器  pServer->setCallbacks(new MyServerCallbacks()); //伺服器回調函數設置為MyServerCallbacks  BLEService *pService = pServer->createService(SERVICE_UUID); //創建一個BLE服務  pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY); //創建一個(讀)特徵值 類型是通知  pCharacteristic->addDescriptor(new BLE2902());//為特徵添加一個描述  BLECharacteristic *pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE); //創建一個(寫)特徵 類型是寫入  pCharacteristic->setCallbacks(new MyCallbacks());//為特徵添加一個回調  pService->start();                  //開啟服務  pServer->getAdvertising()->start(); //伺服器開始廣播  Serial.println("Waiting a client connection to notify...");}void setup(){  Serial.begin(115200);  setupBLE("ESP32BLE"); //設置藍牙名稱}void loop(){  long now = millis(); //記錄當前時間  if (now - lastMsg > 1000)  { //每隔1秒發一次信號    if (deviceConnected && rxload.length() > 0)    {      String str = rxload;      if (str=="10086\r\n")      {        const char *newValue = str.c_str();        pCharacteristic->setValue(newValue);        pCharacteristic->notify();      }    }    lastMsg = now; //刷新上一次發送數據的時間  }}

相關焦點

  • arduino設置串口模式專題及常見問題 - CSDN
    參數:pin:引腳編號mode:GPIO的I/O模式,取值有3種INPUT :作為數字輸入OUTPUT :作為數字輸出INPUT_PULLUP:作為數字輸入,且使能引腳的內部上拉電阻注意:a、引腳作為PWM輸出時,無需先前使用pinMode配置其模式,因為PWM本身就代表了輸出的意思。
  • arduino定位專題及常見問題 - CSDN
  • iot和iot的區別 nb專題及常見問題 - CSDN
    在這裡我們來詳細分析:  憑藉廣覆蓋、大容量、低功耗、低成本等優勢,窄帶物聯網(NB-IoT)被認為是最適合物聯網商用部署的技術。自去年6月核心標準凍結以來,NB-IoT發展全面提速。電信運營商加快布局網絡建設,設備商、終端廠商大力推進NB-IoT技術發展,包括智能抄表、智慧停車、智慧家庭、智慧農業等在內的各種應用紛紛落地。
  • iot和iot區別 nb專題及常見問題 - CSDN
    在這裡我們來詳細分析:  憑藉廣覆蓋、大容量、低功耗、低成本等優勢,窄帶物聯網(NB-IoT)被認為是最適合物聯網商用部署的技術。自去年6月核心標準凍結以來,NB-IoT發展全面提速。電信運營商加快布局網絡建設,設備商、終端廠商大力推進NB-IoT技術發展,包括智能抄表、智慧停車、智慧家庭、智慧農業等在內的各種應用紛紛落地。
  • 卡方檢驗結果分析專題及常見問題 - CSDN
    簡單統計之後,得到總數和死亡率:此處需要使用到ggbarstats函數,其參數可謂是非常的多,詳細的參數表我放在另一個博客中了,有興趣的朋友可以去看看(https://blog.csdn.net/m0_45248682/article/details/104086729)。
  • 藍牙多少功耗算低功耗?低功耗藍牙是如何實現低功耗的?
    目前市場上比較常見的連接技術包括wifi、藍牙和NFC等等。WiFi是熱點最多的無線連接,但功耗較高;NFC可以說是「最私密」的無線連接,即是近距離連接;那相比wifi高功耗、NFC近距離,藍牙的低功耗無縫、快速連接顯然是物聯網市場中最有力的競爭者。
  • f檢驗 matlab專題及常見問題 - CSDN
    15.71985 15.91986 15.71987 16.71988 15.31989 16.11990 16.2MATLAB實現參考網上多個代碼可得https://www.ilovematlab.cn/thread-246993-1-1.htmlhttps://blog.csdn.net
  • 重新定義低功耗、小尺寸FPGA
    最終萊迪思成為業界首個支持28 nm全耗盡型絕緣體上矽(FD-SOI)工藝的低功耗FPGA供應商。該工藝由三星研發,與如今大多數半導體晶片採用的bulk CMOS工藝有些類似,但優勢更為顯著,能在顯著降低器件尺寸和功耗的同時,大幅提升性能和穩定性。
  • 磁性位置傳感器,已在功耗問題上大幅改善
    磁性位置傳感器,已在功耗問題上大幅改善 工程師周亮 發表於 2018-10-13 10:33:00 在行動裝置和消費性應用領域,低功耗無疑是最主流的設計思維
  • 萬能超的arduino學習日記(一)
    本科時候有接觸過arduino,但是由於導師方向原因,轉做了3D列印和動力學分析,所以這裡是啥都會一點點的萬能超,希望能夠和大家一起學習討論。最近由於興趣原因,決定重新撿起arduino,所以決定寫這個萬能超的arduino學習日記跟大家一起重新學習。最開始的入門學習,我選擇跟B站太極創客的學習視頻,因為有基礎,選擇二倍速觀看學習。
  • 卡方檢驗相關性專題及常見問題 - CSDN
    那麼有一個問題:協方差數值大小是否代表了相關程度呢?也就是說如果協方差為 100 是否一定比協方差為 10 的正相關性強呢?假如X1、Y1 和 X2、Y2 分別聯合分布圖,如下所示:考察兩個變量的相關關係,首先得看清楚兩個變量都是什麼類型的,統計分析中常見的變量類型有連續型數值變量,無序分類變量、有序分類變量:連續型數值變量:如銷售額、氣溫、工資收入、考試成績;無序分類變量:如性別男和女,血型種類;有序分類變量:如學歷水平小學、初中、高中
  • android啟動頁設計專題及常見問題 - CSDN
    轉載請註明出處:http://blog.csdn.net/wangjihuanghun/article/details/63255144啟動頁幾乎成為了每個app的標配,有些商家在啟動頁中增加了開屏廣告以此帶來更多的收入。
  • 關於寬帶電力線通信晶片的低功耗設計
    模擬電路電晶體工作在線性放大區,需要設置適當的偏置電壓(或電流),當其工作在亞閾值模式下,可以大大降低功耗;此外模擬模塊通常會提供低功耗關斷模式,通過外部的數字控制管腳進行設置。但用電信息採集系統中寬帶PLC工作在室外環境,面臨的主要問題是覆蓋範圍、可靠性、成本和功耗,通信速率相對要求不高,典型的10 Mb/s物理層速率已能滿足所用應用需要[5],因此工作頻段可大幅降低。 晶片選擇2~12 MHz作為基本工作頻段,向下可擴展至500 kHz,同時應用小帶寬模式或載波屏蔽方式,晶片可工作在6 MHz以下。
  • android藍牙相關框架專題及常見問題 - CSDN
    聯繫人/通話記錄依賴原生contactsprovidermusic音樂相關,走原生Mediasessionsettings藍牙設置相關,用settingsLib控制,開關連接等其他其他應用依賴於Android自身支持的協議(profile)比如GATT低功耗藍牙,OPP文件傳輸,等等註:1、本文以分析整體為主。
  • 數碼管與ARDUINO 開發板的連接使用
    MR:重置(RESET),低電平時將移位寄存器中的數據清零,應用時通常將它直接連高電平(VCC)。OE:輸出允許,高電平時禁止輸出(高阻態)。實際應用時可以將它直接連低電平(GND)。對於一個最簡單的74HC595應用來講,可以用單片機的三個數字I/O埠分別控制DS、SH_CP和ST_CP,然後將MR和OE分別接VCC和地。
  • bootstrap 有統計圖專題及常見問題 - CSDN
    這種模式還常見於評分系統的分數分布。
  • 低功耗藍牙BLE掃描
    傳統掃描:Inquiry,掃描周圍環境中的BR/EDR藍牙設備,常見於設置-藍牙中的搜索BLE掃描:Scan,掃描周圍環境中的低功耗藍牙設備,常見於第三方APP搜索低功耗藍牙(手環、手錶、體脂秤等應用中)簡單的BLE掃描其實也是分為多種掃描方式,按照協議主要分為如下兩種:1、Passive Scanning — 被動掃描,藍牙設備被動掃描周圍環境中對等設備發送出來的廣播包並直接上報到
  • 高靈敏、低功耗的紅外接近感應方案
    Labs)特別推出的Si1102和Si1120是目前業界最靈敏的紅外接近傳感器之一,在遠距探測和低功耗方面尤為出色。Si1102和Si1120紅外接近傳感器的優勢   在消費產品領域應用中,Si1102和Si1120紅外接近傳感器具備了人們極為關注的兩大特點:一是低功耗,二是高靈敏度。
  • 用MSP430設計超低功耗數字溫度計
    在設計溫度遙測系統時,通常需要採用電池供電的極低功耗模塊。傳統的測溫手段比較多,但不論是採用分立電晶體、熱敏電阻,或者是熱電偶,功耗都降不下來。本文介紹了一種滿足低功耗要求的可行方案,該方案使用一枚極低功耗的、帶Flash存儲器的MCU,以及數字溫度傳感器、液晶模塊(LCD)和一個32kHz的鐘表用振蕩器。該方案的突出特點是節能耐用,僅需一枚紐扣電池,就可以連續工作10年以上。
  • Acconeer超低功耗PCR雷達傳感器開啟晶片化時代
    產品採用Aip封裝技術,在60GHz ISM頻段內,把包括天線在內的所有組件都集成在一顆面積僅29mm²的晶片內;產品由於把脈衝雷達低功耗的優勢與高準確度的相干雷達相結合,使得產品功耗低至0.2毫瓦,隨著新型低功耗、晶片化PCR雷達傳感器的誕生,PCR雷達傳感器技術在各種智能設備和消費類電子產品中的應用將成為一種必然趨勢。