Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: source/main.cpp
- Revision:
- 9:674ab70e0f36
- Parent:
- 1:916188eae2bb
- Child:
- 17:6bf7972c4d0e
--- a/source/main.cpp Thu Aug 23 13:45:41 2018 +0100
+++ b/source/main.cpp Thu Aug 23 14:00:15 2018 +0100
@@ -19,6 +19,11 @@
#include "ble/BLE.h"
#include "SecurityManager.h"
+#if MBED_CONF_APP_FILESYSTEM_SUPPORT
+#include "LittleFileSystem.h"
+#include "HeapBlockDevice.h"
+#endif //MBED_CONF_APP_FILESYSTEM_SUPPORT
+
/** This example demonstrates all the basic setup required
* for pairing and setting up link security both as a central and peripheral
*
@@ -108,7 +113,7 @@
virtual void pairingRequest(
ble::connection_handle_t connectionHandle
) {
- printf("Pairing requested. Authorising.\r\n");
+ printf("Pairing requested - authorising\r\n");
_ble.securityManager().acceptPairingRequest(connectionHandle);
}
@@ -122,12 +127,6 @@
} else {
printf("Pairing failed\r\n");
}
-
- /* disconnect in 500 ms */
- _event_queue.call_in(
- 500, &_ble.gap(),
- &Gap::disconnect, _handle, Gap::REMOTE_USER_TERMINATED_CONNECTION
- );
}
/** Inform the application of change in encryption status. This will be
@@ -143,6 +142,12 @@
} else if (result == ble::link_encryption_t::NOT_ENCRYPTED) {
printf("Link NOT_ENCRYPTED\r\n");
}
+
+ /* disconnect in 2 s */
+ _event_queue.call_in(
+ 2000, &_ble.gap(),
+ &Gap::disconnect, _handle, Gap::REMOTE_USER_TERMINATED_CONNECTION
+ );
}
private:
@@ -159,15 +164,55 @@
return;
}
+ /* This path will be used to store bonding information but will fallback
+ * to storing in memory if file access fails (for example due to lack of a filesystem) */
+ const char* db_path = "/fs/bt_sec_db";
/* If the security manager is required this needs to be called before any
* calls to the Security manager happen. */
- error = _ble.securityManager().init();
+ error = _ble.securityManager().init(
+ true,
+ false,
+ SecurityManager::IO_CAPS_NONE,
+ NULL,
+ false,
+ db_path
+ );
if (error) {
printf("Error during init %d\r\n", error);
return;
}
+ error = _ble.securityManager().preserveBondingStateOnReset(true);
+
+ if (error) {
+ printf("Error during preserveBondingStateOnReset %d\r\n", error);
+ }
+
+#if MBED_CONF_APP_FILESYSTEM_SUPPORT
+ /* Enable privacy so we can find the keys */
+ error = _ble.gap().enablePrivacy(true);
+
+ if (error) {
+ printf("Error enabling privacy\r\n");
+ }
+
+ Gap::PeripheralPrivacyConfiguration_t configuration_p = {
+ /* use_non_resolvable_random_address */ false,
+ Gap::PeripheralPrivacyConfiguration_t::REJECT_NON_RESOLVED_ADDRESS
+ };
+ _ble.gap().setPeripheralPrivacyConfiguration(&configuration_p);
+
+ Gap::CentralPrivacyConfiguration_t configuration_c = {
+ /* use_non_resolvable_random_address */ false,
+ Gap::CentralPrivacyConfiguration_t::RESOLVE_AND_FORWARD
+ };
+ _ble.gap().setCentralPrivacyConfiguration(&configuration_c);
+
+ /* this demo switches between being master and slave */
+ _ble.securityManager().setHintFutureRoleReversal(true);
+#endif
+
/* Tell the security manager to use methods in this class to inform us
* of any events. Class needs to implement SecurityManagerEventHandler. */
_ble.securityManager().setSecurityManagerEventHandler(this);
@@ -195,7 +240,7 @@
* in our case it ends the demonstration. */
void on_disconnect(const Gap::DisconnectionCallbackParams_t *event)
{
- printf("Disconnected - demonstration ended \r\n");
+ printf("Diconnected\r\n");
_event_queue.break_dispatch();
};
@@ -203,7 +248,7 @@
* scanning or connection initiation */
void on_timeout(const Gap::TimeoutSource_t source)
{
- printf("Unexpected timeout - aborting \r\n");
+ printf("Unexpected timeout - aborting\r\n");
_event_queue.break_dispatch();
};
@@ -276,6 +321,8 @@
return;
}
+ printf("Please connect to device\r\n");
+
/** This tells the stack to generate a pairingRequest event
* which will require this application to respond before pairing
* can proceed. Setting it to false will automatically accept
@@ -293,6 +340,10 @@
* during the next demonstration */
memcpy(_peer_address, connection_event->peerAddr, sizeof(_peer_address));
+ printf("Connected to: %02x:%02x:%02x:%02x:%02x:%02x\r\n",
+ _peer_address[5], _peer_address[4], _peer_address[3],
+ _peer_address[2], _peer_address[1], _peer_address[0]);
+
/* store the handle for future Security Manager requests */
_handle = connection_event->handle;
@@ -325,6 +376,12 @@
* and scan requests responses */
ble_error_t error = _ble.gap().startScan(this, &SMDeviceCentral::on_scan);
+ printf("Please advertise\r\n");
+
+ printf("Scanning for: %02x:%02x:%02x:%02x:%02x:%02x\r\n",
+ _peer_address[5], _peer_address[4], _peer_address[3],
+ _peer_address[2], _peer_address[1], _peer_address[0]);
+
if (error) {
printf("Error during Gap::startScan %d\r\n", error);
return;
@@ -339,39 +396,27 @@
return;
}
- /* parse the advertising payload, looking for a discoverable device */
- for (uint8_t i = 0; i < params->advertisingDataLen; ++i) {
- /* The advertising payload is a collection of key/value records where
- * byte 0: length of the record excluding this byte
- * byte 1: The key, it is the type of the data
- * byte [2..N] The value. N is equal to byte0 - 1 */
- const uint8_t record_length = params->advertisingData[i];
- if (record_length == 0) {
- continue;
- }
-
- /* connect to the same device that connected to us */
- if (memcmp(params->peerAddr, _peer_address, sizeof(_peer_address)) == 0) {
+ /* connect to the same device that connected to us */
+ if (memcmp(params->peerAddr, _peer_address, sizeof(_peer_address)) == 0) {
- ble_error_t error = _ble.gap().connect(
- params->peerAddr, params->addressType,
- NULL, NULL
- );
+ ble_error_t error = _ble.gap().connect(
+ params->peerAddr, params->peerAddrType,
+ NULL, NULL
+ );
- if (error) {
- printf("Error during Gap::connect %d\r\n", error);
- return;
- }
-
- /* we may have already scan events waiting
- * to be processed so we need to remember
- * that we are already connecting and ignore them */
- _is_connecting = true;
-
+ if (error) {
+ printf("Error during Gap::connect %d\r\n", error);
return;
}
- i += record_length;
+ printf("Connecting... ");
+
+ /* we may have already scan events waiting
+ * to be processed so we need to remember
+ * that we are already connecting and ignore them */
+ _is_connecting = true;
+
+ return;
}
};
@@ -387,6 +432,8 @@
/* in this example the local device is the master so we request pairing */
error = _ble.securityManager().requestPairing(_handle);
+ printf("Connected\r\n");
+
if (error) {
printf("Error during SM::requestPairing %d\r\n", error);
return;
@@ -396,21 +443,69 @@
};
};
+
+#if MBED_CONF_APP_FILESYSTEM_SUPPORT
+bool create_filesystem()
+{
+ static LittleFileSystem fs("fs");
+
+ /* replace this with any physical block device your board supports (like an SD card) */
+ static HeapBlockDevice bd(4096, 256);
+
+ int err = bd.init();
+
+ if (err) {
+ return false;
+ }
+
+ err = bd.erase(0, bd.size());
+
+ if (err) {
+ return false;
+ }
+
+ err = fs.mount(&bd);
+
+ if (err) {
+ /* Reformat if we can't mount the filesystem */
+ printf("No filesystem found, formatting...\r\n");
+
+ err = fs.reformat(&bd);
+
+ if (err) {
+ return false;
+ }
+ }
+
+ return true;
+}
+#endif //MBED_CONF_APP_FILESYSTEM_SUPPORT
+
int main()
{
BLE& ble = BLE::Instance();
events::EventQueue queue;
- {
- printf("\r\n PERIPHERAL \r\n\r\n");
- SMDevicePeripheral peripheral(ble, queue, peer_address);
- peripheral.run();
+#if MBED_CONF_APP_FILESYSTEM_SUPPORT
+ /* if filesystem creation fails or there is no filesystem the security manager
+ * will fallback to storing the security database in memory */
+ if (!create_filesystem()) {
+ printf("Filesystem creation failed, will use memory storage\r\n");
}
+#endif
- {
- printf("\r\n CENTRAL \r\n\r\n");
- SMDeviceCentral central(ble, queue, peer_address);
- central.run();
+ while(1) {
+ {
+ printf("\r\n PERIPHERAL \r\n\r\n");
+ SMDevicePeripheral peripheral(ble, queue, peer_address);
+ peripheral.run();
+ }
+
+ {
+ printf("\r\n CENTRAL \r\n\r\n");
+ SMDeviceCentral central(ble, queue, peer_address);
+ central.run();
+ }
}
return 0;