-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlwm2m_client.go
100 lines (84 loc) · 2.1 KB
/
lwm2m_client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package main
import (
"log"
"github.com/msangoi/go-coap"
"os"
"net"
"time"
"math/rand"
)
func main() {
if len(os.Args) != 3 {
log.Fatalf("Invalid number of arguments, expected <serverHost> <serverPort>")
}
serverHost := os.Args[1]
serverPort := os.Args[2]
log.Println("Starting LWM2M client")
rand.Seed(time.Now().Unix())
msgId := rand.Intn(10000)
// binding to a UDP socket
laddr, err := net.ResolveUDPAddr("udp", ":5685")
if err != nil {
log.Fatal(err)
}
c, err := net.ListenUDP("udp", laddr)
if err != nil {
log.Fatal(err)
}
// Send register request
register := coap.Message{
Type: coap.Confirmable,
Code: coap.POST,
MessageID: uint16(msgId),
Payload: []byte("</3/0>"),
}
register.SetPathString("/rd")
register.AddOption(coap.URIQuery, "ep=goclient");
// server address
uaddr, err := net.ResolveUDPAddr("udp", serverHost + ":" + serverPort)
if err != nil {
log.Fatal(err)
}
err = coap.Transmit(c, uaddr, register)
if err != nil {
log.Fatalf("Error while sending registration request: %v", err)
}
buf := make([]byte, 1500)
rv, err := coap.Receive(c, buf)
if err != nil {
log.Fatalf("Error while sending registration request: %v", err)
}
if &rv != nil {
log.Printf("Ack received: %v", &rv)
log.Printf("Registered with id: %s", rv.Options(coap.LocationPath)[1])
}
// Listen for incoming requests
rh := coap.FuncHandler(func(l *net.UDPConn, a *net.UDPAddr, m *coap.Message) *coap.Message {
log.Printf("New message: path=%q: %#v from %v", m.Path(), m, a)
if m.IsConfirmable() {
res := &coap.Message{
Type: coap.Acknowledgement,
Code: coap.Content,
MessageID: m.MessageID,
Token: m.Token,
Payload: []byte("Plop"),
}
res.SetOption(coap.ContentFormat, coap.TextPlain)
for _, p := range m.Path() {
m.AddOption(coap.LocationPath, p)
}
return res
}
return nil
})
c.SetReadDeadline(time.Time{})
buf = make([]byte, 1500)
for {
nr, addr, err := c.ReadFromUDP(buf)
if err == nil {
tmp := make([]byte, nr)
copy(tmp, buf)
go coap.HandlePacket(c, tmp, addr, rh)
}
}
}