TLP消息协议
概述
TLP消息协议(TLP Message Protocol,简称TLP-MP)为TLP系统中的软件组件提供了“请求-应答”式和广播式的消息传输机制。
在TLP系统中,软件组件之间需要跨进程和跨网络的服务调用机制,并且软件组件需要将产生的事件异步地通知给多个其它的软件组件。TLP-MP采用了在消息总线上提供“发布-订阅”操作的方式来满足这两种需求:
- 当软件组件需要对外提供服务时,它可以通过订阅一个我们称作消息路径的地址来监听所有发送到该路径上的消息;
- 当软件组件需要调用某个已经发布的服务时,它可以向一个消息路径发送请求消息,并期待在自己监听的回应消息路径上接收到调用结果;
- 当软件组件在一个消息路径上对外广播事件时,所有订阅了该消息路径的软件组件将接收到这个广播的事件消息。
为了对消息的传输进行权限控制,TLP-MP将每个消息路径视作资源地址,并定义了如下几种请求消息的操作类型,便于权限控制组件根据地址和操作类型进行访问控制:
- GET操作,表明该请求操作的目的是读取资源内容,不会改变资源的内容;
- PUT操作,表明该请求操作的目的是将该资源内容更新为提供的数据内容;
- POST操作,表明该请求操作的目的是创建新的子项或者对该资源内容进行部分修改;
- DELETE操作,表明该请求操作的目的是删除该资源;
消息格式
TLP-MP中的消息由消息地址、消息头和消息体构成:
- 消息地址唯一确定了“请求-应答”式消息的去向(即接收者的地址),或广播式消息的来源(即发送者的地址);
- 消息头包含有消息相关的描述信息,比如“请求-应答”式消息的操作类型、发送者等;
- 消息体包含有软件组件想要给其它组件传递的数据。
消息地址
消息地址是一段由‘/’符号分隔的字符串,格式为:
/MP/1.0/<controllerId>/(events|services|components)/[...]
说明
<controllerId>是控制器在一个控制器网络中的唯一标识。
在TLP-MP中,一共有5类地址:
- 公共服务地址。系统中的默认服务订阅了一个消息地址,实时回应发送到所订阅地址上的请求。格式是:
/MP/1.0/<controllerId>/services/<serviceId>/...
说明
<serviceId>是服务的唯一标识,相同的服务具有相同的serviceId。- 默认服务是指当有多个软件组件提供相同serviceId的服务时,默认被访问的那一个服务实现。当系统中仅有一个软件组件提供某serviceId所代表的服务时,那么该服务即自动被认为是默认服务。当有多个选择时,默认服务通常由管理员决定。
- 公共广播地址,所有默认服务的事件消息均从公共广播地址发出。订阅一个公共广播地址,则意味着当该地址上有事件发出时,订阅者将收到消息。公共广播地址的格式是:
/MP/1.0/<controllerId>/events/<serviceId>/...
- 组件私有服务地址,用来访问非默认服务。发送请求的软件组件必须知道提供服务的组件的ID。格式是:
/MP/1.0/<controllerId>/components/<componentId>/services/<serviceId>/...
说明
<componentId>是控制器范围内软件组件的唯一标识。
- 组件私有广播地址,用来发送软件组件私有服务的广播。格式是:
/MP/1.0/<controllerId>/components/<componentId>/events/<serviceId>/...
- 回应地址,用来接收服务请求的回应。格式是:
/MP/1.0/<controllerId>/components/<componentId>/results/<serviceId>/...
消息头
TLP-MP的消息头中包含了消息相关的信息,这些信息已以键值对的形式体现,每个键值对称为一个字段,消息头可包含多个字段。
请求消息的消息头
| 字段名 | 取值范围 | 含义 |
|---|---|---|
| method | GET|PUT|POST|DELETE | 操作类型 |
| sender | 字符串 | 发出请求消息的软件组件的componentId |
| contentType | Media Types | 消息体的编码方式 |
| correlation | 整数 | 将请求与回应消息相对应的唯一编号 |
示例
{
"method": "GET",
"sender": "Xn2iZkj9",
"correlation": 23123243,
"contentType": "applications/cbor"
}
回应消息的消息头
| 字段名 | 取值范围 | 含义 |
|---|---|---|
| method | GET|PUT|POST|DELETE | 操作类型 |
| sender | 字符串 | 接入TLP-MP的Client-ID |
| contentType | Media Types | 消息体的编码格式 |
| correlation | 整数 | 将请求与回应消息相对应的唯一编号 |
| code | RFC 7231 Response Status Codes | 请求的执行情况的回应代码 |
| message | 字符串 | 请求的执行情况的文字说明 |
示例
{
"method": "GET",
"sender": "Xn2i2kak",
"correlation": 23123243,
"contentType": "applications/cbor",
"code": 200,
"message": "Success"
}
事件消息的消息头
| 字段名 | 取值范围 | 含义 |
|---|---|---|
| event | 字符串 | 事件名 |
| contentType | Media Types | 消息体的编码格式 |
示例
{
"event": "BridgePresence",
"contentType": "applications/cbor"
}
消息体
TLP-MP的消息体用来承载消息的具体内容,其编码格式由消息头中的contentType决定。
承载协议
MQTT
TLP-MP支持以MQTT 3.1.1为承载协议,其中:
- 消息地址即为MQTT消息的
Topic; - 消息头以CBOR编码后放入MQTT消息的
Payload; - 消息体以
content为字段名,与消息头的字段一同被放入MQTT消息的Payload;