diff options
author | Trygve Laugstøl <trygvis@inamo.no> | 2015-06-21 16:58:18 +0200 |
---|---|---|
committer | Trygve Laugstøl <trygvis@inamo.no> | 2015-06-21 16:58:18 +0200 |
commit | 9042b87f32bcabcc671e393376d3fb96ad858caa (patch) | |
tree | c68fe4f680fcc2a53ff3375141c9ad52cd1a028e /apps/ble-scan.h | |
parent | 4529a75f15bffd5bb941818deef03fb50a6fc9c9 (diff) | |
download | ble-toys-9042b87f32bcabcc671e393376d3fb96ad858caa.tar.gz ble-toys-9042b87f32bcabcc671e393376d3fb96ad858caa.tar.bz2 ble-toys-9042b87f32bcabcc671e393376d3fb96ad858caa.tar.xz ble-toys-9042b87f32bcabcc671e393376d3fb96ad858caa.zip |
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().
Diffstat (limited to 'apps/ble-scan.h')
-rw-r--r-- | apps/ble-scan.h | 87 |
1 files changed, 87 insertions, 0 deletions
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 <csignal> + +namespace trygvis { +namespace apps { + +using namespace std; +using namespace trygvis::bluetooth; +using namespace trygvis::apps; + +namespace ble_scan_utils { + +static std::function<void(int)> 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<int>()->default_value(0), "Which adapter to use."); + } + + int main(app_execution &execution) override { + BluetoothSystem bluetoothSystem; + shared_ptr<BluetoothAdapter> 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<int>(); + + adapter = getAdapter(adapter_index); + + set<Mac> 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; + } + } +}; + +} +} |