Kris Scholte Lubberink
/
SSS_Ble
Ble for smart sOlutions
source/BleDeviceCentral.cpp@11:d6ed1437c2ee, 2019-06-20 (annotated)
- Committer:
- kris@kris-X682X
- Date:
- Thu Jun 20 13:20:24 2019 +0200
- Revision:
- 11:d6ed1437c2ee
- Parent:
- 10:d845189d146e
Refactored
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 | #include "BleDeviceCentral.h" |
kris@kris-X682X | 10:d845189d146e | 6 | |
kris@kris-X682X | 10:d845189d146e | 7 | void hubDetection(){ |
kris@kris-X682X | 10:d845189d146e | 8 | MyStripSingleton::getInstance()->rainbowCycle(2); |
kris@kris-X682X | 10:d845189d146e | 9 | } |
kris@kris-X682X | 10:d845189d146e | 10 | |
kris@kris-X682X | 10:d845189d146e | 11 | void BleDeviceCentral::onAdvertisingReport(const ble::AdvertisingReportEvent &event) { |
kris@kris-X682X | 10:d845189d146e | 12 | { |
kris@kris-X682X | 10:d845189d146e | 13 | |
kris@kris-X682X | 10:d845189d146e | 14 | /* don't bother with analysing scan result if we're already connecting */ |
kris@kris-X682X | 10:d845189d146e | 15 | if (_is_connecting) { |
kris@kris-X682X | 10:d845189d146e | 16 | return; |
kris@kris-X682X | 10:d845189d146e | 17 | } |
kris@kris-X682X | 10:d845189d146e | 18 | bool found = false; |
kris@kris-X682X | 10:d845189d146e | 19 | ble::address_t::byte_array_t actualdata = event.getPeerAddress().data(); |
kris@kris-X682X | 10:d845189d146e | 20 | |
kris@kris-X682X | 10:d845189d146e | 21 | //TODO: Start service discovery. |
kris@kris-X682X | 10:d845189d146e | 22 | ble::AdvertisingDataParser adv_data(event.getPayload()); |
kris@kris-X682X | 10:d845189d146e | 23 | while (adv_data.hasNext()) { |
kris@kris-X682X | 10:d845189d146e | 24 | if (addresses.size() > 0) { |
kris@kris-X682X | 10:d845189d146e | 25 | found = (std::find(addresses.begin(), addresses.end(), actualdata) != addresses.end()); |
kris@kris-X682X | 10:d845189d146e | 26 | } |
kris@kris-X682X | 10:d845189d146e | 27 | |
kris@kris-X682X | 10:d845189d146e | 28 | if (!found) { |
kris@kris-X682X | 10:d845189d146e | 29 | //TODO: Clear the list to prevent memory overflow |
kris@kris-X682X | 10:d845189d146e | 30 | addresses.push_back(actualdata); |
kris@kris-X682X | 10:d845189d146e | 31 | MyStripSingleton::getInstance()->crawlNextLed(1, 0xFF00FF); |
kris@kris-X682X | 10:d845189d146e | 32 | |
kris@kris-X682X | 10:d845189d146e | 33 | printf("\r\n Amount devices: %d \r\n", addresses.size()); |
kris@kris-X682X | 10:d845189d146e | 34 | return; |
kris@kris-X682X | 10:d845189d146e | 35 | } else { |
kris@kris-X682X | 10:d845189d146e | 36 | // TODO: Increment internal counter |
kris@kris-X682X | 10:d845189d146e | 37 | } |
kris@kris-X682X | 10:d845189d146e | 38 | // printf("\n\t\t Has next"); |
kris@kris-X682X | 10:d845189d146e | 39 | ble::AdvertisingDataParser::element_t field = adv_data.next(); |
kris@kris-X682X | 10:d845189d146e | 40 | |
kris@kris-X682X | 10:d845189d146e | 41 | /* connect to a discoverable device */ |
kris@kris-X682X | 10:d845189d146e | 42 | //Deze if-statement kijkt naar de naam en MEMCMP vergelijkt de advertising-naam met de target-naam (sssble) |
kris@kris-X682X | 10:d845189d146e | 43 | //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 | 10:d845189d146e | 44 | /*if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME && |
kris@kris-X682X | 10:d845189d146e | 45 | field.value.size() == strlen("SSS BLE") && |
kris@kris-X682X | 10:d845189d146e | 46 | (memcmp(field.value.data(), "SSS BLE", field.value.size()) == 0)) {*/ |
kris@kris-X682X | 10:d845189d146e | 47 | if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME) { |
kris@kris-X682X | 10:d845189d146e | 48 | if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME && |
kris@kris-X682X | 10:d845189d146e | 49 | field.value.size() == strlen("SSS BLE") && |
kris@kris-X682X | 10:d845189d146e | 50 | (memcmp(field.value.data(), "SSS BLE", field.value.size()) == 0)) { |
kris@kris-X682X | 10:d845189d146e | 51 | |
kris@kris-X682X | 10:d845189d146e | 52 | printf("[CENTRAL]\t Found another wearable, let's try connecting to him.\r\n"); |
kris@kris-X682X | 10:d845189d146e | 53 | MyStripSingleton::getInstance()->resetCrawl(); |
kris@kris-X682X | 10:d845189d146e | 54 | // wait_ms(200); |
kris@kris-X682X | 10:d845189d146e | 55 | ble_error_t error = _ble.gap().stopScan(); |
kris@kris-X682X | 10:d845189d146e | 56 | |
kris@kris-X682X | 10:d845189d146e | 57 | if (error) { |
kris@kris-X682X | 10:d845189d146e | 58 | print_error(error, "Error caused by Gap::stopScan"); |
kris@kris-X682X | 10:d845189d146e | 59 | return; |
kris@kris-X682X | 10:d845189d146e | 60 | } |
kris@kris-X682X | 10:d845189d146e | 61 | printf("[CENTRAL]\t Stopped the scan.\r\n"); |
kris@kris-X682X | 10:d845189d146e | 62 | |
kris@kris-X682X | 10:d845189d146e | 63 | const ble::ConnectionParameters connection_params; |
kris@kris-X682X | 10:d845189d146e | 64 | |
kris@kris-X682X | 10:d845189d146e | 65 | printf("[CENTRAL]\t Trying to connect.\r\n"); |
kris@kris-X682X | 10:d845189d146e | 66 | |
kris@kris-X682X | 10:d845189d146e | 67 | error = _ble.gap().connect( |
kris@kris-X682X | 10:d845189d146e | 68 | event.getPeerAddressType(), |
kris@kris-X682X | 10:d845189d146e | 69 | event.getPeerAddress(), |
kris@kris-X682X | 10:d845189d146e | 70 | connection_params |
kris@kris-X682X | 10:d845189d146e | 71 | ); |
kris@kris-X682X | 10:d845189d146e | 72 | printf("[CENTRAL]\t Trying to connect..\r\n"); |
kris@kris-X682X | 10:d845189d146e | 73 | |
kris@kris-X682X | 10:d845189d146e | 74 | if (error) { |
kris@kris-X682X | 10:d845189d146e | 75 | _ble.gap().startScan(); |
kris@kris-X682X | 10:d845189d146e | 76 | return; |
kris@kris-X682X | 10:d845189d146e | 77 | } |
kris@kris-X682X | 10:d845189d146e | 78 | printf("[CENTRAL]\t Looks like I'm connected...\r\n"); |
kris@kris-X682X | 10:d845189d146e | 79 | //TODO: Break the event queue, but keep doing what im doing |
kris@kris-X682X | 10:d845189d146e | 80 | _event_queue.dispatch_forever(); |
kris@kris-X682X | 10:d845189d146e | 81 | } |
kris@kris-X682X | 10:d845189d146e | 82 | |
kris@kris-X682X | 10:d845189d146e | 83 | char test[field.value.size()]; |
kris@kris-X682X | 10:d845189d146e | 84 | char GoogleHome[field.value.size()]; |
kris@kris-X682X | 10:d845189d146e | 85 | char *output = NULL; |
kris@kris-X682X | 10:d845189d146e | 86 | output = strstr (test, "GoogleHome"); |
kris@kris-X682X | 10:d845189d146e | 87 | memcpy(test, field.value.data(), field.value.size()); |
kris@kris-X682X | 10:d845189d146e | 88 | //TODO: If name contains something like google home, do fancy shit but keep it at that |
kris@kris-X682X | 10:d845189d146e | 89 | if (output) { |
kris@kris-X682X | 10:d845189d146e | 90 | // do stuff |
kris@kris-X682X | 10:d845189d146e | 91 | printf("There seems to be a google home nearby!"); |
kris@kris-X682X | 10:d845189d146e | 92 | MyStripSingleton::getInstance()->rainbowCycle(2); |
kris@kris-X682X | 10:d845189d146e | 93 | _event_queue.call(callback(hubDetection)); |
kris@kris-X682X | 10:d845189d146e | 94 | |
kris@kris-X682X | 10:d845189d146e | 95 | } |
kris@kris-X682X | 10:d845189d146e | 96 | |
kris@kris-X682X | 10:d845189d146e | 97 | printf("\n\t\t Adv from: "); |
kris@kris-X682X | 10:d845189d146e | 98 | printf("%s", test); |
kris@kris-X682X | 10:d845189d146e | 99 | printf(" rssi: %d, scan response: %u, connectable: %u\r\n", |
kris@kris-X682X | 10:d845189d146e | 100 | event.getRssi(), event.getType().scan_response(), event.getType().connectable()); |
kris@kris-X682X | 10:d845189d146e | 101 | |
kris@kris-X682X | 10:d845189d146e | 102 | |
kris@kris-X682X | 10:d845189d146e | 103 | /* we may have already scan events waiting |
kris@kris-X682X | 10:d845189d146e | 104 | * to be processed so we need to remember |
kris@kris-X682X | 10:d845189d146e | 105 | * that we are already connecting and ignore them */ |
kris@kris-X682X | 10:d845189d146e | 106 | // _is_connecting = true; |
kris@kris-X682X | 10:d845189d146e | 107 | |
kris@kris-X682X | 10:d845189d146e | 108 | return; |
kris@kris-X682X | 10:d845189d146e | 109 | } |
kris@kris-X682X | 10:d845189d146e | 110 | } |
kris@kris-X682X | 10:d845189d146e | 111 | |
kris@kris-X682X | 10:d845189d146e | 112 | } |
kris@kris-X682X | 10:d845189d146e | 113 | } |