Canopus is a client/server implementation of the Constrained Application Protocol (CoAP)
package main
import (
. "github.com/zubairhamed/canopus"
"log"
)
/* To test this example, also run examples/test_server.go */
func main() {
client := NewCoapServer(":0")
client.OnStart(func (server *CoapServer){
client.Dial("localhost:5683")
req := NewRequest(TYPE_CONFIRMABLE, GET, GenerateMessageId())
req.SetStringPayload("Hello, canopus")
req.SetRequestURI("/hello")
resp, err := client.Send(req)
if err != nil {
log.Println(err)
} else {
log.Println("Got Response:")
log.Println(resp.GetMessage().Payload.String())
}
})
client.OnMessage(func(msg *Message, inbound bool){
if inbound {
log.Println(">>>>> INBOUND <<<<<")
} else {
log.Println(">>>>> OUTBOUND <<<<<")
}
PrintMessage(msg)
})
client.Start()
}
server := NewLocalServer()
server.Get("/hello", func(req *Request) *Response{
msg := NewMessageOfType(TYPE_ACKNOWLEDGEMENT, req.GetMessage().MessageId)
msg.SetStringPayload("Acknowledged: " + req.GetMessage().Payload.String())
res := NewResponse(msg, nil)
return res
})
server.Start()
package main
import (
. "github.com/zubairhamed/canopus"
"time"
"log"
"math/rand"
"strconv"
)
func main() {
server := NewLocalServer()
server.Get("/watch/this", routeHandler)
GenerateRandomChangeNotifications(server)
server.OnMessage(func (msg *Message, inbound bool){
// PrintMessage(msg)
})
server.OnObserve(func(resource string, msg *Message){
log.Println("Observe Requested for " + resource)
})
server.Start()
}
func GenerateRandomChangeNotifications(server *CoapServer) {
ticker := time.NewTicker(3 * time.Second)
go func() {
for {
select {
case <-ticker.C:
changeVal := strconv.Itoa(rand.Int())
log.Println("Notify Change..", changeVal)
server.NotifyChange("/watch/this", changeVal, false)
}
}
}()
}
func routeHandler(req *Request) *Response {
msg := NewMessageOfType(TYPE_ACKNOWLEDGEMENT, req.GetMessage().MessageId)
msg.SetStringPayload("Acknowledged")
res := NewResponse(msg, nil)
return res
}
package main
import (
. "github.com/zubairhamed/canopus"
"log"
)
func main() {
client := NewCoapServer(":0")
client.OnStart(func (server *CoapServer){
client.Dial("localhost:5683")
req := NewRequest(TYPE_CONFIRMABLE, GET, GenerateMessageId())
req.SetRequestURI("/watch/this")
req.GetMessage().AddOption(OPTION_OBSERVE, 0)
_, err := client.Send(req)
if err != nil {
log.Println(err)
}
})
var notifyCount int = 0
client.OnNotify(func (resource string, value interface{}, msg *Message) {
if notifyCount < 4 {
notifyCount++
log.Println("Got Change Notification for resource and value: ", notifyCount, resource, value)
} else {
log.Println("Cancelling Observation after 4 notifications")
req := NewRequest(TYPE_CONFIRMABLE, GET, GenerateMessageId())
req.SetRequestURI("watch/this")
req.GetMessage().AddOption(OPTION_OBSERVE, 0)
_, err := client.Send(req)
if err != nil {
log.Println(err)
}
}
})
client.Start()
}