From 49b49d077b0e631bd2a87f0d7b0cdbe4a824d146 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Tue, 29 May 2012 21:34:20 +0200 Subject: [PATCH] Sync behaviour from serial to TCP connections --- bin/mbus-tcp-request-data-multi-reply.c | 33 +++++++++++++++++-- bin/mbus-tcp-request-data.c | 12 +++++-- bin/mbus-tcp-scan-secondary.c | 44 +++++++++++++++++++++++-- bin/mbus-tcp-scan.c | 40 ++++++++++++++++++---- 4 files changed, 117 insertions(+), 12 deletions(-) diff --git a/bin/mbus-tcp-request-data-multi-reply.c b/bin/mbus-tcp-request-data-multi-reply.c index e85e8e1..e06c022 100644 --- a/bin/mbus-tcp-request-data-multi-reply.c +++ b/bin/mbus-tcp-request-data-multi-reply.c @@ -20,12 +20,12 @@ static int debug = 0; //------------------------------------------------------------------------------ -// Execution starts here: +// Scan for devices using secondary addressing. //------------------------------------------------------------------------------ int main(int argc, char **argv) { - mbus_frame reply, *reply_iter; + mbus_frame *frame, reply; mbus_frame_data reply_data; mbus_handle *handle = NULL; @@ -67,6 +67,33 @@ main(int argc, char **argv) fprintf(stderr, "Failed to setup connection to M-bus gateway\n"); return 1; } + + // + // init slave to get really the beginning of the records + // + + frame = mbus_frame_new(MBUS_FRAME_TYPE_SHORT); + + if (frame == NULL) + { + fprintf(stderr, "Failed to allocate mbus frame.\n"); + return 1; + } + + frame->control = MBUS_CONTROL_MASK_SND_NKE | MBUS_CONTROL_MASK_DIR_M2S; + frame->address = MBUS_ADDRESS_BROADCAST_NOREPLY; + + if (debug) + printf("%s: debug: sending init frame\n", __PRETTY_FUNCTION__); + + if (mbus_send_frame(handle, frame) == -1) + { + fprintf(stderr, "Failed to send mbus frame.\n"); + mbus_frame_free(frame); + return 1; + } + + mbus_recv_frame(handle, &reply); if (strlen(addr_str) == 16) { @@ -125,7 +152,9 @@ main(int argc, char **argv) fprintf(stderr, "Failed to generate XML representation of MBUS frames: %s\n", mbus_error_str()); return 1; } + printf("%s", xml_result); + free(xml_result); mbus_disconnect(handle); return 0; diff --git a/bin/mbus-tcp-request-data.c b/bin/mbus-tcp-request-data.c index 6f91be4..7b40f28 100644 --- a/bin/mbus-tcp-request-data.c +++ b/bin/mbus-tcp-request-data.c @@ -29,7 +29,7 @@ main(int argc, char **argv) mbus_frame_data reply_data; mbus_handle *handle = NULL; - char *host, *addr_str, matching_addr[16]; + char *host, *addr_str, matching_addr[16], *xml_result; int port, address; memset((void *)&reply, 0, sizeof(mbus_frame)); @@ -130,7 +130,15 @@ main(int argc, char **argv) fprintf(stderr, "M-bus data parse error.\n"); return 1; } - printf("%s", mbus_frame_data_xml(&reply_data)); + + if ((xml_result = mbus_frame_data_xml(&reply_data)) == NULL) + { + fprintf(stderr, "Failed to generate XML representation of MBUS frame: %s\n", mbus_error_str()); + return 1; + } + + printf("%s", xml_result); + free(xml_result); // manual free if (reply_data.data_var.record) diff --git a/bin/mbus-tcp-scan-secondary.c b/bin/mbus-tcp-scan-secondary.c index ff6cb84..e2cca2a 100644 --- a/bin/mbus-tcp-scan-secondary.c +++ b/bin/mbus-tcp-scan-secondary.c @@ -17,8 +17,7 @@ #include #include -static mbus_handle *handle = NULL; - +static int debug = 0; //------------------------------------------------------------------------------ // Execution starts here: @@ -28,6 +27,10 @@ main(int argc, char **argv) { char *host, *addr_mask; int port; + mbus_handle *handle = NULL; + mbus_frame *frame = NULL, reply; + + memset((void *)&reply, 0, sizeof(mbus_frame)); if (argc != 4 && argc != 3) { @@ -59,6 +62,43 @@ main(int argc, char **argv) fprintf(stderr, "Failed to setup connection to M-bus gateway: %s\n", mbus_error_str()); return 1; } + + frame = mbus_frame_new(MBUS_FRAME_TYPE_SHORT); + + if (frame == NULL) + { + fprintf(stderr, "Failed to allocate mbus frame.\n"); + return 1; + } + + // + // init slaves + // + frame->control = MBUS_CONTROL_MASK_SND_NKE | MBUS_CONTROL_MASK_DIR_M2S; + frame->address = 0xFD; + + if (mbus_send_frame(handle, frame) == -1) + { + fprintf(stderr, "Failed to send SND_NKE #1.\n"); + mbus_frame_free(frame); + return 1; + } + + (void) mbus_recv_frame(handle, &reply); + sleep(1); + + frame->control = MBUS_CONTROL_MASK_SND_NKE | MBUS_CONTROL_MASK_DIR_M2S; + frame->address = 0xFF; + + if (mbus_send_frame(handle, frame) == -1) + { + fprintf(stderr, "Failed to send SND_NKE #2.\n"); + mbus_frame_free(frame); + return 1; + } + + (void) mbus_recv_frame(handle, &reply); + sleep(1); mbus_scan_2nd_address_range(handle, 0, addr_mask); diff --git a/bin/mbus-tcp-scan.c b/bin/mbus-tcp-scan.c index 1d412c8..d6dcee4 100644 --- a/bin/mbus-tcp-scan.c +++ b/bin/mbus-tcp-scan.c @@ -27,6 +27,7 @@ main(int argc, char **argv) mbus_handle *handle; char *host; int port, address, debug = 0; + int ret; if (argc == 3) { @@ -59,11 +60,13 @@ main(int argc, char **argv) if (debug) printf("Scanning primary addresses:\n"); - - for (address = 0; address < 254; address++) + + for (address = 0; address <= 250; address++) { mbus_frame reply; + memset((void *)&reply, 0, sizeof(mbus_frame)); + if (debug) { printf("%d ", address); @@ -75,16 +78,41 @@ main(int argc, char **argv) printf("Scan failed. Could not send ping frame: %s\n", mbus_error_str()); return 1; } + + ret = mbus_recv_frame(handle, &reply); - if (mbus_recv_frame(handle, &reply) == -1) + if (ret == -1) { continue; - } + } + + if (debug) + printf("\n"); + + if (ret == -2) + { + /* check for more data (collision) */ + while (mbus_recv_frame(handle, &reply) != -1); + + printf("Collision at address %d\n", address); + + continue; + } if (mbus_frame_type(&reply) == MBUS_FRAME_TYPE_ACK) { - if (debug) - printf("\n"); + /* check for more data (collision) */ + while (mbus_recv_frame(handle, &reply) != -1) + { + ret = -2; + } + + if (ret == -2) + { + printf("Collision at address %d\n", address); + + continue; + } printf("Found a M-Bus device at address %d\n", address); }