Categorygithub.com/NubeDev/bacnet
repositorypackage
0.1.9
Repository: https://github.com/nubedev/bacnet.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# README

bacnet

bacnet client written in go.

Installation

learn some golang if you don't know it first :)

go mod tidy

For usage run:

go mod tidy
cd cli
go run main.go --help

examples

change out the interface and device and so on

whois

go run main.go whois --interface=wlp3s0
go run main.go whois --interface=wlp3s0

read AO

go run main.go read --interface=wlp3s0 --device=202 --objectID=1 --objectType=1 --property=87

write to an AO

go run main.go write --interface=wlp3s0 --device=202 --address=192.168.15.20 --network=4 --mstp=1 --objectID=1 --objectType=1 --property=85 --priority=16 --value=21

write null to @16

go run main.go write --interface=wlp3s0 --device=202 --objectID=1 --objectType=1 --property=85 --priority=16 --null=true

over a bacnet to ms-tp network

  • router ip: 192.168.15.20
  • bacnet router network number: 4
  • bacnet mstp(rs485) mac address (between 0-255): 1
go run main.go read --interface=wlp3s0 --device=202 --address=192.168.15.20 --network=4 --mstp=1 --objectID=1 --objectType=1 --property=85 

get device name

go run main.go read --interface=wlp3s0 --device=202 --address=192.168.15.20 --network=4 --mstp=1 --objectID=202 --objectType=8 --property=77

Max APDU Length

Max APDU Length is important on for read/write prop multiple

In the variable "Max APDU Length Accepted" the following are the values that can be returned:

mstp device: 480
ip device: 1476

example same device getting the max APDU

get device MaxApdu length over MSTP will return 480

go run main.go read --interface=wlp3s0 --device=202 --address=192.168.15.20 --network=4 --mstp=1 --objectID=202 --objectType=8 --property=62

get device MaxApdu length and on the same device but over IP will return 1476

go run main.go read --interface=wlp3s0 --device=202 --address=192.168.15.202 --network=0 --mstp=0 --objectID=202 --objectType=8 --property=62

Library

  • Who Is
  • Iam
  • Read Property
  • Read Multiple Property (beta)
  • Read Range
  • Write Property
  • Write Property Multiple (beta)
  • Who Has
  • What Is Network Number (beta)
  • Who Is Router To Network (beta)
  • Change of Value Notification
  • Event Notification
  • Subscribe Change of Value
  • Atomic Read File
  • Atomic Write File

Command Line Interface

  • Who Is
  • Iam
  • Read Property
  • Read Multiple Property
  • Read Range
  • Write Property
  • Write Property Multiple
  • Who Has
  • What Is Network Number
  • Who Is Router To Network
  • Atomic Read File
  • Atomic Write File

testing

Tested on devices

  • Johnson Controls (FEC)
  • Easy-IO 30p, tested over IP and ms-tp
  • Delta Controls
  • Reliable Controls
  • Honeywell Spyder
  • Niagara N4 jace
  • Schneider

tested with other bacnet-libs

  • bacnet-stack
  • bacnet-4j
  • bacpypes

This library is heavily based on the BACnet-Stack library originally written by Steve Karg.

example whois

	bytes := []byte{
		0x81, 0x0b, 0x00, 0x08, // BVLC
		0x01, 0x00, // NPDU
		0x10, 0x08, // APDU
	}

	pc, err := net.ListenPacket("udp4", ":47809")
	if err != nil {
		panic(err)
	}
	defer pc.Close()

	addr, err := net.ResolveUDPAddr("udp4", "255.255.255.255:47808")
	if err != nil {
		panic(err)
	}

	_, err = pc.WriteTo(bytes, addr)
	if err != nil {
		panic(err)
	}
	d := make([]byte, 1)

	a, b, c := pc.ReadFrom(d)
	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)