본문 바로가기

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 스캐너를 만들 것입니다.

 

 

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

 

 

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 Characteristic

 

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

 

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

 

속성은 특성 값과 상호 작용할 수 있는 방법을 설명합니다. 기본적으로 특성과 함께 사용할 수 있는 작업과 프로시저가 포함되어 있습니다.

 

  • 방송 Broadcast
  • 읽다 Read
  • 응답없이 쓰다 Write without response
  • 쓰다 Write
  • 알림 Notify
  • 나타내다 Indicate
  • 인증된 서명된 쓰기 Authenticated Signed Writes
  • 확장된 속성 Extened Propertied

 

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에 ESP32 보드 설치(Windows, Mac OS X, Linux)

 

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를 만들 수도 있습니다.

 

에서설정(), 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
                                     );

 

 

Charateristic을 생성한 후에는 setValue() 메쏘드로 해당 값을 설정할 수 있습니다. 

 

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

 

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

 

마지막으로 서비스와 광고를 시작하여 다른 BLE 장치가 해당 BLE 장치를 스캔하여 찾을 수 있도록 합니다.

 

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

 

이것은 BLE 서버를 만드는 방법에 대한 간단한 예일 뿐입니다. 이 코드에서는 아무것도 수행되지 않습니다. 하지만 새로운 클라이언트가 연결되면 어떤 일이 일어나는지 추가할 수 있습니다(일부 지침은 Notify 예시를 확인하세요).

 

ESP32 BLE 스캐너

 

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

 

/*
  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 스캐너 및 서버 통신

 

ESP32에서 "BLE_scan" 예제를 실행하여 직렬 모니터로 이동하고 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

 

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

 

 

Nordic의 모바일용 nRF Connect 활성화

 

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

 

 

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

 

“ 연결 ” 버튼을 클릭하세요.

 

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

 

 

Nordic의 모바일용 nRF Connect UUID 확인

 

 

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

 

마무리하기

 

이 튜토리얼에서는 Bluetooth Low Energy의 기본 원리를 보여드리고 ESP32를 사용한 몇 가지 예를 보여드렸습니다. BLE 서버 스케치와 BLE 스캔 스케치를 살펴보았습니다. BLE를 시작하기 위한 간단한 예입니다.

 

BLE를 이용해 다른 장치로부터 센서 판독값을 보내거나 받는 것이 아이디어입니다.

 

당신이 좋아할 만한 다른 Bluetooth 관련 튜토리얼:

 

  • 블루투스 및 블루투스 저에너지가 포함된 ESP32: 궁극의 가이드
  • ESP32 BLE 서버 및 클라이언트(Bluetooth 저에너지)
  • BLE(Bluetooth 저에너지)를 통한 ESP32 Wi-Fi 프로비저닝 - Arduino IDE
  • ESP32 웹 블루투스(BLE): 시작 안내서
  • ESP32 Bluetooth 클래식(Arduino IDE 포함) - 시작하기 

 

 

다음 글도 읽어보시면 좋을 것 같습니다.

 

 

읽어주셔서 감사합니다. 배움을 멈추지 마세요. 절대 포기하지 마세요!

 

 

 

반응형

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