Mio Blog

do while

使用Golang与BACNet协议设备进行通讯

本文为Golang与使用BACNet协议设备的通讯示例。

BACNet包使用:github.com/alexbeltran/gobacnet

Golang版本:1.20

测试环境:MacOS Ventura13.3.1、Windows10 22H2、CentOS9 Stream、Ubuntu Server 22.10、OpenEuler 22.09


bacnet.org

  1. BACNet概念

BACnet(Building Automation and Control Networks)是一种用于建筑自动化和控制系统的通信协议和标准。它是一个开放的、厂商中立的通信协议,用于在建筑物自动化和控制系统中实现设备之间的通信和数据交换。

  1. BACNet示例
func BACNetReadOne() {
    varTypes := flag.Int("t", 0, "-t 0")
    varAddress := flag.Int("a", 0, "-a 0")

    flag.Parse()

        // 使用网卡名称来构建客户端
        // 端口可以直接使用DefaultPort
    client, err := gobacnet.NewClient("br-sw", gobacnet.DefaultPort)
    if err != nil {
        log.Println(err)
        return
    }

    // 查找设备 指定ID
        // 或者使用client.WhoIs(0, types.ArrayALl)
        // 来查询所有设备
    devices, err := client.WhoIs(500, 500)
    if err != nil {
        log.Fatal(err)
    }

    for _, device := range devices {
        log.Printf("get device %d", device.ID.Instance)

        rpm := types.ReadMultipleProperty{}
        rpm.Objects = make([]types.Object, 0)

        rpm.Objects = append(rpm.Objects, types.Object{
            ID: types.ObjectID{ // ObjectId用于确定要查的具体变量点
                Type:     types.ObjectType(*varTypes),
                Instance: types.ObjectInstance(*varAddress),
            },
            Properties: []types.Property{ // Properties用于确定要查取的内容
                {
                    Type:       property.PresentValue, // PresentValue为查值
                    ArrayIndex: types.ArrayAll,
                },
            },
        })

                // 查多个,本方法支持一次性传入多个Objects来同时查取
        r, err := client.ReadMultiProperty(device, rpm)
        if err != nil {
            log.Fatal("err", err)
        }

        for _, object := range r.Objects {
            //log.Println("name:", object.Properties[0].Data)
            log.Println("value:", object.Properties[0].Data)
        }
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注