#include #include #include #include #include "ble/Bluetooth.h" #include "apps.h" namespace trygvis { namespace apps { using namespace std; using namespace trygvis::bluetooth; using namespace trygvis::apps; class ble_inspect_device : public app { public: ble_inspect_device() : app("ble-inspect-device") {} ~ble_inspect_device() override = 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."); options("device", po::value()->required(), "The MAC of the device to inspect"); options("service", po::value()->required(), "The UUID of the service to read"); options("characteristic", po::value()->required(), "The UUID of the characteristic to read"); } int with_device(const shared_ptr &device, const Uuid &service_uuid, const Uuid &characteristic_uuid) { cout << "Inspecting device: " << device->getMac().str() << endl; auto gatt = device->connectGatt(); cout << "Connected, discovering services" << endl; gatt->discoverServices(); auto serviceO = gatt->findService(service_uuid); if (!serviceO) { cout << "Device does not requested service (" << service_uuid.str() << ")" << endl; return EXIT_FAILURE; } auto service = serviceO->get(); auto characteristicO = service->findCharacteristic(characteristic_uuid); if (!characteristicO) { cout << "The device does not have requested characteristic (" << characteristic_uuid << ")" << endl; return EXIT_FAILURE; } auto characteristic = characteristicO.value(); gatt->readValue(characteristic); return EXIT_SUCCESS; } int main(app_execution &execution) override { string mac_str = execution.vm["device"].as(); string service_str = execution.vm["service"].as(); string characteristic_str = execution.vm["characteristic"].as(); auto service_uuid = Uuid::fromString(service_str); auto characteristic_uuid = Uuid::fromString(characteristic_str); BluetoothSystem bluetoothSystem; try { Mac mac = Mac::parseMac(mac_str); auto adapter = bluetoothSystem.getAdapter(adapter_name); auto device = adapter->getDevice(mac); return with_device(device, service_uuid.value(), characteristic_uuid.value()); } 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_inspect_device(), argc, argv); }