kopia lustrzana https://github.com/weetmuts/wmbusmeters
Most tests pass.
rodzic
dcf67bf9b2
commit
c12a0e8e19
|
@ -481,7 +481,8 @@ void perform_auto_scan_of_devices(Configuration *config)
|
||||||
wmbus->setLinkModes(config->listen_to_link_modes);
|
wmbus->setLinkModes(config->listen_to_link_modes);
|
||||||
//string using_link_modes = wmbus->getLinkModes().hr();
|
//string using_link_modes = wmbus->getLinkModes().hr();
|
||||||
//verbose("(config) listen to link modes: %s\n", using_link_modes.c_str());
|
//verbose("(config) listen to link modes: %s\n", using_link_modes.c_str());
|
||||||
wmbus->onTelegram([&](vector<uchar> data){return meter_manager_->handleTelegram(data);});
|
bool simulated = detected.type == WMBusDeviceType::DEVICE_SIMULATOR;
|
||||||
|
wmbus->onTelegram([&, simulated](vector<uchar> data){return meter_manager_->handleTelegram(data, simulated);});
|
||||||
wmbus->setTimeout(config->alarm_timeout, config->alarm_expected_activity);
|
wmbus->setTimeout(config->alarm_timeout, config->alarm_expected_activity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -518,8 +519,10 @@ void detectAndConfigureWMBusDevices(Configuration *config)
|
||||||
wmbus->setLinkModes(config->listen_to_link_modes);
|
wmbus->setLinkModes(config->listen_to_link_modes);
|
||||||
//string using_link_modes = wmbus->getLinkModes().hr();
|
//string using_link_modes = wmbus->getLinkModes().hr();
|
||||||
//verbose("(config) listen to link modes: %s\n", using_link_modes.c_str());
|
//verbose("(config) listen to link modes: %s\n", using_link_modes.c_str());
|
||||||
wmbus->onTelegram([&](vector<uchar> data){return meter_manager_->handleTelegram(data);});
|
bool simulated = detected.type == WMBusDeviceType::DEVICE_SIMULATOR;
|
||||||
|
wmbus->onTelegram([&, simulated](vector<uchar> data){return meter_manager_->handleTelegram(data, simulated);});
|
||||||
wmbus->setTimeout(config->alarm_timeout, config->alarm_expected_activity);
|
wmbus->setTimeout(config->alarm_timeout, config->alarm_expected_activity);
|
||||||
|
serial_manager_->expectDevicesToWork();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ struct MeterManagerImplementation : public virtual MeterManager
|
||||||
return meters_.size() != 0;
|
return meters_.size() != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool handleTelegram(vector<uchar> data)
|
bool handleTelegram(vector<uchar> data, bool simulated)
|
||||||
{
|
{
|
||||||
if (!hasMeters())
|
if (!hasMeters())
|
||||||
{
|
{
|
||||||
|
@ -75,7 +75,7 @@ struct MeterManagerImplementation : public virtual MeterManager
|
||||||
|
|
||||||
for (auto &m : meters_)
|
for (auto &m : meters_)
|
||||||
{
|
{
|
||||||
bool h = m->handleTelegram(data);
|
bool h = m->handleTelegram(data, simulated);
|
||||||
if (h) handled = true;
|
if (h) handled = true;
|
||||||
}
|
}
|
||||||
if (isVerboseEnabled() && !handled)
|
if (isVerboseEnabled() && !handled)
|
||||||
|
@ -412,11 +412,13 @@ string concatFields(Meter *m, Telegram *t, char c, vector<Print> &prints, vector
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MeterCommonImplementation::handleTelegram(vector<uchar> input_frame)
|
bool MeterCommonImplementation::handleTelegram(vector<uchar> input_frame, bool simulated)
|
||||||
{
|
{
|
||||||
Telegram t;
|
Telegram t;
|
||||||
bool ok = t.parseHeader(input_frame);
|
bool ok = t.parseHeader(input_frame);
|
||||||
|
|
||||||
|
if (simulated) t.markAsSimulated();
|
||||||
|
|
||||||
if (!ok || !isTelegramForMe(&t))
|
if (!ok || !isTelegramForMe(&t))
|
||||||
{
|
{
|
||||||
// This telegram is not intended for this meter.
|
// This telegram is not intended for this meter.
|
||||||
|
|
|
@ -201,7 +201,7 @@ struct Meter
|
||||||
|
|
||||||
// The handleTelegram expects an input_frame where the DLL crcs have been removed.
|
// The handleTelegram expects an input_frame where the DLL crcs have been removed.
|
||||||
// Returns true of this meter handled this telegram!
|
// Returns true of this meter handled this telegram!
|
||||||
virtual bool handleTelegram(vector<uchar> input_frame) = 0;
|
virtual bool handleTelegram(vector<uchar> input_frame, bool simulated) = 0;
|
||||||
virtual bool isTelegramForMe(Telegram *t) = 0;
|
virtual bool isTelegramForMe(Telegram *t) = 0;
|
||||||
virtual MeterKeys *meterKeys() = 0;
|
virtual MeterKeys *meterKeys() = 0;
|
||||||
|
|
||||||
|
@ -222,7 +222,7 @@ struct MeterManager
|
||||||
virtual void addMeter(unique_ptr<Meter> meter) = 0;
|
virtual void addMeter(unique_ptr<Meter> meter) = 0;
|
||||||
virtual void removeAllMeters() = 0;
|
virtual void removeAllMeters() = 0;
|
||||||
virtual void forEachMeter(std::function<void(Meter*)> cb) = 0;
|
virtual void forEachMeter(std::function<void(Meter*)> cb) = 0;
|
||||||
virtual bool handleTelegram(vector<uchar> data) = 0;
|
virtual bool handleTelegram(vector<uchar> data, bool simulated) = 0;
|
||||||
virtual bool hasAllMetersReceivedATelegram() = 0;
|
virtual bool hasAllMetersReceivedATelegram() = 0;
|
||||||
virtual bool hasMeters() = 0;
|
virtual bool hasMeters() = 0;
|
||||||
virtual void onTelegram(function<void(vector<uchar>)> cb) = 0;
|
virtual void onTelegram(function<void(vector<uchar>)> cb) = 0;
|
||||||
|
|
|
@ -85,7 +85,7 @@ protected:
|
||||||
// Print the dimensionless Text quantity, no unit is needed.
|
// Print the dimensionless Text quantity, no unit is needed.
|
||||||
void addPrint(string vname, Quantity vquantity,
|
void addPrint(string vname, Quantity vquantity,
|
||||||
function<std::string()> getValueFunc, string help, bool field, bool json);
|
function<std::string()> getValueFunc, string help, bool field, bool json);
|
||||||
bool handleTelegram(vector<uchar> frame);
|
bool handleTelegram(vector<uchar> frame, bool simulated);
|
||||||
void printMeter(Telegram *t,
|
void printMeter(Telegram *t,
|
||||||
string *human_readable,
|
string *human_readable,
|
||||||
string *fields, char separator,
|
string *fields, char separator,
|
||||||
|
|
|
@ -1215,10 +1215,12 @@ bool Telegram::parseTPLConfig(std::vector<uchar>::iterator &pos)
|
||||||
|
|
||||||
if (meter_keys->confidentiality_key.size() != 16)
|
if (meter_keys->confidentiality_key.size() != 16)
|
||||||
{
|
{
|
||||||
if (meter_keys->isSimulation()) {
|
if (isSimulated())
|
||||||
|
{
|
||||||
debug("(wmbus) simulation without keys, not generating Kmac and Kenc.\n");
|
debug("(wmbus) simulation without keys, not generating Kmac and Kenc.\n");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
debug("(wmbus) no key, thus cannot execute kdf.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
AES_CMAC(&meter_keys->confidentiality_key[0], &input[0], 16, &mac[0]);
|
AES_CMAC(&meter_keys->confidentiality_key[0], &input[0], 16, &mac[0]);
|
||||||
|
@ -1351,7 +1353,7 @@ bool Telegram::potentiallyDecrypt(vector<uchar>::iterator &pos)
|
||||||
}
|
}
|
||||||
else if (tpl_sec_mode == TPLSecurityMode::AES_CBC_NO_IV)
|
else if (tpl_sec_mode == TPLSecurityMode::AES_CBC_NO_IV)
|
||||||
{
|
{
|
||||||
if (!meter_keys->hasConfidentialityKey() && meter_keys->isSimulation())
|
if (!meter_keys->hasConfidentialityKey() && isSimulated())
|
||||||
{
|
{
|
||||||
CHECK(2);
|
CHECK(2);
|
||||||
addExplanationAndIncrementPos(pos, 2, "%02x%02x (already) decrypted check bytes", *(pos+0), *(pos+1));
|
addExplanationAndIncrementPos(pos, 2, "%02x%02x (already) decrypted check bytes", *(pos+0), *(pos+1));
|
||||||
|
|
|
@ -294,11 +294,9 @@ struct MeterKeys
|
||||||
{
|
{
|
||||||
vector<uchar> confidentiality_key;
|
vector<uchar> confidentiality_key;
|
||||||
vector<uchar> authentication_key;
|
vector<uchar> authentication_key;
|
||||||
bool simulation {};
|
|
||||||
|
|
||||||
bool hasConfidentialityKey() { return confidentiality_key.size() > 0; }
|
bool hasConfidentialityKey() { return confidentiality_key.size() > 0; }
|
||||||
bool hasAuthenticationKey() { return authentication_key.size() > 0; }
|
bool hasAuthenticationKey() { return authentication_key.size() > 0; }
|
||||||
bool isSimulation() { return simulation; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Telegram
|
struct Telegram
|
||||||
|
@ -413,6 +411,7 @@ struct Telegram
|
||||||
void explainParse(string intro, int from);
|
void explainParse(string intro, int from);
|
||||||
|
|
||||||
bool isSimulated() { return is_simulated_; }
|
bool isSimulated() { return is_simulated_; }
|
||||||
|
void markAsSimulated() { is_simulated_ = true; }
|
||||||
|
|
||||||
// Extracted mbus values.
|
// Extracted mbus values.
|
||||||
std::map<std::string,std::pair<int,DVEntry>> values;
|
std::map<std::string,std::pair<int,DVEntry>> values;
|
||||||
|
|
|
@ -14,6 +14,8 @@ Forren lansensm 00010206 NOKEY
|
||||||
|
|
||||||
cat > $TEST/test_expected.txt <<EOF
|
cat > $TEST/test_expected.txt <<EOF
|
||||||
(meter) Dorren: meter detection did not match the selected driver lansendw! correct driver is: unknown!
|
(meter) Dorren: meter detection did not match the selected driver lansendw! correct driver is: unknown!
|
||||||
|
(meter) please consider opening an issue at https://github.com/weetmuts/wmbusmeters/
|
||||||
|
(meter) to add support for this unknown mfct,media,version combination
|
||||||
{"media":"Unknown","meter":"lansendw","name":"Dorren","id":"00010205","status":"OPEN","timestamp":"1111-11-11T11:11:11Z"}
|
{"media":"Unknown","meter":"lansendw","name":"Dorren","id":"00010205","status":"OPEN","timestamp":"1111-11-11T11:11:11Z"}
|
||||||
(meter) Forren: meter detection did not match the selected driver lansensm! correct driver is: lansendw
|
(meter) Forren: meter detection did not match the selected driver lansensm! correct driver is: lansendw
|
||||||
{"media":"reserved","meter":"lansensm","name":"Forren","id":"00010206","status":"OK","timestamp":"1111-11-11T11:11:11Z"}
|
{"media":"reserved","meter":"lansensm","name":"Forren","id":"00010206","status":"OK","timestamp":"1111-11-11T11:11:11Z"}
|
||||||
|
|
Ładowanie…
Reference in New Issue