From caf018f0728dee9d563a998e5ede3a15e4a47973 Mon Sep 17 00:00:00 2001 From: skarg Date: Wed, 7 Dec 2005 19:55:39 +0000 Subject: [PATCH] updated the read property demo. --- bacnet-stack/handlers.c | 11 +++++- bacnet-stack/ports/linux/main.c | 55 +++++++++++++++++++++------- bacnet-stack/ports/win32/bacnet.ide | Bin 52606 -> 52796 bytes bacnet-stack/ports/win32/bip-init.c | 3 ++ bacnet-stack/ports/win32/main.c | 50 ++++++++++++++++++++----- bacnet-stack/tsm.c | 1 + 6 files changed, 96 insertions(+), 24 deletions(-) diff --git a/bacnet-stack/handlers.c b/bacnet-stack/handlers.c index 69a97aea..5819d6f9 100644 --- a/bacnet-stack/handlers.c +++ b/bacnet-stack/handlers.c @@ -136,7 +136,7 @@ void Send_WhoIs(void) fprintf(stderr,"Failed to Send Who-Is Request (%s)!\n", strerror(errno)); } -// returns false if device is not bound +// returns false if device is not bound or no tsm available bool Send_Read_Property_Request( uint32_t device_id, // destination device BACNET_OBJECT_TYPE object_type, @@ -153,7 +153,11 @@ bool Send_Read_Property_Request( int bytes_sent = 0; BACNET_READ_PROPERTY_DATA data; + /* is the device bound? */ status = address_get_by_device(device_id, &max_apdu, &dest); + /* is there a tsm available? */ + if (status) + status = tsm_transaction_available(); if (status) { datalink_get_my_address(&my_address); @@ -174,6 +178,11 @@ bool Send_Read_Property_Request( &Tx_Buf[pdu_len], invoke_id, &data); + /* will it fit in the sender? + note: if there is a bottleneck router in between + us and the destination, we won't know unless + we have a way to check for that and update the + max_apdu in the address binding table. */ if ((unsigned)pdu_len < max_apdu) { tsm_set_confirmed_unsegmented_transaction( diff --git a/bacnet-stack/ports/linux/main.c b/bacnet-stack/ports/linux/main.c index 62cc07e1..4065c4ed 100644 --- a/bacnet-stack/ports/linux/main.c +++ b/bacnet-stack/ports/linux/main.c @@ -97,6 +97,7 @@ static void LocalIAmHandler( static void Read_Properties(void) { uint32_t device_id = 0; + bool status = false; unsigned max_apdu = 0; BACNET_ADDRESS src; bool next_device = false; @@ -108,15 +109,41 @@ static void Read_Properties(void) to have all the properties listed here. */ const int object_props[] = { - 75,77,79,112,121,120,70,44,12,98,95,97,96, - 62,107,57,56,119,24,10,11,73,116,64,63,30, - 514,515, - /* note: 76 is missing cause we get it special: - 76 is the object list, and reading index 0 - gives us the number of objects in the list, + PROP_OBJECT_IDENTIFIER, + PROP_OBJECT_NAME, + PROP_OBJECT_TYPE, + PROP_SYSTEM_STATUS, + PROP_VENDOR_NAME, + PROP_VENDOR_IDENTIFIER, + PROP_MODEL_NAME, + PROP_FIRMWARE_REVISION, + PROP_APPLICATION_SOFTWARE_VERSION, + PROP_PROTOCOL_VERSION, + PROP_PROTOCOL_CONFORMANCE_CLASS, + PROP_PROTOCOL_SERVICES_SUPPORTED, + PROP_PROTOCOL_OBJECT_TYPES_SUPPORTED, + PROP_MAX_APDU_LENGTH_ACCEPTED, + PROP_SEGMENTATION_SUPPORTED, + PROP_LOCAL_TIME, + PROP_LOCAL_DATE, + PROP_UTC_OFFSET, + PROP_DAYLIGHT_SAVINGS_STATUS, + PROP_APDU_SEGMENT_TIMEOUT, + PROP_APDU_TIMEOUT, + PROP_NUMBER_OF_APDU_RETRIES, + PROP_TIME_SYNCHRONIZATION_RECIPIENTS, + PROP_MAX_MASTER, + PROP_MAX_INFO_FRAMES, + PROP_DEVICE_ADDRESS_BINDING, + /* note: PROP_OBJECT_LIST is missing because + the result can be very large. Read index 0 + which gives us the number of objects in the list, and then we can read index 1, 2.. n one by one, rather than trying to read the entire object list in one message. */ + /* some proprietary properties */ + 514,515, + /* end of list */ -1 }; @@ -128,25 +155,25 @@ static void Read_Properties(void) next_device = true; else { - if (Send_Read_Property_Request( + /* note: if we wanted to do this synchronously, we would get the + invoke ID from the sending of the request, and wait until we + got the reply with matching invoke ID or the TSM of the + invoke ID expired. This demo is doing things asynchronously. */ + status = Send_Read_Property_Request( device_id, // destination device OBJECT_DEVICE, device_id, object_props[property], - BACNET_ARRAY_ALL)) - { - /* note: if we wanted to do this synchronously, we would get the - invoke ID from the sending of the request, and wait until we - got the reply with matching invoke ID or the TSM of the - invoke ID expired. This demo is doing things asynchronously. */ + BACNET_ARRAY_ALL); + if (status) property++; - } } } else next_device = true; if (next_device) { + next_device = false; index++; if (index >= MAX_ADDRESS_CACHE) index = 0; diff --git a/bacnet-stack/ports/win32/bacnet.ide b/bacnet-stack/ports/win32/bacnet.ide index b90772d3484e5844866541be36a45b093f0fafcb..1a1e74cc30d679b73458a2fb63fa786ee9e2ac6f 100644 GIT binary patch delta 7816 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 G2>X8(Ow};} delta 7657 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 YK%I~6La(a09MVS8yQsqd`0{7}4R diff --git a/bacnet-stack/ports/win32/bip-init.c b/bacnet-stack/ports/win32/bip-init.c index 5aeb083f..5dc0d1e0 100644 --- a/bacnet-stack/ports/win32/bip-init.c +++ b/bacnet-stack/ports/win32/bip-init.c @@ -172,6 +172,9 @@ bool bip_init(void) (const struct sockaddr*)&sin, sizeof(struct sockaddr)); if (rv < 0) { + fprintf(stderr,"bip: failed to bind to %s port %hd\n", + inet_ntoa(sin.sin_addr), + bip_get_port()); close(sock_fd); bip_set_socket(-1); return false; diff --git a/bacnet-stack/ports/win32/main.c b/bacnet-stack/ports/win32/main.c index 5b817679..db16c121 100644 --- a/bacnet-stack/ports/win32/main.c +++ b/bacnet-stack/ports/win32/main.c @@ -46,19 +46,50 @@ static uint8_t Rx_Buf[MAX_MPDU] = {0}; static void Read_Properties(void) { uint32_t device_id = 0; + bool status = false; unsigned max_apdu = 0; BACNET_ADDRESS src; bool next_device = false; static unsigned index = 0; static unsigned property = 0; - // list of required (and some optional) properties in the - // Device Object + /* list of required (and some optional) properties in the + Device Object + note: you could just loop through + all the properties in all the objects. */ const int object_props[] = { - 75,77,79,112,121,120,70,44,12,98,95,97,96, - 62,107,57,56,119,24,10,11,73,116,64,63,30, + PROP_OBJECT_IDENTIFIER, + PROP_OBJECT_NAME, + PROP_OBJECT_TYPE, + PROP_SYSTEM_STATUS, + PROP_VENDOR_NAME, + PROP_VENDOR_IDENTIFIER, + PROP_MODEL_NAME, + PROP_FIRMWARE_REVISION, + PROP_APPLICATION_SOFTWARE_VERSION, + PROP_PROTOCOL_VERSION, + PROP_PROTOCOL_CONFORMANCE_CLASS, + PROP_PROTOCOL_SERVICES_SUPPORTED, + PROP_PROTOCOL_OBJECT_TYPES_SUPPORTED, + PROP_MAX_APDU_LENGTH_ACCEPTED, + PROP_SEGMENTATION_SUPPORTED, + PROP_LOCAL_TIME, + PROP_LOCAL_DATE, + PROP_UTC_OFFSET, + PROP_DAYLIGHT_SAVINGS_STATUS, + PROP_APDU_SEGMENT_TIMEOUT, + PROP_APDU_TIMEOUT, + PROP_NUMBER_OF_APDU_RETRIES, + PROP_TIME_SYNCHRONIZATION_RECIPIENTS, + PROP_MAX_MASTER, + PROP_MAX_INFO_FRAMES, + PROP_DEVICE_ADDRESS_BINDING, + /* note: PROP_OBJECT_LIST is missing cause + we need to get it with an index method since + the list could be very large */ + /* some proprietary properties */ 514,515, - // note: 76 is missing cause we get it special below + /* end of list */ -1 }; @@ -70,19 +101,21 @@ static void Read_Properties(void) next_device = true; else { - (void)Send_Read_Property_Request( + status = Send_Read_Property_Request( device_id, // destination device OBJECT_DEVICE, device_id, object_props[property], BACNET_ARRAY_ALL); - property++; + if (status) + property++; } } else next_device = true; if (next_device) { + next_device = false; index++; if (index >= MAX_ADDRESS_CACHE) index = 0; @@ -186,7 +219,7 @@ static void print_address( static void print_address_cache(void) { - unsigned i,j; + int i,j; BACNET_ADDRESS address; uint32_t device_id = 0; unsigned max_apdu = 0; @@ -235,7 +268,6 @@ int main(int argc, char *argv[]) for (;;) { // input - //Read_Properties(); // returns 0 bytes on timeout pdu_len = bip_receive( diff --git a/bacnet-stack/tsm.c b/bacnet-stack/tsm.c index 6cca0451..1b7aedd6 100644 --- a/bacnet-stack/tsm.c +++ b/bacnet-stack/tsm.c @@ -127,6 +127,7 @@ uint8_t tsm_next_free_invokeID(void) found = true; invokeID = current_invokeID; } + /* update for the next call or check */ current_invokeID++; // skip zero - we treat that internally as invalid or no free if (current_invokeID == 0)