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

这篇具有很好参考价值的文章主要介绍了【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长度的获取和设置操作。它们可以用于处理与网络端口相关的功能和服务。文章来源地址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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Tcp的三次握手及netty和实际开发如何设置全连接队列参数

    上图 第一次握手,client 发送 SYN 到 server,状态修改为 SYN_SEND,server 收到,状态改变为 SYN_REVD,并将该请求放入 sync queue 队列 第二次握手,server 回复 SYN + ACK 给 client,client 收到,状态改变为 ESTABLISHED,并发送 ACK 给 server 第三次握手,server 收到 ACK,状态改变为 ESTABLISHED,将

    2024年02月08日
    浏览(48)
  • OpenWrt网络打印机TCP/IP共享设置教程——以703N为例(PCL)

    在本教程中,我们将探讨如何在OpenWrt路由器上设置TCP/IP共享以实现打印机的网络共享。我们以OpenWrt路由器型号703N为例,并使用PCL作为打印机的语言。 步骤1:准备工作 首先,确保你已经在OpenWrt路由器上安装了最新版本的OpenWrt固件,并且已经连接到你的网络。另外,确保你

    2024年02月08日
    浏览(87)
  • 如何正确设置电脑的IP地址和DNS等参数[图文]

    使用宽带路由器的话一般建议手工指定电脑的IP地址和DNS等参数,设置方法参考下文。 如果你使用的是Windows 2000或Windows XP系统,请点击 “网上邻居”―― “本地连接”――“属性”――“Internet协议 (TCP/IP)属性”,将会看到如下界面: 图1 Internet协议(TCP/IP)属性 IP地址

    2024年02月06日
    浏览(64)
  • 如何在Node.js中使用环境变量或命令行参数来设置HTTP爬虫ip?

    首先,定义问题:在 Node.js 应用程序中,我们可以通过环境变量或命令行参数来设置HTTP爬虫ip,以便在发送请求时使用这些HTTP爬虫ip。 亲身经验:我曾经需要为一个项目设置HTTP爬虫ip,以便在发送请求时使用这些HTTP爬虫ip。我通过环境变量和命令行参数来实现这一点。 数据

    2024年02月07日
    浏览(63)
  • 如何在 Linux 中将本地网络 IP 设置为静态的

    笔者的运行环境: CentOS 8 Red Hat Enterprise Linux 9   在 Linux 中将本地网络 IP 设置为静态的,只需要在那台 Linux 上设置即可。为了方便,这里笔者使用了 Xshell 来远程访问那台 Linux。关于如何在 Windows 主机上访问本地局域网中的 Linux 主机,可见笔者的另一篇博客:    如何在

    2024年02月07日
    浏览(44)
  • BACnet IP通讯方式组网步骤

    BACnet IP方式组网的几个优势: 高效性:BACnet IP方式组网使用标准的TCP/IP协议,能够实现高效的数据传输和通信,提高了网络的数据传输速率和响应速度。 网络拓扑灵活:BACnet IP方式组网能够灵活地适应各种网络拓扑结构,包括星型、环型、总线型等多种结构,方便快捷地扩

    2024年02月01日
    浏览(41)
  • BACnet路由器 BA101专为实现BACnet IP和BACnet MS/TP协议之间的相互转化而研发的。

    随着通讯技术和控制技术的发展,为了实现楼宇的高效、智能化管理,集中监控管理已成为楼宇智能管理发展的必然趋势。在此背景下,高性能的楼宇暖通数据传输解决方案——协议转换网关应运而生,广泛应用于楼宇自控和暖通空调系统应用中。 钡铼技术始终坚持以用户需

    2024年02月22日
    浏览(42)
  • Modbus Poll读取plc数据(TCP/IP读取),并查看指定地址指定数据

     1.首先连接,点击Connection-connect,选择Modbus TCP/IP,输入IP和端口号(Server Port) 2.连接后,Tx=0下没有红色错误提示则表示连接成功,右键数据界面选择Read/write Definition  3. Address:表示开始读取的地址数,比如plc地址为D801,那么在此文本框内输入800,就可以从  800开始显示数据

    2024年02月15日
    浏览(47)
  • Ubuntu23.04-配置静态IP地址TCP/IP参数

    Ubuntu 23.04 点击右上角网络图标中的设置   先开启服务 使用ip a命令查看一下        

    2024年02月09日
    浏览(51)
  • Ubuntu 22.04网络配置指南:如何设置静态IP和自定义DNS服务器

    找到并打开Netplan配置文件 : 在Ubuntu终端中,输入以下命令来编辑Netplan的配置文件: 请确保文件名与您系统中实际的文件名匹配。 更新配置文件 : 使用以下内容替换文件中的内容(根据实际情况调整接口名称 enp0s3 、IP地址、网关和DNS服务器): 在这个配置中: enp0s3 是网

    2024年04月11日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包