物联网平台 Thingsboard rule engine 规则引擎 - 初始化过程

ThingsBoard自定义规则节点开发 3.1 下载rule-node-examples源码3.2 编译example3.3 开发自定义规则节点(RuleNode)1) 实现TbNode接口2)添加@RuleNode注释,添加节点的名称、关联类型、说明、UI文件、及UI的selector模块名(驼峰命名法,对应着js的短横线命名法)等3)实现TbNode接口对应的init()、onMsg()方法■ init()中初始化,主要获取用户配置的数据■ onMsg()中处理业务逻辑。 阅读详情

Thingsboard 规则引擎介绍

Thingsboard 的 Rule engine 是针对物联网场景下的定制实现的规则引擎,主要通过节点的定义,实现物联网各种场景的需求,可以对消息进行转换,消息类型进行路由,消息内容进行解析,消息数据进行转发,并且可以实现对设备下发指令动作片等强大的功能。Thingsboard规则引擎的高性能和高效是我们值得学习的编程框架,主要采用了Actor模型,以及大量的使用了消息队列异步编程。实现的高可靠规则引擎。本篇讲讲规则引擎的初始化过程,让大家入门了解规则引擎的设计。

表结构说明

rule_chain 表结构

在这里插入图片描述

rule_node表结构 主要保存规则链里面的每一个节点信息,核心的配置项信息,以json存储在configuration字段里面,

在这里插入图片描述

relation 表 保存rule node 的关联关系

在这里插入图片描述

整体初始化过程

整个初始化过程 大致如下:AppActor初始化 -> TennantActor初始化 -> RuleChainActor初始化 - > RuleNodeActor初始化 -> RuleNode的关系初始化

程序初始化入口

第一步:TenantActor 初始化租户的时候,调用了org.thingsboard.server.actors.ruleChain.RuleChainManagerActor#initRuleChains

TenantActor

初始化过程

第二步: org.thingsboard.server.actors.ruleChain.RuleChainManagerActor#initRuleChains 方法 查询数据库获取租户下的规则引擎配置,也就是规则链的配置信息


    protected void initRuleChains() {
        for (RuleChain ruleChain : new PageDataIterable<>(link -> ruleChainService.findTenantRuleChainsByType(tenantId, RuleChainType.CORE, link), ContextAwareActor.ENTITY_PACK_LIMIT)) {
            RuleChainId ruleChainId = ruleChain.getId();
            log.debug("[{}|{}] Creating rule chain actor", ruleChainId.getEntityType(), ruleChain.getId());
            TbActorRef actorRef = getOrCreateActor(ruleChainId, id -> ruleChain);
            visit(ruleChain, actorRef);
            log.debug("[{}|{}] Rule Chain actor created.", ruleChainId.getEntityType(), ruleChainId.getId());
        }
    }

第三步:org.thingsboard.server.actors.ruleChain.RuleChainActorMessageProcessor#start 初始化 规则链的节点 ruleNodeActor,调用了initRoutes

@Override
public void start(TbActorCtx context) {
        if (!started) {
            RuleChain ruleChain = service.findRuleChainById(tenantId, entityId);
            if (ruleChain != null && RuleChainType.CORE.equals(ruleChain.getType())) {
                List<RuleNode> ruleNodeList = service.getRuleChainNodes(tenantId, entityId);
                log.trace("[{}][{}] Starting rule chain with {} nodes", tenantId, entityId, ruleNodeList.size());
                // Creating and starting the actors;
                for (RuleNode ruleNode : ruleNodeList) {
                    log.trace("[{}][{}] Creating rule node [{}]: {}", entityId, ruleNode.getId(), ruleNode.getName(), ruleNode);
                    TbActorRef ruleNodeActor = createRuleNodeActor(context, ruleNode);
                    nodeActors.put(ruleNode.getId(), new RuleNodeCtx(tenantId, self, ruleNodeActor, ruleNode));
                }
                initRoutes(ruleChain, ruleNodeList);
                started = true;
            }
        } else {
            onUpdate(context);
        }
}

第四步:初始化 rule node之间的关联关系,关系保存在org.thingsboard.server.actors.ruleChain.RuleChainActorMessageProcessor#nodeRoutes 中,

private void initRoutes(RuleChain ruleChain, List<RuleNode> ruleNodeList) {
        nodeRoutes.clear();
        // Populating the routes map;
        for (RuleNode ruleNode : ruleNodeList) {
            List<EntityRelation> relations = service.getRuleNodeRelations(TenantId.SYS_TENANT_ID, ruleNode.getId());
            log.trace("[{}][{}][{}] Processing rule node relations [{}]", tenantId, entityId, ruleNode.getId(), relations.size());
            if (relations.size() == 0) {
                nodeRoutes.put(ruleNode.getId(), Collections.emptyList());
            } else {
                for (EntityRelation relation : relations) {
                    log.trace("[{}][{}][{}] Processing rule node relation [{}]", tenantId, entityId, ruleNode.getId(), relation.getTo());
                    if (relation.getTo().getEntityType() == EntityType.RULE_NODE) {
                        RuleNodeCtx ruleNodeCtx = nodeActors.get(new RuleNodeId(relation.getTo().getId()));
                        if (ruleNodeCtx == null) {
                            throw new IllegalArgumentException("Rule Node [" + relation.getFrom() + "] has invalid relation to Rule node [" + relation.getTo() + "]");
                        }
                    }
                    nodeRoutes.computeIfAbsent(ruleNode.getId(), k -> new ArrayList<>())
                            .add(new RuleNodeRelation(ruleNode.getId(), relation.getTo(), relation.getType()));
                }
            }
        }

        firstId = ruleChain.getFirstRuleNodeId();
        firstNode = nodeActors.get(firstId);
        state = ComponentLifecycleState.ACTIVE;
    }

总结

至此,规则引擎的核心Actor 初始化完成,包括初始化了所有的RuleChainActor,RuleNodeActor以及 RuleNode之间的关联关系,收到设备上报消息,消息根据设备对应的 设备配置 设备配置的规则链找到对应的规则链也就是RuleChainActor进行消息投递。最终处理过程 AppActor -> TenantActor -> RuleChainActor -> RuleNodeActor,下一篇文章我讲解这个消息的处理过程。

别再硬啃官方文档了!手把手教你用Docker Compose 10分钟搞定ThingsBoard物联网平台 本文提供了一份详细的Docker Compose实战指南,帮助开发者在10分钟内快速部署ThingsBoard物联网平台。通过容器化方案,绕过繁琐的配置过程,实现极速搭建和验证,适用于原型验证和演示环境搭建。 阅读详情

相关推荐

Java构建物联网平台的核心技术与实践指南

物联网平台开发中,Java凭借其跨平台特性和成熟的生态系统成为主流选择。从技术原理看,Java虚拟机(JVM)的垃圾回收机制通过ZGC等算法优化,已能满足物联网场景的低延迟需求。在工程实践层面,Java提供了从设备连接(如MQTT协议)、数据持久化(如InfluxDB)到云端服务(Spring Boot)的完整解决方案。典型应用场景包括工业物联网设备管理和消费级SaaS平台,其中开源框架如Eclipse Kura和ThingsBoard各有侧重。通过合理使用Netty、Drools等技术组件,配合JVM调优

weixin_30675247的博客 365

Thingsboard 规则引擎规则链入门教程

一、规则引擎是什么? 官方解释:“规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。” Thingsboard解释:Thingsboard平台的核心处理引擎,好比一台车子的发动机,是基于事件构建的工作流,是一个高度可定制的框架,用于复杂事件的处理。 二、T...

物联网平台 1万+

ThingsBoard 3.6.3 保姆级安装教程:从Docker到源码编译,一次搞定所有环境问题

本文提供ThingsBoard 3.6.3的保姆级安装教程,涵盖Docker部署和源码编译两种方式,解决物联网平台部署中的常见问题。从环境规划、依赖配置到生产级调优,详细讲解如何避免Cassandra节点通信故障、PostgreSQL初始化失败等实战经验,帮助开发者快速搭建高可用的物联网平台。

dianjin3567的博客 510

Thingsboard规则链介绍及运用详解

Thingsboard规则链介绍及简单配置。

weixin_71146793的博客 7261

ThingsBoard-规则引擎介绍

ThingsBoard-规则引擎介绍

AldrichEugene 1543

ThingsBoard源码解析-规则引擎

thingsboard

一个技术菜鸟的博客 2676

4步上手ThingsBoard物联网平台:从一键部署到完成第一次界面改造

搭一个能用的IoT平台,常被"Java后端+前端+消息队列+数据库"的依赖链劝退。这篇文章带你用4条Docker命令部署ThingsBoard物联网平台,再亲手改一次界面主题色——读完你能独立跑起设备管理与数据可视化环境,并完成第一个真实改动。 ## 项目速览:ThingsBoard 能做什么 ThingsBoard 是一个开源 IoT 平台,覆盖设备管理、遥测数据采集、规则引擎处理和仪表盘可

gitblog_00990的博客 399

ROS激光雷达动态避障算法优化(C++实战)

本文深入探讨了ROS激光雷达动态避障算法的C++实战优化。针对动态环境的核心挑战,文章系统性地介绍了从激光数据预处理(降噪、瘦身)、动态障碍物检测与跟踪,到基于动态窗口法(DWA)的智能决策与调优的全流程。重点分享了如何将障碍物速度预测融入DWA打分函数,以实现更安全、流畅的避障,并提供了工程架构、性能优化及真机调试的实用建议。

weixin_29192141的博客 946

ThingsBoard 上手指南:本地跑起物联网平台并接入第一台设备

如果你想把 ThingsBoard 物联网平台在本地跑起来、接入一台设备、在仪表盘看到遥测数据,这篇文章带你一步步做完:构建一个可运行的实例,用 MQTT 发出第一条遥测,最后给出两个可以继续深入的方向。 ## 环境前置条件:检查 JDK 25、Maven 与 PostgreSQL ThingsBoard 是 Java 多模块 Maven 工程,前端 UI 在构建时由 Maven 自动拉取 N

gitblog_00510的博客 138

基于溶解气体分析(DGA)的变压器DGA数据故障诊断含代码含数据

在拥有可靠的DGA数据的前提下,结合机器学习分类算法,可以实现变压器的故障诊断。在此数据集的基础上,用随机森林跑出的结果如图。

Jason_Orton的博客 2704

自动驾驶中的多传感器融合实战:用卡尔曼滤波搞定毫米波雷达与摄像头航迹对齐

本文深入探讨了自动驾驶中多传感器融合的实战技术,重点介绍了如何使用卡尔曼滤波实现毫米波雷达与摄像头的航迹对齐。通过分析传感器特性差异、时空同步挑战及工程化实现步骤,提供了包括状态向量定义、观测矩阵设计和故障检测机制在内的完整解决方案,最终实现0.15米以内的高精度航迹对齐。

weixin_28728495的博客 411

ThingsBoard 开源物联网平台完全实操:一条命令启动,从 MQTT 设备接入到实时数据监控

设备连上了,数据却散落在日志里?ThingsBoard 是一个开源的物联网平台,帮你把设备接入、遥测采集、告警处理和仪表盘监控一次搞定。下面按"先跑起来、再连设备、最后加自动化"的顺序带你走完。 ## 它到底解决什么问题 一句话定位:**开源的 IoT Platform**,覆盖设备管理、数据收集、处理与可视化(见 [README.md](https://link.gitcode.com/i/

gitblog_00121的博客 407

避坑指南:Unity新版InputSystem在移动端的5个常见问题及解决方案

本文针对Unity新版InputSystem在移动端开发中的常见问题,提供了5个关键解决方案,包括虚拟摇杆灵敏度调节、多点触控冲突处理、按钮反馈延迟优化、手势识别与陀螺仪数据融合以及Android/iOS平台差异处理。这些实战经验帮助开发者高效解决触控适配难题,提升移动游戏体验。

soda5的博客 405

ThingsBoard物联网平台部署与环境搭建完全指南:Docker四步速启、二进制安装、源码编译

准备把第一台设备接上物联网平台,却被环境搭建卡住?ThingsBoard 是一个开源物联网平台,覆盖设备管理、数据采集、规则处理与可视化,本文带你走通 Docker、二进制包、源码编译三条部署路径,10 分钟让平台跑起来,并附上高频翻车点的解法。 先对一下机器,不够的话再往上加: | 项目 | 最低配置 | 推荐配置 | | --- | --- | --- | | CPU | 2 核 | 4

gitblog_01134的博客 373

从零开始做题:big_zip

内容为:You_know_the_bed_feels_warmer_Sleeping_here_alone_You_know_I_dream_in_color_And_do_the_things_I_want_You_think_you_got_the_best_of_me_Think_you_had_the_last_laugh_Bet_you_think_that_everything_good_is_gone。查看压缩包内容,发现有五字节长度的文件,用crc碰撞攻击破解明文。

weixin_44626085的博客 1242

01-FreeSWITCH 的安装、部署、配置以及可能遇到的问题和解决方法

一文让您了解从FreeSWITCH 的安装、部署、配置、可能遇到的问题及解决方法。一切从实际项目出发,以工程应用为目的。

秋风的博客 2127

3 步跑通 ThingsBoard 物联网平台:从第一条命令到实时监控面板

你买了一批温湿度传感器,想随时看温度、超温自动告警——自己搭得先配 MQTT broker、数据库、仪表盘前端、告警引擎……写三周代码还没跑通。ThingsBoard 是开箱即用的开源物联网平台,负责设备接入、数据采集、处理与可视化,一条 Docker 命令拉起完整集群。 ## 一眼看懂定位:一体化物联网平台 一句话定位:ThingsBoard 把"设备接入 → 数据入库 → 规则处理 → 仪

gitblog_00420的博客 249

HyperLynx(十三)Hyperlynx前放置之对网络的EMC分析

在“Spectrum Analyzer”对话框的“Stimulus”(激励)栏中,设置激励源频率为100MHz,选择“IC modeling”为“Fast-Strong”,并按图所示设置其他选项。显然,在仿真的基频上,它的幅值最大,将鼠标光标置于柱状图上,可以读取其值为64.28mA,这个数值是由选定的驱动芯片决定的。按上图所示的原理图,在接收端增加一个并联的RC负载,再次运行仿真,结果如图所示。在对话框左侧的“Pins”列表中,显示出了已添加电流探针的引脚,可以在此列表中选择所要仿真的目标。...

小幽余生不加糖 4680

ThingsBoard 从零部署教程:15 分钟跑通设备接入、MQTT 遥测上报与实时仪表盘

ThingsBoard 是一个 All-in-one IoT 平台,负责设备管理、数据采集、处理与可视化。这份 ThingsBoard 部署教程面向第一次接触物联网平台的新手:全程在一台机器上从源码构建、启动实例、接入一台模拟设备,并搭出第一块实时仪表盘。做完你将拥有: - 一个跑在本机 8080 端口的 ThingsBoard 实例 - 一台通过 MQTT 1883 端口持续上报遥测数据的模拟

gitblog_00088的博客 379

Qt/C++ 音视频开发 - FFmpeg 安卓版

通过将 FFmpeg 集成到 Qt/C++ 项目中,我们可以实现强大且灵活的音视频处理功能。本文介绍了在安卓平台上使用 FFmpeg 的基本步骤,包括初始化、解码、处理和编码等。实际应用代码示例展示了如何在安卓设备上播放视频。

走向CTO的路上... 1193

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ThingsBoard Docker 部署:从零接入第一台设备并跑通遥测数据

