#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; } } }; } }