0x13
coding...
展开
-
【Thingsboard】使用技巧:自动维护关联关系
自动创建关联关系,从当前消息实体出发创建指定的关联关系。通过监听服务端属性的变更,从当前消息实体和目标实体之间创建关联关系。这里从指的是"从目标实体"。原创 2022-11-08 09:06:53 · 380 阅读 · 0 评论 -
【Thingsboard】使用技巧:聚合计算定时任务
专业版的 aggregate latest 节点可以定期聚合A下面子设备(BCD)的数据,然后切换到A身份输出为每个父实体和聚合属性生成POST_TELEMETRY_REQUEST类型的消息。原创 2022-11-08 09:06:45 · 489 阅读 · 0 评论 -
【Thingsboard】使用技巧:直接调用规则引擎
很多时候,厂家不太需要 Thingsboard 的功能,而只想单独使用规则引擎的快速发开能力,那么可以通过直接调用规则链的方式来实现。原创 2022-11-08 09:06:06 · 407 阅读 · 0 评论 -
【Thingsboard】使用技巧:测试数据生成节点
很多时候会判断一个设备的经纬度是否有在某个地域内,或者判断两个设备之间的经纬度是否相隔太远,则可以使用电子围栏的规则节点来完成相应的需求。原创 2022-11-08 09:05:56 · 572 阅读 · 0 评论 -
【Thingsboard】如何实现全链路日志?
日志级别:TRACE原创 2022-11-07 09:14:34 · 579 阅读 · 0 评论 -
【Thingsboard】源码分析:下行 rpc 调用
log.info("[日志][ DefaultTbCoreDeviceRpcService -> processRpcResponseFromDeviceActor ]rpc2w响应处理");请求由 DeviceActor 发送出去后,transport会发送响应到队列里,队列服务获取到响应后同样是先给 tbCore。# deviceActor 将响应发送给 tb-core, tb-core 将响应发送给 rule-engine。# DeviceActor处理最终的rpc请求。原创 2022-11-07 09:14:14 · 575 阅读 · 0 评论 -
【Thingsboard】源码分析:设备网关api 分析
然后构造子设备的会话对象 GatewayDeviceSessionCtx,这个对象是 SessionListener 实现类用于子设备接受平台的回调。然后将子设备的会话加入到当前网关处理对象的缓存中,后续需要通过 deviceName 获取出子设备会话对象进行属性上传。:平台下行rpc到子设备。会调用子设备会话校验,检测缓存对象中是否有该 deviceName 的子设备会话对象,如果没有的话则执行上面的子设备会话初始化,如果存在缓存中则直接取出子设备的 deviceInfo 进行消息上传。原创 2022-11-07 09:13:59 · 321 阅读 · 0 评论 -
【Thingsboard】源码分析:数据 dao 层
AccountController(路径:application,包:org.thingsboard.server.controller)所有的 sql 语句都写在 org.thingsboard.server.dao.sql 包下面,里面有所有实体的查询语句。所有的实体类都通过 Table 注解,在 org.thingsboard.server.dao.model.sql 下。新增 Account(文件:common,包:org.thingsboard.server.common.data.原创 2022-11-07 09:13:50 · 267 阅读 · 0 评论 -
【Thingsboard】源码分析:实现 Actor 系统
这三个动作没有固定的顺序,可以并发地执行,Actor会根据接收到的消息进行不同的处理。3、接下来会创建一个根Actor(org.thingsboard.server.actors.app.AppActor),并将其设置为Actor系统的根Actor,这个Actor是所有消息的入口,是其他所有Actor的Parent。6、第一次收到消息的时候会先进行TenantActor的初始化,从数据库的tenant表里面拿出所有的数据,并进行加载,每一个Tenant都会创建对应一个TenantActor。原创 2022-11-07 09:13:33 · 513 阅读 · 0 评论 -
【Thingsboard】源码分析:设备创建链接和断开链接
INFO ContextAwareActor - [日志][ ContextAwareActor -> process ]msg=TransportToDeviceActorMsgWrapper(tenantId=06e29f90-5bbb-11ec-b8c3-5164aa3a5bca, deviceId=a7e8e080-7762-11ec-ab81-811f614b3583, msg=sessionInfo {原创 2022-11-07 09:13:10 · 248 阅读 · 0 评论 -
【Thingsboard】源码分析:设备活跃和心跳分析
加上设备允许最大不活跃时间间隔(600000) 】 相比 【当前时间(1646059574864) 】谁大,如果前者大说明还在设备允许的不活跃时间间隔内,设置 active=true,如果后者大说明设备允许的最大不活跃时间间隔已经过了,设置 active=false。log.info("【日志】 当前时间="+ts+",上次活跃时间="+state.getLastActivityTime() + ",允许最大不活跃时间间隔=" +state.getInactivityTimeout());原创 2022-11-07 09:12:54 · 640 阅读 · 0 评论 -
【Thingsboard】源码分析:社区办和专业版的权限控制
也就是说,想要做到数据权限的前提就是所有的实体表(包括用户表)都必须冗余 tenant_id 和 customer_id 这两个字段,这样 SecurityUser 中取出当前用户的 tenant_id 和 customer_id 再和需要进行 curd 的实体的 tenant_id 和 customer_id 进。这个是用户所属层级上面的粗粒度的接口校验。数据权限 CE 和 PE 版本都有,CE 版本仅仅校验当前用户对需要访问的目标资源有没有访问权限(比如A租户不能看到B租户下面的东西)。原创 2022-11-07 09:10:04 · 787 阅读 · 0 评论 -
【Thingsboard】源码分析:整体包结构分析
thingsboard 包结构分析原创 2022-11-07 09:09:42 · 375 阅读 · 0 评论 -
【Thingsboard】源码分析:Websocket 和前端交互
①创建了一个回调函数 callBack,将查询结果 List data 进行下发,并构造了订阅对象(sessionId、cmdId、tenantId、sessionSendMsgFunc消息下发方法),将订阅对象交给 oldSubService 缓存起来。用于限流的几个map,里面保存了一个租户、客户、用户下,每个session订阅的cmdId个数,集合里面保存了 sessionId 拼接 cmdId,这样可以计算出所有订阅的记录。注意只有开启了才会进行缓存。原创 2022-11-07 09:09:18 · 637 阅读 · 0 评论 -
【Thingsboard】源码分析:Transport 开发
(1)调用 DefaultTransportService.onSuccess(),方法传入 TbProtoQueueMsg 和 TransportServiceCallback。(2)从 kafka 队列中获取的响应 Response 可以解析出 requestId,从缓存中匹配到对应的 ResponseMetaData 找到里面的 future1。原创 2022-11-06 18:42:46 · 449 阅读 · 0 评论 -
【Thingsboard】源码分析:tb-core 的作用
/tbCoreMsgProducer.send 发送session事件例如open/close。//调用的 tbCoreMsgProducer.send 未知 用于coap协议设备。//tbCoreMsgProducer.send 订阅属性变更请求。//tbCoreMsgProducer.send 订阅rpc请求。//tbCoreMsgProducer.send 获取属性请求。//tbCoreMsgProducer.send 设备认领。//tbCoreMsgProducer.send 未知。原创 2022-11-06 18:41:26 · 525 阅读 · 0 评论 -
【Thingsboard】源码分析:调度器 schedul 开发
DefaultSchedulerService - 【日志】删除调度器 eventId=c1d493d0-a4db-11ec-a824-9997d34f46d1。原创 2022-11-06 18:39:53 · 478 阅读 · 0 评论 -
【Thingsboard】源码分析:规则引擎提交策略
RuleActor 线程池 RuleDispatcher 的扩大不会加快 ruel-engine 的 commit,因为调用 Actor.tell() 之后,调用 tryProcessQueue() 会利用 CAS 替换邮箱状态 FREE -> BUSY,如果替换失败说明当前邮箱正在执行 tryProcessQueue() 方法,也就是说同一时刻 RuleChainActor 只会调用一次 tryProcessQueue(),不可能同一个 Actor 同一时刻执行两个 tryProcessQueue()。原创 2022-11-06 18:38:13 · 896 阅读 · 0 评论 -
【Thingsboard】源码分析:如何开发规则链
首先从 kafka 队列中获取消息,获取一批消息 queue.rule-engine.poll-interval 配置 TB_QUEUE_RULE_ENGINE_POLL_INTERVAL_MS pollDuration 表示每隔这么长时间就从消息队列中获取一次消息。从前面的 kafka 队列分析,可以发现规则引擎从 kafka 中消费到消息之后就会直接提交到规则链中。调度器会定时发送消息进入规则链实现定时任务除了ota相关的调度器之外的都会发送消息到规则链。规则链服务从 kafka 中消费消息。原创 2022-11-06 18:36:21 · 647 阅读 · 0 评论 -
【Thingsboard】源码分析:OTA 更新
这个设备组内的设备或者单一的这个设备属于更新包的设备类型,那么就会触发升级。真正的更新是设备在订阅到ota文件的相关共享属性之后,拿到ota文件总字节数然后每次拉取一定数量的字节多次拉取完成 ota 文件的下载。如果是 http-transport 连接的设备,需要请求 http://host/api/v1/${access_token}/firmware?如果是 mqtt-transport 连接的设备,需要请求 v2/fw/request/${requestId}/chunk/${chunk} 主题。原创 2022-11-06 18:34:58 · 972 阅读 · 0 评论 -
【Thingsboard】源码分析: kafka 的微服务架构
每次策略将消息重新提交到规则引擎时,这些消息都是原始消息的二进制副本。但是,在消息被取消之前开始处理消息的规则节点不会被中断。每次策略将消息重新提交到规则引擎时,这些消息都是原始消息的二进制副本。但是,在消息被取消之前开始处理消息的规则节点不会被中断。每次策略将消息重新提交到规则引擎时,这些消息都是原始消息的二进制副本。但是,在消息被取消之前开始处理消息的规则节点不会被中断。但是,在消息被取消之前开始处理消息的规则节点不会被中断。在设备 A 的先前消息被确认之前,不会提交例如设备 A 的新消息。原创 2022-11-06 18:32:13 · 1758 阅读 · 0 评论 -
【Thingsboard】源码分析:Coap服务端
也就是说需要扩展其他的协议,按照相同的方式,例如 Tcp-Transport。原创 2022-11-06 18:28:34 · 389 阅读 · 0 评论 -
【Thingsboard】源码分析:设备告警
基本上,如果您启用此选项和“获取警报规则的状态”选项,规则节点将能够发出警报。所以这就是为什么 deviceProfile 默认会存在于规则链的第一个节点,如果 deviceProfile 节点只放到 msg type switch 的遥测和属性上传后面的话,也就监听不到设备实体的删除和更新,会造成 deviceProfile 节点内部 deviceState 缓存错乱。有时候会发现,同一时刻一批设备的告警结束时间会跟随系统时间刷新,并且已经消除的告警又变成未消除状态,和每分钟执行的定时任务有关。原创 2022-11-06 18:26:46 · 998 阅读 · 0 评论 -
【Thingsboard】源码分析:Actor模型架构
Device Actor: 维护设备的状态:活动会话、订阅、挂起的 RPC 命令等。App Actor:负责租户Actor的管理。处理规则引擎(链/节点)actor 消息的 actor 系统调度程序的线程池大小。处理 device actor 消息的 actor 系统调度程序的线程池大小。处理 tenant actor 消息的 actor 系统调度器的线程池大小。在切换到处理下一个参与者的消息之前,参与者系统将处理每个参与者的消息数。处理 app actor 消息的 actor 调度程序的线程池大小。原创 2022-11-06 18:25:24 · 764 阅读 · 0 评论 -
【Thingsboard】仪表板:实体别名和筛选器
它用于过滤其他仪表板状态的数据。* Entity name [按照实体名称过滤]:此别名允许选择以输入的查询开头的一个或多个实体名称,这些名称可以是设备、资产、实体视图、租户、客户、仪表板、数据转换器、调度程序事件、blob 实体或客户。* Entity list [实体列表]:此别名允许在不输入查询的情况下手动选择多个实体,这些实体可以是设备、资产、实体视图、租户、客户、仪表板、数据转换器、调度程序事件、blob 实体或客户。此别名过滤“设备”类型的设备。此别名过滤“设备”类型的设备。原创 2022-11-02 14:36:42 · 538 阅读 · 0 评论 -
【Thingsboard】仪表板使用:汽车充电站
数据源:实体[Charging Stations]即名称为charging station类型的资产,[属性]latitude,longitude,status,type,maxPortPower,inMaxPower。Charging Ports:设备搜索查询类型,从Charging ports[充电站]下查询类型为Charging port[充电桩]的设备作为实体引用。数据源:[实体]Charging Ports,[属性]xPos,yPos,status,portType,maxPortPower。原创 2022-11-02 14:35:50 · 420 阅读 · 0 评论 -
【Thingsboard】发送邮件配置
规则链发送邮件可以自定义邮件服务器,也可以使用系统的 stmp 设置。【02】使用系统stmp服务器。【01】自定义stmp服务器。原创 2022-11-02 11:04:51 · 375 阅读 · 0 评论 -
【Thingsboard】实体和实体组的使用
每个实体可能同时属于多个组。实体组对于仪表板和数据处理很有用,但它们存在的主要原因是支持物联网的高级基于角色的访问控制 ( RBAC )。用户就是使用tb的人,租户管理员或客户管理员给自己下面的用户设置不同资源的不同权限,客户登录进去就能显示不同的资源视图。在pe版中,默认组"all",可以新建一个设备组"手表"。所有设备都会"all"组下面,一个设备可以加入到不同的组。在pe版支持的实体组功能上,用户组和客户组都算实体组,只不过单独拿出来用于权限管理。设备切换到新的组,加入到新的组,从当前组移除。原创 2022-11-02 11:03:49 · 477 阅读 · 0 评论 -
【Thingsboard】设备配置文件
例如,如果严重程度为Critical 的条件为真,则平台将发出严重程度为Critical 的警报,并且不会评估“主要”、“次要”或“警告”条件。每个警报规则的严重性必须是唯一的(例如,在同一警报规则中创建的两个条件不能具有相同的严重性);因为thingsboard是基于消息队列来顺序处理消息的,所以不同种类设备之间的消息走同一个队列的话会造成特殊消息处理不及时(比如100w条水表消息中夹杂1条烟雾报警消息),所以为了将不同种类的设备消息进行隔离,给出三种队列隔离模式。(1)警报类型:- 一种警报。原创 2022-11-02 10:50:04 · 484 阅读 · 0 评论 -
【Thingsboard】规则链使用详解
如果您正在使用某个规则引擎队列的RETRY_ALL, RETRY_FAILED, RETRY_TIMED_OUT或RETRY_FAILED_AND_TIMED_OUT策略,则某些失败的节点可能会阻止该队列中消息的整个处理。其他规则链也可以将消息转发到不同的规则链。这对许多用例很有用。同样在仪表板的底部,您可以找到规则引擎内部异常的描述,以及有问题的规则节点的名称。能够处理单个传入消息并生成一个或多个传出消息,发往不同的规则链路进行消息的路由处理,同时可以过滤,丰富,转换传入消息,执行操作或与外部系统通信。原创 2022-11-02 10:49:05 · 744 阅读 · 0 评论 -
【Thingsboard】js-executor 自定义协议解析
很多厂家相要直接在 js-executor 里面解析自己的设备二进制数据,如果是传统的json或者xml数据,规则链可以直接进行解析。有些情况下设备上传的二进制数据,可能需要一些特有的 js 解析库,那么可以将特有的 js 库植入到 js-executor 引擎中,然后在规则链中调用该库。经过测试,一个 js-executor 解析水电表等比较复杂的二进制数据,差不多疫苗可以处理几千条。原创 2022-11-02 10:43:45 · 789 阅读 · 0 评论 -
【Thingsboard】Trendz 分析服务的使用
定义一个表格,定义三列,分别是楼栋列和公寓列电表列。注意这里【电表】是从tb获取的属于【设备类型】,也就说这里的图统计的是电表这个类型下按照时间分组,所有设备单位时间的energy的sum。电表实体下建立关键字energy,引用设备的energy遥测字段,然后x选时间,y选sum(energy)。Trendz下面的分组聚合,直接拖拽对应的实体和字段即可,无需在规则链里面定义任务数据聚合和分组。如果有 楼栋->公寓->表 这样子的拓扑结构,其中设备数据每30分钟上报一次,可以合并计算并分组。原创 2022-10-26 15:36:13 · 312 阅读 · 0 评论 -
【Thingsboard】资源的限速
尽管我们通过 REST API 调用的数量来限制用户,但某些调用可能会产生不止一个数据库查询。设备、资产、客户、用户、仪表板、规则链、Integration、Data Convert、调度器。限制【普通用户】级别ws会话的个数上线,0不限制。限制【公开用户】级别ws会话的个数上线,0不限制。限制【普通用户】级别ws会话的订阅上线,0不限制。限制【公开用户】级别ws会话的订阅上线,0不限制。限制【租户】级别ws会话的个数上线,0不限制。限制【客户】级别ws会话的个数上线,0不限制。原创 2022-10-24 00:09:59 · 844 阅读 · 0 评论 -
【Thingsboard】设备自注册/批量导入/设备认领
thingsboard在收到设备请求后执行检测,查询到对应的Device Profile,编辑设备配置,最后一栏设备预配置。设备认领在一个场景下使用,当租户已经生产好设备时,客户通过认领的方式将设备划拨到自己下面,客户变成设备的拥有者。设备出场开机时连接服务器,设备自己生成一个密钥(含过期时间)然后发送到服务器,设备未待认领状态。客户登录Thingsboard在上的认领设备部件中输入设备名称和密钥,前端请求服务器完成认领。租户随机生成密钥并配置到这个设备的服务端属性下,设备为待认领状态。原创 2022-10-26 15:34:40 · 1478 阅读 · 0 评论 -
【Thingsboard】实现设备多连接
tb可以配置一个设备可以创建多个客户端连接,在多个连接都订阅有属性更新和rpc时,服务端会将属性更新和rpc同时推送给多个客户端连接。【网关子设备加直连设备】【直连设备加直连设备】原创 2022-10-26 15:34:23 · 616 阅读 · 0 评论 -
【Thingsboard】版本控制功能
因为实体具有唯一uuid,所以在导出时会在 tb 实例范围内生成一个 externalId,作为还原时的实体 id 以防止实体id冲突:当您第一次将实体导出到 Git 时,实体“id”用于命名 git 存储库中的文件。然后,当您将实体从 Git 导入 ThingsBoard 时,文件名中的“id”将变为实体的“externalId”。因此,您可以在同一平台实例的租户之间或不同实例之间导入/导出实体。每当您执行导出和导入操作时,“externalId”都会用于查找要更新的正确实体。原创 2022-10-24 00:10:43 · 261 阅读 · 0 评论 -
【Thingsboard】集成 TCP 服务
平台还支持与特定的 LoRaWAN 网络服务器、Sigfox 后端、使用原始 UDP 和 TCP 集成的各种 NB IoT 设备的集成。一旦消息被验证,ThingsBoard 集成就会调用指定的上行链路数据转换器,从传入的消息中提取有意义的信息子集。集成的主要作用是,对于其他协议例如tcp传输数据,可以配合数据转换器将数据转换为thingsboard能识别的格式,来实现一个私有协议转换器。平台集成列表在不断增加,但是,一般集成概念是相同的,并在下面进行了解释。和线下设备在一个内网,代理设备发送消息。原创 2022-10-24 00:10:17 · 503 阅读 · 0 评论 -
【Thingsboard】压力测试以及性能预估
这里使用 jmeter 创建一个连接,生成动态的设备名称并发送消息即可。如果您正在使用某个规则引擎队列的RETRY_ALL, RETRY_FAILED, RETRY_TIMED_OUT或RETRY_FAILED_AND_TIMED_OUT策略,则某些失败的节点可能会阻止该队列中消息的整个处理。这里统计的是 rule-engine 入口处的消息个数,规则节点数量不影响写入到 rule-engine 的消息总数,只有 mqtt-transport 上传总数才影响写入 rule_transport 的消息数。原创 2022-10-24 00:09:34 · 892 阅读 · 0 评论 -
【Thingsboard】从源码构建 jar 服务
在本地配置好配置文件后,将 thingsboard 的源码进行打包,然后推送到服务器以单节点方式启动,注意服务器需要安装jdk11。thingsboard-3.3.2-SNAPSHOT-boot.jar [包含lib的可执行文件]打包后会生成几个可执行文件,里面 -boot.jar 是包含依赖的可执行jar文件。如果打包之后的 jar 没有 logback 可以启动后再指定。thingsboard.yml [程序配置文件]profiles 勾选 packaging。(3)自动部署 jar。原创 2022-10-24 00:09:16 · 400 阅读 · 0 评论 -
【Thingsboard】Gateway 开源网关
另外网关和TB之间会断线重连,断线期间的设备数据是先持久化在网关层,重连后再恢复上传。网关1上传设备A:{"sub_client_1184274":{"type":"light","xxx":42},"sub_client_1193865":{"type":"switch","xxx":42}}网关2上传设备A:{"sub_client_1184274":{"type":"light","xxx":43},"sub_client_1193865":{"type":"switch","xxx":43}}原创 2022-10-20 11:32:33 · 1270 阅读 · 0 评论