【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 
  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: BACnet IP模拟器是一种能够模拟BACnet网络的软件程序。BACnet是一种用于建筑自动化系统中的通信协议,它允许不同厂商的设备之间进行无缝通信。而BACnet IP则是一种基于互联网协议的BACnet通信方式。 BACnet IP模拟器的主要作用是在模拟环境下测试BACnet设备的互通性、功能性和性能等方面。可以通过模拟器来测试设备的读写、控制、报警等功能,以及模拟各种异常情况和场景。 该软件的主要优点是可以节省硬件成本、提高测试效率和保证系统稳定性。通过使用模拟器,可以在没有实际设备的情况下进行测试,避免了测试成本的浪费。此外,模拟器也可以大大降低测试的复杂度,通过设定模拟环境,可以模拟出各种异常情况和故障场景,以便更加深入地测试设备的可靠性和性能。 总之,BACnet IP模拟器在建筑自动化系统中的应用具有重要的意义,可以提高系统的可靠性和安全性,降低测试成本,加快项目进度。随着建筑自动化系统的不断发展,BACnet IP模拟器将会在未来得到更加广泛的应用。 ### 回答2: BACnet是一个通用的自动化控制系统网络协议,它已成为许多建筑自动化系统中最常用的通信协议之一。而BACnet IP模拟器是一种能够模拟BACnet IP网络的工具或设备,主要用于测试和调试BACnet网络中的设备、控制器或系统。 通过使用BACnet IP模拟器,用户可以模拟出一个BACnet IP网络环境,利用该环境对BACnet设备进行测试和调试,以保证设备的正常工作和协议的正确性。同时,BACnet IP模拟器还可以实现自定义的BACnet网络拓扑结构、模拟各种设备行为以及捕捉和显示BACnet网络数据包等功能。 BACnet IP模拟器的应用范围比较广泛,包括但不限于以下几个方面:一是建筑自动化系统的开发和调试。在BACnet协议下,建筑自动化系统通常涉及多个设备、传感器、控制器和应用程序,BACnet IP模拟器可以帮助开发人员测试和验证其BACnet设备的正确性和稳定性。二是BACnet网络的性能测试和调优。BACnet IP模拟器可以模拟各种网络负载、不同的延迟和丢包率等网络状况,帮助用户评估并优化BACnet网络的性能。三是BACnet网络的故障排查和维护。通过捕捉和显示BACnet网络数据包,BACnet IP模拟器可以帮助用户快速定位网络问题,并进行相应的维护和修复。 总之,BACnet IP模拟器是BACnet网络测试和调试的重要工具,帮助用户保证自动化控制系统的正确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥嵌入式开发

坚持不易,你们的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值