Example usage of the privacy features in the GAP.

Privacy - example usage of the privacy feature

Demonstration of privacy features in Gap. It shows how to use private addresses when advertising and connecting and how filtering ties in with these operations.

The application will start by repeatedly trying to connect to the same application running on another board. It will do this by advertising and scanning for random intervals waiting until the difference in intervals between the boards will make them meet when one is advertising and the other scanning.

Two devices will be operating using random resolvable addresses. The application will connect to the peer and pair. It will attempt bonding and if possible create a whitelist based on the bond.

Subsequent connections will turn on filtering if the whitelist has been successfully created.

Running the application

Requirements

Application requires two devices. Each one should be loaded with the same example. The application will alternate between scanning and advertising until the two devices find each other and the demonstration proceeds.

Information about activity is printed over the serial connection - please have two clients open, each connected to a device. You may use:

- Tera Term

Hardware requirements are in the main readme.

Building instructions

Building instructions for all samples are in the main readme.

Note: example currently doesn't use ST provided stack and instead uses a Cordio port for the ST.

Committer:
mbed_official
Date:
Thu Aug 15 17:02:23 2019 +0100
Revision:
2:13ad22604846
Parent:
0:2a36ad25fd97
Merge pull request #252 from donatieng/mbed_os_update

Update Master branch to use Mbed OS 5.13.1
.
Commit copied from https://github.com/ARMmbed/mbed-os-example-ble

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:2a36ad25fd97 1 /* mbed Microcontroller Library
mbed_official 0:2a36ad25fd97 2 * Copyright (c) 2018 ARM Limited
mbed_official 0:2a36ad25fd97 3 *
mbed_official 0:2a36ad25fd97 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 0:2a36ad25fd97 5 * you may not use this file except in compliance with the License.
mbed_official 0:2a36ad25fd97 6 * You may obtain a copy of the License at
mbed_official 0:2a36ad25fd97 7 *
mbed_official 0:2a36ad25fd97 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 0:2a36ad25fd97 9 *
mbed_official 0:2a36ad25fd97 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 0:2a36ad25fd97 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 0:2a36ad25fd97 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 0:2a36ad25fd97 13 * See the License for the specific language governing permissions and
mbed_official 0:2a36ad25fd97 14 * limitations under the License.
mbed_official 0:2a36ad25fd97 15 */
mbed_official 0:2a36ad25fd97 16
mbed_official 0:2a36ad25fd97 17 #include <mbed.h>
mbed_official 0:2a36ad25fd97 18 #include "ble/BLE.h"
mbed_official 0:2a36ad25fd97 19
mbed_official 0:2a36ad25fd97 20 inline void print_error(ble_error_t error, const char* msg)
mbed_official 0:2a36ad25fd97 21 {
mbed_official 0:2a36ad25fd97 22 printf("%s: ", msg);
mbed_official 0:2a36ad25fd97 23 switch(error) {
mbed_official 0:2a36ad25fd97 24 case BLE_ERROR_NONE:
mbed_official 0:2a36ad25fd97 25 printf("BLE_ERROR_NONE: No error");
mbed_official 0:2a36ad25fd97 26 break;
mbed_official 0:2a36ad25fd97 27 case BLE_ERROR_BUFFER_OVERFLOW:
mbed_official 0:2a36ad25fd97 28 printf("BLE_ERROR_BUFFER_OVERFLOW: The requested action would cause a buffer overflow and has been aborted");
mbed_official 0:2a36ad25fd97 29 break;
mbed_official 0:2a36ad25fd97 30 case BLE_ERROR_NOT_IMPLEMENTED:
mbed_official 0:2a36ad25fd97 31 printf("BLE_ERROR_NOT_IMPLEMENTED: Requested a feature that isn't yet implement or isn't supported by the target HW");
mbed_official 0:2a36ad25fd97 32 break;
mbed_official 0:2a36ad25fd97 33 case BLE_ERROR_PARAM_OUT_OF_RANGE:
mbed_official 0:2a36ad25fd97 34 printf("BLE_ERROR_PARAM_OUT_OF_RANGE: One of the supplied parameters is outside the valid range");
mbed_official 0:2a36ad25fd97 35 break;
mbed_official 0:2a36ad25fd97 36 case BLE_ERROR_INVALID_PARAM:
mbed_official 0:2a36ad25fd97 37 printf("BLE_ERROR_INVALID_PARAM: One of the supplied parameters is invalid");
mbed_official 0:2a36ad25fd97 38 break;
mbed_official 0:2a36ad25fd97 39 case BLE_STACK_BUSY:
mbed_official 0:2a36ad25fd97 40 printf("BLE_STACK_BUSY: The stack is busy");
mbed_official 0:2a36ad25fd97 41 break;
mbed_official 0:2a36ad25fd97 42 case BLE_ERROR_INVALID_STATE:
mbed_official 0:2a36ad25fd97 43 printf("BLE_ERROR_INVALID_STATE: Invalid state");
mbed_official 0:2a36ad25fd97 44 break;
mbed_official 0:2a36ad25fd97 45 case BLE_ERROR_NO_MEM:
mbed_official 0:2a36ad25fd97 46 printf("BLE_ERROR_NO_MEM: Out of Memory");
mbed_official 0:2a36ad25fd97 47 break;
mbed_official 0:2a36ad25fd97 48 case BLE_ERROR_OPERATION_NOT_PERMITTED:
mbed_official 0:2a36ad25fd97 49 printf("BLE_ERROR_OPERATION_NOT_PERMITTED");
mbed_official 0:2a36ad25fd97 50 break;
mbed_official 0:2a36ad25fd97 51 case BLE_ERROR_INITIALIZATION_INCOMPLETE:
mbed_official 0:2a36ad25fd97 52 printf("BLE_ERROR_INITIALIZATION_INCOMPLETE");
mbed_official 0:2a36ad25fd97 53 break;
mbed_official 0:2a36ad25fd97 54 case BLE_ERROR_ALREADY_INITIALIZED:
mbed_official 0:2a36ad25fd97 55 printf("BLE_ERROR_ALREADY_INITIALIZED");
mbed_official 0:2a36ad25fd97 56 break;
mbed_official 0:2a36ad25fd97 57 case BLE_ERROR_UNSPECIFIED:
mbed_official 0:2a36ad25fd97 58 printf("BLE_ERROR_UNSPECIFIED: Unknown error");
mbed_official 0:2a36ad25fd97 59 break;
mbed_official 0:2a36ad25fd97 60 case BLE_ERROR_INTERNAL_STACK_FAILURE:
mbed_official 0:2a36ad25fd97 61 printf("BLE_ERROR_INTERNAL_STACK_FAILURE: internal stack faillure");
mbed_official 0:2a36ad25fd97 62 break;
mbed_official 0:2a36ad25fd97 63 }
mbed_official 0:2a36ad25fd97 64 printf("\r\n");
mbed_official 0:2a36ad25fd97 65 }
mbed_official 0:2a36ad25fd97 66
mbed_official 0:2a36ad25fd97 67 /** print device address to the terminal */
mbed_official 0:2a36ad25fd97 68 void print_address(const uint8_t *addr)
mbed_official 0:2a36ad25fd97 69 {
mbed_official 0:2a36ad25fd97 70 printf("%02x:%02x:%02x:%02x:%02x:%02x\r\n",
mbed_official 0:2a36ad25fd97 71 addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]);
mbed_official 0:2a36ad25fd97 72 }
mbed_official 0:2a36ad25fd97 73
mbed_official 0:2a36ad25fd97 74 inline void print_mac_address()
mbed_official 0:2a36ad25fd97 75 {
mbed_official 0:2a36ad25fd97 76 /* Print out device MAC address to the console*/
mbed_official 0:2a36ad25fd97 77 Gap::AddressType_t addr_type;
mbed_official 0:2a36ad25fd97 78 Gap::Address_t address;
mbed_official 0:2a36ad25fd97 79 BLE::Instance().gap().getAddress(&addr_type, address);
mbed_official 0:2a36ad25fd97 80 printf("DEVICE MAC ADDRESS: ");
mbed_official 0:2a36ad25fd97 81 print_address(address);
mbed_official 0:2a36ad25fd97 82 }
mbed_official 0:2a36ad25fd97 83
mbed_official 0:2a36ad25fd97 84 inline const char* phy_to_string(Gap::Phy_t phy) {
mbed_official 0:2a36ad25fd97 85 switch(phy.value()) {
mbed_official 0:2a36ad25fd97 86 case Gap::Phy_t::LE_1M:
mbed_official 0:2a36ad25fd97 87 return "LE 1M";
mbed_official 0:2a36ad25fd97 88 case Gap::Phy_t::LE_2M:
mbed_official 0:2a36ad25fd97 89 return "LE 2M";
mbed_official 0:2a36ad25fd97 90 case Gap::Phy_t::LE_CODED:
mbed_official 0:2a36ad25fd97 91 return "LE coded";
mbed_official 0:2a36ad25fd97 92 default:
mbed_official 0:2a36ad25fd97 93 return "invalid PHY";
mbed_official 0:2a36ad25fd97 94 }
mbed_official 0:2a36ad25fd97 95 }