kopia lustrzana https://github.com/weetmuts/wmbusmeters
Added more debug information.
rodzic
7236c7893b
commit
0f74dba6e9
14
README.md
14
README.md
|
@ -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
|
||||
/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.
|
||||
|
||||
You can also start/stop the daemon with `sudo systemctl restart wmbusmeters@im871a_0`
|
||||
and trigger the daemon to reload the config files with `sudo killall -HUP wmbusmetersd`
|
||||
If you add more dongles, then more daemons gets started. Each daemon gets a unique name
|
||||
like `wmbusmeters@im871a_0 wmbusmeters@im871a_1`.
|
||||
You can start/stop the daemon with `sudo systemctl stop wmbusmeters@-dev-im871a_0.service`
|
||||
or `sudo systemctl stop wmbusmeters@-dev-amb8465_1.service` etc. Alas
|
||||
rtl_sdr does not play nice right now with wmbusmeters daemon. If you first do `sudo systemctl stop wmbusmeters@-dev-rtlsdr_3.service`
|
||||
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
|
||||
|
||||
|
|
|
@ -291,6 +291,12 @@ bool MeterCommonImplementation::handleTelegram(vector<uchar> input_frame)
|
|||
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_);
|
||||
if (!ok)
|
||||
{
|
||||
|
|
|
@ -1664,7 +1664,6 @@ bool Telegram::parse(vector<uchar> &input_frame, MeterKeys *mk)
|
|||
if (!ok) return false;
|
||||
|
||||
verboseFields();
|
||||
debugPayload("(wmbus) frame", frame);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -300,22 +300,31 @@ FrameStatus WMBusAmber::checkAMB8465Frame(vector<uchar> &data,
|
|||
int *payload_offset,
|
||||
uchar *rssi)
|
||||
{
|
||||
// telegram=|2A442D2C998734761B168D2021D0871921|58387802FF2071000413F81800004413F8180000615B|+96
|
||||
if (data.size() == 0) return PartialFrame;
|
||||
debugPayload("(amb8465) checkIM871AFrame", data);
|
||||
int payload_len = 0;
|
||||
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
|
||||
*msgid_out = data[1];
|
||||
payload_len = data[2];
|
||||
*payload_len_out = payload_len;
|
||||
*payload_offset = 3;
|
||||
*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_) {
|
||||
*rssi = data[*frame_length-1];
|
||||
}
|
||||
debug("(amb8465) received full command frame\n");
|
||||
return FullFrame;
|
||||
}
|
||||
// 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_offset = 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -289,16 +289,24 @@ FrameStatus WMBusCUL::checkCULFrame(vector<uchar> &data,
|
|||
int *hex_payload_offset)
|
||||
{
|
||||
if (data.size() == 0) return PartialFrame;
|
||||
|
||||
debugPayload("(cul) checkCULFrame", data);
|
||||
|
||||
size_t eolp = 0;
|
||||
// Look for end of line
|
||||
for (; eolp < data.size(); ++eolp) {
|
||||
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')
|
||||
{
|
||||
// C1 and T1 telegrams should start with a 'b'
|
||||
debug("(cul) text and no frame\n");
|
||||
return TextAndNotFrame;
|
||||
}
|
||||
|
||||
|
@ -320,7 +328,7 @@ FrameStatus WMBusCUL::checkCULFrame(vector<uchar> &data,
|
|||
*hex_payload_len_out = data.size()-8+fix;
|
||||
*hex_payload_offset = 2+fix;
|
||||
|
||||
debug("(cul) got full frame\n");
|
||||
debug("(cul) received full frame\n");
|
||||
return FullFrame;
|
||||
}
|
||||
|
||||
|
|
|
@ -125,7 +125,11 @@ FrameStatus WMBusD1TC::checkD1TCFrame(vector<uchar> &data,
|
|||
// Ugly: 00615B2A442D2C998734761B168D2021D0871921|58387802FF2071000413F81800004413F8180000615B
|
||||
// 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;
|
||||
}
|
||||
int payload_len = data[0];
|
||||
|
@ -166,9 +170,12 @@ FrameStatus WMBusD1TC::checkD1TCFrame(vector<uchar> &data,
|
|||
*payload_len_out = payload_len;
|
||||
*payload_offset = 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;
|
||||
}
|
||||
debug("(d1tc) received full frame\n");
|
||||
return FullFrame;
|
||||
}
|
||||
|
||||
|
|
|
@ -507,6 +507,7 @@ FrameStatus WMBusIM871A::checkIM871AFrame(vector<uchar> &data,
|
|||
}
|
||||
}
|
||||
|
||||
debug("(im871a) received full frame\n");
|
||||
return FullFrame;
|
||||
}
|
||||
|
||||
|
|
|
@ -125,7 +125,11 @@ FrameStatus WMBusRawTTY::checkRawTTYFrame(vector<uchar> &data,
|
|||
// Ugly: 00615B2A442D2C998734761B168D2021D0871921|58387802FF2071000413F81800004413F8180000615B
|
||||
// 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;
|
||||
}
|
||||
int payload_len = data[0];
|
||||
|
@ -166,9 +170,13 @@ FrameStatus WMBusRawTTY::checkRawTTYFrame(vector<uchar> &data,
|
|||
*payload_len_out = payload_len;
|
||||
*payload_offset = 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;
|
||||
}
|
||||
|
||||
debug("(rawtty) received full frame\n");
|
||||
return FullFrame;
|
||||
}
|
||||
|
||||
|
|
|
@ -205,26 +205,49 @@ FrameStatus WMBusRTLWMBUS::checkRTLWMBUSFrame(vector<uchar> &data,
|
|||
// 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.......
|
||||
if (data.size() == 0) return PartialFrame;
|
||||
|
||||
if (isDebugEnabled())
|
||||
{
|
||||
string msg = safeString(data);
|
||||
debug("(rtlwmbus) checkRTLWMBusFrame \"%s\"\n", msg.c_str());
|
||||
}
|
||||
|
||||
int payload_len = 0;
|
||||
size_t eolp = 0;
|
||||
// Look for end of line
|
||||
for (; eolp < data.size(); ++eolp) {
|
||||
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
|
||||
// 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
|
||||
// stderr output from rtl_sdr/rtl_wmbus.
|
||||
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.
|
||||
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:
|
||||
// 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).
|
||||
|
@ -239,7 +262,10 @@ FrameStatus WMBusRTLWMBUS::checkRTLWMBUSFrame(vector<uchar> &data,
|
|||
for (; i+1 < data.size(); ++i) {
|
||||
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
|
||||
|
||||
// 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] == ';' && 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;
|
||||
*hex_payload_len_out = payload_len;
|
||||
*hex_payload_offset = i;
|
||||
*hex_frame_length = eolp+1;
|
||||
|
||||
debug("(rtlwmbus) got full frame\n");
|
||||
debug("(rtlwmbus) received full frame\n");
|
||||
return FullFrame;
|
||||
}
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue