CoAP 服务中的 Observe 和 Multicast
CoAP
是一种专门为物联网设计的轻量级应用层协议,它基于 UDP
,支持观察(Observe
)和组播(Multicast
)等特性。其中 Observe
是 CoAP
的一个重要特性,它允许客户端注册对资源的观察,一旦资源发生变化,服务器就会主动通知客户端。这种机制非常适合物联网场景,例如传感器数据的实时监控、设备状态的实时更新等。其在传输层是基于 UDP
的单播来实现。而 Multicast
则可以实现一次性向多个设备发送数据,在传输层一般是基于 UDP
的组播来提高了数据传输的效率。
UDP 单播+组播的代码实现
C 实现 UDP 单播+组播的代码
由于 Go 的实现封装了很多细节,而且在直接用 Go 调用 CoAP 库的时候出现了一些问题,所以先写了一个 C 语言的实现,然后再仔细研究 Go 的实现。
1 |
|
上面的代码是一个简单的 UDP
组播+单播接收程序,它创建了一个 UDP
套接字,绑定到本地地址 0.0.0.0:5683
,并加入了组播组 224.0.1.187
。然后通过 recvfrom
函数接收数据,打印接收到的消息。
运行程序
1 | $ gcc -o udp_multicast_receive udp_multicast_receive.c |
Go 实现 UDP 单播+组播的代码
1 | package main |
上面的代码是一个简单的 Go
版本的 UDP
组播+单播接收程序,它创建了一个 UDP
套接字,绑定到组播地址 224.0.1.187:5683
,然后通过 ReadFromUDP
函数接收数据,打印接收到的消息。此时已经可以收到发送到组播地址的消息和发送到该主机的单播消息。测试程序如下:
1 | package main |
1 | package main |
CoAP 服务中的 Observe 和 Multicast
找了一个 CoAP
的库 github.com/plgd-dev/go-coap 来实现 CoAP
服务中的 Observe
和 Multicast
。
直接用 go-coap
库实现 Observe
和 Multicast
的代码会有一些问题,其中 Observe
的主要是通过库的 ListenAndServe
接口,封装了监听和启动服务的细节,其 example
代码如下:
1 | func main() { |
而 Multicast
则是需要通过该库的 NewListenUDP
接口创建一个 UDP
连接,然后通过 Serve
接口来启动服务,其 example
代码如下:
1 | func main() { |
Go 实现 CoAP 服务中的 Observe 和 Multicast
上面的两个例子分别实现了 Observe
和 Multicast
的功能,下面将两个例子结合起来,实现 CoAP
服务中的 Observe
和 Multicast
的功能。
1 | package main |