#include "ble/Bluetooth.h" #include "apps.h" #include #include "apps.h" 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; string adapter_name; void add_options(po::options_description_easy_init &options) override { auto adapter_value = po::value<>(&adapter_name)->default_value("0"); options("adapter", adapter_value, "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 { adapter = bluetoothSystem.getAdapter(adapter_name); set seen_devices; cout << "Scanning with adapter " << adapter_name << ", mac=" << adapter->getMac().str() << endl; adapter->runScan([&](auto device) { auto mac = device->getMac(); cout << "Found: " << mac.str() << endl; seen_devices.insert(mac); }); cout << "Stopped. Found " << seen_devices.size() << " devices." << endl; vector devices(seen_devices.cbegin(), seen_devices.cend()); std::sort(devices.begin(), devices.end(), [](const Mac& a, const Mac& b) { return a < b; }); for_each(begin(devices), end(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; } } }; } } int main(int argc, const char *argv[]) { using namespace trygvis::apps; return real_main(new ble_scan(), argc, argv); }