Added more debug information.

pull/76/head
weetmuts 2020-02-06 19:01:48 +01:00
rodzic 7236c7893b
commit 0f74dba6e9
9 zmienionych plików z 101 dodań i 24 usunięć

Wyświetl plik

@ -365,13 +365,17 @@ the computer boots, if the dongle is already inserted.
If you do not want the daemon to start automatically, simply edit If you do not want the daemon to start automatically, simply edit
/dev/udev/rules.d/99-wmbus-usb-serial.rules and remove /dev/udev/rules.d/99-wmbus-usb-serial.rules and remove
`,TAG+="systemd",ENV{SYSTEMD_WANTS}="wmbusmeters.service"` from each `,TAG+="systemd",ENV{SYSTEMD_WANTS}="wmbusmeters.@/dev/im871a_%n.service"` from each
line. line.
You can also start/stop the daemon with `sudo systemctl restart wmbusmeters@im871a_0` You can start/stop the daemon with `sudo systemctl stop wmbusmeters@-dev-im871a_0.service`
and trigger the daemon to reload the config files with `sudo killall -HUP wmbusmetersd` or `sudo systemctl stop wmbusmeters@-dev-amb8465_1.service` etc. Alas
If you add more dongles, then more daemons gets started. Each daemon gets a unique name rtl_sdr does not play nice right now with wmbusmeters daemon. If you first do `sudo systemctl stop wmbusmeters@-dev-rtlsdr_3.service`
like `wmbusmeters@im871a_0 wmbusmeters@im871a_1`. it will hang, in a separate window do `sudo killall -9 rtl_sdr` to get rid of the spinning rtl_sdr process.
You can trigger a reload of the config files with `sudo killall -HUP wmbusmetersd`
If you add more dongles, then more daemons gets started, each with a unique name/nr.
# Source code # Source code

Wyświetl plik

@ -291,6 +291,12 @@ bool MeterCommonImplementation::handleTelegram(vector<uchar> input_frame)
return false; return false;
} }
if (isDebugEnabled())
{
string msg = bin2hex(input_frame);
debug("(meter) %s %s \"%s\"\n", name().c_str(), t.id.c_str(), msg.c_str());
}
ok = t.parse(input_frame, &meter_keys_); ok = t.parse(input_frame, &meter_keys_);
if (!ok) if (!ok)
{ {

Wyświetl plik

@ -1664,7 +1664,6 @@ bool Telegram::parse(vector<uchar> &input_frame, MeterKeys *mk)
if (!ok) return false; if (!ok) return false;
verboseFields(); verboseFields();
debugPayload("(wmbus) frame", frame);
return true; return true;
} }

Wyświetl plik

