thingsboard使用MQTT遥测数据理解

跳过建立连接阶段:

1、加载MqttTransportService服务类

在这里插入图片描述

2、MqttTransportServerInitializer对MqttTransportService初始化
在这里插入图片描述
3、MqttTransportHandler描述怎么处理
在这里插入图片描述
4、传入消息类型是遥测数据,执行processPublish(ctx, (MqttPublishMessage) msg);
在这里插入图片描述
5、根据设备上报的数据类型,执行对应的方法。这里传入的是遥测数据,执行第一个process方法。

 private void processDevicePublish(ChannelHandlerContext ctx, MqttPublishMessage mqttMsg, String topicName, int msgId) {
        try {
            if (topicName.equals(MqttTopics.DEVICE_TELEMETRY_TOPIC)) {
                TransportProtos.PostTelemetryMsg postTelemetryMsg = adaptor.convertToPostTelemetry(deviceSessionCtx, mqttMsg);
                transportService.process(sessionInfo, postTelemetryMsg, getPubAckCallback(ctx, msgId, postTelemetryMsg));
            } else if (topicName.equals(MqttTopics.DEVICE_ATTRIBUTES_TOPIC)) {
                TransportProtos.PostAttributeMsg postAttributeMsg = adaptor.convertToPostAttributes(deviceSessionCtx, mqttMsg);
                transportService.process(sessionInfo, postAttributeMsg, getPubAckCallback(ctx, msgId, postAttributeMsg));
            } else if (topicName.startsWith(MqttTopics.DEVICE_ATTRIBUTES_REQUEST_TOPIC_PREFIX)) {
                TransportProtos.GetAttributeRequestMsg getAttributeMsg = adaptor.convertToGetAttributes(deviceSessionCtx, mqttMsg);
                transportService.process(sessionInfo, getAttributeMsg, getPubAckCallback(ctx, msgId, getAttributeMsg));
            } else if (topicName.startsWith(MqttTopics.DEVICE_RPC_RESPONSE_TOPIC)) {
                TransportProtos.ToDeviceRpcResponseMsg rpcResponseMsg = adaptor.convertToDeviceRpcResponse(deviceSessionCtx, mqttMsg);
                transportService.process(sessionInfo, rpcResponseMsg, getPubAckCallback(ctx, msgId, rpcResponseMsg));
            } else if (topicName.startsWith(MqttTopics.DEVICE_RPC_REQUESTS_TOPIC)) {
                TransportProtos.ToServerRpcRequestMsg rpcRequestMsg = adaptor.convertToServerRpcRequest(deviceSessionCtx, mqttMsg);
                transportService.process(sessionInfo, rpcRequestMsg, getPubAckCallback(ctx, msgId, rpcRequestMsg));
            } else if (topicName.equals(MqttTopics.DEVICE_CLAIM_TOPIC)) {
                TransportProtos.ClaimDeviceMsg claimDeviceMsg = adaptor.convertToClaimDevice(deviceSessionCtx, mqttMsg);
                transportService.process(sessionInfo, claimDeviceMsg, getPubAckCallback(ctx, msgId, claimDeviceMsg));
            } else {
                transportService.reportActivity(sessionInfo);
            }
        } catch (AdaptorException e) {
            log.warn("[{}] Failed to process publish msg [{}][{}]", sessionId, topicName, msgId, e);
            log.info("[{}] Closing current session due to invalid publish msg [{}][{}]", sessionId, topicName, msgId);
            ctx.close();
        }
    }

