반응형

Server

불특정 기기가 ESP32에 접속하려면 ESP32는 Server가 되어야 한다.
Server에 접속한 기기에게 데이터를 보내는 센서에서 많이 사용하는데, 명령어 등 데이터 수신을 처리하려면 READ 기능을 활성화 해야 한다.

  1. 센서(ESP32 Server)에 수신기(Client)가 접속
  2. 수신기가 센서에 명령어 전송
  3. 센서는 응답 결과를 수신기에 전송

 

BLE Server 모드로 동작하면서 데이터 수신하기

UUID는 Online UUID Generator Tool 에서 생성하면 된다.

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

#define SERVICE_UUID        "a4a2f593-76de-47ba-9133-7e908188c5af"
#define CHARACTERISTIC_UUID "303d6f69-a751-43f0-9165-bdbb7601cdda"

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();
      if (value.length() > 0) {
        Serial.print("\r\nNew value: ");
        for (int i = 0; i < value.length(); i++)
          Serial.print(value[i]);
        Serial.println();
      }
    }
};

void setup() {
  Serial.begin(9600);

  BLEDevice::init("ESP32 BLE example");
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setCallbacks(new MyCallbacks());

  pCharacteristic->setValue("Hello World");
  pService->start();

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

void loop() {
  delay(1);
}

 

설명

BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE

PROPERTY_READ의 값은 1이고, PROPERTY_WRITE 값은 2이다.

| 기호로 더했으니 3이 된다. IntelliSense를 사용하지 않으려면 숫자 3을 입력해도 된다.

Hello World! 줄은 테스트용...

다음 코드에서 수신 이벤트가 발생하면 콜백함수로 넘겨준다.

pCharacteristic->setCallbacks(new MyCallbacks());

콜백 함수에서 수신 데이터를 처리하면 된다. 

반응형

관련글