@ -300,22 +300,31 @@ FrameStatus WMBusAmber::checkAMB8465Frame(vector<uchar> &data,
int *payload_offset, int *payload_offset,
uchar *rssi) uchar *rssi)
{ {
// telegram=|2A442D2C998734761B168D2021D0871921|58387802FF2071000413F81800004413F8180000615B|+96
if (data.size() == 0) return PartialFrame; if (data.size() == 0) return PartialFrame;
debugPayload("(amb8465) checkIM871AFrame", data);
int payload_len = 0; int payload_len = 0;
if (data[0] == 0xff) { if (data[0] == 0xff) {
if (data.size() < 3) return PartialFrame; if (data.size() < 3)
{
debug("(amb8465) not enough bytes yet for command.\n");
return PartialFrame;
}
// A command response begins with 0xff // A command response begins with 0xff
*msgid_out = data[1]; *msgid_out = data[1];
payload_len = data[2]; payload_len = data[2];
*payload_len_out = payload_len; *payload_len_out = payload_len;
*payload_offset = 3; *payload_offset = 3;
*frame_length = 3+payload_len + (int)rssi_expected_; *frame_length = 3+payload_len + (int)rssi_expected_;
if (data.size() < *frame_length) return PartialFrame; if (data.size() < *frame_length)
{
debug("(amb8465) not enough bytes yet, partial command response %d %d.\n", data.size(), *frame_length);
return PartialFrame;
}
if (rssi_expected_) { if (rssi_expected_) {
*rssi = data[*frame_length-1]; *rssi = data[*frame_length-1];
} }
debug("(amb8465) received full command frame\n");
return FullFrame; return FullFrame;
} }
// If it is not a 0xff we assume it is a message beginning with a length. // If it is not a 0xff we assume it is a message beginning with a length.
@ -326,8 +335,13 @@ FrameStatus WMBusAmber::checkAMB8465Frame(vector<uchar> &data,
*payload_len_out = payload_len; *payload_len_out = payload_len;
*payload_offset = 1; *payload_offset = 1;
*frame_length = payload_len+1; *frame_length = payload_len+1;
if (data.size() < *frame_length) return PartialFrame; if (data.size() < *frame_length)
{
debug("(amb8465) not enough bytes yet, partial frame %d %d.\n", data.size(), *frame_length);
return PartialFrame;
}
debug("(amb8465) received full frame\n");
return FullFrame; return FullFrame;
} }

Wyświetl plik

@ -289,16 +289,24 @@ FrameStatus WMBusCUL::checkCULFrame(vector<uchar> &data,
int *hex_payload_offset) int *hex_payload_offset)
{ {
if (data.size() == 0) return PartialFrame; if (data.size() == 0) return PartialFrame;
debugPayload("(cul) checkCULFrame", data);
size_t eolp = 0; size_t eolp = 0;
// Look for end of line // Look for end of line
for (; eolp < data.size(); ++eolp) { for (; eolp < data.size(); ++eolp) {
if (data[eolp] == '\n') break; if (data[eolp] == '\n') break;
} }
if (eolp >= data.size()) return PartialFrame; if (eolp >= data.size())
{
debug("(cul) no eol found yet, partial frame\n");
return PartialFrame;
}
if (data[0] != 'b') if (data[0] != 'b')
{ {
// C1 and T1 telegrams should start with a 'b' // C1 and T1 telegrams should start with a 'b'
debug("(cul) text and no frame\n");
return TextAndNotFrame; return TextAndNotFrame;
} }
@ -320,7 +328,7 @@ FrameStatus WMBusCUL::checkCULFrame(vector<uchar> &data,
*hex_payload_len_out = data.size()-8+fix; *hex_payload_len_out = data.size()-8+fix;
*hex_payload_offset = 2+fix; *hex_payload_offset = 2+fix;
debug("(cul) got full frame\n"); debug("(cul) received full frame\n");
return FullFrame; return FullFrame;
} }

Wyświetl plik

@ -125,7 +125,11 @@ FrameStatus WMBusD1TC::checkD1TCFrame(vector<uchar> &data,
// Ugly: 00615B2A442D2C998734761B168D2021D0871921|58387802FF2071000413F81800004413F8180000615B // Ugly: 00615B2A442D2C998734761B168D2021D0871921|58387802FF2071000413F81800004413F8180000615B
// Here the frame is prefixed with some random data. // Here the frame is prefixed with some random data.
if (data.size() < 11) { debugPayload("(d1tc) checkD1TCFrame", data);
if (data.size() < 11)
{
debug("(d1tc) less than 11 bytes, partial frame");
return PartialFrame; return PartialFrame;
} }
int payload_len = data[0]; int payload_len = data[0];
@ -166,9 +170,12 @@ FrameStatus WMBusD1TC::checkD1TCFrame(vector<uchar> &data,
*payload_len_out = payload_len; *payload_len_out = payload_len;
*payload_offset = offset; *payload_offset = offset;
*frame_length = payload_len+offset; *frame_length = payload_len+offset;
if (data.size() < *frame_length) { if (data.size() < *frame_length)
{
debug("(rawtty) not enough bytes, partial frame %d %d", data.size(), *frame_length);
return PartialFrame; return PartialFrame;
} }
debug("(d1tc) received full frame\n");
return FullFrame; return FullFrame;
} }

Wyświetl plik

@ -507,6 +507,7 @@ FrameStatus WMBusIM871A::checkIM871AFrame(vector<uchar> &data,
} }
} }
debug("(im871a) received full frame\n");
return FullFrame; return FullFrame;
} }

Wyświetl plik

@ -125,7 +125,11 @@ FrameStatus WMBusRawTTY::checkRawTTYFrame(vector<uchar> &data,
// Ugly: 00615B2A442D2C998734761B168D2021D0871921|58387802FF2071000413F81800004413F8180000615B // Ugly: 00615B2A442D2C998734761B168D2021D0871921|58387802FF2071000413F81800004413F8180000615B
// Here the frame is prefixed with some random data. // Here the frame is prefixed with some random data.
if (data.size() < 11) { debugPayload("(rawtty) checkRAWTTYFrame", data);
if (data.size() < 11)
{
debug("(rawtty) less than 11 bytes, partial frame");
return PartialFrame; return PartialFrame;
} }
int payload_len = data[0]; int payload_len = data[0];
@ -166,9 +170,13 @@ FrameStatus WMBusRawTTY::checkRawTTYFrame(vector<uchar> &data,
*payload_len_out = payload_len; *payload_len_out = payload_len;
*payload_offset = offset; *payload_offset = offset;
*frame_length = payload_len+offset; *frame_length = payload_len+offset;
if (data.size() < *frame_length) { if (data.size() < *frame_length)
{
debug("(rawtty) not enough bytes, partial frame %d %d", data.size(), *frame_length);
return PartialFrame; return PartialFrame;
} }
debug("(rawtty) received full frame\n");
return FullFrame; return FullFrame;
} }

Wyświetl plik

