1. CoapEndpoint: 绑定到
- 成员变量coapStack: 业务层处理,使用线程池,对应CoapEndpoint中的executor
- 成员变量connector: 传输层处理,发送和接收消息,使用单独线程,对应UDPConnector中的Sender、Receiver
2. 逻辑结构
发送消息:使用了比较常用的设计方法,使用阻塞消息队列,隔离了coap协议层组装coap消息(即生产消息)、和只负责发送coap消息的Sender(即消费消息)
UDPConnector中的send方法
接收消息:
CoapEndpoint中的InboxImpl
UDPConnector.java
3. 常用的模式
生产者 -> 阻塞消息队列 -> 消费者
(mqtt paho 中发送消息,也使用了该种方式,不过使用的是Vector作为队列,Object作为lock,整体作为阻塞队列来进行控制)
优点:
业务解耦,模块解耦
阻塞消息队列,还可以类比一些消息中间件,比如:kafka、rocketmq、rabbitmq等
参考:
https://github.com/eclipse/californium
https://github.com/eclipse/californium/issues/434 UDPConnector中没有使用NIO,有人提议可以使用UDP NIO,比如基于netty实现传输层,作者认为改动后优势不大,所以暂时没动
https://gist.github.com/martinmine/7ef19800cdcd380a138bae5bec89e18e 其他人提供了基于UDP NIO实现的Connector
https://stackoverflow.com/questions/16048284/whats-the-point-of-using-udp-with-nio/16048705#16048705
https://github.com/eclipse/leshan 基于Californium实现了lwm2m client / server