在thingsboard中这个节点配置在规则链中,用以存储上传的设备或者实体的属性信息。将这个讲个节点之前首先说一下,thingsboard中节点通用特点,一般情况下,节点有节点类,和节点配置类,节点实现类主要处理消息,节点配置中配置此节点处理信息的一些配置参数,每个节点配置thingsboard系统都会有个默认配置。
在thingsboard系统中这些配置以Json形式保存在数据库中,界面实现有node编辑器来处理,由于没有研究前端具体实现,我移植的代码中会根据默认的配置,进行配置,如果没有配置,我会直接生成默认配置,避免后面逻辑出现问题。
回归正题,此节点的配置主要配置有两个属性,一个就是属性的范围,一个是是否通知设备。但是我看来这个属性范围有点诡异,所以暂时不用管他,我们先分析接下来的逻辑。
每个node都会实现init用以初始化node,其实就是根据配置,产生这个配置。第二个要实现的函数就是
onMsg(TbContext ctx, TbMsg msg)
用于真正的消息处理,其实这个节点逻辑相对检点,我们也比较容易入手,并借此来跟踪一下,thingsboard的数据存储逻辑。
@Override public void onMsg(TbContext ctx, TbMsg msg) { if (!msg.getType().equals(SessionMsgType.POST_ATTRIBUTES_REQUEST.name())) { ctx.tellFailure(msg, new IllegalArgumentException("Unsupported msg type: " + msg.getType())); return;//判断消息类型,如果不是post属性请求就返回 } String src = msg.getData(); Set<AttributeKv> attributes = JsonConverter.convertToAttributes(new JsonParser().parse(src)); //拿到属性列表 String notifyDeviceStr = msg.getMetaData().getValue("notifyDevice"); //保存数据,并回调,我们接着这个逻辑继续分析 ctx.getTelemetryService().saveAndNotify( TenantId.fromString(ctx.getTenantId()), msg.getOriginator(), config.getScope(), new ArrayList<>(attributes), config.getNotifyDevice() || StringUtils.isEmpty(notifyDeviceStr) || Boolean.parseBoolean(notifyDeviceStr), new TelemetryNodeCallback(ctx, msg) ); }
接着会调用
DefaultTelemetrySubscriptionService中的
@Override public void saveAndNotifyInternal(TenantId tenantId, EntityId entityId, String scope, List<AttributeKv> attributes, boolean notifyDevice, FutureCallback<Void> callback) { ListenableFuture<List<Void>> saveFuture = attrService.save(tenantId, entityId, scope, attributes);//保存到数据库中 addVoidCallback(saveFuture, callback);//异步调动回调 addWsCallback(saveFuture, success -> onAttributesUpdate(tenantId, entityId, scope, attributes, notifyDevice));//处理数据订阅服务,主要功能通过websocket发送给订阅了此消息的客户 }
数据保存后会通过回到函数,回到处理规则链中。
写的比较乱,主要为了记录。如果有需要讨论欢迎留言