Giter VIP home page Giter VIP logo

znp-go's Introduction

ZigBee Network Processor (ZNP) Interface

Build Status

Overview

ZNP is used for communication between the host and a ZigBee device through a serial port. You can issue Monitor and Test (MT) commands to the ZigBee target from your application.

I tested it with cc2531, but it might work with cc253X

Example

To use it you need to provide a reference to an unp instance:

import (
	"go.bug.st/serial.v1"
	"github.com/davecgh/go-spew/spew"
	"github.com/dyrkin/unp-go"
	"github.com/dyrkin/znp-go"
)

func main() {
	mode := &serial.Mode{
		BaudRate: 115200,
	}

	port, err := serial.Open("/dev/tty.usbmodem14101", mode)
	if err != nil {
		log.Fatal(err)
	}
	port.SetRTS(true)

	u := unp.New(1, port)
	z := znp.New(u)
	z.Start()
}

Then you be able to run commands:

res, err := z.SysSetExtAddr("0x00124b00019c2ee9")
if err != nil {
	log.Fatal(err)
}
	
res, err = z.SapiZbPermitJoiningRequest("0xFF00", 200)
if err != nil {
	log.Fatal(err)
}

To receive async commands and errors, use AsyncInbound() and Errors() channels:

go func() {
    for {
        select {
        case err := <-z.Errors():
            fmt.Printf("Error received: %s\n", err)
        case async := <-z.AsyncInbound():
            fmt.Printf("Async received: %s\n", spew.Sdump(async))
        }
    }
}()

To log all ingoing and outgoing unp frames, use InFramesLog() and OutFramesLog() channels:

go func() {
    for {
        select {
        case frame := <-z.OutFramesLog():
            fmt.Printf("Frame sent: %s\n", spew.Sdump(frame))
        case frame := <-z.InFramesLog():
            fmt.Printf("Frame received: %s\n", spew.Sdump(frame))
        }
    }
}()

See more examples

znp-go's People

Contributors

dyrkin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

znp-go's Issues

Steward can miss asyncInbound frames

asyncInbound is an unbuffered channel, and this line is using non-blocking send:

case znp.asyncInbound <- cp:

This looked dangerous to me, so I added error logging to the default: case (failed to send), and sure enough, I was actually running into this. If consumer (let's say Steward) is processing an existing message and therefore is not waiting to receive, inbound frames are silently dropped on the floor.

Easy solution is to make this channel buffered, perhaps 10 or 100 frames.

Race condition in startup logic

These things happen in chronological order:

  1. Processors are started
    • incomingProcessor() and outgoingProcessor() are started as goroutines (which stop if znp.started == false)
  2. znp.started = true

The logic works because I guess, starting goroutines usually runs a bit later than the code following the goroutine launch. This is / should be an implementation detail of Go's runtime and should not be relied on. Who knows if on a slower processor or busier system these are executed in different order.

SysOsalNvRead() has wrong response type

func (znp *Znp) SysOsalNvRead(id uint16, offset uint8) (rsp *StatusResponse, err error) {

I believe the correct response type is SysOsalNvReadResponse:

znp-go/model.go

Line 347 in 69131cf

type SysOsalNvReadResponse struct {

The incorrect one takes into account only the status, the correct one also includes the read NVRAM content

I tested and NVRAM reading works with this change.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.