본문 바로가기

ESP32

ESP32 Bluetooth Low Energy(BLE) 시작하기

반응형

 

Arduino IDE에서 ESP32 Bluetooth Low Energy(BLE) 시작하기

 

ESP32에는 Wi-Fi뿐만 아니라 Bluetooth와 Bluetooth Low Energy(BLE)도 제공됩니다. 이 게시물은 ESP32를 사용한 BLE에 대한 간단한 소개입니다. 먼저 BLE가 무엇이고 무엇에 사용할 수 있는지 살펴보고, 그런 다음 Arduino IDE를 사용하여 ESP32를 사용한 몇 가지 예를 살펴보겠습니다. 간단한 소개를 위해 ESP32 BLE 서버와 해당 서버를 찾기 위한 ESP32 BLE 스캐너를 만들겠습니다.

 

 

 

Bluetooth Low Energy 소개

 

BLE에 대한 간단한 소개는 아래 비디오를 보거나 아래로 스크롤하여 서면 설명을 볼 수 있습니다.

 

추천 자료: ESP32 Bluetooth Classic을 Arduino IDE와 함께 사용하여 ESP32와 Android 스마트폰 간에 데이터를 교환하는 방법을 알아보세요.

 

Bluetooth Low Energy란 무엇인가요?

 

Bluetooth Low Energy(약칭 BLE)는 Bluetooth의 전력 절약형 변형입니다. BLE의 주요 응용 분야는 소량의 데이터(저대역폭)를 단거리로 전송하는 것입니다. 항상 켜져 있는 Bluetooth와 달리 BLE는 연결이 시작될 때를 제외하고는 항상 절전 모드를 유지합니다.

 

이로 인해 전력 소모가 매우 낮습니다. BLE는 Bluetooth보다 약 100배 적은 전력을 소모합니다(사용 사례에 따라 다름).

 

 

또한 BLE는 지점 간 통신뿐만 아니라 브로드캐스트 모드와 메시 네트워크도 지원합니다.

 

BLE와 Bluetooth Classic을 더 자세히 비교한 아래 표를 살펴보세요.

 

 

 

이미지 소스보기

 

BLE는 특성상 코인 셀에서 주기적으로 소량의 데이터를 교환해야 하는 애플리케이션에 적합합니다. 예를 들어 BLE는 의료, 피트니스, 추적, 비콘, 보안 및 홈 오토메이션 산업에 매우 유용합니다.

 

 

BLE 서버 및 클라이언트

 

Bluetooth Low Energy에는 서버와 클라이언트라는 두 가지 유형의 장치가 있습니다. ESP32는 클라이언트 또는 서버로 작동할 수 있습니다.

 

서버는 자신의 존재를 광고하므로 다른 기기에서 찾을 수 있으며 클라이언트가 읽을 수 있는 데이터를 포함합니다. 클라이언트는 근처 기기를 스캔하고 찾고 있는 서버를 찾으면 연결을 설정하고 들어오는 데이터를 수신합니다. 이를 지점 간 통신이라고 합니다.

 

 

앞서 언급했듯이 BLE는 브로드캐스트 모드와 메시 네트워크도 지원합니다.

 

  • 브로드캐스트 모드: 서버는 연결된 많은 클라이언트에 데이터를 전송합니다.
  • 메시 네트워크: 모든 기기가 연결되어 있으며 이는 다대다 연결입니다.

브로드캐스트 및 메시 네트워크 설정은 구현이 가능하지만 아주 최근에 개발되었으므로 현재 ESP32에 구현된 예는 많지 않습니다.

 

GATT

 

GATT는 Generic Attributes의 약자로 연결된 BLE 기기에 노출되는 계층적 데이터 구조를 정의합니다. 즉, GATT는 두 BLE 기기가 표준 메시지를 보내고 받는 방식을 정의합니다. 이 계층 구조를 이해하는 것이 중요합니다. BLE를 사용하고 애플리케이션을 작성하는 방법을 더 쉽게 이해할 수 있기 때문입니다.

 

 

BLE 서비스

 

