协议转换
概念说明
协议转换模块为第二层配置,用于配置协议的转换规则,输入输出示例以模版引擎加持进行动态替换
- 协议:选择协议记录模块中的协议
- 数据流向:设备到平台/平台到设备
- Topic规则:匹配的需要转换的Topic规则,支持通配符匹配
- 输入Topic示例:需要转换的实际Topic值,已替换为真实数据
- 输入Json示例:需要转换的实际Json值,已替换为真实数据
- 输出Topic模版:转换后的Topic模版,支持模版引擎
- 输出Json模版:转换后的Json模版,支持模版引擎
配置说明
用户可在线实时配置转换规则,支持多个转换规则同时生效,服务端调用平台提供的封装方法便可以进行数据的转换,之后再根据自定义业务逻辑进行转发。
- 用户可通过本模块对接各类协议、数据结构不一的平台,实现数据的转换和转发。
- 用户可将本平台定位为中转站,做不同平台之间的协议转发功能。
- 注意:目前功能已实现,但还未将各云平台的协议转换规则进行每个处理入库,未来会增加一键转换功能。



后端实现
用户在线配置好转换规则后,后端便可实时生效,通过转换规则匹配对应的topic,并且调用调试功能,进行数据格式解析转换,最后再根据转换后的数据进行转发。
核心代码如下,用户可自行拓展增强:
protocolMapperService.ifMatch(FlowTypes.IN, topic, payload, bean -> {
String beanTopic = bean.getTopic();
byte[] beanBody = bean.getBody().getBytes(StandardCharsets.UTF_8);
mqttServerTemplate.publishAll(beanTopic, beanBody);
executeServerRelayManager(context, beanTopic, beanBody);
});
步骤说明
- 给对方开 mqtt 账号,最好是开设备产品密钥签名的账号,单然也可以开 mqtt 账号管理菜单里的账号。
- 对方按自己的协议格式上报数据,
- 在平台添加一个协议转换,例如:添加
blink,添加对方协议的topic前缀blink/# - 新建产品时选择
blink协议。 - 添加协议转换的具体规则。
一、协议转换语法
转换规则 topic 可以使用 ${xxx} 来提取 topic 中的变量。
示例(将阿里云协议转换到 BladeX-Links)
Topic示例:
/sys/a1jzyZ3hPpo/6PE21ZLBWDtLMLjOSBXg/thing/event/property/postTopic规则:
/sys/${productKey}/${deviceName}/thing/event/property/post输出Topic模板:
/blade/sys/${topic.productKey}/${topic.deviceName}/thing/event/property/post
由于 BladeX-Links 和阿里云 ALink 消息结构体完全一致,输出 json 模板可以直接使用 ${body}
二、Beetl 变量和函数
1. 内置变量
对于下行(转发送到设备)的消息,内置了 ${ext.product.xxx}(产品)和 ${ext.device.xxx}(设备)扩展变量,如果设备有上级网关设备还可以使用 ${ext.gateway.xxx} 获取到网关设备相关信息。
2. 内置函数
| 函数名 | 示例 | 作用 |
|---|---|---|
| timestamp | ${timestamp()} | 获取当前时间戳(服务器时间) |
| uuid | ${uuid()} | 生成一个 uuid |
| iosDateFmt | ${iosDateFmt(body)} | 时间格式化,将 ios 时间 2023-08-04T14:53:11+08:00 格式化成 yyyy-MM-dd HH:mm:ss |
3. 自定义 beetl 函数
对于某些场景自定义 beetl 函数能更大程度简化协议转换的规则。详见:blade-broker 服务中的 BeetlConfiguration 类。
beetl模板文档地址:点击查看
