Simple example to demonstrate custom made BLE service and characteristics.

Fork of BLE_GATT_Example by Bluetooth Low Energy

Files at this revision

API Documentation at this revision

Comitter:
andresag
Date:
Tue Oct 20 13:46:23 2015 +0000
Parent:
19:477567297aac
Parent:
18:7d89c4fba362
Child:
21:73f42c00b1db
Commit message:
Merged updated version of main.cpp with upstream.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp.orig Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Tue Oct 20 13:41:38 2015 +0000
+++ b/main.cpp	Tue Oct 20 13:46:23 2015 +0000
@@ -84,4 +84,4 @@
     while (true) {
         ble.waitForEvent(); //Save power
     }
-}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp.orig	Tue Oct 20 13:46:23 2015 +0000
@@ -0,0 +1,87 @@
+#include "mbed.h"
+#include "ble/BLE.h"
+
+BLE ble;
+DigitalOut led(LED1, 1);
+uint16_t customServiceUUID  = 0xA000;
+uint16_t readCharUUID       = 0xA001;
+uint16_t writeCharUUID      = 0xA002;
+
+const static char     DEVICE_NAME[]        = "ChangeMe!!"; // change this
+static const uint16_t uuid16_list[]        = {0xFFFF}; //Custom UUID, FFFF is reserved for development
+
+// Set Up custom Characteristics
+static uint8_t readValue[10] = {0};
+ReadOnlyArrayGattCharacteristic<uint8_t, sizeof(readValue)> readChar(readCharUUID, readValue);
+
+static uint8_t writeValue[10] = {0};
+WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(writeValue)> writeChar(writeCharUUID, writeValue);
+
+// Set up custom service
+GattCharacteristic *characteristics[] = {&readChar, &writeChar};
+GattService        customService(customServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));
+
+
+/*
+ *  Restart advertising when phone app disconnects
+*/
+void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *)
+{
+    ble.gap().startAdvertising();
+}
+
+/*
+ *  handle writes to writeCharacteristic
+*/
+void writeCharCallback(const GattWriteCallbackParams *params)
+{
+    // check to see what characteristic was written, by handle
+    if(params->handle == writeChar.getValueHandle()) {
+        // toggle LED if only 1 byte is written
+        if(params->len == 1) {
+            led = params->data[0];
+            (params->data[0] == 0x00) ? printf("led on\n\r") : printf("led off\n\r"); // print led toggle
+        }
+        // print the data if more than 1 byte is written
+        else {
+            printf("Data received: length = %d, data = 0x",params->len);
+            for(int x=0; x < params->len; x++) {
+                printf("%x", params->data[x]);
+            }
+            printf("\n\r");
+        }
+        // update the readChar with the value of writeChar
+        ble.updateCharacteristicValue(readChar.getValueHandle(), params->data,params->len);
+    }
+}
+
+/*
+ *  main loop
+*/
+int
+main(void)
+{
+    /* initialize stuff */
+    printf("\n\r********* Starting Main Loop *********\n\r");
+    ble.init();
+    ble.gap().onDisconnection(disconnectionCallback);
+    ble.gattServer().onDataWritten(writeCharCallback);
+
+    /* setup advertising */
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); // BLE only, no classic BT
+    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // advertising type
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); // add name
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); // UUID's broadcast in advertising packet
+    ble.gap().setAdvertisingInterval(100); // 100ms.
+
+    // add our custom service
+    ble.addService(customService);
+
+    // start advertising
+    ble.gap().startAdvertising();
+
+    // infinite loop waiting for BLE interrupt events
+    while (true) {
+        ble.waitForEvent(); //Save power
+    }
+}