FLuxMQ是一款基于java开发,支持无限设备连接的云原生分布式物联网接入平台。FluxMQ基于Netty开发,底层采用Reactor3反应堆模型,具备低延迟,高吞吐量,千万、亿级别设备连接;方便企业快速构建其物联网平台与应用。
FluxMQ官网:https://www.fluxmq.com
FluxMQ演示系统:http://demo.fluxmq.com/
通配符 | 解释 |
---|---|
# | 可以匹配零个或多个层级的主题。只能出现在主题末尾。 |
+ | 可以匹配一个层级的主题。可以出现在主题的任何位置。 |
FluxMQ支持两种通配符:+和#。+表示匹配一个层级,#表示匹配零个或多个层级。下面是一些例子:
井号通配符表示可以匹配零个或多个层级的主题。它只能出现在主题的末尾,例如 home/living_room/#。
用法示例:如果一个订阅者订阅了主题 home/living_room/#,那么它将接收到诸如 home/living_room/light、home/living_room/temperature 等所有以 home/living_room/ 开头的消息。
加号通配符表示可以匹配一个层级的主题。它可以出现在主题的任何位置,例如 home/+/light。
用法示例:如果一个订阅者订阅了主题 home/+/light,那么它将接收到诸如 home/living_room/light、home/kitchen/light 等层级为 home/ 下,且以 /light 结尾的消息。
FluxMQ支持共享订阅,单个topic共享订阅集群支持10W/s吞吐量,下面吗我们介绍下共享订阅的使用方式:
$share/topic1
,则订阅组名称为DEFAULT
,订阅主题为topic1
。$queue/group1/topic1
,则订阅组名称为group1
,订阅主题为topic1
。FluxMQ Rule Engine (以下简称规则引擎) 用于配置FluxMQ 消息流与设备事件的处理、响应规则。规则引擎不仅提供了清晰、灵活的 “配置式” 的业务集成方案,简化了业务开发流程,提升用户易用性,降低业务系统与 FluxMQ 的耦合度;也为 FluxMQ 的私有功能定制提供了一个更优秀的基础架构。
FluxMQ 在 消息发布或事件触发 时将触发规则引擎,满足触发条件的规则将执行各自的 SQL 语句筛选并处理消息和事件的上下文信息;
规则的 SQL 语句基本格式为:
SELECT <字段名> FROM <事件类型> [WHERE <条件>]
## SELECT 语句用于决定最终的输出结果里的字段。比如:
## 下面 SQL 的输出结果中将只有两个字段 "a" 和 "b":
SELECT a, b FROM "$EVENT.PUBLISH"
# 选取 username 为 'abc' 的建立连接消息,输出结果为所有可用字段:
SELECT * FROM "$EVENT.CONNECT" WHERE auth.username = 'abc'
## 选取 clientId 为 'abc' 的终端发来的消息,输出结果将只有 cid 一个字段。
SELECT clientId as cid FROM "$EVENT.PUBLISH" WHERE clientId = 'abc'
## 选取 qos 为 '1' 的发布消息,输出结果将只有 cid 一个字段。
## 注意虽然 SELECT 语句中只选取了 cid 一个字段,所有消息发布事件中的可用字段 (比如 clientId、topic 等) 仍然可以在 WHERE 语句中使用:
SELECT clientId as cid FROM "$EVENT.PUBLISH" WHERE qos = 1
## 但下面这个 SQL 语句就不能工作了,因为变量 xyz 不是消息发布事件中的可用字段:
SELECT clientId as cid FROM "$EVENT.PUBLISH" WHERE xyz = 'abc'
函数名 | 函数作用 | 返回值 |
---|---|---|
> | 大于 | true/false |
< | 小于 | true/false |
<= | 小于等于 | true/false |
>= | 大于等于 | true/false |
<> | 不等于 | true/false |
!= | 不等于 | true/false |
= | 比较两者是否完全相等。可用于比较变量和主题 | true/false |
=~ | 比较主题(topic)是否能够匹配到主题过滤器(topic filter)。只能用于主题匹配 | true/false |
SELECT * FROM "$EVENT.PUBLISH" WHERE topic = 't/a'
SELECT * FROM "$EVENT.PUBLISH" WHERE topic = 't/a' or topic = 't/b'
SELECT * FROM "$EVENT.PUBLISH" WHERE topic =~ "t/#"
SELECT qos, messageId, clientId FROM "$EVENT.PUBLISH" WHERE topic =~ "t/#"
select auth.username as username from "$EVENT.CONNECT" where auth.username = 'fluxmq'
SELECT payload.x as x FROM "$EVENT.PUBLISH" WHERE payload.x = 1
SELECT payload FROM "$EVENT.PUBLISH" WHERE payload.x.y = 1
SELECT clientIp FROM "$EVENT.CONNECT" WHERE clientId = 'c1'
SELECT clientId FROM "$EVENT.SUBSCRIBE" WHERE topic =~ 't/#' and qos = 1
SELECT clientId FROM "$EVENT.SUBSCRIBE" WHERE topic =~ 't/#' and qos = 1
SELECT * FROM "$EVENT.PUBLISH" WHERE topic like '%fluxmq%'
SELECT *, "test" as event FROM "$EVENT.PUBLISH"
select * from "$EVENT.PUBLISH" where topic.startsWith('test')
提示
函数名 | 说明 |
---|---|
json | - 使用在SQL语句中,可以将嵌套的Json结构转换成字符串 - 使用在支持模板替换的想象中,比如数据库保存的SQL,KAFKA的TOPIC等地方 |
bytes | 将对象转成字节数组,会先将对象JSON化,再转成UTF8格式的字节数组 |
int8 | 将对象转为Int8类型,相当于byte |
int16 | 将对象转为Int16类型,相当于short |
int32 | 将对象转为Int32类型,相当于int |
int64 | 将对象转为Int64类型,相当于long |
toDouble | 将对象转为double类型 |
hexStr | 将对象转成HEX字符串, 会先将对象JSON化,再转成对象的16进制字符串 |
date | 格式化时间字符串:yyyy-MM-dd |
datetime | 格式化时间字符串:yyyy-MM-dd HH:mm:ss |
dateToTimestamp | yyyy-MM-dd 时间字符串转成时间戳 |
datetimeToTimestamp | yyyy-MM-dd HH:mm:ss 时间字符串转成时间戳 |
uuid | 生成32位随机小写字符串 |
uuidUpper | 生成32位随机大写字符串 |
isBytes | 判断是否是字节数组 |
isJson | 判断是否是json |
规则的 SQL 语句可以处理事件(发布消息、客户端上下线、客户端订阅等),FROM 子句后面跟事件主题。
事件主题以 $EVENT/ 开头,比如 E V E N T . P U B L I S H , EVENT.PUBLISH, EVENT.PUBLISH,EVENT.SUBSCRIBE 。
事件名称 | 事件主题名 | 释义 |
---|---|---|
发布事件 | $EVENT.PUBLISH | 发布消息 |
订阅事件 | $EVENT.SUBSCRIBE | 订阅成功消息 |
取消订阅事件 | $EVENT.UNSUBSCRIBE | 取消订阅成功消息 |
发布回复事件 | $EVENT.ACK | 消息接收成功并回复 |
心跳事件 | $EVENT.PING | 连接保活心跳消息 |
取消连接事件 | $EVENT.DISCONNECT | 客户端主动断开连接 |
连接断开事件 | $EVENT.CLOSE | 服务端关闭连接 |
建立连接事件 | $EVENT.CONNECT | 连接成功 |
离线消息事件 | $EVENT.OFFLINE | 离线期间接收的消息 |
目前已经支持的协议如下:
通过控制台启动协议插件后,默认会在集群每个节点气动对应的协议插件,依托于FluxMQ,该协议天然支持集群,订阅的规则如下:
下行指令通过MQTT下发给具体的设备,TOPIC规则为:
{协议名称}/down/{vin}
上行是设备上报的报文,TOPIC规则为:{协议名称}/up/{vin}
脚本的处理时机是在MQTT事件处理器之前,因此脚本的适用于修改、解析、加解密MQTT传输的Payload。脚本默认匹配主题支持通配符,处理Payload可以直接返回byte[]或者String。
function convert(topic, payload){
return payload;
}
function convert(topic, payload)
return payload
end
def convert(String topic, byte[] payload){
return payload
}
FluxMQ默认提供免费的接入License许可,直接参考我们文档下载即可。