
Send continuous stream to mobile
Fork of pdiot-ble-notify-array by
Revision 0:3fe9d5124576, committed 2016-07-26
- Comitter:
- Vincent Coubard
- Date:
- Tue Jul 26 14:37:15 2016 +0100
- Child:
- 1:cd85f873e10d
- Commit message:
- Update example at tag mbed-os-5.0.1-rc1
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.mbed Tue Jul 26 14:37:15 2016 +0100 @@ -0,0 +1,1 @@ +ROOT=.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.mbedignore Tue Jul 26 14:37:15 2016 +0100 @@ -0,0 +1,4 @@ +mbed-os/features/net/* +mbed-os/uvisor-mbed-lib/* +mbed-os/frameworks/* +mbed-os/features/mbedtls/*
Binary file img/button_depressed.png has changed
Binary file img/button_pressed.png has changed
Binary file img/connection.png has changed
Binary file img/discovery.png has changed
Binary file img/register_to_notifications.png has changed
Binary file img/scan_results.png has changed
Binary file img/start_scan.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-events.lib Tue Jul 26 14:37:15 2016 +0100 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-events.git#c621d7f80bb282ab1814e727f9c4f81a8538bf6f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os.lib Tue Jul 26 14:37:15 2016 +0100 @@ -0,0 +1,1 @@ +https://github.com/mbedmicro/mbed#5fea6e69ec1aec4c56852f2e959002dc815eb480
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_app.json Tue Jul 26 14:37:15 2016 +0100 @@ -0,0 +1,13 @@ +{ + "target_overrides": { + "K64F": { + "target.features_add": ["BLE"], + "target.extra_labels_add": ["ST_BLUENRG"], + "target.macros_add": ["IDB0XA1_D13_PATCH"] + }, + "NUCLEO_F401RE": { + "target.features_add": ["BLE"], + "target.extra_labels_add": ["ST_BLUENRG"] + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/module.json Tue Jul 26 14:37:15 2016 +0100 @@ -0,0 +1,15 @@ +{ + "name": "ble-button", + "version": "0.0.1", + "description": "The *input service template* demonstrates the use of a simple input (boolean values) from a read-only characteristic.", + "licenses": [ + { + "url": "https://spdx.org/licenses/Apache-2.0", + "type": "Apache-2.0" + } + ], + "bin": "./source", + "dependencies": { + "ble": "^2.0.0" + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/readme.md Tue Jul 26 14:37:15 2016 +0100 @@ -0,0 +1,79 @@ +BLE_Button is a BLE service template. It handles a read-only characteristic with a simple input (boolean values). The input's source is the button on the board itself - the characteristic's value changes when the button is pressed or released. + +The template covers: + +1. Setting up advertising and connection modes. + +1. Creating an input characteristic: read-only, boolean, with notifications. + +1. Constructing a service class and adding it to the BLE stack. + +1. Assigning UUIDs to the service and its characteristic. + +1. Pushing notifications when the characteristic's value changes. + +# Running the application + +## Requirements + +The sample application can be seen on any BLE scanner on a smartphone. If you don't have a scanner on your phone, please install : + +- [nRF Master Control Panel](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp) for Android. + +- [LightBlue](https://itunes.apple.com/gb/app/lightblue-bluetooth-low-energy/id557428110?mt=8) for iPhone. + +Hardware requirements are in the [main readme](https://github.com/ARMmbed/mbed-os-example-ble/blob/master/README.md). + +## Building instructions + +Building instructions for all samples are in the [main readme](https://github.com/ARMmbed/mbed-os-example-ble/blob/master/README.md). + +## Checking for success + +**Note:** Screens captures depicted below show what is expected from this example if the scanner used is *nRF Master Control Panel* version 4.0.5. If you encounter any difficulties consider trying another scanner or another version of nRF Master Control Panel. Alternative scanners may require reference to their manuals. + +1. Build the application and install it on your board as explained in the building instructions. +1. Open the BLE scanner on your phone. +1. Start a scan. + +  + + **figure 1** How to start scan using nRF Master Control Panel 4.0.5 + +1. Find your device; it should appear with the name `Button` in the scanner. + +  + + **figure 2** Scan results using nRF Master Control Panel 4.0.5 + +1. Establish a connection with the device. + +  + + **figure 3** How to establish a connection using Master Control Panel 4.0.5 + +1. Discover the services and the characteristics on the device. The *Button service* has the UUID `0xA000` and includes the *Button state characteristic* which has the UUID `0xA001`. Depending on your scanner, non standard 16-bit UUID's can be displayed as 128-bit UUID's. If it is the case the following format will be used: `0000XXXX-0000-1000-8000-00805F9B34FB` where `XXXX` is the hexadecimal representation of the 16-bit UUID value. + +  + + **figure 4** Representation of the Button service using Master Control Panel 4.0.5 + +1. Register for the notifications sent by the button state characteristic then the scanner will automatically receive a notification containing the new state of the button every time the state of the button changes. + +  + + **figure 5** How to register to notifications using Master Control Panel 4.0.5 + + +1. Pressing Button 1 on your board updates the state of the button and sends a notification to the scanner. The new state of the button characteristic value should be equal to 0x01. + +  + + **figure 6** Notification of button pressed using Master Control Panel 4.0.5 + +1. Releasing Button 1 on your board updates the state of the button and sends a notification to the scanner. The new state of the button characteristic value should be equal to 0x00. + +  + + **figure 7** Notification of button depressed using Master Control Panel 4.0.5 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/shields/TARGET_ST_BLUENRG.lib Tue Jul 26 14:37:15 2016 +0100 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/ble-x-nucleo-idb0xa1#947ff7cf03846721ec9970f16d373390cbf71f39
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/ButtonService.h Tue Jul 26 14:37:15 2016 +0100 @@ -0,0 +1,42 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 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 __BLE_BUTTON_SERVICE_H__ +#define __BLE_BUTTON_SERVICE_H__ + +class ButtonService { +public: + const static uint16_t BUTTON_SERVICE_UUID = 0xA000; + const static uint16_t BUTTON_STATE_CHARACTERISTIC_UUID = 0xA001; + + ButtonService(BLE &_ble, bool buttonPressedInitial) : + ble(_ble), buttonState(BUTTON_STATE_CHARACTERISTIC_UUID, &buttonPressedInitial, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY) + { + GattCharacteristic *charTable[] = {&buttonState}; + GattService buttonService(ButtonService::BUTTON_SERVICE_UUID, charTable, sizeof(charTable) / sizeof(GattCharacteristic *)); + ble.gattServer().addService(buttonService); + } + + void updateButtonState(bool newState) { + ble.gattServer().write(buttonState.getValueHandle(), (uint8_t *)&newState, sizeof(bool)); + } + +private: + BLE &ble; + ReadOnlyGattCharacteristic<bool> buttonState; +}; + +#endif /* #ifndef __BLE_BUTTON_SERVICE_H__ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/main.cpp Tue Jul 26 14:37:15 2016 +0100 @@ -0,0 +1,111 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 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-events/events.h> + +#include <mbed.h> +#include "ble/BLE.h" +#include "ble/Gap.h" +#include "ButtonService.h" + +DigitalOut led1(LED1, 1); +InterruptIn button(BUTTON1); + +static EventQueue eventQueue( + /* event count */ 10 * /* event size */ 32 +); + +const static char DEVICE_NAME[] = "Button"; +static const uint16_t uuid16_list[] = {ButtonService::BUTTON_SERVICE_UUID}; + +ButtonService *buttonServicePtr; + +void buttonPressedCallback(void) +{ + eventQueue.post(Callback<void(bool)>(buttonServicePtr, &ButtonService::updateButtonState), true); +} + +void buttonReleasedCallback(void) +{ + eventQueue.post(Callback<void(bool)>(buttonServicePtr, &ButtonService::updateButtonState), false); +} + +void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) +{ + BLE::Instance().gap().startAdvertising(); // restart advertising +} + +void blinkCallback(void) +{ + led1 = !led1; /* Do blinky on LED1 to indicate system aliveness. */ +} + +void onBleInitError(BLE &ble, ble_error_t error) +{ + /* Initialization error handling should go here */ +} + +void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) +{ + BLE& ble = params->ble; + ble_error_t error = params->error; + + if (error != BLE_ERROR_NONE) { + /* In case of error, forward the error handling to onBleInitError */ + onBleInitError(ble, error); + return; + } + + /* Ensure that it is the default instance of BLE */ + if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { + return; + } + + ble.gap().onDisconnection(disconnectionCallback); + + button.fall(buttonPressedCallback); + button.rise(buttonReleasedCallback); + + /* Setup primary service. */ + buttonServicePtr = new ButtonService(ble, false /* initial value for button pressed */); + + /* setup advertising */ + 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)); + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); + ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + ble.gap().setAdvertisingInterval(1000); /* 1000ms. */ + ble.gap().startAdvertising(); +} + +void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { + BLE &ble = BLE::Instance(); + eventQueue.post(Callback<void()>(&ble, &BLE::processEvents)); +} + +int main() +{ + eventQueue.post_every(blinkCallback, 500); + + BLE &ble = BLE::Instance(); + ble.onEventsToProcess(scheduleBleEventsProcessing); + ble.init(bleInitComplete); + + while (true) { + eventQueue.dispatch(); + } + + return 0; +}