Added demo for WhoIs service.

This commit is contained in:
skarg
2006-02-20 16:16:09 +00:00
parent 3da578c943
commit 16c2545f45
3 changed files with 104 additions and 88 deletions
+2 -2
View File
@@ -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 \
+55 -44
View File
@@ -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 <stddef.h>
#include <stdint.h>
#include <stdio.h>
@@ -32,8 +32,6 @@
#include <errno.h>
#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 <object-type object-instance | object-name>\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;
}
+47 -42
View File
@@ -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