Californium 源码分析
1. Californium 项目简介
Californium 是一款基于Java实现的Coap技术框架,该项目实现了Coap协议的各种请求响应定义,支持CON/NON不同的可靠性传输模式。
Californium 基于分层设计且高度可扩展,其内部模块设计及接口定义存在许多学习之处;
值得一提的是,在同类型的 Coap技术实现中,Californium的性能表现是比较突出的,如下图:
更多的数据可以参考Californium-可扩展云服务白皮书
本文以框架的源码分析为主,其他内容不做展开。
2. 项目结构
目前Californium 项目稳定版本为 2.0.0-M2,项目的托管地址在:
https://github.com/eclipse/californium
模块说明
~.californium-core
californium 核心模块,定义了一系列协议栈核心接口,并提供了Coap协议栈的完整实现,
~.element-connector
从core模块剥离的连接器模块,用于抽象网络传输层的接口,使得coap可以同时运行于udp和tcp多种传输协议之上;
~.scandium-core
Coap over DTLS 支持模块,提供了DTLS 传输的Connector实现;
~.californium-osgi
californium 的osgi 封装模块;
~.californium-proxy
coap 代理模块,用于支持coap2coap、coap2http、http2coap的转换;
~.demo-xxx
样例程序;
其中,californium-core和element-connector是coap技术实现最关键的模块,后面的分析将围绕这两个模块进行。
3. 分层设计
Californiium 定义了三层架构:
1 网络层,负责处理端口监听,网络数据收发;
2 协议层,负责Coap协议数据包解析及封装,实现消息的路由、可靠性传输、Token处理、观察者模型等等;
3 逻辑层,负责 Resource定义和映射,一个Resource 对应一个URL,可独立实现Coap 请求处理。
异步线程池
三层架构中都可以支持独立的线程池,其中网络层与协议层的线程池保持独立;
逻辑层可为每个Resource指定独立的线程池,并支持父级继承的机制,即当前Resource若没有定义则沿用父级Resource线程池;
若逻辑层未指定线程池,则默认使用协议层的线程池。
4. 包结构分析
4.1 californium-core
core 模块定义了协议栈相关的所有关键接口,根据功能职责的不同拆分为多个子 package;
根级 package定义的是Coap应用的一些入口类,如Client/Server实现、包括应用层CoapResource的定义。
4.1.1 package-coap
实现 coap协议 RFC7252 实体定义,包括消息类型、消息头、Observe机制等。
具体定义见下图
Coap 消息划分为Request/Response/EmptyMessage 三类;
MessageObserver 接口用于实现消息的状态跟踪,如重传、确认等。
4.1.2 package-network
network 是协议栈核心机制实现的关键模块,其涵盖了网络传输及协议层的定义及实现;
模块实现了一些关键接口定义,如将网络传输端点抽象为Endpoint,根据请求响应的关联模型定义了Exchange等。
协议栈的分层定义、消息编解码、拦截处理也由network包提供。
endpoins定义
Endpoint 定义为一个端点,通常与一个IP和端口对应,其屏蔽了client和server交互时的网络传输细节。
对于client来说,Endpoint代表通讯的服务端地址端口;而对于server来说则代表了绑定监听的地址及端口。
CoapEndpoint实现了Endpoint接口,通过RawDataChannel(见elements-connector部分)接口实现消息接收,通过Outbox接口实现消息发送。
通常CoapEndpoint 会关联一个Connector,以实现传输层的收发;
CoapStack对应了协议栈接口,用于处理CoapEndpoint上层的消息链路;
除此之外,CoapEndpoint 还应该包括消息编解码、拦截处理等功能。
exchange定义
Exchange描述了请求-响应模型,一个Exchange会对应一个Request,相应的Response,以及当前的Endpoint;
ExchangeObserver用于实现对Exchange状态的变更监听;
Exchange 通常存在于两种场景:
1 发送请求后初始化并存储,当接收到对应的响应之后变更为completed(执行清理工作)。
2 接收请求后初始化并存储,当发送响应时执行清理;
matcher定义
Matcher 是用于实现Exchange 生成及销毁的模块,提供了几个收发接口;
用于消息在进入协议栈CoapStack处理之前完成配对处理;
messagetool定义
MessageExchangeStore 实现了Exchange的查询、存储;
MessageIdProvider 用于提供Coap消息的MID,一个MID代表了一个唯一的消息(在消息生命周期内);
TokenProvider 用于提供Coap消息的Token,而Request及Response通过Token实现匹配;
network子模块
package-config
提供网络参数配置定义
package-deduplication
提供消息去重机制的实现
package-interceptors
提供消息传输拦截器定义
package-serialization
提供消息包的解析及编码实现
package-stack
提供协议栈分层定义及实现