jgh

Dependents:   Migration

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Thu Jul 02 09:06:11 2015 +0100
Revision:
716:11b41f651697
Child:
719:5f5c3812ea8f
Synchronized with git rev d80fec88
Author: Rohit Grover
Release 0.4.0
=============

This is a major release which introduces the GATT Client functionality. It
also aligns BLE_API with builds using our new package manager: yotta
(https://github.com/armmbed/yotta).

Many APIs have seen some redesign. We encourage our users to pay attention to
the changes and migrate appropriately over time. We've also taken care to
ensure that existing code continues to work the same way. There's more
documentation in the form of comment headers for APIs to explain proper usage;
in many cases comment headers suggest alternative use of APIs.

Enhancements
~~~~~~~~~~~~

* Introduce GattClient. This includes functionality for service-discovery,
connections, and attribute-reads and writes. You'll find a demo program for
LEDBlinker on the mbed.org Bluetooth team page to use the new APIs. Some of
the GATT client functionality hasn't been implemented yet, but the APIs have
been added.

* Most APIs in the abstract base classes like Gap and GattServer return
BLE_ERROR_NOT_IMPLEMENTED. Previously many APIs were pure-virtual, which did
not permit partial ports to compile.

* We've added a new abstract base class for SecurityManager. All security
related APIs have been moved into that.

* BLEDevice has been renamed as BLE. A deprecated alias for BLEDevice is
available to support existing code.

* There has been a major cleanup of APIs under BLE. APIs have now been
categorized as belonging to Gap, GattServer, GattClient, or SecurityManager.
There are accessors to get references for Gap, GattServer, GattClient, and
SecurityManager. A former call to ble.setAddress(...) is now expected to be
achieved with ble.gap().setAddress(...).

* We've cleaned up our APIs, and this has resulted in dropping some APIs like
BLE::reset().

* We've also dropped GattServer::initializeGattDatabase(). THis was added at
some point to support controllers where a commit point was needed to
indicate when the application had finished constructing the GATT database.
This API would get called internally before Gap::startAdvertising(). We now
expect the underlying port to do the equivalent of initializeGattDatabase()
implicitly upon Gap::startAdvertising().

* The callback for BLE.onTimeout() now receives a TimeoutSource_t to indicate
the cause of the timeout. This is perhaps the only breaking API change. We
expect it to have very little disruptive effect.

* We've added a version of Gap::disconnect() which takes a connection handle.
The previous API (which did not take a connection handle) has been
deprecated; it will still work for situations where there's only a single
active connection. We hold on to that API to allow existing code to migrate
to the new API.

Bugfixes
~~~~~~~~

* None.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 716:11b41f651697 1 /* mbed Microcontroller Library
rgrover1 716:11b41f651697 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 716:11b41f651697 3 *
rgrover1 716:11b41f651697 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 716:11b41f651697 5 * you may not use this file except in compliance with the License.
rgrover1 716:11b41f651697 6 * You may obtain a copy of the License at
rgrover1 716:11b41f651697 7 *
rgrover1 716:11b41f651697 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 716:11b41f651697 9 *
rgrover1 716:11b41f651697 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 716:11b41f651697 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 716:11b41f651697 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 716:11b41f651697 13 * See the License for the specific language governing permissions and
rgrover1 716:11b41f651697 14 * limitations under the License.
rgrover1 716:11b41f651697 15 */
rgrover1 716:11b41f651697 16
rgrover1 716:11b41f651697 17 #ifndef __GATT_CLIENT_H__
rgrover1 716:11b41f651697 18 #define __GATT_CLIENT_H__
rgrover1 716:11b41f651697 19
rgrover1 716:11b41f651697 20 #include "Gap.h"
rgrover1 716:11b41f651697 21 #include "GattAttribute.h"
rgrover1 716:11b41f651697 22 #include "ServiceDiscovery.h"
rgrover1 716:11b41f651697 23
rgrover1 716:11b41f651697 24 #include "GattCallbackParamTypes.h"
rgrover1 716:11b41f651697 25
rgrover1 716:11b41f651697 26 class GattClient {
rgrover1 716:11b41f651697 27 public:
rgrover1 716:11b41f651697 28 typedef void (*ReadCallback_t)(const GattReadCallbackParams *params);
rgrover1 716:11b41f651697 29
rgrover1 716:11b41f651697 30 enum WriteOp_t {
rgrover1 716:11b41f651697 31 GATT_OP_WRITE_REQ = 0x01, /**< Write Request. */
rgrover1 716:11b41f651697 32 GATT_OP_WRITE_CMD = 0x02, /**< Write Command. */
rgrover1 716:11b41f651697 33 };
rgrover1 716:11b41f651697 34
rgrover1 716:11b41f651697 35 typedef void (*WriteCallback_t)(const GattWriteCallbackParams *params);
rgrover1 716:11b41f651697 36
rgrover1 716:11b41f651697 37 /*
rgrover1 716:11b41f651697 38 * The following functions are meant to be overridden in the platform-specific sub-class.
rgrover1 716:11b41f651697 39 */
rgrover1 716:11b41f651697 40 public:
rgrover1 716:11b41f651697 41 /**
rgrover1 716:11b41f651697 42 * Launch service discovery. Once launched, service discovery will remain
rgrover1 716:11b41f651697 43 * active with callbacks being issued back into the application for matching
rgrover1 716:11b41f651697 44 * services/characteristics. isServiceDiscoveryActive() can be used to
rgrover1 716:11b41f651697 45 * determine status; and a termination callback (if setup) will be invoked
rgrover1 716:11b41f651697 46 * at the end. Service discovery can be terminated prematurely if needed
rgrover1 716:11b41f651697 47 * using terminateServiceDiscovery().
rgrover1 716:11b41f651697 48 *
rgrover1 716:11b41f651697 49 * @param connectionHandle
rgrover1 716:11b41f651697 50 * Handle for the connection with the peer.
rgrover1 716:11b41f651697 51 * @param sc
rgrover1 716:11b41f651697 52 * This is the application callback for matching service. Taken as
rgrover1 716:11b41f651697 53 * NULL by default. Note: service discovery may still be active
rgrover1 716:11b41f651697 54 * when this callback is issued; calling asynchronous BLE-stack
rgrover1 716:11b41f651697 55 * APIs from within this application callback might cause the
rgrover1 716:11b41f651697 56 * stack to abort service discovery. If this becomes an issue, it
rgrover1 716:11b41f651697 57 * may be better to make local copy of the discoveredService and
rgrover1 716:11b41f651697 58 * wait for service discovery to terminate before operating on the
rgrover1 716:11b41f651697 59 * service.
rgrover1 716:11b41f651697 60 * @param cc
rgrover1 716:11b41f651697 61 * This is the application callback for matching characteristic.
rgrover1 716:11b41f651697 62 * Taken as NULL by default. Note: service discovery may still be
rgrover1 716:11b41f651697 63 * active when this callback is issued; calling asynchronous
rgrover1 716:11b41f651697 64 * BLE-stack APIs from within this application callback might cause
rgrover1 716:11b41f651697 65 * the stack to abort service discovery. If this becomes an issue,
rgrover1 716:11b41f651697 66 * it may be better to make local copy of the discoveredCharacteristic
rgrover1 716:11b41f651697 67 * and wait for service discovery to terminate before operating on the
rgrover1 716:11b41f651697 68 * characteristic.
rgrover1 716:11b41f651697 69 * @param matchingServiceUUID
rgrover1 716:11b41f651697 70 * UUID based filter for specifying a service in which the application is
rgrover1 716:11b41f651697 71 * interested. By default it is set as the wildcard UUID_UNKNOWN,
rgrover1 716:11b41f651697 72 * in which case it matches all services. If characteristic-UUID
rgrover1 716:11b41f651697 73 * filter (below) is set to the wildcard value, then a service
rgrover1 716:11b41f651697 74 * callback will be invoked for the matching service (or for every
rgrover1 716:11b41f651697 75 * service if the service filter is a wildcard).
rgrover1 716:11b41f651697 76 * @param matchingCharacteristicUUIDIn
rgrover1 716:11b41f651697 77 * UUID based filter for specifying characteristic in which the application
rgrover1 716:11b41f651697 78 * is interested. By default it is set as the wildcard UUID_UKNOWN
rgrover1 716:11b41f651697 79 * to match against any characteristic. If both service-UUID
rgrover1 716:11b41f651697 80 * filter and characteristic-UUID filter are used with non- wildcard
rgrover1 716:11b41f651697 81 * values, then only a single characteristic callback is
rgrover1 716:11b41f651697 82 * invoked for the matching characteristic.
rgrover1 716:11b41f651697 83 *
rgrover1 716:11b41f651697 84 * @note Using wildcard values for both service-UUID and characteristic-
rgrover1 716:11b41f651697 85 * UUID will result in complete service discovery--callbacks being
rgrover1 716:11b41f651697 86 * called for every service and characteristic.
rgrover1 716:11b41f651697 87 *
rgrover1 716:11b41f651697 88 * @note Providing NULL for the characteristic callback will result in
rgrover1 716:11b41f651697 89 * characteristic discovery being skipped for each matching
rgrover1 716:11b41f651697 90 * service. This allows for an inexpensive method to discover only
rgrover1 716:11b41f651697 91 * services.
rgrover1 716:11b41f651697 92 *
rgrover1 716:11b41f651697 93 * @return
rgrover1 716:11b41f651697 94 * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
rgrover1 716:11b41f651697 95 */
rgrover1 716:11b41f651697 96 virtual ble_error_t launchServiceDiscovery(Gap::Handle_t connectionHandle,
rgrover1 716:11b41f651697 97 ServiceDiscovery::ServiceCallback_t sc = NULL,
rgrover1 716:11b41f651697 98 ServiceDiscovery::CharacteristicCallback_t cc = NULL,
rgrover1 716:11b41f651697 99 const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN),
rgrover1 716:11b41f651697 100 const UUID &matchingCharacteristicUUIDIn = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) {
rgrover1 716:11b41f651697 101 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 716:11b41f651697 102 }
rgrover1 716:11b41f651697 103
rgrover1 716:11b41f651697 104 /**
rgrover1 716:11b41f651697 105 * Launch service discovery for services. Once launched, service discovery will remain
rgrover1 716:11b41f651697 106 * active with service-callbacks being issued back into the application for matching
rgrover1 716:11b41f651697 107 * services. isServiceDiscoveryActive() can be used to
rgrover1 716:11b41f651697 108 * determine status; and a termination callback (if setup) will be invoked
rgrover1 716:11b41f651697 109 * at the end. Service discovery can be terminated prematurely if needed
rgrover1 716:11b41f651697 110 * using terminateServiceDiscovery().
rgrover1 716:11b41f651697 111 *
rgrover1 716:11b41f651697 112 * @param connectionHandle
rgrover1 716:11b41f651697 113 * Handle for the connection with the peer.
rgrover1 716:11b41f651697 114 * @param sc
rgrover1 716:11b41f651697 115 * This is the application callback for matching service. Note: service discovery may still be active
rgrover1 716:11b41f651697 116 * when this callback is issued; calling asynchronous BLE-stack
rgrover1 716:11b41f651697 117 * APIs from within this application callback might cause the
rgrover1 716:11b41f651697 118 * stack to abort service discovery. If this becomes an issue, it
rgrover1 716:11b41f651697 119 * may be better to make local copy of the discoveredService and
rgrover1 716:11b41f651697 120 * wait for service discovery to terminate before operating on the
rgrover1 716:11b41f651697 121 * service.
rgrover1 716:11b41f651697 122 * @param matchingServiceUUID
rgrover1 716:11b41f651697 123 * UUID based filter for specifying a service in which the application is
rgrover1 716:11b41f651697 124 * interested. By default it is set as the wildcard UUID_UNKNOWN,
rgrover1 716:11b41f651697 125 * in which case it matches all services.
rgrover1 716:11b41f651697 126 *
rgrover1 716:11b41f651697 127 * @return
rgrover1 716:11b41f651697 128 * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
rgrover1 716:11b41f651697 129 */
rgrover1 716:11b41f651697 130 virtual ble_error_t discoverServices(Gap::Handle_t connectionHandle,
rgrover1 716:11b41f651697 131 ServiceDiscovery::ServiceCallback_t callback,
rgrover1 716:11b41f651697 132 const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)) {
rgrover1 716:11b41f651697 133 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 716:11b41f651697 134 }
rgrover1 716:11b41f651697 135
rgrover1 716:11b41f651697 136 /**
rgrover1 716:11b41f651697 137 * Launch service discovery for services. Once launched, service discovery will remain
rgrover1 716:11b41f651697 138 * active with service-callbacks being issued back into the application for matching
rgrover1 716:11b41f651697 139 * services. isServiceDiscoveryActive() can be used to
rgrover1 716:11b41f651697 140 * determine status; and a termination callback (if setup) will be invoked
rgrover1 716:11b41f651697 141 * at the end. Service discovery can be terminated prematurely if needed
rgrover1 716:11b41f651697 142 * using terminateServiceDiscovery().
rgrover1 716:11b41f651697 143 *
rgrover1 716:11b41f651697 144 * @param connectionHandle
rgrover1 716:11b41f651697 145 * Handle for the connection with the peer.
rgrover1 716:11b41f651697 146 * @param sc
rgrover1 716:11b41f651697 147 * This is the application callback for matching service. Note: service discovery may still be active
rgrover1 716:11b41f651697 148 * when this callback is issued; calling asynchronous BLE-stack
rgrover1 716:11b41f651697 149 * APIs from within this application callback might cause the
rgrover1 716:11b41f651697 150 * stack to abort service discovery. If this becomes an issue, it
rgrover1 716:11b41f651697 151 * may be better to make local copy of the discoveredService and
rgrover1 716:11b41f651697 152 * wait for service discovery to terminate before operating on the
rgrover1 716:11b41f651697 153 * service.
rgrover1 716:11b41f651697 154 * @param startHandle, endHandle
rgrover1 716:11b41f651697 155 * Handle range within which to limit the search
rgrover1 716:11b41f651697 156 *
rgrover1 716:11b41f651697 157 * @return
rgrover1 716:11b41f651697 158 * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
rgrover1 716:11b41f651697 159 */
rgrover1 716:11b41f651697 160 virtual ble_error_t discoverServices(Gap::Handle_t connectionHandle,
rgrover1 716:11b41f651697 161 ServiceDiscovery::ServiceCallback_t callback,
rgrover1 716:11b41f651697 162 GattAttribute::Handle_t startHandle,
rgrover1 716:11b41f651697 163 GattAttribute::Handle_t endHandle) {
rgrover1 716:11b41f651697 164 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 716:11b41f651697 165 }
rgrover1 716:11b41f651697 166
rgrover1 716:11b41f651697 167 /**
rgrover1 716:11b41f651697 168 * Is service-discovery currently active?
rgrover1 716:11b41f651697 169 */
rgrover1 716:11b41f651697 170 virtual bool isServiceDiscoveryActive(void) const {
rgrover1 716:11b41f651697 171 return false; /* default implementation; override this API if this capability is supported. */
rgrover1 716:11b41f651697 172 }
rgrover1 716:11b41f651697 173
rgrover1 716:11b41f651697 174 /**
rgrover1 716:11b41f651697 175 * Terminate an ongoing service-discovery. This should result in an
rgrover1 716:11b41f651697 176 * invocation of the TerminationCallback if service-discovery is active.
rgrover1 716:11b41f651697 177 */
rgrover1 716:11b41f651697 178 virtual void terminateServiceDiscovery(void) {
rgrover1 716:11b41f651697 179 /* default implementation; override this API if this capability is supported. */
rgrover1 716:11b41f651697 180 }
rgrover1 716:11b41f651697 181
rgrover1 716:11b41f651697 182 /* Initiate a Gatt Client read procedure by attribute-handle. */
rgrover1 716:11b41f651697 183 virtual ble_error_t read(Gap::Handle_t connHandle, GattAttribute::Handle_t attributeHandle, uint16_t offset) const {
rgrover1 716:11b41f651697 184 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 716:11b41f651697 185 }
rgrover1 716:11b41f651697 186
rgrover1 716:11b41f651697 187 /**
rgrover1 716:11b41f651697 188 * Initiate a GATT Client write procedure.
rgrover1 716:11b41f651697 189 *
rgrover1 716:11b41f651697 190 * @param[in] cmd
rgrover1 716:11b41f651697 191 * Command can be either a write-request (which generates a
rgrover1 716:11b41f651697 192 * matching response from the peripheral), or a write-command,
rgrover1 716:11b41f651697 193 * which doesn't require the connected peer to respond.
rgrover1 716:11b41f651697 194 * @param[in] connHandle
rgrover1 716:11b41f651697 195 * Connection handle.
rgrover1 716:11b41f651697 196 * @param[in] attributeHandle
rgrover1 716:11b41f651697 197 * handle for the target attribtue on the remote GATT server.
rgrover1 716:11b41f651697 198 * @param[in] length
rgrover1 716:11b41f651697 199 * length of the new value.
rgrover1 716:11b41f651697 200 * @param[in] value
rgrover1 716:11b41f651697 201 * new value being written.
rgrover1 716:11b41f651697 202 */
rgrover1 716:11b41f651697 203 virtual ble_error_t write(GattClient::WriteOp_t cmd,
rgrover1 716:11b41f651697 204 Gap::Handle_t connHandle,
rgrover1 716:11b41f651697 205 GattAttribute::Handle_t attributeHandle,
rgrover1 716:11b41f651697 206 size_t length,
rgrover1 716:11b41f651697 207 const uint8_t *value) const {
rgrover1 716:11b41f651697 208 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 716:11b41f651697 209 }
rgrover1 716:11b41f651697 210
rgrover1 716:11b41f651697 211 /**
rgrover1 716:11b41f651697 212 * Setup callback for when serviceDiscovery terminates.
rgrover1 716:11b41f651697 213 */
rgrover1 716:11b41f651697 214 virtual void onServiceDiscoveryTermination(ServiceDiscovery::TerminationCallback_t callback) {
rgrover1 716:11b41f651697 215 /* default implementation; override this API if this capability is supported. */
rgrover1 716:11b41f651697 216 }
rgrover1 716:11b41f651697 217
rgrover1 716:11b41f651697 218 protected:
rgrover1 716:11b41f651697 219 GattClient() {
rgrover1 716:11b41f651697 220 /* empty */
rgrover1 716:11b41f651697 221 }
rgrover1 716:11b41f651697 222
rgrover1 716:11b41f651697 223 private:
rgrover1 716:11b41f651697 224 /* disallow copy and assignment */
rgrover1 716:11b41f651697 225 GattClient(const GattClient &);
rgrover1 716:11b41f651697 226 GattClient& operator=(const GattClient &);
rgrover1 716:11b41f651697 227 };
rgrover1 716:11b41f651697 228
rgrover1 716:11b41f651697 229 #endif // ifndef __GATT_CLIENT_H__