ThingsBoard 是开源 IoT 平台,管设备接入、数据采集、处理与可视化。适合有命令行基础、想把一批传感器接上平台的开发或运维读。读完并跟着做完,你手上会多一个本地跑起来的 ThingsBoard 实例、一台通过 MQTT 上报遥测的模拟设备,以及一个能看到数据的仪表盘。 ## 动手前:环境自检 先确认四件事,省得中途返工: - **Java 25 + Maven 3.9+**:构建

gitblog_00228的博客 159

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ThingsBoard 部署安装实战:从演示环境到生产集群的一条路

ThingsBoard 是开源的 IoT 平台,负责设备管理、数据采集、处理与可视化,并提供 MQTT、HTTP、CoAP、LwM2M、SNMP 等多种设备接入协议。本文给出三条 ThingsBoard 部署路线:单容器演示、Docker Compose 微服务和源码编译定制,每条路线都按"命令 + 成功标志"组织,照着敲完即可用。 ## 🧭 一分钟选型 先对号入座,然后直接跳到对应路线:

gitblog_00567的博客 450

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ThingsBoard集群部署方案:高可用架构设计与负载均衡配置

随着物联网设备规模的快速增长,单节点部署的ThingsBoard面临性能瓶颈和单点故障风险。本文将详细介绍如何通过Docker Compose实现ThingsBoard的高可用集群部署,包括多节点服务编排、负载均衡配置及故障转移策略,确保系统在大规模设备接入场景下的稳定性和可扩展性。 ## 集群架构设计 ### 核心组件与服务拆分 ThingsBoard集群采用微服务架构,将核心功能拆分为多...

gitblog_00732的博客 761

ThingsBoard 部署避坑实录:三种姿势从 5 分钟跑通到生产级调优

ThingsBoard 是开源 IoT 平台,覆盖设备管理、数据采集、处理与可视化。它的部署核心关键词是 docker-compose:一条命令拉起 2 个 core、2 个规则引擎、5 种协议传输和 haproxy 的完整微服务套件。这篇文章讲清选型取舍、Docker 一键启动的实操路径、二进制包与源码编译的差异,以及端口、数据库、内存三类最常见的坑怎么定位、怎么一行修掉。 ## 选错部署路径

gitblog_00531的博客 650

ThingsBoard消息优先级:3层机制让高优先级消息跑在前面

半夜两点,温度传感器的告警消息卡在一堆常规上报数据后面,大屏上的红色告警迟到了将近一分钟。你翻源码想找个"priority"字段去调,结果发现 ThingsBoard 里根本没有 int 型的优先级字段——它给紧急消息直接开了一条独立的"高优先级车道"。 整篇文章就拆两块:先讲清楚"优先级"这东西在 ThingsBoard 里到底落在哪一层,再带你用 3 步把这条高优先级车道实际跑起来。 ##

gitblog_00676的博客 349

2026物联网平台选型:设备影子、Node-RED沙箱与视频流调度三大硬核指标

物联网平台本质是设备管理、边缘计算与智能视频的协同系统。设备影子状态同步决定远程控制实时性,Node-RED沙箱资源隔离能力影响边缘逻辑可靠性,视频流缓冲区调度则关乎AI推理稳定性。三者耦合深度直接决定工业场景下故障恢复速度、算力利用率与系统自治时长。当前主流平台在设备影子延迟容忍度、Node-RED流级内存隔离、视频流-GPU显存协同调度等底层机制上差异显著,尤其在中小制造远程诊断、教育虚拟串口实训、安防多路分析及终端刷机备份等典型场景中,需穿透宣传话术,聚焦设备影子同步机制与Node-RED沙箱环境两大

weixin_33804582的博客 377
上一篇: springboot 日志框架 logback 自定义 appender 实现log日志数据通过websocket 推送到 前端进行滚动输出
下一篇: 物联网平台 Thingsboard rule engine 规则引擎 - 设备消息处理过程
gzcsschen
博客等级 码龄16年 72粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gzcsschen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值