본문 바로가기

RaspberryPi/RaspberryPi PicoW

Raspberry Pi PicoW - BLE Serial Profile 서비스 테스트

BLE는 Classic Bluetooth SPP와 같은 시리얼 서비스가 제공되지 않는다. 대신 BLE UART Custom 서비스로 구현해야 한다. 

 

Pi PicoW BLE Custom Profile 테스트 코드를 이용해서 간단히 BLE UART로 송수신 하는 테스트 코드를 작성해 보자.

참고로 Nordic UART 테스트 코드에서 서비스 UUID를 사용 하였다.

#include <BTstackLib.h>
#include <SPI.h>

#define Serial					Serial1

#define SERVICE_UUID           "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"


static char characteristic_data = 'H';

//Device Connected Callback
void deviceConnectedCallback(BLEStatus status, BLEDevice *device) {
  (void) device;
  switch (status) {
    case BLE_STATUS_OK:
      Serial.println("Device connected!");
      break;
    default:
      break;
  }
}

//Device Disconnected Callback
void deviceDisconnectedCallback(BLEDevice * device) {
  (void) device;
  Serial.println("Disconnected.");
}

//Read Callback
uint16_t gattReadCallback(uint16_t value_handle, uint8_t * buffer, uint16_t buffer_size) {
  (void) value_handle;
  (void) buffer_size;
  if (buffer) {
    Serial.print("gattReadCallback, value: ");
    Serial.println(characteristic_data, HEX);
    buffer[0] = characteristic_data;
  }
  return 1;
}

//Write Callback
int gattWriteCallback(uint16_t value_handle, uint8_t *buffer, uint16_t size) {
  (void) value_handle;
  (void) size;
  Serial.print("gattWriteCallback , size");
  Serial.println(size);
  for(int i=0;i<size;i++)
  {
    Serial.printf("%02x ", buffer[i]);
  }
  Serial.println();
  
  return 0;
}


void setup(void) {
  Serial.begin(115200);
  
  // set callbacks
  BTstack.setBLEDeviceConnectedCallback(deviceConnectedCallback);
  BTstack.setBLEDeviceDisconnectedCallback(deviceDisconnectedCallback);
  BTstack.setGATTCharacteristicRead(gattReadCallback);
  BTstack.setGATTCharacteristicWrite(gattWriteCallback);
  
  // setup GATT Database
  BTstack.addGATTService(new UUID(SERVICE_UUID));
  BTstack.addGATTCharacteristic(new UUID(CHARACTERISTIC_UUID_TX), ATT_PROPERTY_NOTIFY, "TX");
  BTstack.addGATTCharacteristicDynamic(new UUID(CHARACTERISTIC_UUID_RX), ATT_PROPERTY_WRITE, 0);
  
  // startup Bluetooth and activate advertisements
  BTstack.setup("PicoUART");
  BTstack.startAdvertising();
}


void loop(void) {
  BTstack.loop();
  //BTstack.writeCharacteristic(&UUID(CHARACTERISTIC_UUID_RX), ,);
}

 

펌웨어 다운로드 후 검색된 자잋를 연결 해 보면 Service 를 확인 할 수 있다.

.

기존 Bluetooth SPP 테스트 코드에서는 Bluetooth Classic으로 인식되는데 이번에는 BLE로 장치가 검색되는 것을 확인 할 수 있다.

 

요즘 대부분의 Bluetooth 앱이 BLE UART를 지원하기 때문에 BLE를 사용하는 것이 좋은것 같다.

기존에 사용하던 BLE 앱에서 정상동작 하는것을 확인 할 수 있다.

반응형