계층의 최상위 수준은 하나 이상의 서비스로 구성된 프로필입니다. 일반적으로 BLE 기기에는 두 개 이상의 서비스가 포함됩니다.

 

모든 서비스에는 하나 이상의 특성이 포함되거나 다른 서비스를 참조할 수도 있습니다. 서비스는 예를 들어 센서 판독값과 같은 정보의 모음일 뿐입니다.

 

SIG(Bluetooth Special Interest Group)에서 정의한 여러 유형의 데이터에 대한 사전 정의된 서비스가 있습니다. 배터리 수준, 혈압, 심박수, 체중계 등입니다. 여기에서 정의된 다른 서비스를 확인할 수 있습니다.

 

 

 

이미지 소스 보기

 

BLE 특성

 

특성은 항상 서비스가 소유하며 실제 데이터가 계층 구조(값)에 포함되는 곳입니다. 특성에는 항상 특성 선언(데이터에 대한 메타데이터 제공)과 특성 값이라는 두 가지 속성이 있습니다.

 

또한 특성 값 뒤에 설명자가 올 수 있으며, 이는 특성 선언에 포함된 메타데이터를 더욱 확장합니다.

 

속성은 특성 값과 상호 작용할 수 있는 방법을 설명합니다. 기본적으로, 여기에는 특성과 함께 사용할 수 있는 작업과 절차가 포함됩니다.

 

  • 브로드캐스트
  • 읽기
  • 응답 없이 쓰기
  • 쓰기
  • 알림
  • 표시
  • 인증된 서명 쓰기
  • 확장된 속성

UUID

 

각 서비스, 특성 및 설명자에는 UUID(Universally Unique Identifier)가 있습니다. UUID는 고유한 128비트(16바이트) 숫자입니다. 예:

 

55072829-bc9e-4c53-938a-74a6d4c78776

 

SIG(Bluetooth Special Interest Group)에 지정된 모든 유형, 서비스 및 프로필에 대한 단축 UUID가 있습니다.

 

하지만 애플리케이션에 고유한 UUID가 필요한 경우 이 UUID 생성기 웹사이트를 사용하여 생성할 수 있습니다.

 

요약하자면, UUID는 정보를 고유하게 식별하는 데 사용됩니다. 예를 들어, Bluetooth 장치에서 제공하는 특정 서비스를 식별할 수 있습니다.

 

ESP32를 사용한 BLE

 

ESP32는 BLE 서버 또는 BLE 클라이언트로 작동할 수 있습니다. Arduino IDE용 ESP32 BLE 라이브러리에는 ESP32에 대한 여러 BLE 예제가 있습니다. 이 라이브러리는 Arduino IDE에 ESP32를 설치할 때 기본적으로 설치됩니다.

 

참고: Arduino IDE에 ESP32 애드온을 설치해야 합니다. 아직 설치하지 않았다면 다음 튜토리얼을 따라 ESP32와 함께 작동하도록 Arduino IDE를 준비하세요.

 

Arduino IDE 2(Windows, Mac OS X, Linux)에 ESP32 보드 설치

 

Arduino IDE에서 파일 > 예제 > BLE로 이동하여 BLE 라이브러리와 함께 제공되는 예제를 탐색할 수 있습니다.

 

 

Arduino IDE의 ESP32 Bluetooth Low Energy 예제

 

참고: ESP32 예제를 보려면 도구 > 보드에서 ESP32 보드를 선택해야 합니다.

 

Arduino IDE에서 BLE를 탑재한 ESP32에 대한 간략한 소개를 위해 ESP32 BLE 서버를 만들고, 그 서버를 찾기 위한 ESP32 BLE 스캐너를 만들 것입니다. BLE 라이브러리와 함께 제공되는 예제를 사용하고 설명하겠습니다.

 

이 예제를 따르려면 ESP32 개발 보드 두 개가 필요합니다. ESP32 DOIT DEVKIT V1 보드를 사용하겠습니다.

 

ESP32 BLE 서버

 

