From 2ca73eefa11665aafc997eeadae5e7bc6fcf2f38 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Mon, 1 Jul 2013 08:09:01 +0200 Subject: [PATCH 1/2] add new parameter f to man page add range for TCP port --- bin/libmbus.pod | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/bin/libmbus.pod b/bin/libmbus.pod index c35c344..737c917 100644 --- a/bin/libmbus.pod +++ b/bin/libmbus.pod @@ -22,9 +22,9 @@ B [-d] [-b BAUDRATE] device mbus-address B [-d] host port mbus-address -B [-d] [-b BAUDRATE] device mbus-address +B [-d] [-b BAUDRATE] [-f FRAMES] device mbus-address -B [-d] host port mbus-address +B [-d] [-f FRAMES] host port mbus-address B [-b BAUDRATE] device secondary-mbus-address @@ -47,8 +47,8 @@ B, B - read data from given dev Supports both primary and secondary address types. B, B - read -data from given device supporting multi-telegram (up to 16 frames) reply. Can be also -used for single telegram as mbus-serial-request-data or mbus-tcp-request-data. +data from given device supporting multi-telegram (default: up to 16 frames) reply. +Can be also used for single telegram as mbus-serial-request-data or mbus-tcp-request-data. Supports both primary and secondary address types. B, B - perform single secondary @@ -79,6 +79,10 @@ the response is erroneous, the MBus master can send a retransmissions. libmbus supports the following range of retransmission: 0 until 9 +=item B<-f> I + +Maximum response frames. + =item B<-d> Enable debugging messages. @@ -95,6 +99,7 @@ For TCP communciation, the host which represents the MBus (gateway). =item B For TCP communciation, the port on the host which represents the MBus (gateway). +An integer between 0 and 65535. =item B
From 8b9d6e735edc0e684d8ac3ad05b9d300a213a8f6 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Mon, 1 Jul 2013 08:16:20 +0200 Subject: [PATCH 2/2] sync mbus-tcp-request-data-multi-reply with serial make init_slaves and parse_abort static fix return value of parse_abort remove unused variables free resources before exit --- bin/mbus-serial-request-data-multi-reply.c | 27 ++++- bin/mbus-tcp-request-data-multi-reply.c | 121 +++++++++++++++------ 2 files changed, 111 insertions(+), 37 deletions(-) diff --git a/bin/mbus-serial-request-data-multi-reply.c b/bin/mbus-serial-request-data-multi-reply.c index a9e396c..3821e4d 100755 --- a/bin/mbus-serial-request-data-multi-reply.c +++ b/bin/mbus-serial-request-data-multi-reply.c @@ -20,7 +20,7 @@ static int debug = 0; // // init slave to get really the beginning of the records // -int +static int init_slaves(mbus_handle *handle) { if (debug) @@ -49,7 +49,7 @@ init_slaves(mbus_handle *handle) //------------------------------------------------------------------------------ // Wrapper for argument parsing errors //------------------------------------------------------------------------------ -int +static void parse_abort(char **argv) { fprintf(stderr, "usage: %s [-d] [-b BAUDRATE] [-f FRAMES] device mbus-address\n", argv[0]); @@ -65,8 +65,7 @@ parse_abort(char **argv) int main(int argc, char **argv) { - mbus_frame *frame, reply; - mbus_frame_data reply_data; + mbus_frame reply; mbus_handle *handle = NULL; char *device, *addr_str, *xml_result; @@ -75,7 +74,6 @@ main(int argc, char **argv) int maxframes = MAXFRAMES; memset((void *)&reply, 0, sizeof(mbus_frame)); - memset((void *)&reply_data, 0, sizeof(mbus_frame_data)); int c; for (c=1; c argc-3) { - host = argv[2]; - port = atol(argv[3]); - addr_str = argv[4]; - debug = 1; - } - else - { - fprintf(stderr, "usage: %s [-d] host port mbus-address\n", argv[0]); - fprintf(stderr, " optional flag -d for debug printout\n"); - return 0; + parse_abort(argv); } + host = argv[c]; + port = atol(argv[c+1]); + addr_str = argv[c+2]; if ((port < 0) || (port > 0xFFFF)) { @@ -73,18 +119,15 @@ main(int argc, char **argv) if (mbus_connect(handle) == -1) { - fprintf(stderr, "Failed to setup connection to M-bus gateway\n"); + fprintf(stderr,"Failed to setup connection to M-bus gateway\n"); + mbus_context_free(handle); return 1; } - // - // init slave to get really the beginning of the records - // - if (debug) - printf("%s: debug: sending init frame\n", __PRETTY_FUNCTION__); - - if (mbus_send_ping_frame(handle, MBUS_ADDRESS_BROADCAST_NOREPLY, 1) == -1) + if (init_slaves(handle) == 0) { + mbus_disconnect(handle); + mbus_context_free(handle); return 1; } @@ -99,20 +142,26 @@ main(int argc, char **argv) if (ret == MBUS_PROBE_COLLISION) { fprintf(stderr, "%s: Error: The address mask [%s] matches more than one device.\n", __PRETTY_FUNCTION__, addr_str); + mbus_disconnect(handle); + mbus_context_free(handle); return 1; } else if (ret == MBUS_PROBE_NOTHING) { fprintf(stderr, "%s: Error: The selected secondary address does not match any device [%s].\n", __PRETTY_FUNCTION__, addr_str); + mbus_disconnect(handle); + mbus_context_free(handle); return 1; } else if (ret == MBUS_PROBE_ERROR) { fprintf(stderr, "%s: Error: Failed to select secondary address [%s].\n", __PRETTY_FUNCTION__, addr_str); + mbus_disconnect(handle); + mbus_context_free(handle); return 1; } // else MBUS_PROBE_SINGLE - + address = MBUS_ADDRESS_NETWORK_LAYER; } else @@ -123,9 +172,12 @@ main(int argc, char **argv) // instead of the send and recv, use this sendrecv function that // takes care of the possibility of multi-telegram replies (limit = 16 frames) - if (mbus_sendrecv_request(handle, address, &reply, 16) != 0) + if (mbus_sendrecv_request(handle, address, &reply, maxframes) != 0) { fprintf(stderr, "Failed to send/receive M-Bus request.\n"); + mbus_disconnect(handle); + mbus_context_free(handle); + mbus_frame_free(reply.next); return 1; } @@ -143,6 +195,9 @@ main(int argc, char **argv) if ((xml_result = mbus_frame_xml(&reply)) == NULL) { fprintf(stderr, "Failed to generate XML representation of MBUS frames: %s\n", mbus_error_str()); + mbus_disconnect(handle); + mbus_context_free(handle); + mbus_frame_free(reply.next); return 1; } @@ -151,6 +206,8 @@ main(int argc, char **argv) mbus_disconnect(handle); mbus_context_free(handle); + mbus_frame_free(reply.next); + return 0; }