6/19/2021

ESP32 BT(Bluetooth) 기본동작 및 BT Stack 비교

1. ESP32 Bluetooth 관련정보 

  • ESP32의 HCI(Host Control Interface)
다른 Bluetooth 처럼 Serial 기반으로 연결되어 HCI가 존재하며, 별도로 VHCI가 존재하고 있음 

  • ESP32 Bluetooth Control/VHCI Layer 함수
HCI(Host Control Interface) 대신 ESP32 Control 기반에 VHCI(Virtual Host Control Interface) 구현됨 
  1. ESP32 Bluetooth Control 함수 
  2. VHCI(Virtual Host Control Interface) Layer 

Bluetooth의 기본동작원리 


1.1  ESP32 Bluetooth 의 Host 구조 및 설정 


ESP32의 경우 BT(Bluetooth) Controller 연결상태에 따라 VHCI or HCI로 연결되어 동작된다.

  • ESP32의 Bluetooth Controller 와 VHCI/HCI 구조 
ESP32 Bluetooth Controller 기반으로 VHCI로 연결하여 Bluedroid를 사용하고 있으며, 외부로 UART로 확장가능 (UART로할 경우 HCI로 동작)
ESP32는 VHCI기반으로 동작되어지고 있으며, Nimble도 동일하며, HCI와 동일하다고 생각하면됨 


https://www.espressif.com/sites/default/files/documentation/esp32_bluetooth_architecture_en.pdf


HCI 관련정보

  • Bluetooth의 HCI의 ACL과 SCO Link 비교
  1. SCO(Synchronous Connection-Oriented) Link 
  2. ACL(Asynchronous Connection-Less)  Link
세부적인 내용은 아래내용참조


  • BT(Bluetooth) 의 HCI Packet 종류
