mbed HRM1017 で Heart Rate Profile をサポートしてみる(3) [mbed]
いよいよ、今回から mbed HRM1017 で Heart Rate Profile をサポートしてみたいと思います。前回の検討で、Heart Rate Profile は、Heart Rate Service と Device Information Service をサポートする必要があることが分かりました。
Heart Rate Service では、Heart Rate Measurement Characteristic とBody Sensor Location Characteristic の2つをサポートします。 mbed での宣言部は下記のようになります。
Device Information Service では、Device Information Service Characteristic をサポートします。
NORDIC の nRFToolbox では、Battery Level も表示するようになっていますので参考までに設定を載せておきます。(mbed HRM1017 のサンプルプログラムでも記載されています)
だいたいパターンはわかったと思います。次にサポートするサービスを Advertising パケットに組み込みます。Advertising とは Collector と接続するための仕組みで、Advertising パケットの中に自分がどのようなサービスを提供しているか記述する必要があります。
Advertising パケットの詳細については、こちらを参照ください。非常に参考になります。
BluetoothSMARTデバイスをmbed で開発する(4)
http://bril-tech.blogspot.jp/2014/06/bluetoothsmartmbed-4.html
今回作成した全コードは下記リポジトリにありますので参照ください。今回は心拍センサーは接続せずにランダム値を心拍データとして扱っています。
BLE_HeartRate
https://developer.mbed.org/users/YoshinoTaro/code/BLE_HeartRate/
それでは、nRFToolbox の Heart Rate Monitor でどう見えるか見てみましょう。
おお、それらしく見えてますね!Device Information も Body Location も認識しているようです。
スマホと接続できると値を記録できるので、心拍計としての応用範囲がぐっと広がりますね。次はいよいよ心拍センサーを接続してみたいと思います!
(^_^)/~
Heart Rate Service では、Heart Rate Measurement Characteristic とBody Sensor Location Characteristic の2つをサポートします。 mbed での宣言部は下記のようになります。
// Heart Rate Measurement Characteristic Setting static uint8_t hrmCounter = 100; // default value static uint8_t bpm[2] = {0x00, hrmCounter}; GattCharacteristic hrmChar(GattCharacteristic::UUID_HEART_RATE_MEASUREMENT_CHAR ,bpm, sizeof(bpm) ,sizeof(bpm) ,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); // Body Sensor Location Characteristic Setting static uint8_t location = 0x05; /* Ear Lobe */ GattCharacteristic hrmLocation(GattCharacteristic::UUID_BODY_SENSOR_LOCATION_CHAR ,(uint8_t *)&location ,sizeof(location) ,sizeof(location) ,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); // Heart Rate Service Service GattCharacteristic *hrmChars[] = {&hrmChar, &hrmLocation,}; GattService hrmService(GattService::UUID_HEART_RATE_SERVICE ,hrmChars ,sizeof(hrmChars)/sizeof(GattCharacteristic *));
Device Information Service では、Device Information Service Characteristic をサポートします。
// Device Information Service Characteristic Setting static uint8_t deviceName[] = {'H', 'R', 'M', '1', '0', '1', '7'}; GattCharacteristic deviceManufacturer(GattCharacteristic::UUID_MANUFACTURER_NAME_STRING_CHAR ,(uint8_t *)deviceName ,sizeof(deviceName) ,sizeof(deviceName) ,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); // Device Information Service GattCharacteristic *devInfoChars[] = {&deviceManufacturer,}; GattService deviceInformationService(GattService::UUID_DEVICE_INFORMATION_SERVICE ,devInfoChars ,sizeof(devInfoChars)/sizeof(GattCharacteristic *));
NORDIC の nRFToolbox では、Battery Level も表示するようになっていますので参考までに設定を載せておきます。(mbed HRM1017 のサンプルプログラムでも記載されています)
// Battery Level Characteristic Setting static uint8_t batt = 100; GattCharacteristic battLevel(GattCharacteristic::UUID_BATTERY_LEVEL_CHAR ,(uint8_t *)&batt ,sizeof(batt) ,sizeof(batt) ,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); // Battery Level Service GattCharacteristic *battChars[] = {&battLevel,}; GattService battService(GattService::UUID_BATTERY_SERVICE ,battChars ,sizeof(battChars)/sizeof(GattCharacteristic *));
だいたいパターンはわかったと思います。次にサポートするサービスを Advertising パケットに組み込みます。Advertising とは Collector と接続するための仕組みで、Advertising パケットの中に自分がどのようなサービスを提供しているか記述する必要があります。
// service list static uint16_t uuid16_list[] = { GattService::UUID_HEART_RATE_SERVICE ,GattService::UUID_BATTERY_SERVICE ,GattService::UUID_DEVICE_INFORMATION_SERVICE }; BLEDevice ble; // only BLE support, not support the classic bluetooth ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); // registering the supported services ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS , (uint8_t*)uuid16_list, sizeof(uuid16_list)); // the appearance is a heart rate sensor ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR); // registering the device name ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME , (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); // setting as a connectable device to a collector ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // advertising interval is 100msec ble.gap().setAdvertisingInterval(160); ble.gap().startAdvertising();
Advertising パケットの詳細については、こちらを参照ください。非常に参考になります。
BluetoothSMARTデバイスをmbed で開発する(4)
http://bril-tech.blogspot.jp/2014/06/bluetoothsmartmbed-4.html
今回作成した全コードは下記リポジトリにありますので参照ください。今回は心拍センサーは接続せずにランダム値を心拍データとして扱っています。
BLE_HeartRate
https://developer.mbed.org/users/YoshinoTaro/code/BLE_HeartRate/
それでは、nRFToolbox の Heart Rate Monitor でどう見えるか見てみましょう。
おお、それらしく見えてますね!Device Information も Body Location も認識しているようです。
スマホと接続できると値を記録できるので、心拍計としての応用範囲がぐっと広がりますね。次はいよいよ心拍センサーを接続してみたいと思います!
(^_^)/~
コメント 0