天天看點

【BLE】ESP32開發填坑和廣播簡介

【BLE】ESP32開發填坑和廣播簡介

關于今日推文

【填坑和廣播簡介】

【BLE】ESP32開發填坑和廣播簡介

最近受到晶片漲價和斷貨的影響,公司幾款批量的藍牙産品都在尋找新方向,是以最近研究了幾款藍牙晶片的代碼,主要面向應用,是以想順帶把ESP32的藍牙也整理下,給想用ESP32的BLE部分的人抛個磚,誰知道ESP32的藍牙和我想象的不太一樣,不建議做BLE單品選擇這個片子。這個以後文章中聊聊,聊回藍牙産品何去何從。我們幾款産品一直用的是瑞昱(螃蟹)的RTL8762,當時搞的時候,原廠送的那個開發闆叫“小蜜蜂”,我特别喜歡這個名字,因為小時候和蜜蜂幹過架。螃蟹的片子平時量小不太好買,遇到現在這個情況更加不好買了,是以老大很久之前就想過要換。

替換方案我們的首選是Nordic,我們當時的做的新項目都是用的nrf52832,用起來非常舒服,SDK的demo也很豐富,基本上在demo的基礎上改改,增加幾個服務和特征就能解決項目。鬼知道這玩意受到疫情影響也斷貨漲價了。

是以近期受到出貨壓力,我們不得不重新選型,這一次我們的首選就是國産藍牙晶片了,找了下,可選挺多了,例如:泰淩微、巨微、博通、彙頂,都有非常不錯的BLE晶片,而泰淩微更是其中的佼佼者。說到這大家是不是覺得我們選擇的是泰淩微?沒有!!因為我們和沁恒的技術有點關系,能得到原廠的技術支援(協助解決次BUG,以後聊),是以默默的選擇了沁恒的CH579,性能中等,用着非常舒服(可仿真,協定棧打包成lib,沒有亂七八糟的下載下傳操作,和單片機一樣操作簡單),價格也非常美麗。

【BLE】ESP32開發填坑和廣播簡介

适合讀者範圍

  1. 不想知道協定棧具體工作
  2. 不想肯藍牙協定規範文檔
  3. 對藍牙不太了解又不想深入研究的
  4. 偶爾做個項目要用
  5. 快速解決應用問題
  6. 隻做從機(廣播後被連接配接,然後互動資料)

用最直白的描述講解BLE,是以當出現不規範的說法時,别見笑哈。

BLE産品的幾個名詞市面上大部分BLE産品都是作為廣播者發送資料,被掃描者(例如手機)掃描到後,廣播者可選擇回複掃描應答包(也可不回)。當掃描者(手機)切換到發起者(手機)發送連接配接請求後,BLE産品作為廣播者發送連接配接應答。連接配接成功後,發起者(手機)變主機(手機),廣播者變從機(BLE産品),至此廣播、掃描、連接配接流程結束,進入應用層資料互動。

此處有幾個角色轉換,而且整個過程是一切順利,期間可能會出現很多異常情況,以後再說,初學者知道整個順利的過程,入門再分析異常。廣播簡介市面上很多關于廣播的講解,我寫的大部分來源網絡,修改掉其中特别難懂的,且不影響我們目标(做個BLE應用産品)的東西。

廣播的類型一般分為四種:

【BLE】ESP32開發填坑和廣播簡介
  • 可連接配接的非定向廣播(Connectable Undirected ),BLE産品最常用的廣播模式。做的大部分項目都是這個廣播模式。
  • 可連接配接的定向廣播(Connectable Directed ),廣播包中有廣播者和發起者位址,并且廣播事件必須每3.75ms重複一次,是以能夠很快被發現,被連接配接。這種模式不常用。
  • 不可連接配接的非定向廣播(Non-connectable Undirected ),僅僅發送廣播資料,最典型的應用場景是beacon。我做過一個beacon插座項目,廣播插座的計量資訊,然後做個掃描裝置(網關),擷取附近的插座資訊。
  •  可掃描的非定向廣播(Scannable Undirected ),不能用于發起連接配接,但允許其他裝置掃描該廣播裝置。這種模式不常用。

