From 9042b87f32bcabcc671e393376d3fb96ad858caa Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sun, 21 Jun 2015 16:58:18 +0200 Subject: ble-scan: o New tool to scan for devices. Requires root on linux :( Linux is also touchy if the program dies. BluetoothAdapter: o Adding getMac(). --- apps/ble-scan.h | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 apps/ble-scan.h (limited to 'apps/ble-scan.h') diff --git a/apps/ble-scan.h b/apps/ble-scan.h new file mode 100644 index 0000000..9a72388 --- /dev/null +++ b/apps/ble-scan.h @@ -0,0 +1,87 @@ +#include "ble/Bluetooth.h" +#include "apps.h" + +#include + +namespace trygvis { +namespace apps { + +using namespace std; +using namespace trygvis::bluetooth; +using namespace trygvis::apps; + +namespace ble_scan_utils { + +static std::function onSignal; + +static void signal_handler(int signal) { + onSignal(signal); +} + +} + +class ble_scan : public app { + +public: + ble_scan() : app("ble-scan") { + } + + ~ble_scan() = default; + + void add_options(po::options_description_easy_init &options) override { + options + ("adapter", po::value()->default_value(0), "Which adapter to use."); + } + + int main(app_execution &execution) override { + BluetoothSystem bluetoothSystem; + shared_ptr adapter; + + struct sigaction sigIntHandler; + + ble_scan_utils::onSignal = [&](int signal) { + adapter->stopScan(); + }; + + sigIntHandler.sa_handler = &ble_scan_utils::signal_handler; + sigemptyset(&sigIntHandler.sa_mask); + sigIntHandler.sa_flags = 0; + + sigaction(SIGINT, &sigIntHandler, NULL); + + try { + auto adapter_index = execution.vm["adapter"].as(); + + adapter = getAdapter(adapter_index); + + set seen_devices; + + cout << "Scanning with adapter #" << adapter_index << ", mac=" << adapter->getMac().str() << endl; + + adapter->runScan([&](BluetoothDevice &device) { + auto mac = device.getMac(); + + cout << "Found: " << mac.str() << endl; + + seen_devices.insert(mac); + }); + + cout << "Stopped. Found " << seen_devices.size() << " devices." << endl; + + for_each(begin(seen_devices), end(seen_devices), [&](auto mac) { + cout << mac.str() << endl; + }); + + return EXIT_SUCCESS; + } catch (std::runtime_error ex) { + cout << "std::runtime_error: " << ex.what() << endl; + return EXIT_FAILURE; + } catch (std::exception ex) { + cout << "std::exception: " << ex.what() << endl; + return EXIT_FAILURE; + } + } +}; + +} +} -- cgit v1.2.3