this is using the mbed os version 5-13-1
source/BleManager.h@79:a2187bbfa407, 2019-03-20 (annotated)
- Committer:
- ocomeni
- Date:
- Wed Mar 20 21:02:47 2019 +0000
- Revision:
- 79:a2187bbfa407
- Parent:
- 78:07bb86e3ce14
- Child:
- 113:888e262ff0a9
now have working mechanism for comms between threads using memory pool and queue.; Next stage expand this for data.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| ocomeni | 75:08eff6258e1b | 1 | #ifndef __BLE_MANAGER_H__ |
| ocomeni | 74:f26e846adfe9 | 2 | #define __BLE_MANAGER_H__ |
| ocomeni | 75:08eff6258e1b | 3 | |
| ocomeni | 75:08eff6258e1b | 4 | |
| ocomeni | 75:08eff6258e1b | 5 | /* mbed Microcontroller Library |
| ocomeni | 75:08eff6258e1b | 6 | * Copyright (c) 2006-2013 ARM Limited |
| ocomeni | 75:08eff6258e1b | 7 | * |
| ocomeni | 75:08eff6258e1b | 8 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| ocomeni | 75:08eff6258e1b | 9 | * you may not use this file except in compliance with the License. |
| ocomeni | 75:08eff6258e1b | 10 | * You may obtain a copy of the License at |
| ocomeni | 75:08eff6258e1b | 11 | * |
| ocomeni | 75:08eff6258e1b | 12 | * http://www.apache.org/licenses/LICENSE-2.0 |
| ocomeni | 75:08eff6258e1b | 13 | * |
| ocomeni | 75:08eff6258e1b | 14 | * Unless required by applicable law or agreed to in writing, software |
| ocomeni | 75:08eff6258e1b | 15 | * distributed under the License is distributed on an "AS IS" BASIS, |
| ocomeni | 75:08eff6258e1b | 16 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ocomeni | 75:08eff6258e1b | 17 | * See the License for the specific language governing permissions and |
| ocomeni | 75:08eff6258e1b | 18 | * limitations under the License. |
| ocomeni | 75:08eff6258e1b | 19 | */ |
| ocomeni | 75:08eff6258e1b | 20 | |
| ocomeni | 75:08eff6258e1b | 21 | #include <events/mbed_events.h> |
| ocomeni | 75:08eff6258e1b | 22 | #include <mbed.h> |
| ocomeni | 75:08eff6258e1b | 23 | #include "ble/BLE.h" |
| ocomeni | 75:08eff6258e1b | 24 | #include "SecurityManager.h" |
| ocomeni | 78:07bb86e3ce14 | 25 | #include "common_types.h" |
| ocomeni | 75:08eff6258e1b | 26 | |
| ocomeni | 75:08eff6258e1b | 27 | /** This example demonstrates all the basic setup required |
| ocomeni | 75:08eff6258e1b | 28 | * for pairing and setting up link security both as a central and peripheral |
| ocomeni | 75:08eff6258e1b | 29 | * |
| ocomeni | 75:08eff6258e1b | 30 | * The example is implemented as two classes, one for the peripheral and one |
| ocomeni | 75:08eff6258e1b | 31 | * for central inheriting from a common base. They are run in sequence and |
| ocomeni | 75:08eff6258e1b | 32 | * require a peer device to connect to. During the peripheral device demonstration |
| ocomeni | 75:08eff6258e1b | 33 | * a peer device is required to connect. In the central device demonstration |
| ocomeni | 75:08eff6258e1b | 34 | * this peer device will be scanned for and connected to - therefore it should |
| ocomeni | 75:08eff6258e1b | 35 | * be advertising with the same address as when it connected. |
| ocomeni | 75:08eff6258e1b | 36 | * |
| ocomeni | 75:08eff6258e1b | 37 | * During the test output is written on the serial connection to monitor its |
| ocomeni | 75:08eff6258e1b | 38 | * progress. |
| ocomeni | 75:08eff6258e1b | 39 | */ |
| ocomeni | 75:08eff6258e1b | 40 | |
| ocomeni | 75:08eff6258e1b | 41 | |
| ocomeni | 75:08eff6258e1b | 42 | /* for demonstration purposes we will store the peer device address |
| ocomeni | 75:08eff6258e1b | 43 | * of the device that connects to us in the first demonstration |
| ocomeni | 75:08eff6258e1b | 44 | * so we can use its address to reconnect to it later */ |
| ocomeni | 75:08eff6258e1b | 45 | static BLEProtocol::AddressBytes_t peer_address; |
| ocomeni | 75:08eff6258e1b | 46 | |
| ocomeni | 75:08eff6258e1b | 47 | /** Base class for both peripheral and central. The same class that provides |
| ocomeni | 75:08eff6258e1b | 48 | * the logic for the application also implements the SecurityManagerEventHandler |
| ocomeni | 75:08eff6258e1b | 49 | * which is the interface used by the Security Manager to communicate events |
| ocomeni | 75:08eff6258e1b | 50 | * back to the applications. You can provide overrides for a selection of events |
| ocomeni | 75:08eff6258e1b | 51 | * your application is interested in. |
| ocomeni | 75:08eff6258e1b | 52 | */ |
| ocomeni | 75:08eff6258e1b | 53 | class SMDevice : private mbed::NonCopyable<SMDevice>, |
| ocomeni | 75:08eff6258e1b | 54 | public SecurityManager::EventHandler |
| ocomeni | 75:08eff6258e1b | 55 | { |
| ocomeni | 75:08eff6258e1b | 56 | public: |
| ocomeni | 78:07bb86e3ce14 | 57 | SMDevice(BLE &ble, events::EventQueue &event_queue, |
| ocomeni | 78:07bb86e3ce14 | 58 | BLEProtocol::AddressBytes_t &peer_address, ble_config_t ble_config); |
| ocomeni | 75:08eff6258e1b | 59 | |
| ocomeni | 75:08eff6258e1b | 60 | virtual ~SMDevice(); |
| ocomeni | 75:08eff6258e1b | 61 | |
| ocomeni | 75:08eff6258e1b | 62 | /** Start BLE interface initialisation */ |
| ocomeni | 75:08eff6258e1b | 63 | void run(); |
| ocomeni | 75:08eff6258e1b | 64 | |
| ocomeni | 75:08eff6258e1b | 65 | /* event handler functions */ |
| ocomeni | 75:08eff6258e1b | 66 | |
| ocomeni | 75:08eff6258e1b | 67 | /** Respond to a pairing request. This will be called by the stack |
| ocomeni | 75:08eff6258e1b | 68 | * when a pairing request arrives and expects the application to |
| ocomeni | 75:08eff6258e1b | 69 | * call acceptPairingRequest or cancelPairingRequest */ |
| ocomeni | 75:08eff6258e1b | 70 | virtual void pairingRequest( |
| ocomeni | 75:08eff6258e1b | 71 | ble::connection_handle_t connectionHandle |
| ocomeni | 75:08eff6258e1b | 72 | ); |
| ocomeni | 75:08eff6258e1b | 73 | |
| ocomeni | 75:08eff6258e1b | 74 | /** Inform the application of a successful pairing. Terminate the demonstration. */ |
| ocomeni | 75:08eff6258e1b | 75 | virtual void pairingResult( |
| ocomeni | 75:08eff6258e1b | 76 | ble::connection_handle_t connectionHandle, |
| ocomeni | 75:08eff6258e1b | 77 | SecurityManager::SecurityCompletionStatus_t result |
| ocomeni | 75:08eff6258e1b | 78 | ); |
| ocomeni | 75:08eff6258e1b | 79 | |
| ocomeni | 75:08eff6258e1b | 80 | /** Inform the application of change in encryption status. This will be |
| ocomeni | 75:08eff6258e1b | 81 | * communicated through the serial port */ |
| ocomeni | 75:08eff6258e1b | 82 | virtual void linkEncryptionResult( |
| ocomeni | 75:08eff6258e1b | 83 | ble::connection_handle_t connectionHandle, |
| ocomeni | 75:08eff6258e1b | 84 | ble::link_encryption_t result |
| ocomeni | 75:08eff6258e1b | 85 | ); |
| ocomeni | 77:0b505d1e15f4 | 86 | |
| ocomeni | 77:0b505d1e15f4 | 87 | void shutDown(); |
| ocomeni | 79:a2187bbfa407 | 88 | void sendBLEUartData(char * str); |
| ocomeni | 75:08eff6258e1b | 89 | |
| ocomeni | 75:08eff6258e1b | 90 | private: |
| ocomeni | 75:08eff6258e1b | 91 | /** Override to start chosen activity when initialisation completes */ |
| ocomeni | 75:08eff6258e1b | 92 | virtual void start() = 0; |
| ocomeni | 75:08eff6258e1b | 93 | |
| ocomeni | 75:08eff6258e1b | 94 | /** This is called when BLE interface is initialised and starts the demonstration */ |
| ocomeni | 75:08eff6258e1b | 95 | void on_init_complete(BLE::InitializationCompleteCallbackContext *event); |
| ocomeni | 75:08eff6258e1b | 96 | |
| ocomeni | 75:08eff6258e1b | 97 | /** This is called by Gap to notify the application we connected */ |
| ocomeni | 75:08eff6258e1b | 98 | virtual void on_connect(const Gap::ConnectionCallbackParams_t *connection_event) = 0; |
| ocomeni | 75:08eff6258e1b | 99 | |
| ocomeni | 75:08eff6258e1b | 100 | /** This is called by Gap to notify the application we disconnected, |
| ocomeni | 75:08eff6258e1b | 101 | * in our case it ends the demonstration. */ |
| ocomeni | 75:08eff6258e1b | 102 | void on_disconnect(const Gap::DisconnectionCallbackParams_t *event); |
| ocomeni | 75:08eff6258e1b | 103 | |
| ocomeni | 75:08eff6258e1b | 104 | /** End demonstration unexpectedly. Called if timeout is reached during advertising, |
| ocomeni | 75:08eff6258e1b | 105 | * scanning or connection initiation */ |
| ocomeni | 75:08eff6258e1b | 106 | void on_timeout(const Gap::TimeoutSource_t source); |
| ocomeni | 75:08eff6258e1b | 107 | |
| ocomeni | 75:08eff6258e1b | 108 | /** Schedule processing of events from the BLE in the event queue. */ |
| ocomeni | 75:08eff6258e1b | 109 | void schedule_ble_events(BLE::OnEventsToProcessCallbackContext *context); |
| ocomeni | 75:08eff6258e1b | 110 | |
| ocomeni | 75:08eff6258e1b | 111 | /** Blink LED to show we're running */ |
| ocomeni | 75:08eff6258e1b | 112 | void blink(void); |
| ocomeni | 76:6afda865fbf8 | 113 | /** Echo received data back */ |
| ocomeni | 76:6afda865fbf8 | 114 | void EchoBleUartReceived(); |
| ocomeni | 79:a2187bbfa407 | 115 | |
| ocomeni | 77:0b505d1e15f4 | 116 | |
| ocomeni | 77:0b505d1e15f4 | 117 | void reportGapState(); |
| ocomeni | 76:6afda865fbf8 | 118 | |
| ocomeni | 76:6afda865fbf8 | 119 | /** |
| ocomeni | 76:6afda865fbf8 | 120 | * This callback allows the LEDService to receive updates to the ledState Characteristic. |
| ocomeni | 76:6afda865fbf8 | 121 | * |
| ocomeni | 76:6afda865fbf8 | 122 | * @param[in] params |
| ocomeni | 76:6afda865fbf8 | 123 | * Information about the characterisitc being updated. |
| ocomeni | 76:6afda865fbf8 | 124 | */ |
| ocomeni | 76:6afda865fbf8 | 125 | void onDataWrittenCallback(const GattWriteCallbackParams *params); |
| ocomeni | 79:a2187bbfa407 | 126 | //void passkeyDisplayCallback(Gap::Handle_t handle, const SecurityManager::Passkey_t passkey); |
| ocomeni | 79:a2187bbfa407 | 127 | //void securitySetupCompletedCallback(Gap::Handle_t handle, SecurityManager::SecurityCompletionStatus_t status); |
| ocomeni | 75:08eff6258e1b | 128 | |
| ocomeni | 75:08eff6258e1b | 129 | private: |
| ocomeni | 75:08eff6258e1b | 130 | DigitalOut _led1; |
| ocomeni | 75:08eff6258e1b | 131 | |
| ocomeni | 75:08eff6258e1b | 132 | protected: |
| ocomeni | 75:08eff6258e1b | 133 | BLE &_ble; |
| ocomeni | 78:07bb86e3ce14 | 134 | ble_config_t ble_config; |
| ocomeni | 75:08eff6258e1b | 135 | events::EventQueue &_event_queue; |
| ocomeni | 75:08eff6258e1b | 136 | BLEProtocol::AddressBytes_t &_peer_address; |
| ocomeni | 75:08eff6258e1b | 137 | ble::connection_handle_t _handle; |
| ocomeni | 75:08eff6258e1b | 138 | bool _is_connecting; |
| ocomeni | 75:08eff6258e1b | 139 | }; |
| ocomeni | 75:08eff6258e1b | 140 | |
| ocomeni | 75:08eff6258e1b | 141 | /** A peripheral device will advertise, accept the connection and request |
| ocomeni | 75:08eff6258e1b | 142 | * a change in link security. */ |
| ocomeni | 75:08eff6258e1b | 143 | class SMDevicePeripheral : public SMDevice { |
| ocomeni | 75:08eff6258e1b | 144 | public: |
| ocomeni | 78:07bb86e3ce14 | 145 | SMDevicePeripheral(BLE &ble, events::EventQueue &event_queue, |
| ocomeni | 78:07bb86e3ce14 | 146 | BLEProtocol::AddressBytes_t &peer_address, ble_config_t ble_config); |
| ocomeni | 75:08eff6258e1b | 147 | |
| ocomeni | 75:08eff6258e1b | 148 | virtual void start(); |
| ocomeni | 75:08eff6258e1b | 149 | |
| ocomeni | 75:08eff6258e1b | 150 | /** This is called by Gap to notify the application we connected, |
| ocomeni | 75:08eff6258e1b | 151 | * in our case it immediately requests a change in link security */ |
| ocomeni | 75:08eff6258e1b | 152 | virtual void on_connect(const Gap::ConnectionCallbackParams_t *connection_event); |
| ocomeni | 77:0b505d1e15f4 | 153 | void stopAdvertising(); |
| ocomeni | 77:0b505d1e15f4 | 154 | void startAdvertising(); |
| ocomeni | 76:6afda865fbf8 | 155 | |
| ocomeni | 75:08eff6258e1b | 156 | }; |
| ocomeni | 75:08eff6258e1b | 157 | |
| ocomeni | 75:08eff6258e1b | 158 | /** A central device will scan, connect to a peer and request pairing. */ |
| ocomeni | 75:08eff6258e1b | 159 | class SMDeviceCentral : public SMDevice { |
| ocomeni | 75:08eff6258e1b | 160 | public: |
| ocomeni | 78:07bb86e3ce14 | 161 | SMDeviceCentral(BLE &ble, events::EventQueue &event_queue, |
| ocomeni | 78:07bb86e3ce14 | 162 | BLEProtocol::AddressBytes_t &peer_address, ble_config_t ble_config); |
| ocomeni | 75:08eff6258e1b | 163 | |
| ocomeni | 75:08eff6258e1b | 164 | virtual void start(); |
| ocomeni | 75:08eff6258e1b | 165 | |
| ocomeni | 75:08eff6258e1b | 166 | /** Look at scan payload to find a peer device and connect to it */ |
| ocomeni | 75:08eff6258e1b | 167 | void on_scan(const Gap::AdvertisementCallbackParams_t *params); |
| ocomeni | 75:08eff6258e1b | 168 | |
| ocomeni | 75:08eff6258e1b | 169 | /** This is called by Gap to notify the application we connected, |
| ocomeni | 75:08eff6258e1b | 170 | * in our case it immediately request pairing */ |
| ocomeni | 75:08eff6258e1b | 171 | virtual void on_connect(const Gap::ConnectionCallbackParams_t *connection_event); |
| ocomeni | 75:08eff6258e1b | 172 | }; |
| ocomeni | 75:08eff6258e1b | 173 | |
| ocomeni | 75:08eff6258e1b | 174 | |
| ocomeni | 75:08eff6258e1b | 175 | #if MBED_CONF_APP_FILESYSTEM_SUPPORT |
| ocomeni | 75:08eff6258e1b | 176 | bool create_filesystem(); |
| ocomeni | 75:08eff6258e1b | 177 | #endif //MBED_CONF_APP_FILESYSTEM_SUPPORT |
| ocomeni | 75:08eff6258e1b | 178 | |
| ocomeni | 74:f26e846adfe9 | 179 | #endif // __BLE_MANAGER_H__ |