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)
|
CFLAGS = -Wall -g $(INCLUDES) $(DEFINES)
|
||||||
|
|
||||||
TARGET = bacwh
|
TARGET = bacwi
|
||||||
|
|
||||||
SRCS = main.c \
|
SRCS = main.c \
|
||||||
$(BACNET_ROOT)/rd.c \
|
$(BACNET_ROOT)/rd.c \
|
||||||
@@ -29,8 +29,8 @@ SRCS = main.c \
|
|||||||
$(BACNET_HANDLER)/h_whois.c \
|
$(BACNET_HANDLER)/h_whois.c \
|
||||||
$(BACNET_HANDLER)/h_ihave.c \
|
$(BACNET_HANDLER)/h_ihave.c \
|
||||||
$(BACNET_HANDLER)/h_rp.c \
|
$(BACNET_HANDLER)/h_rp.c \
|
||||||
$(BACNET_HANDLER)/s_whohas.c \
|
|
||||||
$(BACNET_HANDLER)/s_ihave.c \
|
$(BACNET_HANDLER)/s_ihave.c \
|
||||||
|
$(BACNET_HANDLER)/s_whois.c \
|
||||||
$(BACNET_OBJECT)/device.c \
|
$(BACNET_OBJECT)/device.c \
|
||||||
$(BACNET_OBJECT)/ai.c \
|
$(BACNET_OBJECT)/ai.c \
|
||||||
$(BACNET_OBJECT)/ao.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 <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -32,8 +32,6 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "bactext.h"
|
#include "bactext.h"
|
||||||
#include "iam.h"
|
#include "iam.h"
|
||||||
#include "arf.h"
|
|
||||||
#include "tsm.h"
|
|
||||||
#include "address.h"
|
#include "address.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "bacdef.h"
|
#include "bacdef.h"
|
||||||
@@ -42,7 +40,6 @@
|
|||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include "datalink.h"
|
#include "datalink.h"
|
||||||
#include "whohas.h"
|
|
||||||
/* some demo stuff needed */
|
/* some demo stuff needed */
|
||||||
#include "filename.h"
|
#include "filename.h"
|
||||||
#include "handlers.h"
|
#include "handlers.h"
|
||||||
@@ -53,9 +50,8 @@
|
|||||||
static uint8_t Rx_Buf[MAX_MPDU] = { 0 };
|
static uint8_t Rx_Buf[MAX_MPDU] = { 0 };
|
||||||
|
|
||||||
/* global variables used in this file */
|
/* global variables used in this file */
|
||||||
static BACNET_OBJECT_TYPE Target_Object_Type = MAX_BACNET_OBJECT_TYPE;
|
static int32_t Target_Object_Instance_Min = 0;
|
||||||
static uint32_t Target_Object_Instance = BACNET_MAX_INSTANCE;
|
static int32_t Target_Object_Instance_Max = BACNET_MAX_INSTANCE;
|
||||||
static char *Target_Object_Name = NULL;
|
|
||||||
|
|
||||||
static bool Error_Detected = false;
|
static bool Error_Detected = false;
|
||||||
|
|
||||||
@@ -95,8 +91,8 @@ static void Init_Service_Handlers(void)
|
|||||||
apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROPERTY,
|
apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROPERTY,
|
||||||
handler_read_property);
|
handler_read_property);
|
||||||
/* handle the reply (request) coming back */
|
/* handle the reply (request) coming back */
|
||||||
apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_I_HAVE,
|
apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_I_AM,
|
||||||
handler_i_have);
|
handler_i_am_add);
|
||||||
/* handle any errors coming back */
|
/* handle any errors coming back */
|
||||||
apdu_set_abort_handler(MyAbortHandler);
|
apdu_set_abort_handler(MyAbortHandler);
|
||||||
apdu_set_reject_handler(MyRejectHandler);
|
apdu_set_reject_handler(MyRejectHandler);
|
||||||
@@ -117,6 +113,27 @@ static void print_address(char *name, BACNET_ADDRESS * dest)
|
|||||||
}
|
}
|
||||||
#endif
|
#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[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
BACNET_ADDRESS src = { 0 }; /* address where message came from */
|
BACNET_ADDRESS src = { 0 }; /* address where message came from */
|
||||||
@@ -131,34 +148,38 @@ int main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
/* note: priority 16 and 0 should produce the same end results... */
|
printf("Usage: %s device-instance | device-instance-min device-instance-max\r\n"
|
||||||
printf("Usage: %s <object-type object-instance | object-name>\r\n"
|
"Send BACnet WhoIs request to devices, and wait for responses.\r\n"
|
||||||
"Send BACnet WhoHas request to devices, and wait for responses.\r\n"
|
|
||||||
"\r\n"
|
"\r\n"
|
||||||
"Use either:\r\n"
|
"The device-instance can be 0 to %d, or -1 for ALL.\r\n"
|
||||||
"The object-type can be 0 to %d.\r\n"
|
"The device-instance can also be specified as a range.\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",
|
|
||||||
filename_remove_path(argv[0]),
|
filename_remove_path(argv[0]),
|
||||||
MAX_BACNET_OBJECT_TYPE - 1, BACNET_MAX_INSTANCE);
|
BACNET_MAX_INSTANCE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* decode the command line parameters */
|
/* decode the command line parameters */
|
||||||
if (argc < 3) {
|
if (argc < 3) {
|
||||||
Target_Object_Name = argv[1];
|
Target_Object_Instance_Min = strtol(argv[1], NULL, 0);
|
||||||
} else {
|
Target_Object_Instance_Max = Target_Object_Instance_Min;
|
||||||
Target_Object_Type = strtol(argv[1], NULL, 0);
|
if (Target_Object_Instance_Min > BACNET_MAX_INSTANCE) {
|
||||||
Target_Object_Instance = strtol(argv[2], NULL, 0);
|
|
||||||
if (Target_Object_Instance > BACNET_MAX_INSTANCE) {
|
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"object-instance=%u - it must be less than %u\r\n",
|
"object-instance-min=%u - it must be less than %u\r\n",
|
||||||
Target_Object_Instance, BACNET_MAX_INSTANCE + 1);
|
Target_Object_Instance_Min, BACNET_MAX_INSTANCE + 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (Target_Object_Type > MAX_BACNET_OBJECT_TYPE) {
|
} else {
|
||||||
fprintf(stderr, "object-type=%u - it must be less than %u\r\n",
|
Target_Object_Instance_Min = strtol(argv[1], NULL, 0);
|
||||||
Target_Object_Type, MAX_BACNET_OBJECT_TYPE + 1);
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -179,14 +200,8 @@ int main(int argc, char *argv[])
|
|||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
timeout_seconds = Device_APDU_Timeout() / 1000;
|
timeout_seconds = Device_APDU_Timeout() / 1000;
|
||||||
/* don't send an I-Am unless asked */
|
|
||||||
I_Am_Request = false;
|
|
||||||
/* send the request */
|
/* send the request */
|
||||||
if (argc < 3)
|
Send_WhoIs(Target_Object_Instance_Min, Target_Object_Instance_Max);
|
||||||
Send_WhoHas_Name(-1, -1, Target_Object_Name);
|
|
||||||
else
|
|
||||||
Send_WhoHas_Object(-1, -1,
|
|
||||||
Target_Object_Type, Target_Object_Instance);
|
|
||||||
/* loop forever */
|
/* loop forever */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
/* increment timer - exit if timed out */
|
/* increment timer - exit if timed out */
|
||||||
@@ -199,18 +214,14 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
if (Error_Detected)
|
if (Error_Detected)
|
||||||
break;
|
break;
|
||||||
if (I_Am_Request) {
|
/* increment timer - exit if timed out */
|
||||||
I_Am_Request = false;
|
elapsed_seconds += (current_seconds - last_seconds);
|
||||||
iam_send(&Handler_Transmit_Buffer[0]);
|
if (elapsed_seconds > timeout_seconds)
|
||||||
} else {
|
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 */
|
/* keep track of time for next check */
|
||||||
last_seconds = current_seconds;
|
last_seconds = current_seconds;
|
||||||
}
|
}
|
||||||
|
print_address_cache();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,49 +11,54 @@ BORLAND_DIR_Not_Defined:
|
|||||||
@echo You must define environment variable BORLAND_DIR to compile.
|
@echo You must define environment variable BORLAND_DIR to compile.
|
||||||
!endif
|
!endif
|
||||||
|
|
||||||
PRODUCT = bacwh
|
PRODUCT = bacwi
|
||||||
PRODUCT_EXE = $(PRODUCT).exe
|
PRODUCT_EXE = $(PRODUCT).exe
|
||||||
|
|
||||||
# Choose the Data Link Layer to Enable
|
# Choose the Data Link Layer to Enable
|
||||||
DEFINES = -DBACDL_BIP=1;TSM_ENABLED=0;USE_INADDR=1
|
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 \
|
SRCS = main.c \
|
||||||
..\..\rd.c \
|
$(BACNET_PORT)\bip-init.c \
|
||||||
..\..\ports\win32\bip-init.c \
|
$(BACNET_ROOT)\bip.c \
|
||||||
..\..\filename.c \
|
$(BACNET_HANDLER)\txbuf.c \
|
||||||
..\..\bip.c \
|
$(BACNET_HANDLER)\noserv.c \
|
||||||
..\..\demo\handler\txbuf.c \
|
$(BACNET_HANDLER)\h_whois.c \
|
||||||
..\..\demo\handler\noserv.c \
|
$(BACNET_HANDLER)\h_iam.c \
|
||||||
..\..\demo\handler\h_whois.c \
|
$(BACNET_HANDLER)\h_rp.c \
|
||||||
..\..\demo\handler\h_ihave.c \
|
$(BACNET_HANDLER)\s_whois.c \
|
||||||
..\..\demo\handler\h_rp.c \
|
$(BACNET_OBJECT)\bacfile.c \
|
||||||
..\..\demo\handler\s_ihave.c \
|
$(BACNET_OBJECT)\device.c \
|
||||||
..\..\demo\handler\s_whohas.c \
|
$(BACNET_OBJECT)\ai.c \
|
||||||
..\..\bacdcode.c \
|
$(BACNET_OBJECT)\ao.c \
|
||||||
..\..\bacapp.c \
|
$(BACNET_ROOT)\address.c \
|
||||||
..\..\bacstr.c \
|
$(BACNET_ROOT)\filename.c \
|
||||||
..\..\bactext.c \
|
$(BACNET_ROOT)\bacdcode.c \
|
||||||
..\..\indtext.c \
|
$(BACNET_ROOT)\bacapp.c \
|
||||||
..\..\bigend.c \
|
$(BACNET_ROOT)\bacstr.c \
|
||||||
..\..\whois.c \
|
$(BACNET_ROOT)\bactext.c \
|
||||||
..\..\iam.c \
|
$(BACNET_ROOT)\indtext.c \
|
||||||
..\..\whohas.c \
|
$(BACNET_ROOT)\bigend.c \
|
||||||
..\..\ihave.c \
|
$(BACNET_ROOT)\whois.c \
|
||||||
..\..\rp.c \
|
$(BACNET_ROOT)\iam.c \
|
||||||
..\..\wp.c \
|
$(BACNET_ROOT)\whohas.c \
|
||||||
..\..\arf.c \
|
$(BACNET_ROOT)\ihave.c \
|
||||||
..\..\awf.c \
|
$(BACNET_ROOT)\rd.c \
|
||||||
..\..\dcc.c \
|
$(BACNET_ROOT)\rp.c \
|
||||||
..\..\demo\object\bacfile.c \
|
$(BACNET_ROOT)\wp.c \
|
||||||
..\..\demo\object\device.c \
|
$(BACNET_ROOT)\arf.c \
|
||||||
..\..\demo\object\ai.c \
|
$(BACNET_ROOT)\awf.c \
|
||||||
..\..\demo\object\ao.c \
|
$(BACNET_ROOT)\dcc.c \
|
||||||
..\..\datalink.c \
|
$(BACNET_ROOT)\datalink.c \
|
||||||
..\..\abort.c \
|
$(BACNET_ROOT)\abort.c \
|
||||||
..\..\reject.c \
|
$(BACNET_ROOT)\reject.c \
|
||||||
..\..\bacerror.c \
|
$(BACNET_ROOT)\bacerror.c \
|
||||||
..\..\apdu.c \
|
$(BACNET_ROOT)\apdu.c \
|
||||||
..\..\npdu.c
|
$(BACNET_ROOT)\npdu.c
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.obj)
|
OBJS = $(SRCS:.c=.obj)
|
||||||
|
|
||||||
@@ -68,7 +73,7 @@ TLIB = $(BORLAND_DIR)\bin\tlib
|
|||||||
# Include directories
|
# Include directories
|
||||||
#
|
#
|
||||||
CC_DIR = $(BORLAND_DIR)\BIN
|
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)
|
CFLAGS = $(INCL_DIRS) $(CS_FLAGS) $(DEFINES)
|
||||||
|
|
||||||
@@ -107,10 +112,10 @@ clean :
|
|||||||
@echo Deleting obj files, $(PRODUCT_EXE) and map files.
|
@echo Deleting obj files, $(PRODUCT_EXE) and map files.
|
||||||
# del $(OBJS) # command too long, bummer!
|
# del $(OBJS) # command too long, bummer!
|
||||||
del *.obj
|
del *.obj
|
||||||
del ..\..\*.obj
|
del $(BACNET_ROOT)\*.obj
|
||||||
del ..\..\demo\handler\*.obj
|
del $(BACNET_HANDLER)\*.obj
|
||||||
del ..\..\demo\object\*.obj
|
del $(BACNET_OBJECT)\*.obj
|
||||||
del ..\..\ports\win32\*.obj
|
del $(BACNET_PORT)\*.obj
|
||||||
del $(PRODUCT_EXE)
|
del $(PRODUCT_EXE)
|
||||||
del *.map
|
del *.map
|
||||||
del bcc32.cfg
|
del bcc32.cfg
|
||||||
|
|||||||
Reference in New Issue
Block a user