【BACnet ip网络参数设置和读取】

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函数:

根据给定的对象实例号,设置BACnet网络端口的APDU长度。
参数:
object_instance:对象实例号,表示要设置APDU长度的对象实例。
value:要设置的APDU长度,范围为0到65535。
函数根据对象实例查找相应的网络端口对象,并将提供的APDU长度设置为该对象的属性。
如果提供的值在有效范围内,并成功设置属性,将返回true;否则返回false。
这些函数用于对BACnet网络端口对象进行MAC地址和APDU长度的获取和设置操作。它们可以用于处理与网络端口相关的功能和服务。

修改网络参数

/**
 * 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 

相关推荐

  1. 【BACnet ip网络参数设置读取

    2024-03-19 18:46:02       30 阅读
  2. 网络模型的保存读取

    2024-03-19 18:46:02       38 阅读
  3. 设置Jira启动参数选项

    2024-03-19 18:46:02       77 阅读
  4. 人大金仓参数查看设置

    2024-03-19 18:46:02       31 阅读
  5. js获取设置url参数

    2024-03-19 18:46:02       25 阅读
  6. Python 如何设置读取 config.ini 文件

    2024-03-19 18:46:02       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-19 18:46:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-19 18:46:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-19 18:46:02       82 阅读
  4. Python语言-面向对象

    2024-03-19 18:46:02       91 阅读

热门阅读

  1. filebeat 配置

    2024-03-19 18:46:02       36 阅读
  2. 深入理解并优化Android中的文件描述符(FD)

    2024-03-19 18:46:02       43 阅读
  3. Vue组件通信

    2024-03-19 18:46:02       44 阅读
  4. 【机器学习】1 机器学习概述

    2024-03-19 18:46:02       41 阅读
  5. 蓝桥杯day4刷题日记

    2024-03-19 18:46:02       46 阅读
  6. 手撕ListIterator底层源码

    2024-03-19 18:46:02       40 阅读
  7. 【C语言】函数的基本使用

    2024-03-19 18:46:02       46 阅读
  8. 面试算法-49-缺失的第一个正数

    2024-03-19 18:46:02       39 阅读
  9. springboot日志配置文件log4j2.xml

    2024-03-19 18:46:02       34 阅读
  10. Python高级语法

    2024-03-19 18:46:02       41 阅读
  11. 19 # 高级类型:索引类型

    2024-03-19 18:46:02       37 阅读
  12. Vue关键字important强制指定样式优先级

    2024-03-19 18:46:02       37 阅读