
A scanner framework that receives advertisements, filters them by MAC, and prints out some data as CSV over the serial port
Dependencies: BLE_API mbed nRF51822
Fork of BasicScanner by
main.cpp
- Committer:
- cordonn2
- Date:
- 2017-03-28
- Revision:
- 14:d8f4a49c9fb3
- Parent:
- 13:8999c8b2e18e
File content as of revision 14:d8f4a49c9fb3:
#include "mbed.h" #include "ble/BLE.h" // Compile time options #define BLINK_LED 1 // Whether to blink the LED #define CYCLE_CHANNELS 0 // Whether to scan cycling between // single channels or normally #define BAUD_RATE 115200 // baud // Experiment parameters #define CYCLE_INTERVAL 5000 // ms; see CYCLE_CHANNELS #define SCAN_INTERVAL 500 // ms #define SCAN_WINDOW SCAN_INTERVAL // ms; must be <= SCAN_INTERVAL #define BLINK_INTERVAL 1000 // ms // Constants #define NRF_RADIO_FREQUENCY (*(uint32_t*)(0x40001508UL)) BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE); uint8_t channel = 37; Serial pc(p9, p11); Timer uptime; #if BLINK_LED void blinkCallback(void) { static DigitalOut led(LED1, 1); led = !led; } #endif /* * This function is called every time we scan an advertisement. */ void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) { if (params->peerAddr[1] == 0xAA && params->peerAddr[2] == 0xAA && params->peerAddr[3] == 0xAA && params->peerAddr[4] == 0xAA && params->peerAddr[5] == 0xAA) { printf("%d,%d,%d,%d,%d\n", params->peerAddr[0], params->advertisingData[2], uptime.read_ms(), params->rssi, //#if CYCLE_CHANNELS // channel //#else NRF_RADIO_FREQUENCY // params->advertisingData[3] // Infer channel from packet data //#endif ); } } void setupScanning(uint8_t channel, uint16_t scanInterval, uint16_t scanWindow) { #if CYCLE_CHANNELS // TODO: make the frequency stick instead of letting softdevice overwrite it switch (channel) { case 37: NRF_RADIO_FREQUENCY = 2; // 2402 MHz break; case 38: NRF_RADIO_FREQUENCY = 26; // 2426 MHz break; case 39: NRF_RADIO_FREQUENCY = 80; // 2480 MHz break; default: break; } #endif ble.gap().setScanParams(scanInterval, scanWindow); ble.gap().startScan(advertisementCallback); } #if CYCLE_CHANNELS void cycleChannelCallback(void) { switch (channel) { case 37: channel = 38; break; case 38: channel = 39; break; case 39: channel = 37; break; default: channel = 0; break; } setupScanning(channel, SCAN_INTERVAL, SCAN_WINDOW); } #endif void bleInitCallback(BLE::InitializationCompleteCallbackContext *params) { static Ticker cycleChannelTicker; if (params->error != BLE_ERROR_NONE || params->ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { return; } #if CYCLE_CHANNELS setupScanning(channel, SCAN_INTERVAL, SCAN_WINDOW); cycleChannelTicker.attach(cycleChannelCallback, CYCLE_INTERVAL/1000.0); #else setupScanning(channel, SCAN_INTERVAL, SCAN_WINDOW); #endif } int main(void) { static Ticker ledTicker, incSeqNumTicker; uptime.start(); pc.baud(BAUD_RATE); #if BLINK_LED ledTicker.attach(blinkCallback, BLINK_INTERVAL/1000.0); #endif printf("\nID,Sequence Number,Timestamp,RSSI,Channel\n"); BLE &ble = BLE::Instance(); ble.init(bleInitCallback); while (true) { ble.waitForEvent(); } }