diff options
Diffstat (limited to 'arduino/libraries/Bluefruit52Lib/examples/Central/central_scan_advanced')
-rwxr-xr-x | arduino/libraries/Bluefruit52Lib/examples/Central/central_scan_advanced/central_scan_advanced.ino | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/arduino/libraries/Bluefruit52Lib/examples/Central/central_scan_advanced/central_scan_advanced.ino b/arduino/libraries/Bluefruit52Lib/examples/Central/central_scan_advanced/central_scan_advanced.ino new file mode 100755 index 0000000..3aab152 --- /dev/null +++ b/arduino/libraries/Bluefruit52Lib/examples/Central/central_scan_advanced/central_scan_advanced.ino @@ -0,0 +1,218 @@ +/********************************************************************* + This is an example for our nRF52 based Bluefruit LE modules + + Pick one up today in the adafruit shop! + + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + MIT license, check LICENSE for more information + All text above, and the splash screen below must be included in + any redistribution +*********************************************************************/ + +#include <bluefruit.h> + +/* For a list of EIR data types see: + * https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile + * Matching enum: cores/nRF5/SDK/components/softdevice/s132/headers/ble_gap.h */ + +void setup() +{ + Serial.begin(115200); + while ( !Serial ) delay(10); // for nrf52840 with native usb + + Serial.println("Bluefruit52 Central ADV Scan Example"); + Serial.println("------------------------------------\n"); + + // Initialize Bluefruit with maximum connections as Peripheral = 0, Central = 1 + // SRAM usage required by SoftDevice will increase dramatically with number of connections + Bluefruit.begin(0, 1); + + // Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4 + Bluefruit.setTxPower(4); + + /* Set the device name */ + Bluefruit.setName("Bluefruit52"); + + /* Set the LED interval for blinky pattern on BLUE LED */ + Bluefruit.setConnLedInterval(250); + + /* Start Central Scanning + * - Enable auto scan if disconnected + * - Filter out packet with a min rssi + * - Interval = 100 ms, window = 50 ms + * - Use active scan (used to retrieve the optional scan response adv packet) + * - Start(0) = will scan forever since no timeout is given + */ + Bluefruit.Scanner.setRxCallback(scan_callback); + Bluefruit.Scanner.restartOnDisconnect(true); + Bluefruit.Scanner.filterRssi(-80); + //Bluefruit.Scanner.filterUuid(BLEUART_UUID_SERVICE); // only invoke callback if detect bleuart service + Bluefruit.Scanner.setInterval(160, 80); // in units of 0.625 ms + Bluefruit.Scanner.useActiveScan(true); // Request scan response data + Bluefruit.Scanner.start(0); // 0 = Don't stop scanning after n seconds + + Serial.println("Scanning ..."); +} + +void scan_callback(ble_gap_evt_adv_report_t* report) +{ + PRINT_LOCATION(); + uint8_t len = 0; + uint8_t buffer[32]; + memset(buffer, 0, sizeof(buffer)); + + /* Display the timestamp and device address */ + if (report->type.scan_response) + { + Serial.printf("[SR%10d] Packet received from ", millis()); + } + else + { + Serial.printf("[ADV%9d] Packet received from ", millis()); + } + // MAC is in little endian --> print reverse + Serial.printBufferReverse(report->peer_addr.addr, 6, ':'); + Serial.print("\n"); + + /* Raw buffer contents */ + Serial.printf("%14s %d bytes\n", "PAYLOAD", report->data.len); + if (report->data.len) + { + Serial.printf("%15s", " "); + Serial.printBuffer(report->data.p_data, report->data.len, '-'); + Serial.println(); + } + + /* RSSI value */ + Serial.printf("%14s %d dBm\n", "RSSI", report->rssi); + + /* Adv Type */ + Serial.printf("%14s ", "ADV TYPE"); + if ( report->type.connectable ) + { + Serial.print("Connectable "); + }else + { + Serial.print("Non-connectable "); + } + + if ( report->type.directed ) + { + Serial.println("directed"); + }else + { + Serial.println("undirected"); + } + + /* Shortened Local Name */ + if(Bluefruit.Scanner.parseReportByType(report, BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME, buffer, sizeof(buffer))) + { + Serial.printf("%14s %s\n", "SHORT NAME", buffer); + memset(buffer, 0, sizeof(buffer)); + } + + /* Complete Local Name */ + if(Bluefruit.Scanner.parseReportByType(report, BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME, buffer, sizeof(buffer))) + { + Serial.printf("%14s %s\n", "COMPLETE NAME", buffer); + memset(buffer, 0, sizeof(buffer)); + } + + /* TX Power Level */ + if (Bluefruit.Scanner.parseReportByType(report, BLE_GAP_AD_TYPE_TX_POWER_LEVEL, buffer, sizeof(buffer))) + { + Serial.printf("%14s %i\n", "TX PWR LEVEL", buffer[0]); + memset(buffer, 0, sizeof(buffer)); + } + + /* Check for UUID16 Complete List */ + len = Bluefruit.Scanner.parseReportByType(report, BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE, buffer, sizeof(buffer)); + if ( len ) + { + printUuid16List(buffer, len); + } + + /* Check for UUID16 More Available List */ + len = Bluefruit.Scanner.parseReportByType(report, BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE, buffer, sizeof(buffer)); + if ( len ) + { + printUuid16List(buffer, len); + } + + /* Check for UUID128 Complete List */ + len = Bluefruit.Scanner.parseReportByType(report, BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE, buffer, sizeof(buffer)); + if ( len ) + { + printUuid128List(buffer, len); + } + + /* Check for UUID128 More Available List */ + len = Bluefruit.Scanner.parseReportByType(report, BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE, buffer, sizeof(buffer)); + if ( len ) + { + printUuid128List(buffer, len); + } + + /* Check for BLE UART UUID */ + if ( Bluefruit.Scanner.checkReportForUuid(report, BLEUART_UUID_SERVICE) ) + { + Serial.printf("%14s %s\n", "BLE UART", "UUID Found!"); + } + + /* Check for DIS UUID */ + if ( Bluefruit.Scanner.checkReportForUuid(report, UUID16_SVC_DEVICE_INFORMATION) ) + { + Serial.printf("%14s %s\n", "DIS", "UUID Found!"); + } + + /* Check for Manufacturer Specific Data */ + len = Bluefruit.Scanner.parseReportByType(report, BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA, buffer, sizeof(buffer)); + if (len) + { + Serial.printf("%14s ", "MAN SPEC DATA"); + Serial.printBuffer(buffer, len, '-'); + Serial.println(); + memset(buffer, 0, sizeof(buffer)); + } + + Serial.println(); + + // For Softdevice v6: after received a report, scanner will be paused + // We need to call Scanner resume() to continue scanning + Bluefruit.Scanner.resume(); +} + +void printUuid16List(uint8_t* buffer, uint8_t len) +{ + Serial.printf("%14s %s", "16-Bit UUID"); + for(int i=0; i<len; i+=2) + { + uint16_t uuid16; + memcpy(&uuid16, buffer+i, 2); + Serial.printf("%04X ", uuid16); + } + Serial.println(); +} + +void printUuid128List(uint8_t* buffer, uint8_t len) +{ + (void) len; + Serial.printf("%14s %s", "128-Bit UUID"); + + // Print reversed order + for(int i=0; i<16; i++) + { + const char* fm = (i==4 || i==6 || i==8 || i==10) ? "-%02X" : "%02X"; + Serial.printf(fm, buffer[15-i]); + } + + Serial.println(); +} + +void loop() +{ + // nothing to do +} |