https://www.koreascience.or.kr/article/JAKO200170709939787.pdf


  • ESP32 BT Classic(BR/EDR) 와 BT LE Controller 구조 
  1. SCO(Synchronous Connection-Oriented) Packet: HCI기반으로 동작 (Data)
  2. ACL(Asynchronous Connection-Less) Packet:  HCI기반으로 동작 (Data)
  3. C/E : (Command/Event) Packet : HCI 기반으로 동작 (Control

BT BR/EDR 과 BT LE 의 구조  
BT의 HCI는 아래와 같이 SCO 와 ACL Link가 존재하며, 이는 데이타를 전달(검정색)
Command/Event의 경우 Command와 Event 로 제어담당 (회색)

  https://www.espressif.com/sites/default/files/documentation/esp32_bluetooth_architecture_en.pdf

ESP32 BT Controller 와 VHCI(Virtual HCI)

H4/HCI Protocol

Bluetooth Controller / Host Stack 

  • 일반적인 BT Controller 와 Stack 전체구조 
HCI(Host Control Interface) 기준으로 일반적인 Host Controller 와 상위 Stack을 보도록하자.

** L2CAP를 걸쳐 RFCOMM 기반으로 PPP기반으로 통신도 가능

https://www.koreascience.or.kr/article/JAKO200170709939787.pdf


  • Bluetooth Version의 변화 (Dual Mode 와 BLE) 
  1. Bluetooth BR/EDR (2.x 기반)
  2. Bluetooth BLE (4.x 기반)
  3. Dual Mode (BR/EDR 와 BLE 모두사용)

BR/EDR 와 BLE 와 Dual Mode 차이와 비교
현재는 아래의 사이트로만으로 충분한 이해는 되지 않고 추후 관련부분을 더 조사

Dual Mode의 장점

BT의 Version 별 기능 


  • ESP32 CONFIG_BT_HOST 설정 
  1. Bluedroid (BT Dual Mode)
  2. Nimble (BLE Only)
  3. 상위외 다른 Stack을 사용하고자한다면 이용

ESP32 관련설정 BTDM (Dual Mode)

  • Bluetooth Classic (BR/EDR 2.x기반)
  1. BR : Basic Rate
  2. EDR : Enhanced  Data Rate



1.2 ESP32의 Bluetooth Core 사용 

  • ESP32의 Bluetooth Core 사용
주의해야할것은 ESP32는 Dual Core이지만, 기본적으로 1개의 Core만 사용하면서 동작되므로, Dual Core는 별도로 설정 및 Task로 분할해서 사용하도록하자.  
  1. PRO_CPU
  2. APP_CPU


2. Bluetooth Stack 종류 와 구조 

  • ESP32에서 제공하는 Bluetooth Stack Library
  1. BlueDroid/Fluoride
  2. Nimble(Apache Mynewt NimBLE)

현재 ESP32의 Bluetooth는 BlueDroid기반과 Nimble기반으로 구현이되어 두가지 방식으로 구현가능하다. 

ESP32의 경우 각 Stack마다 동작되는 BT의 기능이 다르므로 주의하도록하자.
Nimble은 BLE Only

  • ESP32의 BT Stack 기본비교 
  1. Bludroid: Android 기반의 BT/BLE로 크고 다양한 기능을 제공하며 Size가 큼 
  2. nimble : BLE만 지원가능하며 작은 Size로 제공가능하며, 아파치 라이센스
Bluedroid/Nibme 비교 

내 개인생각으로느 ESP32가 MCU이기때문에 거의 Nimble로 선택되어 구성될 것으로 생각되며, Bludroid는 다양한 기능을 구현할때 사용하면 될 꺼 같다.


2.1 ESP32 BlueDroid 기반구조(Dual Mode, BT/BLE) 

BlueDroid는 상위 wiki 설명을 보면, Broadcom에서 만들어졌으며, Android에서 처음 Linux에서 사용하던 Bluez를 사용하다가 
BlueDroid로 변경되었다고 하며, 현재 Fluoride라고 이름이 변경되어졌다고 한다.
세부사항은 상위 Wiki 참조 

  • ESP32 BlueDroid 의 구조
  1. BTC Task (Bluetooth Control layer) : BTA_API 와 ESP_API 통신하며, SDP/GAP/GATT 외 BLE/BT Profile Control 
  2. BTU Task :  BLE & BT Stack 정보를 BTA_API 에게 전달  

- GAP(General Access Profile)
- GATT(General Attribute Profile)
- SM(Security Manager)
- ATT(Attribute Protocol)
- L2CAP(Logical Link Control and Adaption Protocol)
- SDP(Service Discovery Protocol)




  https://www.espressif.com/sites/default/files/documentation/esp32_bluetooth_architecture_en.pdf


  • Android Bluetooth 구조 
Android에서 BlueDroid가 사용되어진다고하니, 관련부분들을 링크


ESP32의 BlueDroid는 아래와 같이 Common/BLE/Classic로 구분되어지는 것 같으며, 각각의 부분을 알아야 할 것 같다.

  • ESP32 BlueDroid - BT Common
BlueDroid 기본 Control 부분


  • ESP32 BlueDroid - BLE
GAP/GATT/BLUFI



2.2 ESP32 Nimble 기반구조 (BLE Only)

ESP-Controller는 공유하지만, Nimble 전용 VHCI 가 별도로 존재하며, Nimble Host가 최종적으로 동작되어 Nimble전체를 동작시키는 구조




  • Host 관련부분 설정 
ESP32 Host 관련부분설정 


  • ESP32 Nimble API
세부기본 사용법은 아래의 Link를 참조 

  • Nimble BLE Host 와 Controller 구성
상위 BlueDroid와 동일하게 Host와 Controller 기본구성 (아래링크참조)

  • Nimble 의 reset/sync 함수 
nimble은 host 와 controller가 sync가 맞지않는동안 동작되지 않는다고 한다.
그래서 주기적으로 sync callback를 호출하여 sync를 맞추므로 중요
controller가 reset이 되면서 host역시 이를 reset를 해야하므로 중요


  • Nimble Host API
Nimble의 ATT(Attribute Protocol)함수 GAP 등 

  • ESP32 Bluetooth 구조 및 전체설명문서
ESP32의 Bluetooth에 관련된 내용에 대해 자세히 나오므로 필독



3. Bluetooth 관련 TEST App 

BT TEST를 위해 관련된 TEST Application의 자료수집이며, 현재 Android에서 nRF Connect로 쉽게 GAP/GATT를 테스트 및 디버그가 가능하다.

  • Window 11/10
nRF Connect for Desktop

  • Android BT/BLE 관련 Tool (Nordic Semiconductor)
nRF Connect for Mobile
가장 많이 사용되어지는 Program 

nRF Toolbox for BLE
Android BT GATT 부분 Debug 분석 

Android BT Tool