From 16c2545f45c397d1d85da9069f2136fe2eb50827 Mon Sep 17 00:00:00 2001 From: skarg Date: Mon, 20 Feb 2006 16:16:09 +0000 Subject: [PATCH] Added demo for WhoIs service. --- bacnet-stack/demo/whohas/Makefile | 4 +- bacnet-stack/demo/whohas/main.c | 99 +++++++++++++++------------ bacnet-stack/demo/whohas/makefile.b32 | 89 ++++++++++++------------ 3 files changed, 104 insertions(+), 88 deletions(-) diff --git a/bacnet-stack/demo/whohas/Makefile b/bacnet-stack/demo/whohas/Makefile index 25b7b640..c48d1283 100644 --- a/bacnet-stack/demo/whohas/Makefile +++ b/bacnet-stack/demo/whohas/Makefile @@ -18,7 +18,7 @@ INCLUDES = -I$(BACNET_ROOT) -I$(BACNET_PORT) -I$(BACNET_OBJECT) -I$(BACNET_HANDL CFLAGS = -Wall -g $(INCLUDES) $(DEFINES) -TARGET = bacwh +TARGET = bacwi SRCS = main.c \ $(BACNET_ROOT)/rd.c \ @@ -29,8 +29,8 @@ SRCS = main.c \ $(BACNET_HANDLER)/h_whois.c \ $(BACNET_HANDLER)/h_ihave.c \ $(BACNET_HANDLER)/h_rp.c \ - $(BACNET_HANDLER)/s_whohas.c \ $(BACNET_HANDLER)/s_ihave.c \ + $(BACNET_HANDLER)/s_whois.c \ $(BACNET_OBJECT)/device.c \ $(BACNET_OBJECT)/ai.c \ $(BACNET_OBJECT)/ao.c \ diff --git a/bacnet-stack/demo/whohas/main.c b/bacnet-stack/demo/whohas/main.c index 1cce8dba..0c4a4ba1 100644 --- a/bacnet-stack/demo/whohas/main.c +++ b/bacnet-stack/demo/whohas/main.c @@ -23,7 +23,7 @@ * *********************************************************************/ -/* WRITEPROP: command line tool that writes a property to a BACnet device. */ +/* command line tool that sends a BACnet service, and displays the reply */ #include #include #include @@ -32,8 +32,6 @@ #include #include "bactext.h" #include "iam.h" -#include "arf.h" -#include "tsm.h" #include "address.h" #include "config.h" #include "bacdef.h" @@ -42,7 +40,6 @@ #include "device.h" #include "net.h" #include "datalink.h" -#include "whohas.h" /* some demo stuff needed */ #include "filename.h" #include "handlers.h" @@ -53,9 +50,8 @@ static uint8_t Rx_Buf[MAX_MPDU] = { 0 }; /* global variables used in this file */ -static BACNET_OBJECT_TYPE Target_Object_Type = MAX_BACNET_OBJECT_TYPE; -static uint32_t Target_Object_Instance = BACNET_MAX_INSTANCE; -static char *Target_Object_Name = NULL; +static int32_t Target_Object_Instance_Min = 0; +static int32_t Target_Object_Instance_Max = BACNET_MAX_INSTANCE; static bool Error_Detected = false; @@ -95,8 +91,8 @@ static void Init_Service_Handlers(void) apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROPERTY, handler_read_property); /* handle the reply (request) coming back */ - apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_I_HAVE, - handler_i_have); + apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_I_AM, + handler_i_am_add); /* handle any errors coming back */ apdu_set_abort_handler(MyAbortHandler); apdu_set_reject_handler(MyRejectHandler); @@ -117,6 +113,27 @@ static void print_address(char *name, BACNET_ADDRESS * dest) } #endif +static void print_address_cache(void) +{ + int i, j; + BACNET_ADDRESS address; + uint32_t device_id = 0; + unsigned max_apdu = 0; + + fprintf(stderr, "Device\tMAC\tMaxAPDU\tNet\n"); + for (i = 0; i < MAX_ADDRESS_CACHE; i++) { + if (address_get_by_index(i, &device_id, &max_apdu, &address)) { + fprintf(stderr, "%u\t", device_id); + for (j = 0; j < address.mac_len; j++) { + fprintf(stderr, "%02X", address.mac[j]); + } + fprintf(stderr, "\t"); + fprintf(stderr, "%hu\t", max_apdu); + fprintf(stderr, "%hu\n", address.net); + } + } +} + int main(int argc, char *argv[]) { BACNET_ADDRESS src = { 0 }; /* address where message came from */ @@ -131,34 +148,38 @@ int main(int argc, char *argv[]) #endif if (argc < 2) { - /* note: priority 16 and 0 should produce the same end results... */ - printf("Usage: %s \r\n" - "Send BACnet WhoHas request to devices, and wait for responses.\r\n" + printf("Usage: %s device-instance | device-instance-min device-instance-max\r\n" + "Send BACnet WhoIs request to devices, and wait for responses.\r\n" "\r\n" - "Use either:\r\n" - "The object-type can be 0 to %d.\r\n" - "The object-instance can be 0 to %d.\r\n" - "or:\r\n" - "The object-name can be any string of characters.\r\n", + "The device-instance can be 0 to %d, or -1 for ALL.\r\n" + "The device-instance can also be specified as a range.\r\n", filename_remove_path(argv[0]), - MAX_BACNET_OBJECT_TYPE - 1, BACNET_MAX_INSTANCE); + BACNET_MAX_INSTANCE); return 0; } /* decode the command line parameters */ if (argc < 3) { - Target_Object_Name = argv[1]; - } else { - Target_Object_Type = strtol(argv[1], NULL, 0); - Target_Object_Instance = strtol(argv[2], NULL, 0); - if (Target_Object_Instance > BACNET_MAX_INSTANCE) { + Target_Object_Instance_Min = strtol(argv[1], NULL, 0); + Target_Object_Instance_Max = Target_Object_Instance_Min; + if (Target_Object_Instance_Min > BACNET_MAX_INSTANCE) { fprintf(stderr, - "object-instance=%u - it must be less than %u\r\n", - Target_Object_Instance, BACNET_MAX_INSTANCE + 1); + "object-instance-min=%u - it must be less than %u\r\n", + Target_Object_Instance_Min, BACNET_MAX_INSTANCE + 1); return 1; } - if (Target_Object_Type > MAX_BACNET_OBJECT_TYPE) { - fprintf(stderr, "object-type=%u - it must be less than %u\r\n", - Target_Object_Type, MAX_BACNET_OBJECT_TYPE + 1); + } else { + Target_Object_Instance_Min = strtol(argv[1], NULL, 0); + Target_Object_Instance_Max = strtol(argv[2], NULL, 0); + if (Target_Object_Instance_Min > BACNET_MAX_INSTANCE) { + fprintf(stderr, + "object-instance-min=%u - it must be less than %u\r\n", + Target_Object_Instance_Min, BACNET_MAX_INSTANCE + 1); + return 1; + } + if (Target_Object_Instance_Max > BACNET_MAX_INSTANCE) { + fprintf(stderr, + "object-instance-max=%u - it must be less than %u\r\n", + Target_Object_Instance_Max, BACNET_MAX_INSTANCE + 1); return 1; } } @@ -179,14 +200,8 @@ int main(int argc, char *argv[]) /* configure the timeout values */ last_seconds = time(NULL); timeout_seconds = Device_APDU_Timeout() / 1000; - /* don't send an I-Am unless asked */ - I_Am_Request = false; /* send the request */ - if (argc < 3) - Send_WhoHas_Name(-1, -1, Target_Object_Name); - else - Send_WhoHas_Object(-1, -1, - Target_Object_Type, Target_Object_Instance); + Send_WhoIs(Target_Object_Instance_Min, Target_Object_Instance_Max); /* loop forever */ for (;;) { /* increment timer - exit if timed out */ @@ -199,18 +214,14 @@ int main(int argc, char *argv[]) } if (Error_Detected) break; - if (I_Am_Request) { - I_Am_Request = false; - iam_send(&Handler_Transmit_Buffer[0]); - } else { - /* increment timer - exit if timed out */ - elapsed_seconds += (current_seconds - last_seconds); - if (elapsed_seconds > timeout_seconds) - break; - } + /* increment timer - exit if timed out */ + elapsed_seconds += (current_seconds - last_seconds); + if (elapsed_seconds > timeout_seconds) + break; /* keep track of time for next check */ last_seconds = current_seconds; } + print_address_cache(); return 0; } diff --git a/bacnet-stack/demo/whohas/makefile.b32 b/bacnet-stack/demo/whohas/makefile.b32 index 1f5e2886..339441f6 100644 --- a/bacnet-stack/demo/whohas/makefile.b32 +++ b/bacnet-stack/demo/whohas/makefile.b32 @@ -11,49 +11,54 @@ BORLAND_DIR_Not_Defined: @echo You must define environment variable BORLAND_DIR to compile. !endif -PRODUCT = bacwh +PRODUCT = bacwi PRODUCT_EXE = $(PRODUCT).exe # Choose the Data Link Layer to Enable DEFINES = -DBACDL_BIP=1;TSM_ENABLED=0;USE_INADDR=1 +# Directories +BACNET_PORT = ..\..\ports\win32 +BACNET_OBJECT = ..\object +BACNET_HANDLER = ..\handler +BACNET_ROOT = ..\.. SRCS = main.c \ - ..\..\rd.c \ - ..\..\ports\win32\bip-init.c \ - ..\..\filename.c \ - ..\..\bip.c \ - ..\..\demo\handler\txbuf.c \ - ..\..\demo\handler\noserv.c \ - ..\..\demo\handler\h_whois.c \ - ..\..\demo\handler\h_ihave.c \ - ..\..\demo\handler\h_rp.c \ - ..\..\demo\handler\s_ihave.c \ - ..\..\demo\handler\s_whohas.c \ - ..\..\bacdcode.c \ - ..\..\bacapp.c \ - ..\..\bacstr.c \ - ..\..\bactext.c \ - ..\..\indtext.c \ - ..\..\bigend.c \ - ..\..\whois.c \ - ..\..\iam.c \ - ..\..\whohas.c \ - ..\..\ihave.c \ - ..\..\rp.c \ - ..\..\wp.c \ - ..\..\arf.c \ - ..\..\awf.c \ - ..\..\dcc.c \ - ..\..\demo\object\bacfile.c \ - ..\..\demo\object\device.c \ - ..\..\demo\object\ai.c \ - ..\..\demo\object\ao.c \ - ..\..\datalink.c \ - ..\..\abort.c \ - ..\..\reject.c \ - ..\..\bacerror.c \ - ..\..\apdu.c \ - ..\..\npdu.c + $(BACNET_PORT)\bip-init.c \ + $(BACNET_ROOT)\bip.c \ + $(BACNET_HANDLER)\txbuf.c \ + $(BACNET_HANDLER)\noserv.c \ + $(BACNET_HANDLER)\h_whois.c \ + $(BACNET_HANDLER)\h_iam.c \ + $(BACNET_HANDLER)\h_rp.c \ + $(BACNET_HANDLER)\s_whois.c \ + $(BACNET_OBJECT)\bacfile.c \ + $(BACNET_OBJECT)\device.c \ + $(BACNET_OBJECT)\ai.c \ + $(BACNET_OBJECT)\ao.c \ + $(BACNET_ROOT)\address.c \ + $(BACNET_ROOT)\filename.c \ + $(BACNET_ROOT)\bacdcode.c \ + $(BACNET_ROOT)\bacapp.c \ + $(BACNET_ROOT)\bacstr.c \ + $(BACNET_ROOT)\bactext.c \ + $(BACNET_ROOT)\indtext.c \ + $(BACNET_ROOT)\bigend.c \ + $(BACNET_ROOT)\whois.c \ + $(BACNET_ROOT)\iam.c \ + $(BACNET_ROOT)\whohas.c \ + $(BACNET_ROOT)\ihave.c \ + $(BACNET_ROOT)\rd.c \ + $(BACNET_ROOT)\rp.c \ + $(BACNET_ROOT)\wp.c \ + $(BACNET_ROOT)\arf.c \ + $(BACNET_ROOT)\awf.c \ + $(BACNET_ROOT)\dcc.c \ + $(BACNET_ROOT)\datalink.c \ + $(BACNET_ROOT)\abort.c \ + $(BACNET_ROOT)\reject.c \ + $(BACNET_ROOT)\bacerror.c \ + $(BACNET_ROOT)\apdu.c \ + $(BACNET_ROOT)\npdu.c OBJS = $(SRCS:.c=.obj) @@ -68,7 +73,7 @@ TLIB = $(BORLAND_DIR)\bin\tlib # Include directories # CC_DIR = $(BORLAND_DIR)\BIN -INCL_DIRS = -I$(BORLAND_DIR)\include;..\..\;..\..\demo\object\;..\..\demo\handler\;..\..\ports\win32\;. +INCL_DIRS = -I$(BORLAND_DIR)\include;$(BACNET_ROOT)\;$(BACNET_OBJECT)\;$(BACNET_HANDLER)\;$(BACNET_PORT)\;. CFLAGS = $(INCL_DIRS) $(CS_FLAGS) $(DEFINES) @@ -107,10 +112,10 @@ clean : @echo Deleting obj files, $(PRODUCT_EXE) and map files. # del $(OBJS) # command too long, bummer! del *.obj - del ..\..\*.obj - del ..\..\demo\handler\*.obj - del ..\..\demo\object\*.obj - del ..\..\ports\win32\*.obj + del $(BACNET_ROOT)\*.obj + del $(BACNET_HANDLER)\*.obj + del $(BACNET_OBJECT)\*.obj + del $(BACNET_PORT)\*.obj del $(PRODUCT_EXE) del *.map del bcc32.cfg