From d8e7be70c45066b83de0636814eed031eb2d1711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20=C3=96hrstr=C3=B6m?= Date: Mon, 5 Oct 2020 19:47:58 +0200 Subject: [PATCH] A single rtlwmbus now works. --- src/main.cc | 50 +++++++++++++++++++++++++---------------- src/rtlsdr.cc | 14 +++--------- src/serial.cc | 16 ++++++------- src/serial.h | 2 +- src/util.cc | 8 +++++++ src/util.h | 1 + src/wmbus.h | 2 -- src/wmbus_rtlwmbus.cc | 12 +++++----- tests/test_wrongkeys.sh | 2 +- 9 files changed, 59 insertions(+), 48 deletions(-) diff --git a/src/main.cc b/src/main.cc index 1232bcf..22638d5 100644 --- a/src/main.cc +++ b/src/main.cc @@ -231,10 +231,13 @@ void check_for_dead_wmbus_devices(Configuration *config) if (!w->isWorking()) { not_working.push_back(w.get()); - notice("Lost %s closing %s(%s)\n", + string id = w->getDeviceId(); + if (id != "") id = "["+id+"]"; + + notice("Lost %s closing %s%s\n", w->device().c_str(), toLowerCaseString(w->type()), - w->getDeviceId().c_str()); + id.c_str()); } } @@ -327,8 +330,13 @@ shared_ptr create_wmbus_object(Detected *detected, Configuration *config, case DEVICE_RTLWMBUS: { string command; + string name = ""; + int id = 0; if (!detected->found_tty_override) { + name = detected->found_file; + id = indexFromRtlSdrName(name); + command = ""; if (detected->specified_device.command != "") { @@ -357,11 +365,11 @@ shared_ptr create_wmbus_object(Detected *detected, Configuration *config, } } if (command == "") { - command = prefix+"rtl_sdr -f "+freq+" -s 1.6e6 - 2>/dev/null | "+prefix+"rtl_wmbus"; + command = prefix+"rtl_sdr -d "+to_string(id)+" -f "+freq+" -s 1.6e6 - 2>/dev/null | "+prefix+"rtl_wmbus"; } verbose("(rtlwmbus) using command: %s\n", command.c_str()); } - wmbus = openRTLWMBUS("rtlwmbus"/*detected->found_file*/, command, manager, + wmbus = openRTLWMBUS(name, command, manager, [command](){ warning("(rtlwmbus) child process exited! " "Command was: \"%s\"\n", command.c_str()); @@ -684,10 +692,13 @@ void open_wmbus_device_and_set_linkmodes(Configuration *config, string how, stri string using_link_modes = lms.hr(); - string started = tostrprintf("Started %s %s[%s] on %s listening on %s\n", + string id = detected->found_device_id.c_str(); + if (id != "") id = "["+id+"]"; + + string started = tostrprintf("Started %s %s%s on %s listening on %s\n", how.c_str(), toLowerCaseString(detected->found_type), - detected->found_device_id.c_str(), + id.c_str(), device.c_str(), using_link_modes.c_str()); @@ -783,37 +794,38 @@ void perform_auto_scan_of_serial_devices(Configuration *config) void perform_auto_scan_of_swradio_devices(Configuration *config) { // Enumerate all swradio devices, that can be used. - vector devices = listRtlSdrDevices(); + vector names = listRtlSdrDevices(); // Did an unavailable swradio-device get unplugged? Then remove it from the known-not-swradio-device set. - remove_lost_swradio_devices_from_ignore_list(devices); + remove_lost_swradio_devices_from_ignore_list(names); - for (string& device : devices) + for (string& name : names) { - trace("[MAIN] rtlsdr device %s\n", device.c_str()); - if (not_swradio_wmbus_devices_.count(device) > 0) + trace("[MAIN] rtlsdr device %s\n", name.c_str()); + if (not_swradio_wmbus_devices_.count(name) > 0) { - trace("[MAIN] skipping already probed rtlsdr device %s\n", device.c_str()); + trace("[MAIN] skipping already probed rtlsdr %s\n", name.c_str()); continue; } - shared_ptr sd = serial_manager_->lookup(device); + shared_ptr sd = serial_manager_->lookup(name); if (!sd) { - debug("(main) rtlsdr device %s not currently used.\n", device.c_str()); - // This serial device is not in use. + debug("(main) rtlsdr device %s not currently used.\n", name.c_str()); Detected detected; detected.setSpecifiedDeviceAsAuto(); - AccessCheck ac = detectRTLSDR(device, &detected); + AccessCheck ac = detectRTLSDR(name, &detected); if (ac != AccessCheck::AccessOK) { // We cannot access this swradio device. - not_swradio_wmbus_devices_.insert(device); - verbose("(main) ignoring rtlsdr %s since it is unavailable.\n", device.c_str()); + not_swradio_wmbus_devices_.insert(name); + verbose("(main) ignoring rtlsdr %s since it is unavailable.\n", name.c_str()); } else { + // Use the name as the file. + detected.found_file = name; find_specified_device_and_update_detected(config, &detected); - open_wmbus_device_and_set_linkmodes(config, "auto", device, &detected); + open_wmbus_device_and_set_linkmodes(config, "auto", name, &detected); } } } diff --git a/src/rtlsdr.cc b/src/rtlsdr.cc index fec71cb..c8aa8a8 100644 --- a/src/rtlsdr.cc +++ b/src/rtlsdr.cc @@ -44,17 +44,9 @@ vector listRtlSdrDevices() return devices; } -uint32_t index(string &s) +AccessCheck detectRTLSDR(string device, Detected *detected) { - size_t p = s.find('_'); - if (p == string::npos) return -1; - string n = s.substr(0, p); - return (uint32_t)atoi(n.c_str()); -} - -AccessCheck detectRTLSDR(string id, Detected *detected) -{ - uint32_t i = index(id); + uint32_t i = indexFromRtlSdrName(device); uint32_t n = rtlsdr_get_device_count(); @@ -62,7 +54,7 @@ AccessCheck detectRTLSDR(string id, Detected *detected) // Would be nice to properly test if the device can be opened. if (i < n) { - detected->setAsFound(id, WMBusDeviceType::DEVICE_RTLWMBUS, 0, false); + detected->setAsFound("", WMBusDeviceType::DEVICE_RTLWMBUS, 0, false); return AccessCheck::AccessOK; } diff --git a/src/serial.cc b/src/serial.cc index 98e242f..9a7c1b8 100644 --- a/src/serial.cc +++ b/src/serial.cc @@ -388,7 +388,7 @@ bool SerialDeviceTTY::working() struct SerialDeviceCommand : public SerialDeviceImp { - SerialDeviceCommand(string device, string command, vector args, vector envs, + SerialDeviceCommand(string identifier, string command, vector args, vector envs, SerialCommunicationManagerImp *manager, function on_exit, string purpose); @@ -399,12 +399,12 @@ struct SerialDeviceCommand : public SerialDeviceImp bool send(vector &data); int available(); bool working(); - string device() { return device_; } + string device() { return identifier_; } string command() { return command_; } private: - string device_; + string identifier_; string command_; int pid_ {}; vector args_; @@ -415,7 +415,7 @@ struct SerialDeviceCommand : public SerialDeviceImp function on_exit_; }; -SerialDeviceCommand::SerialDeviceCommand(string device, +SerialDeviceCommand::SerialDeviceCommand(string identifier, string command, vector args, vector envs, @@ -424,8 +424,8 @@ SerialDeviceCommand::SerialDeviceCommand(string device, string purpose) : SerialDeviceImp(manager, purpose) { - assert(device != ""); - device_ = device; + assert(identifier != ""); + identifier_ = identifier; command_ = command; args_ = args; envs_ = envs; @@ -671,14 +671,14 @@ shared_ptr SerialCommunicationManagerImp::createSerialDeviceTTY(st return addSerialDeviceForManagement(new SerialDeviceTTY(device, baud_rate, this, purpose)); } -shared_ptr SerialCommunicationManagerImp::createSerialDeviceCommand(string device, +shared_ptr SerialCommunicationManagerImp::createSerialDeviceCommand(string identifier, string command, vector args, vector envs, function on_exit, string purpose) { - return addSerialDeviceForManagement(new SerialDeviceCommand(device, command, args, envs, this, on_exit, purpose)); + return addSerialDeviceForManagement(new SerialDeviceCommand(identifier, command, args, envs, this, on_exit, purpose)); } shared_ptr SerialCommunicationManagerImp::createSerialDeviceFile(string file, string purpose) diff --git a/src/serial.h b/src/serial.h index 4eb5374..59f75e7 100644 --- a/src/serial.h +++ b/src/serial.h @@ -71,7 +71,7 @@ struct SerialCommunicationManager // Read from a /dev/ttyUSB0 or /dev/ttyACM0 device with baud settings. virtual shared_ptr createSerialDeviceTTY(string dev, int baud_rate, string purpose) = 0; // Read from a sub shell. - virtual shared_ptr createSerialDeviceCommand(string device, + virtual shared_ptr createSerialDeviceCommand(string identifier, string command, vector args, vector envs, diff --git a/src/util.cc b/src/util.cc index 6bc4109..72a445a 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1506,3 +1506,11 @@ vector splitString(string &s, char c) } return v; } + +uint32_t indexFromRtlSdrName(string &s) +{ + size_t p = s.find('_'); + if (p == string::npos) return -1; + string n = s.substr(0, p); + return (uint32_t)atoi(n.c_str()); +} diff --git a/src/util.h b/src/util.h index 67080ac..42f9984 100644 --- a/src/util.h +++ b/src/util.h @@ -173,5 +173,6 @@ bool startsWith(std::string s, std::vector &data); // Sum the memory used by the heap and stack. size_t memoryUsage(); +uint32_t indexFromRtlSdrName(std::string &s); #endif diff --git a/src/wmbus.h b/src/wmbus.h index e4836ce..e6316e7 100644 --- a/src/wmbus.h +++ b/src/wmbus.h @@ -593,8 +593,6 @@ AccessCheck detectRTL433(Detected *detected, shared_ptr handler); AccessCheck detectWMB13U(Detected *detected, shared_ptr handler); -AccessCheck detectRTLSDR(Detected *detected, shared_ptr handler); - // Try to factory reset an AMB8465 by trying all possible serial speeds and // restore to factory settings. AccessCheck factoryResetAMB8465(string tty, shared_ptr handler, int *was_baud); diff --git a/src/wmbus_rtlwmbus.cc b/src/wmbus_rtlwmbus.cc index 5e90f3e..fdf0044 100644 --- a/src/wmbus_rtlwmbus.cc +++ b/src/wmbus_rtlwmbus.cc @@ -73,9 +73,10 @@ private: string setup_; }; -shared_ptr openRTLWMBUS(string device, string command, shared_ptr manager, +shared_ptr openRTLWMBUS(string identifier, string command, shared_ptr manager, function on_exit, shared_ptr serial_override) { + debug("(rtlwmbus) opening %s\n", identifier.c_str()); vector args; vector envs; args.push_back("-c"); @@ -85,7 +86,7 @@ shared_ptr openRTLWMBUS(string device, string command, shared_ptr(imp); } - auto serial = manager->createSerialDeviceCommand(device, "/bin/sh", args, envs, on_exit, "rtlwmbus"); + auto serial = manager->createSerialDeviceCommand(identifier, "/bin/sh", args, envs, on_exit, "rtlwmbus"); WMBusRTLWMBUS *imp = new WMBusRTLWMBUS(serial, manager); return shared_ptr(imp); } @@ -103,7 +104,7 @@ bool WMBusRTLWMBUS::ping() string WMBusRTLWMBUS::getDeviceId() { - return "?"; + return ""; } LinkModeSet WMBusRTLWMBUS::getLinkModes() @@ -290,7 +291,6 @@ FrameStatus WMBusRTLWMBUS::checkRTLWMBUSFrame(vector &data, AccessCheck detectRTLWMBUS(Detected *detected, shared_ptr handler) { - detected->setAsFound("", WMBusDeviceType::DEVICE_RTLWMBUS, 0, false); - - return AccessCheck::AccessOK; + assert(0); + return AccessCheck::NotThere; } diff --git a/tests/test_wrongkeys.sh b/tests/test_wrongkeys.sh index 85009df..6c1077e 100755 --- a/tests/test_wrongkeys.sh +++ b/tests/test_wrongkeys.sh @@ -27,7 +27,7 @@ then fi cat < $TEST/test_expected.txt -Started config rtlwmbus[] on stdin listening on any +Started config rtlwmbus on stdin listening on any (wmbus) decrypted content failed check, did you use the correct decryption key? Ignoring telegram. (wmbus) decrypted payload crc failed check, did you use the correct decryption key? Ignoring telegram. (wmbus) decrypted content failed check, did you use the correct decryption key? Ignoring telegram.