可連接配接的非定向廣播這是一種用途最廣的廣播類型,包括廣播資料和掃描響應資料,它表示目前裝置可以接受其他任何裝置的連接配接請求。廣播可以在沒有被連接配接的情況下發送(在37,38,39信道循環發送),被連上後廣播包就不發了,切換到從機了,和主機進行資料互動。

注意在一個廣播事件中,前一個廣播包的開始到相鄰的下一個廣播包的開始處的時間要小于等于 10ms 。以下幾張圖是廣播時候,可能會遇到的事情。其實我們做應用的話都不用關心,隻要配置好廣播的幾個參數和廣播包資料,配置好掃描應答的資料,開啟廣播即可,但這是常識,了解下即可。

下圖是隻發送廣播的示意圖:

【BLE】ESP32開發填坑和廣播簡介

下圖是發送廣播包時候,收到掃描請求,并給出掃描應答的示意圖:

【BLE】ESP32開發填坑和廣播簡介

下圖是發送廣播包結束,收到掃描請求,并給出掃描應答的示意圖:

【BLE】ESP32開發填坑和廣播簡介

下圖是發送廣播包時候,收到連接配接請求的示意圖:

【BLE】ESP32開發填坑和廣播簡介

BLE裝置被連上後,就不發送包播包了。

代碼不同的晶片不同的SDK,廣播代碼邏輯都是相同的,先配置廣播參數,然後定義廣播資料,最後開啟廣播,BLE就開始發送廣播包了。以下用ESP32的SDK舉例:

  • ESP32的廣播參數配置代碼:
static void hci_cmd_send_ble_set_adv_param(void){    uint16_t adv_intv_min = 256; // 160ms    uint16_t adv_intv_max = 256; // 160ms    uint8_t adv_type = 0; // connectable undirected advertising (ADV_IND)    uint8_t own_addr_type = 0; // Public Device Address    uint8_t peer_addr_type = 0; // Public Device Address    uint8_t peer_addr[6] = {0x80, 0x81, 0x82, 0x83, 0x84, 0x85};    uint8_t adv_chn_map = 0x07; // 37, 38, 39    uint8_t adv_filter_policy = 0; // Process All Conn and Scan
    uint16_t sz = make_cmd_ble_set_adv_param(hci_cmd_buf,                  adv_intv_min,                  adv_intv_max,                  adv_type,                  own_addr_type,                  peer_addr_type,                  peer_addr,                  adv_chn_map,                  adv_filter_policy);    esp_vhci_host_send_packet(hci_cmd_buf, sz);}
      
  • ESP32的廣播資料代碼:(廣播包資料最多31的位元組)
static void hci_cmd_send_ble_set_adv_data(void){    char *adv_name = "ESP-BLE-HELLO";    uint8_t name_len = (uint8_t)strlen(adv_name);    uint8_t adv_data[31] = {0x02, 0x01, 0x06, 0x0, 0x09};    uint8_t adv_data_len;
    adv_data[3] = name_len + 1;    for (int i = 0; i < name_len; i++) {        adv_data[5 + i] = (uint8_t)adv_name[i];    }    adv_data_len = 5 + name_len;
    uint16_t sz = make_cmd_ble_set_adv_data(hci_cmd_buf, adv_data_len, (uint8_t *)adv_data);    esp_vhci_host_send_packet(hci_cmd_buf, sz);}      
  • ESP32開啟廣播代碼:
static void hci_cmd_send_ble_adv_start(void){    uint16_t sz = make_cmd_ble_set_adv_enable (hci_cmd_buf, 1);    esp_vhci_host_send_packet(hci_cmd_buf, sz);}      

下一篇規劃下一篇講解下廣播參數配置和廣播資料的代碼,講講每個參數的大緻作用,遇到問題的時候友善修改修改。資料下載下傳市面上nordic的資料最多,我搜集了些,大家需要的話,自行下載下傳。

公衆号背景回複關鍵詞【52832】,發送後收到連結即可下載下傳。

舉例:關鍵詞【步進電機】

【BLE】ESP32開發填坑和廣播簡介
【BLE】ESP32開發填坑和廣播簡介

關注微信公衆号

【BLE】ESP32開發填坑和廣播簡介