Skip to content

ytuox/bacnet

This branch is 3 commits ahead of NubeDev/bacnet:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

cd50290 · Mar 2, 2024

History

83 Commits
Mar 2, 2024
Mar 2, 2024
Mar 2, 2024
Mar 2, 2024
Mar 2, 2024
Mar 2, 2024
May 25, 2022
May 7, 2022
May 7, 2022
Jan 11, 2023
Jun 22, 2022
Mar 2, 2024
Mar 2, 2024
Mar 2, 2024
Jul 28, 2022
Mar 2, 2024
Mar 2, 2024
Mar 2, 2024
May 7, 2022
Mar 2, 2024
Mar 2, 2024
Mar 2, 2024
Mar 2, 2024
Mar 2, 2024
Mar 2, 2024
Mar 2, 2024
Mar 2, 2024

Repository files navigation

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)

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Go 100.0%