Kris Scholte Lubberink
/
SSS_Ble
Ble for smart sOlutions
source/BleDeviceCentral.h@7:9cda1b0f25ae, 2019-05-20 (annotated)
- Committer:
- kris@kris-X682X
- Date:
- Mon May 20 13:20:35 2019 +0200
- Revision:
- 7:9cda1b0f25ae
- Parent:
- 6:ee9c86f06eae
- Child:
- 8:369b80cef5ae
Working broadcast & advertise
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kris@kris-X682X | 6:ee9c86f06eae | 1 | // |
kris@kris-X682X | 6:ee9c86f06eae | 2 | // Created by kris on 20-4-19. |
kris@kris-X682X | 6:ee9c86f06eae | 3 | // |
kris@kris-X682X | 6:ee9c86f06eae | 4 | |
kris@kris-X682X | 6:ee9c86f06eae | 5 | #ifndef SSS_BLE_BLEDEVICECENTRAL_H |
kris@kris-X682X | 6:ee9c86f06eae | 6 | #define SSS_BLE_BLEDEVICECENTRAL_H |
kris@kris-X682X | 6:ee9c86f06eae | 7 | |
kris@kris-X682X | 6:ee9c86f06eae | 8 | #include <AdvertisingDataParser.h> |
kris@kris-X682X | 6:ee9c86f06eae | 9 | #include "BleDevice.h" |
kris@kris-X682X | 6:ee9c86f06eae | 10 | #include "list" |
kris@kris-X682X | 6:ee9c86f06eae | 11 | |
kris@kris-X682X | 6:ee9c86f06eae | 12 | class BleDeviceCentral : public BleDevice { |
kris@kris-X682X | 6:ee9c86f06eae | 13 | public: |
kris@kris-X682X | 6:ee9c86f06eae | 14 | BleDeviceCentral(BLE &ble, events::EventQueue &event_queue) |
kris@kris-X682X | 6:ee9c86f06eae | 15 | : BleDevice(ble, event_queue) {} |
kris@kris-X682X | 6:ee9c86f06eae | 16 | std::list<ble::address_t::byte_array_t> addresses ; |
kris@kris-X682X | 6:ee9c86f06eae | 17 | |
kris@kris-X682X | 6:ee9c86f06eae | 18 | virtual void start() |
kris@kris-X682X | 6:ee9c86f06eae | 19 | { |
kris@kris-X682X | 6:ee9c86f06eae | 20 | ble::ScanParameters params; |
kris@kris-X682X | 6:ee9c86f06eae | 21 | ble_error_t error = _ble.gap().setScanParameters(params); |
kris@kris-X682X | 6:ee9c86f06eae | 22 | |
kris@kris-X682X | 6:ee9c86f06eae | 23 | if (error) { |
kris@kris-X682X | 6:ee9c86f06eae | 24 | print_error(error, "Error in Gap::startScan %d\r\n"); |
kris@kris-X682X | 6:ee9c86f06eae | 25 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 26 | } |
kris@kris-X682X | 6:ee9c86f06eae | 27 | // |
kris@kris-X682X | 6:ee9c86f06eae | 28 | // /* start scanning, results will be handled by onAdvertisingReport */ |
kris@kris-X682X | 6:ee9c86f06eae | 29 | error = _ble.gap().startScan(); |
kris@kris-X682X | 6:ee9c86f06eae | 30 | |
kris@kris-X682X | 6:ee9c86f06eae | 31 | |
kris@kris-X682X | 6:ee9c86f06eae | 32 | if (error) { |
kris@kris-X682X | 6:ee9c86f06eae | 33 | print_error(error, "Error in Gap::startScan %d\r\n"); |
kris@kris-X682X | 6:ee9c86f06eae | 34 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 35 | } |
kris@kris-X682X | 6:ee9c86f06eae | 36 | } |
kris@kris-X682X | 6:ee9c86f06eae | 37 | virtual void stop(){ |
kris@kris-X682X | 6:ee9c86f06eae | 38 | printf("[CENTRAL]\t Stopping \r\n"); |
kris@kris-X682X | 6:ee9c86f06eae | 39 | //TODO: Destroy the list with addresses |
kris@kris-X682X | 6:ee9c86f06eae | 40 | //FIXME: Out-of-memory error |
kris@kris-X682X | 6:ee9c86f06eae | 41 | addresses.clear(); |
kris@kris-X682X | 6:ee9c86f06eae | 42 | _ble.gap().stopScan(); |
kris@kris-X682X | 6:ee9c86f06eae | 43 | if (_ble.hasInitialized()) { |
kris@kris-X682X | 6:ee9c86f06eae | 44 | _ble.shutdown(); |
kris@kris-X682X | 6:ee9c86f06eae | 45 | } |
kris@kris-X682X | 6:ee9c86f06eae | 46 | } |
kris@kris-X682X | 6:ee9c86f06eae | 47 | |
kris@kris-X682X | 6:ee9c86f06eae | 48 | private: |
kris@kris-X682X | 6:ee9c86f06eae | 49 | /* Gap::EventHandler */ |
kris@kris-X682X | 6:ee9c86f06eae | 50 | |
kris@kris-X682X | 6:ee9c86f06eae | 51 | /** Look at scan payload to find a peer device and connect to it */ |
kris@kris-X682X | 6:ee9c86f06eae | 52 | virtual void onAdvertisingReport(const ble::AdvertisingReportEvent &event) |
kris@kris-X682X | 6:ee9c86f06eae | 53 | { |
kris@kris-X682X | 6:ee9c86f06eae | 54 | /* don't bother with analysing scan result if we're already connecting */ |
kris@kris-X682X | 6:ee9c86f06eae | 55 | if (_is_connecting) { |
kris@kris-X682X | 6:ee9c86f06eae | 56 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 57 | } |
kris@kris-X682X | 6:ee9c86f06eae | 58 | // printf("found someone "); |
kris@kris-X682X | 6:ee9c86f06eae | 59 | /* parse the advertising payload, looking for a discoverable device */ |
kris@kris-X682X | 6:ee9c86f06eae | 60 | //TODO: Hier checken ofhet een andere SSS wearable is. Zo niet, gewoon tellen. |
kris@kris-X682X | 6:ee9c86f06eae | 61 | bool found = false; |
kris@kris-X682X | 6:ee9c86f06eae | 62 | ble::address_t::byte_array_t actualdata = event.getPeerAddress().data(); |
kris@kris-X682X | 6:ee9c86f06eae | 63 | |
kris@kris-X682X | 6:ee9c86f06eae | 64 | //TODO: Start service discovery. |
kris@kris-X682X | 6:ee9c86f06eae | 65 | ble::AdvertisingDataParser adv_data(event.getPayload()); |
kris@kris-X682X | 6:ee9c86f06eae | 66 | while (adv_data.hasNext()) { |
kris@kris-X682X | 6:ee9c86f06eae | 67 | // printf("\n\t\t Has next"); |
kris@kris-X682X | 6:ee9c86f06eae | 68 | ble::AdvertisingDataParser::element_t field = adv_data.next(); |
kris@kris-X682X | 6:ee9c86f06eae | 69 | |
kris@kris-X682X | 6:ee9c86f06eae | 70 | /* connect to a discoverable device */ |
kris@kris-X682X | 6:ee9c86f06eae | 71 | //Deze if-statement kijkt naar de naam en MEMCMP vergelijkt de advertising-naam met de target-naam (sssble) |
kris@kris-X682X | 6:ee9c86f06eae | 72 | //Als het SSS BLE is, moet ik dus de services gaan ontdekken en de interest-service uitlezen. Dit is altijd een array van 5 bytes, allemaal |
kris@kris-X682X | 6:ee9c86f06eae | 73 | /*if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME && |
kris@kris-X682X | 6:ee9c86f06eae | 74 | field.value.size() == strlen("SSS BLE") && |
kris@kris-X682X | 6:ee9c86f06eae | 75 | (memcmp(field.value.data(), "SSS BLE", field.value.size()) == 0)) {*/ |
kris@kris-X682X | 6:ee9c86f06eae | 76 | if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME){ |
kris@kris-X682X | 6:ee9c86f06eae | 77 | if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME && |
kris@kris-X682X | 6:ee9c86f06eae | 78 | field.value.size() == strlen("SSS BLE") && |
kris@kris-X682X | 6:ee9c86f06eae | 79 | (memcmp(field.value.data(), "SSS BLE", field.value.size()) == 0)) { |
kris@kris-X682X | 6:ee9c86f06eae | 80 | printf("Found another wearable, let's try connecting to him."); |
kris@kris-X682X | 6:ee9c86f06eae | 81 | |
kris@kris-X682X | 6:ee9c86f06eae | 82 | |
kris@kris-X682X | 6:ee9c86f06eae | 83 | ble_error_t error = _ble.gap().stopScan(); |
kris@kris-X682X | 6:ee9c86f06eae | 84 | |
kris@kris-X682X | 6:ee9c86f06eae | 85 | if (error) { |
kris@kris-X682X | 6:ee9c86f06eae | 86 | print_error(error, "Error caused by Gap::stopScan"); |
kris@kris-X682X | 6:ee9c86f06eae | 87 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 88 | } |
kris@kris-X682X | 6:ee9c86f06eae | 89 | |
kris@kris-X682X | 6:ee9c86f06eae | 90 | const ble::ConnectionParameters connection_params; |
kris@kris-X682X | 6:ee9c86f06eae | 91 | |
kris@kris-X682X | 6:ee9c86f06eae | 92 | |
kris@kris-X682X | 6:ee9c86f06eae | 93 | error = _ble.gap().connect( |
kris@kris-X682X | 6:ee9c86f06eae | 94 | event.getPeerAddressType(), |
kris@kris-X682X | 6:ee9c86f06eae | 95 | event.getPeerAddress(), |
kris@kris-X682X | 6:ee9c86f06eae | 96 | connection_params |
kris@kris-X682X | 6:ee9c86f06eae | 97 | ); |
kris@kris-X682X | 6:ee9c86f06eae | 98 | |
kris@kris-X682X | 6:ee9c86f06eae | 99 | if (error) { |
kris@kris-X682X | 6:ee9c86f06eae | 100 | _ble.gap().startScan(); |
kris@kris-X682X | 6:ee9c86f06eae | 101 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 102 | } |
kris@kris-X682X | 6:ee9c86f06eae | 103 | |
kris@kris-X682X | 6:ee9c86f06eae | 104 | } |
kris@kris-X682X | 6:ee9c86f06eae | 105 | |
kris@kris-X682X | 6:ee9c86f06eae | 106 | char test[field.value.size()]; |
kris@kris-X682X | 6:ee9c86f06eae | 107 | memcpy(test, field.value.data(), field.value.size()); |
kris@kris-X682X | 6:ee9c86f06eae | 108 | |
kris@kris-X682X | 6:ee9c86f06eae | 109 | printf("\n\t\t Adv from: "); |
kris@kris-X682X | 6:ee9c86f06eae | 110 | printf("%s", test); |
kris@kris-X682X | 6:ee9c86f06eae | 111 | printf(" rssi: %d, scan response: %u, connectable: %u\r\n", |
kris@kris-X682X | 6:ee9c86f06eae | 112 | event.getRssi(), event.getType().scan_response(), event.getType().connectable()); |
kris@kris-X682X | 6:ee9c86f06eae | 113 | |
kris@kris-X682X | 6:ee9c86f06eae | 114 | |
kris@kris-X682X | 6:ee9c86f06eae | 115 | /* we may have already scan events waiting |
kris@kris-X682X | 6:ee9c86f06eae | 116 | * to be processed so we need to remember |
kris@kris-X682X | 6:ee9c86f06eae | 117 | * that we are already connecting and ignore them */ |
kris@kris-X682X | 6:ee9c86f06eae | 118 | // _is_connecting = true; |
kris@kris-X682X | 6:ee9c86f06eae | 119 | |
kris@kris-X682X | 6:ee9c86f06eae | 120 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 121 | } |
kris@kris-X682X | 6:ee9c86f06eae | 122 | } |
kris@kris-X682X | 6:ee9c86f06eae | 123 | |
kris@kris-X682X | 6:ee9c86f06eae | 124 | if(addresses.size() > 0){ |
kris@kris-X682X | 6:ee9c86f06eae | 125 | found = (std::find(addresses.begin(), addresses.end(),actualdata ) != addresses.end()); |
kris@kris-X682X | 6:ee9c86f06eae | 126 | } |
kris@kris-X682X | 6:ee9c86f06eae | 127 | |
kris@kris-X682X | 6:ee9c86f06eae | 128 | if (!found) { |
kris@kris-X682X | 6:ee9c86f06eae | 129 | //TODO: Clear the list to prevent memory overflow |
kris@kris-X682X | 6:ee9c86f06eae | 130 | addresses.push_back(actualdata); |
kris@kris-X682X | 6:ee9c86f06eae | 131 | printf("\r\n Amount devices: %d \r\n", addresses.size()); |
kris@kris-X682X | 6:ee9c86f06eae | 132 | |
kris@kris-X682X | 6:ee9c86f06eae | 133 | // printf("%02x:%02x:%02x:%02x:%02x:%02x\r\n", actualdata[5], actualdata[4], actualdata[3], actualdata[2], actualdata[1], actualdata[0]); |
kris@kris-X682X | 6:ee9c86f06eae | 134 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 135 | } else { |
kris@kris-X682X | 6:ee9c86f06eae | 136 | // TODO: Increment internal counter |
kris@kris-X682X | 6:ee9c86f06eae | 137 | } |
kris@kris-X682X | 6:ee9c86f06eae | 138 | } |
kris@kris-X682X | 6:ee9c86f06eae | 139 | |
kris@kris-X682X | 7:9cda1b0f25ae | 140 | |
kris@kris-X682X | 6:ee9c86f06eae | 141 | }; |
kris@kris-X682X | 6:ee9c86f06eae | 142 | |
kris@kris-X682X | 6:ee9c86f06eae | 143 | |
kris@kris-X682X | 6:ee9c86f06eae | 144 | #endif //SSS_BLE_BLEDEVICECENTRAL_H |