Added ability to specify the BACnet/IP interface on multi-homed machines from the command line demo for demo/epics on a Win32 platform.
This commit is contained in:
@@ -57,7 +57,8 @@ static uint8_t Rx_Buf[MAX_MPDU] = { 0 };
|
|||||||
/* global variables used in this file */
|
/* global variables used in this file */
|
||||||
static uint32_t Target_Device_Object_Instance = BACNET_MAX_INSTANCE;
|
static uint32_t Target_Device_Object_Instance = BACNET_MAX_INSTANCE;
|
||||||
static bool Error_Detected = false;
|
static bool Error_Detected = false;
|
||||||
static BACNET_ADDRESS Target_Address;
|
static BACNET_ADDRESS Target_Address;
|
||||||
|
static char *Network_Interface = NULL;
|
||||||
|
|
||||||
typedef struct BACnet_RP_Service_Data_t {
|
typedef struct BACnet_RP_Service_Data_t {
|
||||||
bool new_data;
|
bool new_data;
|
||||||
@@ -267,7 +268,48 @@ static uint8_t Read_Properties(uint32_t device_instance)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return invoke_id;
|
return invoke_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void Interpret_Arguments(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int i = 0, j = 0; /* used to index through arguments */
|
||||||
|
char *p_arg = NULL; /* points to current argument */
|
||||||
|
long number = 0; /* used for strtol */
|
||||||
|
char *p_data = NULL; /* points to data portion of argument */
|
||||||
|
|
||||||
|
if (!argv)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* skip 1st one [0] - its the command line for the filename */
|
||||||
|
for (i = 1; i < argc; i++) {
|
||||||
|
p_arg = argv[i];
|
||||||
|
if (p_arg[0] == '-') {
|
||||||
|
p_data = p_arg + 2;
|
||||||
|
switch (p_arg[1]) {
|
||||||
|
case 'a':
|
||||||
|
bip_set_addr(inet_addr(p_data));
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
Network_Interface = p_data;
|
||||||
|
break;
|
||||||
|
/* double dash */
|
||||||
|
case '-':
|
||||||
|
if (strcmp(p_data, "help") == 0) {
|
||||||
|
printf
|
||||||
|
("%s device-instance\r\n",
|
||||||
|
filename_remove_path(argv[0]));
|
||||||
|
}
|
||||||
|
exit(1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* do nothing */
|
||||||
|
break;
|
||||||
|
} /* end of arguments beginning with - */
|
||||||
|
} /* dash arguments */
|
||||||
|
} /* end of arg loop */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@@ -288,11 +330,13 @@ int main(int argc, char *argv[])
|
|||||||
filename_remove_path(argv[0]));
|
filename_remove_path(argv[0]));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Interpret_Arguments(argc, argv);
|
||||||
|
|
||||||
/* decode the command line parameters */
|
/* decode the command line parameters */
|
||||||
Target_Device_Object_Instance = strtol(argv[1], NULL, 0);
|
Target_Device_Object_Instance = strtol(argv[1], NULL, 0);
|
||||||
if (Target_Device_Object_Instance >= BACNET_MAX_INSTANCE) {
|
if (Target_Device_Object_Instance > BACNET_MAX_INSTANCE) {
|
||||||
fprintf(stderr, "device-instance=%u - it must be less than %u\r\n",
|
fprintf(stderr, "device-instance=%u - it must be less than %u\r\n",
|
||||||
Target_Device_Object_Instance, BACNET_MAX_INSTANCE);
|
Target_Device_Object_Instance, BACNET_MAX_INSTANCE+1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* setup my info */
|
/* setup my info */
|
||||||
@@ -300,19 +344,25 @@ int main(int argc, char *argv[])
|
|||||||
address_init();
|
address_init();
|
||||||
Init_Service_Handlers();
|
Init_Service_Handlers();
|
||||||
#if defined(BACDL_ETHERNET)
|
#if defined(BACDL_ETHERNET)
|
||||||
/* init the physical layer */
|
/* init the physical layer */
|
||||||
if (!ethernet_init("eth0"))
|
if (!Network_Interface)
|
||||||
|
Network_Interface = "eth0";
|
||||||
|
if (!ethernet_init(Network_Interface))
|
||||||
return 1;
|
return 1;
|
||||||
#elif defined(BACDL_BIP)
|
#elif defined(BACDL_BIP)
|
||||||
bip_set_interface("eth0");
|
if (!Network_Interface)
|
||||||
|
Network_Interface = "eth0";
|
||||||
|
bip_set_interface(Network_Interface);
|
||||||
if (!bip_init())
|
if (!bip_init())
|
||||||
return 1;
|
return 1;
|
||||||
/* printf("bip: using port %hu\r\n", bip_get_port()); */
|
/* printf("bip: using port %hu\r\n", bip_get_port()); */
|
||||||
#elif defined(BACDL_ARCNET)
|
#elif defined(BACDL_ARCNET)
|
||||||
if (!arcnet_init("arc0"))
|
if (!Network_Interface)
|
||||||
|
Network_Interface = "arc0";
|
||||||
|
if (!arcnet_init(Network_Interface))
|
||||||
return 1;
|
return 1;
|
||||||
#else
|
#else
|
||||||
#error Datalink (BACDL_ETHERNET,BACDL_BIP, or BACDL_ARCNET) undefined
|
#error Define a datalink (BACDL_ETHERNET,BACDL_BIP, or BACDL_ARCNET)
|
||||||
#endif
|
#endif
|
||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ PRODUCT = bacepics
|
|||||||
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=1;BIG_ENDIAN=0;PRINT_ENABLED=1
|
DEFINES = -DBACDL_BIP=1;TSM_ENABLED=1;BIG_ENDIAN=0;PRINT_ENABLED=1;BIP_DEBUG=0
|
||||||
|
|
||||||
SRCS = main.c \
|
SRCS = main.c \
|
||||||
..\..\ports\win32\bip-init.c \
|
..\..\ports\win32\bip-init.c \
|
||||||
|
|||||||
@@ -55,13 +55,13 @@ static long gethostaddr(void)
|
|||||||
if ((host_ent = gethostbyname(host_name)) == NULL)
|
if ((host_ent = gethostbyname(host_name)) == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
#ifdef BIP_DEBUG
|
#ifdef BIP_DEBUG
|
||||||
printf("host: %s at %03u.%03u.%03u.%03u\n", host_name,
|
printf("host: %s at %u.%u.%u.%u\n", host_name,
|
||||||
((uint8_t*)host_ent->h_addr)[0],
|
((uint8_t*)host_ent->h_addr)[0],
|
||||||
((uint8_t*)host_ent->h_addr)[1],
|
((uint8_t*)host_ent->h_addr)[1],
|
||||||
((uint8_t*)host_ent->h_addr)[2],
|
((uint8_t*)host_ent->h_addr)[2],
|
||||||
((uint8_t*)host_ent->h_addr)[3]);
|
((uint8_t*)host_ent->h_addr)[3]);
|
||||||
#endif
|
#endif
|
||||||
|
/* note: network byte order */
|
||||||
return *(long *) host_ent->h_addr;
|
return *(long *) host_ent->h_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,6 +115,7 @@ bool bip_init(void)
|
|||||||
int Code;
|
int Code;
|
||||||
WSADATA wd;
|
WSADATA wd;
|
||||||
struct in_addr address;
|
struct in_addr address;
|
||||||
|
struct in_addr broadcast_address;
|
||||||
|
|
||||||
Result = WSAStartup((1 << 8) | 1, &wd);
|
Result = WSAStartup((1 << 8) | 1, &wd);
|
||||||
/*Result = WSAStartup(MAKEWORD(2,2), &wd); */
|
/*Result = WSAStartup(MAKEWORD(2,2), &wd); */
|
||||||
@@ -126,17 +127,28 @@ bool bip_init(void)
|
|||||||
}
|
}
|
||||||
atexit(cleanup);
|
atexit(cleanup);
|
||||||
|
|
||||||
address.s_addr = gethostaddr();
|
/* has address been set? */
|
||||||
if (address.s_addr == (unsigned) -1) {
|
address.s_addr = htonl(bip_get_addr());
|
||||||
Code = WSAGetLastError();
|
if (address.s_addr == 0) {
|
||||||
printf("Get host address failed, error code: %i\n", Code);
|
address.s_addr = gethostaddr();
|
||||||
exit(1);
|
if (address.s_addr == (unsigned) -1) {
|
||||||
|
Code = WSAGetLastError();
|
||||||
|
printf("Get host address failed, error code: %i\n", Code);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
bip_set_addr(address.s_addr);
|
||||||
}
|
}
|
||||||
#ifdef BIP_DEBUG
|
#ifdef BIP_DEBUG
|
||||||
printf("host address: %s\n", inet_ntoa(address));
|
printf("host address: %s\n", inet_ntoa(address));
|
||||||
#endif
|
#endif
|
||||||
bip_set_addr(address.s_addr);
|
/* has broadcast address been set? */
|
||||||
set_broadcast_address(address.s_addr);
|
if (bip_get_broadcast_addr() == 0) {
|
||||||
|
set_broadcast_address(address.s_addr);
|
||||||
|
}
|
||||||
|
#ifdef BIP_DEBUG
|
||||||
|
broadcast_address.s_addr = htonl(bip_get_broadcast_addr());
|
||||||
|
printf("broadcast address: %s\n", inet_ntoa(broadcast_address));
|
||||||
|
#endif
|
||||||
|
|
||||||
/* assumes that the driver has already been initialized */
|
/* assumes that the driver has already been initialized */
|
||||||
sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||||
|
|||||||
Reference in New Issue
Block a user