5、process是TransportService中的方法,这里我们使用断点调试可以看到这里使用TransportService接口的实现类时DefaultTransportService
在这里插入图片描述
6、查看DefaultTransportService的process方法

 @Override
    public void process(TransportProtos.SessionInfoProto sessionInfo, TransportProtos.PostTelemetryMsg msg, TransportServiceCallback<Void> callback) {
        if (checkLimits(sessionInfo, msg, callback)) {
            reportActivityInternal(sessionInfo);
            TenantId tenantId = new TenantId(new UUID(sessionInfo.getTenantIdMSB(), sessionInfo.getTenantIdLSB()));
            DeviceId deviceId = new DeviceId(new UUID(sessionInfo.getDeviceIdMSB(), sessionInfo.getDeviceIdLSB()));
            MsgPackCallback packCallback = new MsgPackCallback(msg.getTsKvListCount(), callback);
            for (TransportProtos.TsKvListProto tsKv : msg.getTsKvListList()) {
                TbMsgMetaData metaData = new TbMsgMetaData();
                metaData.putValue("deviceName", sessionInfo.getDeviceName());
                metaData.putValue("deviceType", sessionInfo.getDeviceType());
                metaData.putValue("ts", tsKv.getTs() + "");
                JsonObject json = JsonUtils.getJsonObject(tsKv.getKvList());
                TbMsg tbMsg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, metaData, gson.toJson(json));
                sendToRuleEngine(tenantId, tbMsg, packCallback);
            }
        }
    }

7、执行完process方法,调用sendToRuleEngine方法将消息传入规则引擎。

 protected void sendToRuleEngine(TenantId tenantId, TbMsg tbMsg, TbQueueCallback callback) {
        TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_RULE_ENGINE, tenantId, tbMsg.getOriginator());
        if (log.isTraceEnabled()) {
            log.trace("[{}][{}] Pushing to topic {} message {}", tenantId, tbMsg.getOriginator(), tpi.getFullTopicName(), tbMsg);
        }
        ToRuleEngineMsg msg = ToRuleEngineMsg.newBuilder().setTbMsg(TbMsg.toByteString(tbMsg))
                .setTenantIdMSB(tenantId.getId().getMostSignificantBits())
                .setTenantIdLSB(tenantId.getId().getLeastSignificantBits()).build();
        ruleEngineMsgProducer.send(tpi, new TbProtoQueueMsg<>(tbMsg.getId(), msg), callback);
    }

这个send方法是TbQueueProducer<TbProtoQueueMsg<ToRuleEngineMsg>> 接口中的,这里使用断点调试可以看到实现类为InMemoryTbQueueProducer。send方法详情如下:

public void send(TopicPartitionInfo tpi, T msg, TbQueueCallback callback) {
        boolean result = storage.put(tpi.getFullTopicName(), msg);
        if (result) {
            if (callback != null) {
                callback.onSuccess(null);
            }
        } else {
            if (callback != null) {
                callback.onFailure(new RuntimeException("Failure add msg to InMemoryQueue"));
            }
        }
    }

这里的storage来自于private final InMemoryStorage storage = InMemoryStorage.getInstance();进一步分析可以看到:
在这里插入图片描述未完待续……

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Thingsboard是一个开源的物联网平台,它可以用于集成和管理物联网设备。要连接ThingsboardMQTT网关,需要遵循以下步骤: 1. 创建设备:首先,在Thingsboard平台上创建一个设备。你可以在设备管理页面创建设备,并分配一个设备标识符(Device ID)和设备令牌(Device Token)。 2. 配置MQTT网关:然后,配置你的MQTT网关以便与Thingsboard平台连接。在网关的配置文件中,你需要指定Thingsboard平台的连接细节,例如服务器地址、端口、设备标识符等。 3. 连接MQTT网关:网关启动后,它将自动连接Thingsboard平台。它将使用预先配置的设备标识符和设备令牌进行身份验证。 4. 设备上报数据:在设备上报数据时,可以通过网关将数据发送到Thingsboard平台。MQTT网关会将数据发布到指定的MQTT主题上,该主题的名称是由设备标识符和“telemetry”(遥测数据)组成的。 5. 数据可视化和管理:Thingsboard平台将接收来自MQTT网关的数据,并将其存储在数据库中。你可以使用Thingsboard提供的仪表板功能来可视化和监控设备数据。还可以在平台上进行设备管理、数据分析和规则引擎配置等操作。 需要注意的是,连接MQTT网关和Thingsboard平台的具体步骤可能会因所使用的网关和Thingsboard的版本而有所不同。因此,在实际操作时,建议参考相关文档和官方指南以获得准确的步骤和配置细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值