BACnet IP设备的网络配置信息
#define BIP_DNS_MAX 3
struct bacnet_ipv4_port {
uint8_t IP_Address[4];
uint8_t IP_Subnet_Prefix[4];
uint8_t IP_Gateway[4];
uint8_t IP_DNS_Server[BIP_DNS_MAX][4];
uint16_t Port;
BACNET_IP_MODE Mode;
bool IP_DHCP_Enable;
uint32_t IP_DHCP_Lease_Seconds;
uint32_t IP_DHCP_Lease_Seconds_Remaining;
uint8_t IP_DHCP_Server[4];
bool IP_NAT_Traversal;
uint32_t IP_Global_Address[4];
bool BBMD_Accept_FD_Registrations;
};
这个结构体定义了一个名为bacnet_ipv4_port的数据结构,用于表示BACnet IP设备的网络配置信息。下面是对结构体成员的解释:
IP_Address:一个长度为4的无符号整数数组,表示设备的IPv4地址。每个元素表示一个字节,共计4个字节。例如,IP地址为192.168.0.1,则数组的值为{192, 168, 0, 1}。
IP_Subnet_Prefix:一个长度为4的无符号整数数组,表示设备的子网掩码。用于确定设备所在的子网范围。与IP_Address类似,每个元素表示一个字节。
IP_Gateway:一个长度为4的无符号整数数组,表示设备的默认网关(路由器)的IPv4地址。用于设备与其他网络进行通信时的路由选择。
IP_DNS_Server:一个长度为BIP_DNS_MAX的二维无符号整数数组,用于存储最多BIP_DNS_MAX个DNS服务器的IPv4地址。这些DNS服务器用于解析域名。
Port:一个无符号16位整数,表示设备的BACnet IP通信端口号。
Mode:一个枚举类型(BACNET_IP_MODE),表示设备的网络模式。可能的模式包括静态IP(Static)、DHCP(Dynamic Host Configuration Protocol)等。
IP_DHCP_Enable:一个布尔值,表示是否启用设备的DHCP功能。
IP_DHCP_Lease_Seconds:一个无符号32位整数,表示设备通过DHCP获得的IP地址租约的持续时间(以秒为单位)。
IP_DHCP_Lease_Seconds_Remaining:一个无符号32位整数,表示DHCP租约剩余时间(以秒为单位)。
IP_DHCP_Server:一个长度为4的无符号整数数组,表示设备所连接的DHCP服务器的IPv4地址。
IP_NAT_Traversal:一个布尔值,表示是否启用设备的NAT(Network Address Translation)穿透功能。
IP_Global_Address:一个长度为4的无符号32位整数数组,表示设备的全局IPv6地址。
BBMD_Accept_FD_Registrations:一个布尔值,表示设备是否接受Foreign Device(FD)的注册。
BACnet网络端口(Network Port)对象的属性操作
Network_Port_Property_List函数:
该函数用于返回网络端口对象的所需、可选和专有属性列表。这些属性列表用于支持BACnet的ReadPropertyMultiple服务。
参数:
object_instance:对象实例号,表示要获取属性列表的对象实例。
pRequired:指向以-1结尾的整数列表的指针,表示所需属性的BACnet标识符列表。
pOptional:指向以-1结尾的整数列表的指针,表示可选属性的BACnet标识符列表。
pProprietary:指向以-1结尾的整数列表的指针,表示专有属性的BACnet标识符列表。
函数根据对象实例和网络类型设置相应的属性列表,然后将属性列表通过传入的指针返回。
Network_Port_Property_Lists函数:
该函数是Network_Port_Property_List函数的简化版本,通过调用Network_Port_Property_List函数来获取指定对象实例的属性列表。
参数:
pRequired:指向以-1结尾的整数列表的指针,表示所需属性的BACnet标识符列表。
pOptional:指向以-1结尾的整数列表的指针,表示可选属性的BACnet标识符列表。
pProprietary:指向以-1结尾的整数列表的指针,表示专有属性的BACnet标识符列表。
Network_Port_Object_Name函数:
该函数用于获取指定对象实例的对象名称,并将其存储在一个BACnet字符字符串中。
参数:
object_instance:对象实例号,表示要获取对象名称的对象实例。
object_name:指向BACnet字符字符串的指针,用于存储获取到的对象名称。
函数根据对象实例查找相应的网络端口对象,并将对象名称初始化到提供的字符字符串中。
Network_Port_Name_Set函数:
该函数用于设置指定对象实例的对象名称。
参数:
object_instance:对象实例号,表示要设置对象名称的对象实例。
new_name:指向静态ANSI C字符串的指针,表示要写入的对象名称。
函数根据对象实例找到相应的网络端口对象,并将提供的对象名称设置为新的对象名称。
这些函数用于对BACnet网络端口对象进行属性操作,包括获取属性列表、获取/设置对象名称等。这些函数可用于实现BACnet协议的相关功能和服务。
BACnet网络端口对象相关的属性操作
bool Network_Port_MAC_Address(
uint32_t object_instance, BACNET_OCTET_STRING *mac_address)
{
unsigned index = 0; /* offset from instance lookup */
bool status = false;
uint8_t *mac = NULL;
//uint8_t ip_mac[4 + 2] = { 0 };
size_t mac_len = 0;
index = Network_Port_Instance_To_Index(object_instance);
if (index < BACNET_NETWORK_PORTS_MAX) {
switch (Object_List[index].Network_Type) {
case PORT_TYPE_ETHERNET:
mac = &Object_List[index].Network.Ethernet.MAC_Address[0];
mac_len =
sizeof(Object_List[index].Network.Ethernet.MAC_Address);
break;
case PORT_TYPE_MSTP:
mac = &Object_List[index].Network.MSTP.MAC_Address;
mac_len = sizeof(Object_List[index].Network.MSTP.MAC_Address);
break;
case PORT_TYPE_BIP:
get_dev_hwaddr("eth0",Object_List[index].Network.Ethernet.MAC_Address);
fprintf(stderr, "DDC-BACnet:MACADDR:%X:%X:%X:%X:%X:%X\r\n ",
Object_List[index].Network.Ethernet.MAC_Address[0],Object_List[index].Network.Ethernet.MAC_Address[1],
Object_List[index].Network.Ethernet.MAC_Address[2],Object_List[index].Network.Ethernet.MAC_Address[3],
Object_List[index].Network.Ethernet.MAC_Address[4],Object_List[index].Network.Ethernet.MAC_Address[5]);
mac = &Object_List[index].Network.Ethernet.MAC_Address[0];
mac_len = 6;
break;
case PORT_TYPE_BIP6:
mac = &Object_List[index].Network.IPv6.MAC_Address[0];
mac_len = sizeof(Object_List[index].Network.IPv6.MAC_Address);
break;
default:
break;
}
if (mac) {
status = octetstring_init(mac_address, mac, mac_len);
}
}
return status;
}
bool Network_Port_MAC_Address_Set(
uint32_t object_instance, uint8_t *mac_src, uint8_t mac_len)
{
unsigned index = 0; /* offset from instance lookup */
bool status = false;
size_t mac_size = 0;
uint8_t *mac_dest = NULL;
index = Network_Port_Instance_To_Index(object_instance);
if (index < BACNET_NETWORK_PORTS_MAX) {
switch (Object_List[index].Network_Type) {
case PORT_TYPE_ETHERNET:
mac_dest = &Object_List[index].Network.Ethernet.MAC_Address[0];
mac_size =
sizeof(Object_List[index].Network.Ethernet.MAC_Address);
break;
case PORT_TYPE_MSTP:
mac_dest = &Object_List[index].Network.MSTP.MAC_Address;
mac_size = sizeof(Object_List[index].Network.MSTP.MAC_Address);
break;
case PORT_TYPE_BIP:
/* no need to set - created from IP address and UPD Port */
break;
case PORT_TYPE_BIP6:
mac_dest = &Object_List[index].Network.IPv6.MAC_Address[0];
mac_size = sizeof(Object_List[index].Network.IPv6.MAC_Address);
break;
default:
break;
}
if (mac_src && mac_dest && (mac_len == mac_size)) {
memcpy(mac_dest, mac_src, mac_size);
status = true;
}
}
return status;
}
/**
* For a given object instance-number, gets the BACnet Network Number.
*
* @param object_instance - object-instance number of the object
*
* @return APDU length for this network port
*/
uint16_t Network_Port_APDU_Length(uint32_t object_instance)
{
uint16_t value = 0;
unsigned index = 0;
index = Network_Port_Instance_To_Index(object_instance);
if (index < BACNET_NETWORK_PORTS_MAX) {
value = Object_List[index].APDU_Length;
}
return value;
}
/**
* For a given object instance-number, sets the BACnet Network Number
*
* @param object_instance - object-instance number of the object
* @param value - APDU length 0..65535
*
* @return true if values are within range and property is set.
*/
bool Network_Port_APDU_Length_Set(uint32_t object_instance, uint16_t value)
{
bool status = false;
unsigned index = 0;
index = Network_Port_Instance_To_Index(object_instance);
if (index < BACNET_NETWORK_PORTS_MAX) {
Object_List[index].APDU_Length = value;
status = true;
}
return status;
}
这段代码涉及与BACnet网络端口对象相关的属性操作。让我们逐个解释每个函数的作用:
Network_Port_MAC_Address函数:
根据给定的对象实例号,将MAC地址加载到一个八位字节字符串中。
参数:
object_instance:对象实例号,表示要获取MAC地址的对象实例。
mac_address:指向BACNET_OCTET_STRING的指针,用于存储获取到的MAC地址。
函数首先根据对象实例查找相应的网络端口对象,然后根据对象的网络类型获取相应的MAC地址和长度。
如果成功获取到MAC地址,将其初始化到提供的mac_address中,并返回true;否则返回false。
Network_Port_MAC_Address_Set函数:
根据给定的对象实例号,设置MAC地址和长度。
参数:
object_instance:对象实例号,表示要设置MAC地址的对象实例。
mac_src:指向MAC地址的指针,用于提供要设置的MAC地址。
mac_len:MAC地址的长度。
函数根据对象实例查找相应的网络端口对象,并根据对象的网络类型找到要设置的MAC地址的目的地址和长度。
如果提供了有效的MAC地址和目的地址,并且长度正确,将提供的MAC地址复制到目的地址,并返回true;否则返回false。
Network_Port_APDU_Length函数:
根据给定的对象实例号,获取BACnet网络端口的APDU长度。
参数:
object_instance:对象实例号,表示要获取APDU长度的对象实例。
函数根据对象实例查找相应的网络端口对象,并返回其APDU长度。
Network_Port_APDU_Length_Set函数:文章来源:https://www.toymoban.com/news/detail-849106.html
根据给定的对象实例号,设置BACnet网络端口的APDU长度。
参数:
object_instance:对象实例号,表示要设置APDU长度的对象实例。
value:要设置的APDU长度,范围为0到65535。
函数根据对象实例查找相应的网络端口对象,并将提供的APDU长度设置为该对象的属性。
如果提供的值在有效范围内,并成功设置属性,将返回true;否则返回false。
这些函数用于对BACnet网络端口对象进行MAC地址和APDU长度的获取和设置操作。它们可以用于处理与网络端口相关的功能和服务。文章来源地址https://www.toymoban.com/news/detail-849106.html
修改网络参数
/**
* For a given object instance-number, loads the ip-address into
* an octet string.
* Note: depends on Network_Type being set for this object
*
* @param object_instance - object-instance number of the object
* @param ip_address - holds the mac-address retrieved
*
* @return true if ip-address was retrieved
*/
bool Network_Port_IP_Address(
uint32_t object_instance, BACNET_OCTET_STRING *ip_address)
{
unsigned index = 0; /* offset from instance lookup */
bool status = false;
BACNET_IP_ADDRESS my_addr = {
0 };
index = Network_Port_Instance_To_Index(object_instance);
if (index < BACNET_NETWORK_PORTS_MAX) {
if (Object_List[index].Network_Type == PORT_TYPE_BIP) {
bip_get_addr(&my_addr);
fprintf(stderr, "DDC-BACnet: Address:%d.%d.%d.%d\r\n ",
my_addr.address[0],my_addr.address[1],my_addr.address[2],my_addr.address[3]);
Object_List[index].Network.IPv4.IP_Address[0] = my_addr.address[0];
Object_List[index].Network.IPv4.IP_Address[1] = my_addr.address[1];
Object_List[index].Network.IPv4.IP_Address[2] = my_addr.address[2];
Object_List[index].Network.IPv4.IP_Address[3] = my_addr.address[3];
status = octetstring_init(
ip_address, &Object_List[index].Network.IPv4.IP_Address[0], 4);
}
}
return status;
}
char *filename
到了这里,关于【BACnet ip网络参数设置和读取】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!