BLE HID sample

Dependencies:   BLE_API BLE_HID mbed nRF51822

Files at this revision

API Documentation at this revision

Comitter:
YuuichiAkagawa
Date:
Sat Feb 27 05:08:02 2016 +0000
Commit message:
initial commit

Changed in this revision

BLE_API.lib Show annotated file Show diff for this revision Revisions of this file
BLE_HID.lib Show annotated file Show diff for this revision Revisions of this file
examples_common.cpp Show annotated file Show diff for this revision Revisions of this file
examples_common.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
nRF51822.lib Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 3435302551b3 BLE_API.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BLE_API.lib	Sat Feb 27 05:08:02 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/Bluetooth-Low-Energy/code/BLE_API/#ff83f0020480
diff -r 000000000000 -r 3435302551b3 BLE_HID.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BLE_HID.lib	Sat Feb 27 05:08:02 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/jbru/code/BLE_HID/#4f8429a1905b
diff -r 000000000000 -r 3435302551b3 examples_common.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples_common.cpp	Sat Feb 27 05:08:02 2016 +0000
@@ -0,0 +1,76 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2015 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+#include "ble/services/BatteryService.h"
+#include "ble/services/DeviceInformationService.h"
+ 
+#include "examples_common.h"
+ 
+static void passkeyDisplayCallback(Gap::Handle_t handle, const SecurityManager::Passkey_t passkey)
+{
+    printf("Input passKey: ");
+    for (unsigned i = 0; i < Gap::ADDR_LEN; i++) {
+        printf("%c", passkey[i]);
+    }
+    printf("\r\n");
+}
+ 
+static void securitySetupCompletedCallback(Gap::Handle_t handle, SecurityManager::SecurityCompletionStatus_t status)
+{
+    if (status == SecurityManager::SEC_STATUS_SUCCESS) {
+        printf("Security success %d\r\n", status);
+    } else {
+        printf("Security failed %d\r\n", status);
+    }
+}
+ 
+static void securitySetupInitiatedCallback(Gap::Handle_t, bool allowBonding, bool requireMITM, SecurityManager::SecurityIOCapabilities_t iocaps)
+{
+    printf("Security setup initiated\r\n");
+}
+ 
+void initializeSecurity(BLE &ble)
+{
+    bool enableBonding = true;
+    bool requireMITM = HID_SECURITY_REQUIRE_MITM;
+ 
+    ble.securityManager().onSecuritySetupInitiated(securitySetupInitiatedCallback);
+    ble.securityManager().onPasskeyDisplay(passkeyDisplayCallback);
+    ble.securityManager().onSecuritySetupCompleted(securitySetupCompletedCallback);
+ 
+    ble.securityManager().init(enableBonding, requireMITM, HID_SECURITY_IOCAPS);
+}
+ 
+void initializeHOGP(BLE &ble)
+{
+    static const uint16_t uuid16_list[] =  {GattService::UUID_HUMAN_INTERFACE_DEVICE_SERVICE,
+        GattService::UUID_DEVICE_INFORMATION_SERVICE,
+        GattService::UUID_BATTERY_SERVICE};
+ 
+    DeviceInformationService deviceInfo(ble, "ARM", "m1", "abc", "def", "ghi", "jkl");
+ 
+    BatteryService batteryInfo(ble, 80);
+ 
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED |
+            GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,
+            (uint8_t *)uuid16_list, sizeof(uuid16_list));
+ 
+    // see 5.1.2: HID over GATT Specification (pg. 25)
+    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
+    // 30ms to 50ms is recommended (5.1.2)
+    ble.gap().setAdvertisingInterval(50);
+}
diff -r 000000000000 -r 3435302551b3 examples_common.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples_common.h	Sat Feb 27 05:08:02 2016 +0000
@@ -0,0 +1,69 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2015 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+#ifndef HID_EXAMPLES_COMMON_H_
+#define HID_EXAMPLES_COMMON_H_
+ 
+/**
+ * Functions and configuration common to all HID demos
+ */
+ 
+#include "ble/BLE.h"
+ 
+#include "HIDServiceBase.h"
+ 
+/**
+ * IO capabilities of the device. During development, you most likely want "JustWorks", which means
+ * no IO capabilities.
+ * It is also possible to use IO_CAPS_DISPLAY_ONLY to generate and show a pincode on the serial
+ * output.
+ */
+#ifndef HID_SECURITY_IOCAPS
+#define HID_SECURITY_IOCAPS (SecurityManager::IO_CAPS_NONE)
+#endif
+ 
+/**
+ * Security level. MITM disabled forces "Just Works". If you require MITM, HID_SECURITY_IOCAPS must
+ * be at least IO_CAPS_DISPLAY_ONLY.
+ */
+#ifndef HID_SECURITY_REQUIRE_MITM
+#define HID_SECURITY_REQUIRE_MITM false
+#endif
+ 
+/**
+ * Disable debug messages by setting NDEBUG
+ */
+#ifndef NDEBUG
+#define HID_DEBUG(...) printf(__VA_ARGS__)
+#else
+#define HID_DEBUG(...)
+#endif
+ 
+/**
+ * Initialize security manager: set callback functions and required security level
+ */
+void initializeSecurity(BLE &ble);
+ 
+/**
+ * - Initialize auxiliary services required by the HID-over-GATT Profile.
+ * - Initialize common Gap advertisement.
+ *
+ * Demos only have to set a custom device name and appearance, and their HID
+ * service.
+ */
+void initializeHOGP(BLE &ble);
+ 
+#endif /* !BLE_HID_COMMON_H_ */
diff -r 000000000000 -r 3435302551b3 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Feb 27 05:08:02 2016 +0000
@@ -0,0 +1,123 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2015 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+#include "mbed.h"
+ 
+#include "ble/BLE.h"
+#include "KeyboardService.h"
+ 
+#include "examples_common.h"
+ 
+/**
+ * This program implements a complete HID-over-Gatt Profile:
+ *  - HID is provided by KeyboardService
+ *  - Battery Service
+ *  - Device Information Service
+ *
+ * Complete strings can be sent over BLE using printf. Please note, however, than a 12char string
+ * will take about 500ms to transmit, principally because of the limited notification rate in BLE.
+ * KeyboardService uses a circular buffer to store the strings to send, and calls to putc will fail
+ * once this buffer is full. This will result in partial strings being sent to the client.
+ */
+ 
+DigitalOut waiting_led(LED1);
+DigitalOut connected_led(LED2);
+ 
+InterruptIn button1(D2);
+ 
+BLE ble;
+KeyboardService *kbdServicePtr;
+ 
+static const char DEVICE_NAME[] = "uKbd";
+static const char SHORT_DEVICE_NAME[] = "kbd1";
+ 
+static void onDisconnect(const Gap::DisconnectionCallbackParams_t *params)
+{
+    HID_DEBUG("disconnected\r\n");
+    connected_led = 0;
+ 
+    ble.gap().startAdvertising(); // restart advertising
+}
+ 
+static void onConnect(const Gap::ConnectionCallbackParams_t *params)
+{
+    HID_DEBUG("connected\r\n");
+    waiting_led = false;
+}
+ 
+static void waiting() {
+    if (!kbdServicePtr->isConnected())
+        waiting_led = !waiting_led;
+    else
+        connected_led = !connected_led;
+}
+ 
+void send_string(const char * c) {
+    if (!kbdServicePtr)
+        return;
+ 
+    if (!kbdServicePtr->isConnected()) {
+        HID_DEBUG("we haven't connected yet...");
+    } else {
+        int len = strlen(c);
+        kbdServicePtr->printf(c);
+        HID_DEBUG("sending %d chars\r\n", len);
+    }
+}
+ 
+void send_stuff() {
+    send_string("hello world!\n");
+}
+ 
+int main()
+{
+    Ticker heartbeat;
+ 
+    button1.rise(send_stuff);
+ 
+    HID_DEBUG("initialising ticker\r\n");
+ 
+    heartbeat.attach(waiting, 1);
+ 
+    HID_DEBUG("initialising ble\r\n");
+    ble.init();
+ 
+    ble.gap().onDisconnection(onDisconnect);
+    ble.gap().onConnection(onConnect);
+ 
+    initializeSecurity(ble);
+ 
+    HID_DEBUG("adding hid service\r\n");
+    KeyboardService kbdService(ble);
+    kbdServicePtr = &kbdService;
+ 
+    HID_DEBUG("adding device info and battery service\r\n");
+    initializeHOGP(ble);
+ 
+    HID_DEBUG("setting up gap\r\n");
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::KEYBOARD);
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME,
+                                           (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
+                                           (uint8_t *)SHORT_DEVICE_NAME, sizeof(SHORT_DEVICE_NAME));
+ 
+    HID_DEBUG("advertising\r\n");
+    ble.gap().startAdvertising();
+ 
+    while (true) {
+        ble.waitForEvent();
+    }
+}
diff -r 000000000000 -r 3435302551b3 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Feb 27 05:08:02 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/6f327212ef96
\ No newline at end of file
diff -r 000000000000 -r 3435302551b3 nRF51822.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nRF51822.lib	Sat Feb 27 05:08:02 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/Nordic-Semiconductor/code/nRF51822/#1751e2e2637a