Added demo for WhoIs service.
This commit is contained in:
@@ -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 \
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user