- BLE (Bluetooth Low Energy) 관련 용어
- 하드웨어 준비
- GATT 서비스를 사용하여 배터리 수준 표시를위한 ESP32 프로그래밍
- ESP32 BLE에서 GATT 서비스 테스트
무선 헤드폰, 피트니스 밴드, 블루투스 스피커, 이어폰 형 헤드폰, 휴대폰, 노트북… 우리 주변에는 너무 많은 블루투스 장치가 있으며 이러한 장치 대부분은 배터리로 작동됩니다. Bluetooth 장치를 휴대폰에 연결할 때 연결된 장치가 컴퓨터, 오디오 장치 또는 휴대폰임을 자동으로 인식하는 방법에 대해 궁금한 적이 있습니까? 일부 장치의 경우 휴대폰이 알림 표시 줄에 연결된 장치의 배터리 비율을 자동으로 표시 할 수도 있습니다. 이 모든 것이 어떻게 스스로 발생합니까? 전화와 블루투스 장치간에 공유되는 몇 가지 공통 프로토콜이 있어야합니다.
인기있는 ESP32 모듈을 사용하여 Bluetooth Low Energy (BLE) 를 이해하려고 할 때 이러한 질문에 대한 답을 얻을 수 있습니다. ESP32의 클래식 블루투스와는 달리 BLE 는 통신이 활성화 될 때만 작동하고 그렇지 않으면 절전 모드로 유지되므로 배터리 구동 애플리케이션에 적합한 선택입니다. BLE는 또한 메시 네트워크를 형성하고 비콘 역할을 할 수 있습니다. 일반적으로 BLE 모듈은 서버 또는 클라이언트로 작동하며 여기서는 ESP32 BLE를 서버로 사용합니다.
여기서는 이해하기 쉽도록 완전한 ESP32 Bluetooth 를 세 부분으로 나눴습니다.
1. 휴대 전화에서 LED를 토글하는 ESP32의 직렬 블루투스
2 . GATT 서비스를 이용하여 배터리 잔량 데이터를 휴대폰으로 전송하는 BLE 서버
3. BLE 클라이언트가 BLE 장치를 검색하고 비콘으로 작동합니다.
우리는 이미 첫 번째 기사를 다루었습니다. 이 기사에서는 ESP32 BLE가 서버로 작동하도록 만들고 GATT 서비스를 사용하여 배터리 수준 정보를 보내는 방법을 배웁니다. 테스트 목적으로 ESP32의 하드 코딩 된 값을 BLE GATT 서비스를 통해 휴대폰에 배터리 백분율로 전송합니다.이 방법으로 모바일은 ESP32가 배터리 백분율로 전송하려는 배터리 작동 Bluetooth 장치라고 가정합니다. 자세히 설명하기 전에 Bluetooth Low Energy와 관련된 몇 가지 용어를 이해합니다.
BLE (Bluetooth Low Energy) 관련 용어
BLE 서버: 앞서 말했듯이 BLE는 서버 또는 클라이언트로 작동하도록 프로그래밍 할 수 있습니다. 서버로 작동 할 때 BLE는 연결을 시작할 수없는 데이터 만 제공 할 수 있습니다. 예를 들어 피트니스 밴드가 있습니다. 서버는 클라이언트가 요청하는 경우에만 정보를 보낼 수 있습니다.
가장 일반적으로 ESP32의 BLE는 서버로 사용됩니다. 각 서버에는 하나 이상의 서비스가 있으며 마찬가지로 각 서비스에는 하나 이상의 특성이 연결됩니다. 특성은 내부에 0 개, 1 개 또는 2 개 이상의 설명자를 가질 수 있습니다. 모든 서비스, 특성 또는 설명자는 UUID라는 자체 사전 정의 된 고유 ID를 갖습니다.
BLE 클라이언트: 클라이언트는 연결을 검색하고 다른 Bluetooth 장치를들을 수 있습니다. 예를 들어 휴대폰이 있습니다. 대부분의 BLE 하드웨어 장치는 서버 및 클라이언트로 작동 할 수 있으며 장치의 역할을 결정하는 소프트웨어입니다.
주변 장치 / 중앙 장치: BLE 네트워크에는 하나의 중앙 장치 만있을 수 있지만 필요한만큼의 주변 장치를 가질 수 있습니다. 중앙 장치는 모든 주변 장치에 동시에 연결할 수 있지만 주변 장치는 중앙 장치에만 연결할 수 있으므로 두 주변 장치가 서로 데이터를 공유 할 수 없습니다. Central 장치의 가장 좋은 예는 스마트 폰이고 주변 장치의 경우 Bluetooth 이어폰 또는 피트니스 밴드입니다.
BLE Advertising: BLE Advertising은 Bluetooth 장치가 모두에게 표시되어 페어링 및 연결을 설정할 수 있도록 지시하는 괴짜 용어로, 단방향 통신으로 간주 될 수 있습니다. 여기서 서버는 서버가 수신 할 것으로 예상하는 광고 데이터를 유지합니다. BLE Beacon은 BLE 유형입니다.
UUID (Universal Unique Identifier) : 모든 BLE Bluetooth 장치에는 프로그래머가 프로그래밍 할 때 범용 고유 식별자 번호가 부여됩니다. 이 식별자는 BLE 장치의 기능 / 역할을 나타내는 일련의 숫자로 생각할 수 있습니다. 다시 두 가지 유형의 UUID가 있습니다. 하나는 서비스 UUID 이고 다른 하나는 특성 UUID 입니다.
GATT 서비스: GATT는 일반 속성 프로필을 나타냅니다. 이것은 두 개의 BLE 장치가 항상 통신해야하는 몇 가지 표준 방법을 정의합니다. 이 속성 (ATT) 프로토콜은 사전 정의되어 있으며 모든 BLE 장치에 공통이므로 두 BLE 장치가 서로를 식별 할 수 있습니다. 그래서 GATT는 이전 질문에 대한 답이었습니다.
두 개의 BLE 장치가 데이터를주고 받아야하는 기술은 서비스 및 특성이라는 개념으로 정의됩니다.
BLE 서비스 / BLE 특성: 서비스 UUID는 BLE 장치가 수행 할 서비스 유형을 알려주고 특성 UUID는 해당 서비스에서 수행 할 매개 변수 또는 기능을 알려줍니다. 따라서 모든 서비스에는 하나 이상의 특성이 있습니다. 괜찮아! 프로그래머는이 UUID를 어디서 얻습니까? 모든 UUID는 이미 GATT (Generic Attribute Profile)에 의해 정의되어 있습니다. 웹 사이트를 방문하여 프로젝트에 필요한 UUID를 선택할 수 있습니다. 나는 그것이 우리 머리 위로 약간 튀었다는 것을 안다. 예를 들어 이해해 봅시다.
오디오 플레이어의 BLE 장치를 가정 해 보겠습니다. 처음에 휴대폰과 페어링 할 때 휴대폰은이를 오디오 장치로 식별하고 상태 표시 줄에 배터리 잔량도 표시합니다. 따라서 이런 일이 발생하려면 오디오 플레이어가 배터리 수준과 배터리 충전 비율을 공유 할 의사가 있음을 휴대 전화에 알려야합니다. 이것은 UUID를 사용하여 수행됩니다. BLE 주사위가 배터리 수준에 대한 세부 정보를 제공 할 것임을 알려주는 특정 UUID가 있습니다.이 UUID는 서비스 유형을 알려주는이 UUID를 Service UUID 라고 합니다. 배터리 값이 이러한 매개 변수에있는 것처럼 서비스를 완료하기 위해 교환 될 수 있으며, 각 매개 변수는 고유 한 UUID를 가지며이를 특성 UUID 라고합니다 .특성에 의해 수행되는 일반적인 기능은 읽기, 쓰기, 알림 및 표시입니다.
BLE 설명자: 설명자는 특성 내부에 존재하는 선택적 속성입니다. 설명자는 일반적으로 특성에 액세스하는 방법을 지정합니다.
BLE Beacon: Bluetooth Beacon은 사용자가 범위 (근 접근)에 도달 할 때 미리 정의 된 동작을 수행하는 근접 스위치와 비슷합니다. 항상 신원을 광고하므로 항상 페어링 할 준비가되어 있습니다.
BLE2902: 여전히이 문제에 대해 회의적이지만 서버에 알림을 켜거나 끄도록 알려주는 클라이언트 측의 소프트웨어로 생각할 수 있습니다. 이것은 전력 절약에 도움이 될 것입니다.
대략적인 아이디어를 얻었기를 바랍니다. 좋은 점은 모든 수작업이 이미 도서관을 통해 우리를 위해 이루어 졌기 때문에 우리가 많이 알 필요가 없다는 것입니다.
하드웨어 준비
이 프로젝트에는 하드웨어 설정이 필요하지 않지만 Arduino IDE에 ESP32 보드 세부 정보를 추가했는지 확인하고 모든 것이 예상대로 작동하는지 확인하기 위해 최소 샘플 깜박임 프로그램을 시도했는지 확인하십시오. 이를 수행하는 방법에 회의적이며 Arduino로 ESP32 시작하기 튜토리얼을 따라 할 수 있습니다.
또한 BLE 서비스를 테스트하기 위해 PlayStore에서 직접 다운로드 할 수있는 nRF Android 애플리케이션을 모바일에서 사용할 것입니다. Iphone 사용자를위한 Itunes Store에서도 사용할 수 있습니다. 오랫동안 BLE로 작업 할 계획이라면이 애플리케이션은 디버깅 목적으로 정말 유용 할 것입니다.
GATT 서비스를 사용하여 배터리 수준 표시를위한 ESP32 프로그래밍
이번에는 GATT 서비스가 무엇이며 서비스 및 특성 모델을 사용하여 구현되는 방법에 대해 공정한 아이디어가 있다고 가정합니다. 이제 Arduino IDE를 사용하여 ESP32에서 구현되는 방법을 알아보기 위해 프로그램을 살펴 보겠습니다. 계속하기 전에이 공간을 사용하여 Andreas Spiess의 비디오 BLE에 감사드립니다.
필요한 라이브러리를 스케치로 가져 와서 프로그램을 시작합니다. ESP32의 BLE 기능을 사용하기 위해 구성해야 할 사항이 많이 있지만 이미 우리를 위해 열심히 일하고 라이브러리를 제공 한 Neil Kolban 덕분입니다. 라이브러리의 기능을 이해하려면 github 페이지에있는 그의 문서를 참조하십시오.
#포함
다음으로 Bluetooth 장치에 대한 서버 콜백 기능을 정의해야합니다. 그 전에 BLE의 콜백 함수가 무엇인지 이해하십시오.
BLE의 콜백 함수는 무엇입니까?
BLE가 서버로 작동 할 때 서버 콜백 함수를 정의하는 것이 중요합니다. BLE와 관련된 많은 유형의 콜백이 있지만 간단히 말하면 이러한 콜백을 작업이 완료되었는지 확인하기 위해 수행되는 확인으로 간주합니다. 서버 콜백은 클라이언트와 서버 간의 연결이 성공적으로 설정되었는지 확인하는 데 사용됩니다.
다음 코드 줄을 사용하여 서버 콜백을 수행합니다.
bool _BLEClientConnected = false; class MyServerCallbacks : public BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
void 설정 기능 내에서 디버깅을 위해 115200에서 Serial 통신을 시작한 다음 InitBLE 기능을 통해 Bluetooth Device 를 초기화합니다.
void setup () { Serial.begin (115200); Serial.println ("배터리 잔량 표시기-BLE"); InitBLE (); }
initBLE는 마법이 일어나는 모든 장소입니다. 여기 에서 Bluetooth 서버 를 만들고 배터리 수준 서비스 를 사용해야합니다. 그러나 그 전에 배터리 수준을 읽기위한 서비스, 특성 및 설명자에 대한 UUID를 정의해야합니다. 모든 UUID는 Bluetooth GATT 서비스 웹 사이트에서 얻을 수 있습니다. 우리의 경우 배터리 서비스를 사용하려고하며 UUID는 아래와 같이 0X180F로 정의됩니다.
다음 으로이 서비스와 관련된 특성 을 알아야합니다. 배터리 서비스를 클릭하기 만하면 서비스 특성 페이지로 이동합니다. 여기서 배터리 수준은 특성의 이름이며 0에서 100까지의 값을 취합니다. 또한 두 가지만 수행 할 수 있습니다. 이 특성을 가진 작업 중 하나는 반드시 수행해야하는 읽기이고 다른 하나는 선택 사항 인 알림입니다. 따라서 우리는 필수 인 클라이언트 (Phone)에 배터리 값을 보내야하며 필요한 경우 선택 사항 인 전화에 알릴 수 있습니다.
그러나 여전히 특성 배터리 수준에 대한 UUID 값을 찾지 못했습니다. 이를 위해 Battery Characteristic 페이지로 이동하여 Battery Level 이름을 검색하면 UUID가 0X2A19로 표시되며 동일한 스냅 샷이 아래에 표시됩니다.
이제 모든 값을 얻었으므로 아래와 같이 프로그램에 넣습니다. 이름 BatterySerivce , BatteryLevelCharacteristic 및 BatteryLevelDescriptor 는 프로그램에서 사용하는 서비스, 특성 및 설명자를 참조하는 사용자 정의 변수입니다. 설명자 0X2901의 값은 값의 크기가 8 비트 일 때 사용되며 자세한 내용은 설명자 설명 페이지에서 찾을 수 있습니다.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ- BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
initBLE 함수로 돌아갑니다. 먼저 BLE 서버를 시작하고 이름으로 광고해야합니다. 다음 줄은 서버와 BLE를 시작하는 데 사용된다. BLe 서버에 부여한 이름은“BLE Battery”이지만 직접 선택할 수 있습니다.
BLEDevice:: init ("BLE 배터리"); // BLE 서버 생성 BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (new MyServerCallbacks ());
다음으로 UUID를 이미 정의 했으므로 GATT 서비스 를 시작 해야합니다. 아래 줄을 사용하여 간단히 서비스를 시작할 수 있습니다.
// BLE 서비스 생성 BLEService * pBattery = pServer-> createService (BatteryService);
서비스가 시작되면 설명자를 특성과 연결하고 값을 설정할 수 있습니다. BLE2902 서비스도 아래와 같이 여기에 추가됩니다.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("퍼센트 0-100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (new BLE2902 ());
마지막으로 모든 것이 설정되었습니다. 이제 남은 것은 ESP32에 광고 를 요청하여 휴대폰과 같은 다른 장치가이를 발견하고 연결할 수 있도록하는 것입니다. 클라이언트에 연결되면 배터리 서비스를 시작해야합니다. 다음 줄.
pServer-> getAdvertising ()-> addServiceUUID (BatteryService); pBattery-> start (); // 광고 시작 pServer-> getAdvertising ()-> start ();
그것은 지금까지 훌륭합니다. 마지막 단계는 설명자에게 클라이언트 (전화) 로 보내야 할 배터리의 값을 백분율로 알려주는 것 입니다. 이 값은 앞서 읽은대로 0-100 사이 일 수 있습니다. 단순하게 유지하기 위해 배터리 값을 57로 하드 코딩 한 다음 5 초마다 증가시키고 100에 도달하면 0부터 시작합니다. 수행 할 코드 아래에 나와 있습니다. 전송되는 값은 unit8_t 형식입니다.
uint8_t 레벨 = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); 지연 (5000); 레벨 ++; Serial.println (int (레벨)); if (int (level) == 100) level = 0; }
ESP32 BLE에서 GATT 서비스 테스트
위에서 설명한 전체 코드는 페이지의 마지막에 제공됩니다. ESP32 보드에 코드를 업로드합니다. 업로드되면 휴대 전화가 "BLE Battery"라는 블루투스 장치를 발견해야합니다.
그런 다음 nRF Android 애플리케이션을 설치하고 열고 BLE 배터리 BLE 장치에 연결합니다. 배터리 서비스 섹션을 확장하면 다음 화면이 나타납니다.
보시다시피 응용 프로그램은 BLE가 배터리 서비스를 제공하고 프로그램에서 사용한 UUID로 인해 배터리 수준의 특성을 가지고 있음을 자동으로 식별했습니다. 67 % 인 현재 배터리 값이 5 초 동안 대기하고 증가하는 것을 확인할 수도 있습니다.
BLE 사용에 대한 멋진 점은 이제 BLE와 함께 작동하는 모든 응용 프로그램이 ESP32가 배터리 수준을 알려주는 BLE 장치라고 생각한다는 것입니다. 그것을 시험해보기 위해 나는 BatON이라는 응용 프로그램을 사용 했고 응용 프로그램은 ESP32를 배터리 전원을 사용하는 Bluetooth 장치로 식별하고 다음과 같이 내 전화에 백분율 알림을 제공했습니다.
멋있는!! 권리? 나는 또한 아래 비디오에서 완전한 작업을 보여 주었다. 이제 ESP32와 함께 BLE 배터리 서비스를 사용하는 방법을 배웠으므로 맥박수, HID, 심박수 등과 같은 매우 흥미로운 다른 GATT 서비스도 시도해 볼 수 있습니다. 재미있게 보내십시오….