ESP32 BLE 서버를 만들려면 Arduino IDE를 열고 파일 > 예제 > BLE로 이동하여 서버 예제를 선택합니다. 다음 코드가 로드되어야 합니다.

 

/*
  Complete Getting Started Guide: https://RandomNerdTutorials.com/esp32-bluetooth-low-energy-ble-arduino-ide/
  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("MyESP32");
  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 서버를 만들려면 코드는 다음 단계를 따라야 합니다.

 

1. BLE 서버를 만듭니다. 이 경우 ESP32는 BLE 서버 역할을 합니다.

2. BLE 서비스를 만듭니다.

3. 서비스에 BLE 특성을 만듭니다.

4. 특성에 BLE 설명자를 만듭니다.

5. 서비스를 시작합니다.

6. 다른 기기에서 찾을 수 있도록 광고를 시작합니다.

 

코드 작동 방식

 

BLE 서버 예제 코드가 작동하는 방식을 간단히 살펴보겠습니다.

BLE 기능에 필요한 라이브러리를 가져오는 것으로 시작합니다.

 

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

 

그런 다음 서비스와 특성에 대한 UUID를 정의해야 합니다.

 

#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

 

 

기본 UUID를 그대로 두거나 uuidgenerator.net으로 이동하여 서비스와 특성에 대한 임의의 UUID를 만들 수 있습니다.

setup()에서 115200의 전송 속도로 직렬 통신을 시작합니다.

 

Serial.begin(115200);

 

그런 다음 "MyESP32"라는 BLE 장치를 만듭니다. 이 이름은 원하는 대로 변경할 수 있습니다.

 

// Create the BLE Device
BLEDevice::init("MyESP32");

 

다음 줄에서 BLE 장치를 서버로 설정합니다.

 

BLEServer *pServer = BLEDevice::createServer();

 

그 후, 앞서 정의한 UUID로 BLE 서버에 대한 서비스를 만듭니다.

 

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

 

그런 다음 해당 서비스에 대한 특성을 설정합니다. 보시다시피, 이전에 정의한 UUID도 사용하고 특성의 속성을 인수로 전달해야 합니다. 이 경우 READ 및 WRITE입니다.

 

BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                     CHARACTERISTIC_UUID,
                                     BLECharacteristic::PROPERTY_READ |
                                     BLECharacteristic::PROPERTY_WRITE
                                     );

 

 

특성을 만든 후 setValue() 메서드로 값을 설정할 수 있습니다.

 

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

 

이 경우 값을 "Hello World says Neil"이라는 텍스트로 설정합니다. 이 텍스트를 원하는 대로 변경할 수 있습니다. 향후 프로젝트에서 이 텍스트는 예를 들어 센서 판독값이나 램프 상태가 될 수 있습니다.

 

마지막으로, 서비스와 광고를 시작할 수 있으므로 다른 BLE 기기가 이 BLE 기기를 스캔하여 찾을 수 있습니다.

 

BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();

 

 

이것은 BLE 서버를 만드는 방법에 대한 간단한 예일 뿐입니다. 이 코드에서는 loop()에서 아무것도 수행되지 않지만 새 클라이언트가 연결될 때 발생하는 작업을 추가할 수 있습니다(일부 지침은 Notify 예제를 확인하세요).

 

ESP32 BLE 스캐너

 

ESP32 BLE 스캐너를 만드는 것은 간단합니다. 다른 ESP32를 가져옵니다(다른 하나는 BLE 서버 스케치를 실행하는 동안). Arduino IDE에서 파일 > 예제 > BLE로 이동하여 스캔 예제를 선택합니다. 다음 코드가 로드되어야 합니다.

 

/*
  Complete Getting Started Guide: https://RandomNerdTutorials.com/esp32-bluetooth-low-energy-ble-arduino-ide/
  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);
}

 

 

이 코드는 ESP32를 BLE 장치로 초기화하고 근처 장치를 스캔합니다. 이 코드를 ESP32에 업로드합니다. 다른 ESP32를 컴퓨터에서 일시적으로 분리하여 올바른 ESP32 보드에 코드를 업로드했는지 확인할 수 있습니다.

 

코드가 업로드되고 두 개의 ESP32 보드에 전원이 켜지면:

 

  • "BLE_server" 스케치가 있는 ESP32 하나;
  • ESP32 "BLE_scan" 스케치가 있는 다른 기기.

 

ESP32 보드 BLE 스캐너 및 서버 통신

 

 

"BLE_scan" 예제를 실행하는 ESP32로 직렬 모니터로 이동하여 ESP32("BLE_scan" 스케치가 있는) ENABLE 버튼을 눌러 다시 시작하고 스캔하는 동안 몇 초 동안 기다립니다.

 

ESP32 보드 BLE 스캐너 및 서버 통신 데모

 

 

스캐너는 두 개의 장치를 찾았습니다. 하나는 ESP32(이름이 "MyESP32")이고 다른 하나는 스마트 워치입니다.

 

 

ESP32 보드 BLE 스캐너 및 서버 통신 데모 Arduino IDE

 

스마트폰으로 ESP32 BLE 서버 테스트

 

대부분의 최신 스마트폰에는 BLE 기능이 있어야 합니다. 저는 OnePlus를 사용했지만 대부분의 스마트폰도 작동할 것입니다.

 

스마트폰으로 ESP32 BLE 서버를 스캔하여 서비스와 특성을 확인할 수 있습니다. 이를 위해 Nordic의 nRF Connect for Mobile이라는 무료 앱을 사용하겠습니다. Android(Google Play Store) 및 iOS(App Store)에서 작동합니다.

 

Google Play Store 또는 App Store로 이동하여 "nRF Connect for Mobile"을 검색합니다. 앱을 설치하고 엽니다.

 

 

Nordic의 nRF Connect for Mobile

 

 

스마트폰에서 Bluetooth 설정으로 가서 Bluetooth 어댑터를 활성화하는 것을 잊지 마세요. 나중에 다른 스케치를 테스트하기 위해 다른 기기에서 볼 수 있도록 할 수도 있습니다.

 

Nordic의 nRF Connect for Mobile 활성화

 

 

스마트폰에서 모든 것이 준비되고 ESP32가 BLE 서버 스케치를 실행하면 앱에서 스캔 버튼을 탭하여 근처 기기를 스캔합니다. "MyESP32"라는 이름의 ESP32를 찾아야 합니다. 

 

Nordic의 nRF Connect for Mobile이 myESP32에 연결됩니다.

 

 

"연결" 버튼을 클릭합니다.

 

아래 그림에서 볼 수 있듯이 ESP32에는 이전에 정의한 UUID가 있는 서비스가 있습니다. 서비스를 탭하면 메뉴가 확장되고 정의한 UUID가 있는 특성이 표시됩니다.

 

Nordic의 nRF Connect for Mobile이 UUID를 확인합니다.

 

 

특성에는 READ 및 WRITE 속성이 있으며 값은 이전에 BLE 서버 스케치에서 정의한 값입니다. 따라서 모든 것이 정상적으로 작동합니다. 

 

 

마무리

 

이 튜토리얼에서는 Bluetooth 저에너지의 기본 원리를 살펴보고 ESP32를 사용한 몇 가지 예제를 보여드렸습니다. BLE 서버 스케치와 BLE 스캔 스케치를 살펴봤습니다. 이는 BLE를 시작하는 데 도움이 되는 간단한 예제입니다. 

 

 

이 아이디어는 BLE를 사용하여 다른 장치에서 센서 판독값을 보내거나 받는 것입니다. 여러분이 좋아할 만한 다른 블루투스 관련 튜토리얼도 있습니다: 

 

 

이 강좌에서 발췌한 내용입니다:아두이노 IDE로 ESP32 배우기. ESP32가 마음에 드시고 이에 대해 더 자세히 알고 싶으시다면 Arduino IDE로 ESP32 배우기 과정을 등록하는 것을 추천합니다. 관련 기사도 읽어보실 수 있습니다: 

 

 

 

이 글의 원문 글은 이 링크를 클릭하면 연결합니다.

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^