@ -205,26 +205,49 @@ FrameStatus WMBusRTLWMBUS::checkRTLWMBUSFrame(vector<uchar> &data,
// C1;1;1;2019-02-09 07:14:18.000;117;102;94740459;0x49449344590474943508780dff5f3500827f0000f10007b06effff530100005f2c620100007f2118010000008000800080008000000000000000000e003f005500d4ff2f046d10086922 // C1;1;1;2019-02-09 07:14:18.000;117;102;94740459;0x49449344590474943508780dff5f3500827f0000f10007b06effff530100005f2c620100007f2118010000008000800080008000000000000000000e003f005500d4ff2f046d10086922
// There might be a second telegram on the same line ;0x4944....... // There might be a second telegram on the same line ;0x4944.......
if (data.size() == 0) return PartialFrame; if (data.size() == 0) return PartialFrame;
if (isDebugEnabled())
{
string msg = safeString(data);
debug("(rtlwmbus) checkRTLWMBusFrame \"%s\"\n", msg.c_str());
}
int payload_len = 0; int payload_len = 0;
size_t eolp = 0; size_t eolp = 0;
// Look for end of line // Look for end of line
for (; eolp < data.size(); ++eolp) { for (; eolp < data.size(); ++eolp) {
if (data[eolp] == '\n') break; if (data[eolp] == '\n') break;
} }
if (eolp >= data.size()) return PartialFrame; if (eolp >= data.size())
{
debug("(rtlwmbus) no eol found, partial frame\n");
return PartialFrame;
}
// We got a full line, but if it is too short, then // We got a full line, but if it is too short, then
// there is something wrong. Discard the data. // there is something wrong. Discard the data.
if (data.size() < 10) return ErrorInFrame; if (data.size() < 10)
{
if (data[0] != '0' || data[1] != 'x') { debug("(rtlwmbus) too short line\n");
return ErrorInFrame;
}
if (data[0] != '0' || data[1] != 'x')
{
// Discard lines that do not begin with T1 or C1, these lines are probably // Discard lines that do not begin with T1 or C1, these lines are probably
// stderr output from rtl_sdr/rtl_wmbus. // stderr output from rtl_sdr/rtl_wmbus.
if (!(data[0] == 'T' && data[1] == '1') && if (!(data[0] == 'T' && data[1] == '1') &&
!(data[0] == 'C' && data[1] == '1')) return TextAndNotFrame; !(data[0] == 'C' && data[1] == '1'))
{
debug("(rtlwmbus) only text\n");
return TextAndNotFrame;
}
// And the checksums should match. // And the checksums should match.
if (strncmp((const char*)&data[1], "1;1", 3)) { if (strncmp((const char*)&data[1], "1;1", 3))
{
// Packages that begin with C1;1 or with T1;1 are good. The full format is: // Packages that begin with C1;1 or with T1;1 are good. The full format is:
// MODE;CRC_OK;3OUTOF6OK;TIMESTAMP;PACKET_RSSI;CURRENT_RSSI;LINK_LAYER_IDENT_NO;DATAGRAM_WITHOUT_CRC_BYTES. // MODE;CRC_OK;3OUTOF6OK;TIMESTAMP;PACKET_RSSI;CURRENT_RSSI;LINK_LAYER_IDENT_NO;DATAGRAM_WITHOUT_CRC_BYTES.
// 3OUTOF6OK makes sense only with mode T1 and no sense with mode C1 (always set to 1). // 3OUTOF6OK makes sense only with mode T1 and no sense with mode C1 (always set to 1).
@ -239,7 +262,10 @@ FrameStatus WMBusRTLWMBUS::checkRTLWMBUSFrame(vector<uchar> &data,
for (; i+1 < data.size(); ++i) { for (; i+1 < data.size(); ++i) {
if (data[i] == '0' && data[i+1] == 'x') break; if (data[i] == '0' && data[i+1] == 'x') break;
} }
if (i+1 >= data.size()) return ErrorInFrame; // No 0x found, then discard the frame. if (i+1 >= data.size())
{
return ErrorInFrame; // No 0x found, then discard the frame.
}
i+=2; // Skip 0x i+=2; // Skip 0x
// Look for end of line or semicolon. // Look for end of line or semicolon.
@ -247,14 +273,18 @@ FrameStatus WMBusRTLWMBUS::checkRTLWMBUSFrame(vector<uchar> &data,
if (data[eolp] == '\n') break; if (data[eolp] == '\n') break;
if (data[eolp] == ';' && data[eolp+1] == '0' && data[eolp+2] == 'x') break; if (data[eolp] == ';' && data[eolp+1] == '0' && data[eolp+2] == 'x') break;
} }
if (eolp >= data.size()) return PartialFrame; if (eolp >= data.size())
{
debug("(rtlwmbus) no eol or semicolon, partial frame\n");
return PartialFrame;
}
payload_len = eolp-i; payload_len = eolp-i;
*hex_payload_len_out = payload_len; *hex_payload_len_out = payload_len;
*hex_payload_offset = i; *hex_payload_offset = i;
*hex_frame_length = eolp+1; *hex_frame_length = eolp+1;
debug("(rtlwmbus) got full frame\n"); debug("(rtlwmbus) received full frame\n");
return FullFrame; return FullFrame;
} }