Giter VIP home page Giter VIP logo

jetlinks / jetlinks-community Goto Github PK

View Code? Open in Web Editor NEW
5.0K 137.0 1.6K 66.79 MB

JetLinks 基于Java8,Spring Boot 2.x ,WebFlux,Netty,Vert.x,Reactor等开发, 是一个全响应式的企业级物联网平台。支持统一物模型管理,多种设备,多种厂家,统一管理。统一设备连接管理,多协议适配(TCP,MQTT,UDP,CoAP,HTTP等),屏蔽网络编程复杂性,灵活接入不同厂家不同协议等设备。实时数据处理,设备告警,消息通知,数据转发。地理位置,数据可视化等。能帮助你快速建立物联网相关业务系统。

Home Page: https://www.jetlinks.cn/

License: Apache License 2.0

Java 99.58% Shell 0.17% JavaScript 0.14% HTML 0.09% Dockerfile 0.02%
iot java spring-boot webflux reactor r2dbc iot-platform rule-engine mqtt tcp

jetlinks-community's People

Contributors

asuka1989 avatar bestfeng1020 avatar codacy-badger avatar dependabot[bot] avatar doveylovey avatar fighter-wang avatar goten7 avatar kyouji avatar liu4410 avatar ningqingsheng avatar pengyudeng avatar qq517634644 avatar tancongsir avatar vvsd avatar wangzheng0723 avatar wujun8 avatar zeje avatar zengjianfei avatar zhou-hao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jetlinks-community's Issues

如何修改docker-compose.yml文件中的端口?

背景:我的环境中,分配给我一段独立的端口范围(如20000~20100)。其余端口范围不允许占用

我看docker-compose.yml中暴露的端口有许多:
kibana:
ports:
- "5602:5601"
postgres:
ports:
- "5432:5432"
ui:
ports:
- 9000:80
jetlinks:
ports:
- 8848:8848 # API端口
- 1883-1890:1883-1890 # 预留
- 8000-8010:8000-8010 # 预留
environment:
- "hsweb.file.upload.static-location=http://127.0.0.1:8848/upload" #上传的静态文件访问根地址,为ui的地址.
- "spring.r2dbc.url=r2dbc:postgresql://postgres:5432/jetlinks" #数据库连接地址
- "elasticsearch.client.post=9200"
- "spring.redis.port=6379"

准备把ports中绑定到的主机端口全部修改掉。那上面environment中的4个端口是否需要修改?

谢谢!

admin使用token踢用户下线问题

对应在UI页面时,页面并没有退出登录状态,仍然可以进行操作. 是否因为是不同session之间无法进行通信导致,所以admin实际并未让用户下线

mongo的jar包也要引用?

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

org.springframework.boot.autoconfigure.mongo.MongoClientFactorySupport.applyUuidRepresentation(MongoClientFactorySupport.java:85)

The following method did not exist:

com.mongodb.MongoClientSettings$Builder.uuidRepresentation(Lorg/bson/UuidRepresentation;)Lcom/mongodb/MongoClientSettings$Builder;

The method's class, com.mongodb.MongoClientSettings$Builder, is available from the following locations:

jar:file:/D:/mongo-java-driver-3.11.0.jar!/com/mongodb/MongoClientSettings$Builder.class

The class hierarchy was loaded from the following locations:

com.mongodb.MongoClientSettings.Builder: file:/D:/mongo-java-driver-3.11.0.jar

reidis Cannot connect, Event executor group is terminated.

redis Luttuce 连接报错

aused by: org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is java.lang.IllegalStateException: Cannot connect, Event executor group is terminated. at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:109) at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.getConnection(LettuceConnectionFactory.java:1440)

设备详情空白页面

选择设备实例列表中的单个设备,点击“查看”按钮,偶尔会出现加载出来空白的页面
bug

【需求】可以制作一个代码生成器吗

虽然 spring boot 倡导可以代码生成就应该内置在框架中

但是不可能不写重复业务,DRY也是相对的。

代码生成器让新手更快上手 平台CRUD业务,菜鸟友好。

++++++++++++++++
附注:特别是 react antd 写起来真不如 vue 方便。

不能针对某个设备下发消息

你好,老周,有个问题

mqtt协议的设备test001和test002,当我想要上线test001设备时,我发了一个主题的消息/device_online_status
内容{
"status":"1",
"deviceId":"test001"
}
我的设备test001 订阅了/device_online_status 能获取信息 但是设备test002 也订阅了/device_online_status 也能获取信息
同样/read-property 我去获取设备信息 所有的设备都能获取订阅信息

采用docker运行,报错后端容器报访问不了redis

Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to redis:6379
jetlinks-ce | at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
jetlinks-ce | at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
jetlinks-ce | at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:234)
jetlinks-ce | at io.lettuce.core.RedisClient.connect(RedisClient.java:207)

Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: No route to host: redis/172.18.0.3:6379
jetlinks-ce | Caused by: java.net.ConnectException: finishConnect(..) failed: No route to host

MqttClient receive message error: MqttMessage cannot be cast to class MqttPublishMessage

jdk:openjdk11.0.8
jetlinks-community versoin: 1.6
netty-mqtt-client version: 1.0.0

mqtt客户端在接收数据长度较长的message时报错:

java.lang.ClassCastException: class io.netty.handler.codec.mqtt.MqttMessage cannot be cast to class io.netty.handler.codec.mqtt.MqttPublishMessage (io.netty.handler.codec.mqtt.MqttMessage and io.netty.handler.codec.mqtt.MqttPublishMessage are in unnamed module of loader 'app')
	at org.jetlinks.mqtt.client.MqttChannelHandler.channelRead0(MqttChannelHandler.java:31) ~[netty-mqtt-client-1.0.0.jar:na]
	at org.jetlinks.mqtt.client.MqttChannelHandler.channelRead0(MqttChannelHandler.java:11) ~[netty-mqtt-client-1.0.0.jar:na]
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at org.jetlinks.mqtt.client.MqttPingHandler.channelRead(MqttPingHandler.java:39) ~[netty-mqtt-client-1.0.0.jar:na]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) ~[netty-handler-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323) ~[netty-codec-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) ~[netty-codec-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:349) ~[netty-codec-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:278) ~[netty-codec-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:677) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:612) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:529) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:491) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905) ~[netty-common-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.34.Final.jar:4.1.34.Final]
	at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

初步分析错误源于数据长度超过了MqttDecoder.DEFAULT_MAX_BYTES_IN_MESSAGE=8092

private static final int DEFAULT_MAX_BYTES_IN_MESSAGE = 8092;

当通过MqttClient的create静态方法创建org.jetlinks.mqtt.client.MqttClientImpl时,MqttClientImpl使用MqttDecoder的无参构造创建MqttDecoder实例,而这里没有找到相关配置入口。

final class MqttClientImpl implements MqttClient {
...
        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            if (sslContext != null) {

                SSLEngine engine = sslContext.newEngine(ch.alloc(), host, port);
                sslEngineConsumer.accept(engine);
                ch.pipeline().addFirst("ssl", new SslHandler(engine));
            }

            ch.pipeline().addLast("mqttDecoder", new MqttDecoder());
            ch.pipeline().addLast("mqttEncoder", MqttEncoder.INSTANCE);
            ch.pipeline().addLast("idleStateHandler", new IdleStateHandler(MqttClientImpl.this.clientConfig.getTimeoutSeconds(), MqttClientImpl.this.clientConfig.getTimeoutSeconds(), 0));
            ch.pipeline().addLast("mqttPingHandler", new MqttPingHandler(MqttClientImpl.this.clientConfig.getTimeoutSeconds()));
            ch.pipeline().addLast("mqttHandler", new MqttChannelHandler(MqttClientImpl.this, connectFuture));
        }
...
}
public final class MqttDecoder extends ReplayingDecoder<DecoderState> {
...
    public MqttDecoder() {
      this(DEFAULT_MAX_BYTES_IN_MESSAGE);
    }

    public MqttDecoder(int maxBytesInMessage) {
        super(DecoderState.READ_FIXED_HEADER);
        this.maxBytesInMessage = maxBytesInMessage;
    }
...
}

请问能否在MqttClientConfig中增加针对MqttDecoder的maxBytesInMessage字段配置?

自定义jar包协议修改重新发布不生效

jetlinks版本: 1.8.0
项目可正常启动,操作。在修改自定义jar包协议,并重新上传关重新发布后,未生效,本地项目重启后可正常使用
jdk: 1.8
其它的都按代码版本进行安装,windows10
问: 修改协议后,在重新发布之后,未生效的原因。

用户登录问题

`` return beforeEvent
.publish(eventPublisher)
.then(authenticationManager
.authenticate(Mono.just(new PlainTextUsernamePasswordAuthenticationRequest(username, password)))
.switchIfEmpty(Mono.error(() -> new AuthenticationException(AuthenticationException.ILLEGAL_PASSWORD,"密码错误")))
.flatMap(auth -> {
//触发授权成功事件
AuthorizationSuccessEvent event = new AuthorizationSuccessEvent(auth, parameterGetter);
event.getResult().put("userId", auth.getUser().getId());
return event
.publish(eventPublisher)
.then(Mono.fromCallable(event::getResult));
}));

用户登录的这段代码中,如果用户已经删除了,那么如果用删除的用户名去登录,我认为需要去做特殊处理.而不能所有的归咎为密码错误这种异常

Elasticsearch 异常本地运行项目

2020-09-10 09:34:41.680 INFO 30688 --- [ main] o.j.c.standalone.JetLinksApplication : Starting JetLinksApplication on tcl-OptiPlex-9020 with PID 30688 (/home/tcl/java_project/jetlinks-community/jetlinks-standalone/target/jetlinks-standalone.jar started by root in /home/tcl/java_project/jetlinks-community)
2020-09-10 09:34:41.685 DEBUG 30688 --- [ main] o.j.c.standalone.JetLinksApplication : Running with Spring Boot v2.3.3.RELEASE, Spring v5.2.8.RELEASE
2020-09-10 09:34:41.685 INFO 30688 --- [ main] o.j.c.standalone.JetLinksApplication : The following profiles are active: dev
2020-09-10 09:34:47.797 DEBUG 30688 --- [ main] o.j.supports.event.BrokerEventBus : local subscriber [spring:DeviceMessageMeasurementProvider.incrementMessage],features:[local],topics: [/device///message/**]
2020-09-10 09:34:47.955 DEBUG 30688 --- [ main] o.j.supports.event.BrokerEventBus : local subscriber [spring:RuleLogHandler.handleEvent],features:[local],topics: [/rule-engine///event/]
2020-09-10 09:34:47.957 DEBUG 30688 --- [ main] o.j.supports.event.BrokerEventBus : local subscriber [spring:RuleLogHandler.handleLog],features:[local],topics: [/rule-engine/
//logger/]
2020-09-10 09:34:48.049 ERROR 30688 --- [or-http-epoll-1] o.j.c.t.m.TimeSeriesMeterRegistry : register metric [device_metrics] metadata error

org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [type=exception, reason=ActionRequestValidationException[Validation Failed: 1: template is missing;]]
at org.jetlinks.community.elastic.search.service.reactive.DefaultReactiveElasticsearchClient.contentOrError(DefaultReactiveElasticsearchClient.java:857)
at org.jetlinks.community.elastic.search.service.reactive.DefaultReactiveElasticsearchClient.lambda$handleClientError$32(DefaultReactiveElasticsearchClient.java:834)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:118)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:385)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)
at reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onNext(FluxContextStart.java:96)
at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:287)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:330)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1782)
at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:152)
at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136)
at reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:252)
at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136)
at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:378)
at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:373)
at reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:429)
at reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:625)
at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:96)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:792)
at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:475)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.elasticsearch.ElasticsearchException: Elasticsearch exception [type=exception, reason=ActionRequestValidationException[Validation Failed: 1: template is missing;]]
at org.elasticsearch.ElasticsearchException.failureFromXContent(ElasticsearchException.java:596)
at org.jetlinks.community.elastic.search.service.reactive.DefaultReactiveElasticsearchClient.getElasticsearchException(DefaultReactiveElasticsearchClient.java:882)
at org.jetlinks.community.elastic.search.service.reactive.DefaultReactiveElasticsearchClient.contentOrError(DefaultReactiveElasticsearchClient.java:852)
... 43 common frames omitted

协议管理中使用自定义的jar包可能会影响服务的正常使用

你好,我现在使用jetlinks的community版本的代码在自己的服务器上部署了一套。目前发现在添加协议管理的jar包时,如果在jar中使用了一些危险的方法,如死循环 while(true){} 或者 System.exit(1) 等类似的方法可以导致服务本身CPU打满或者服务进程被退出等情况,看了下代码似乎没有一个沙箱的环境以保证脚本或者jar的独立运行。不知道在专业版或企业版中是否有对该问题修复,或者是否有对该问题的修复的计划?

spring boot Application run failed

2020-12-09 09:28:54.592 ERROR 1592 --- [ main] o.s.boot.SpringApplication : Application run failed

java.lang.IllegalStateException: Could not register object [org.springdoc.core.GroupedOpenApi@2489e84a] under bean name '': there is already object [org.springdoc.core.GroupedOpenApi@2a39aa2b] bound
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.registerSingleton(DefaultSingletonBeanRegistry.java:124)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerSingleton(DefaultListableBeanFactory.java:1078)
at org.springdoc.core.SpringdocBeanFactoryConfigurer.lambda$postProcessBeanFactory$1(SpringdocBeanFactoryConfigurer.java:76)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.springdoc.core.SpringdocBeanFactoryConfigurer.postProcessBeanFactory(SpringdocBeanFactoryConfigurer.java:76)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:291)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:182)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:707)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:533)
at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:62)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
at org.jetlinks.community.standalone.JetLinksApplication.main(JetLinksApplication.java:33)

Process finished with exit code 1

建议物模型里面的告警设置增加防抖功能

告警设置里面的触发器这里建议加一个防抖的处理,实际情况会出现设备的属性值在某个边界值来回跳动的情况,可能会出现短时间内可能会产生大量的告警记录。
scada里面一般是有个时间窗口的处理,一个时间窗口内连续报多少条,只报一条出来。或者报一条,但是会加上一个次数。

关于自定义TCP协议的拆包问题

  1. 场景:
    tcp客户端通过消息头指定整个数据的大小,比如##0248表示后面的整个数据有248个字符
  2. 问题:
    客户端数据比较长的时候会被拆成两个包,导致解析失败
  3. 期望:
    通过netty的LengthFieldBasedFrameDecoder进行合并处理
  4. 结果:
    在ProtocolSupportProvider类以及DeviceMessageCodec类,没有找到可以介入的地方

收到一条数据只能返回一条message的问题

一条数据,可能需要触发多个不同的EVENT,或者一条数据含有的数据比较多的时候,目前decode解析后都只有一条DeviceMessage,无法处理这种情况,有什么解决办法吗?

EventBus的疑问.

看代码中自己实现基于redis的pub/sub消费. 如果启动两个jetlink实例. 发布者发布消息. 订阅者这两个实例是都会受到. 还是并发消费只有一个会受到?

docker-compose启动时,一直报连接不上es的localhost:9200地址

错误日志如下:
2020-09-03 15:37:06.553 ERROR 6 --- [or-http-epoll-4] o.j.c.t.m.TimeSeriesMeterRegistry : failed to send metrics [jetlinks-metrics]
jetlinks-ce |
jetlinks-ce | org.springframework.data.elasticsearch.client.NoReachableHostException: Host 'localhost:9200' not reachable. Clusterstate is offline.
jetlinks-ce | at org.springframework.data.elasticsearch.client.reactive.SingleNodeHostProvider.lambda$null$4(SingleNodeHostProvider.java:106)
jetlinks-ce | at reactor.core.publisher.MonoErrorSupplied.call(MonoErrorSupplied.java:76)
jetlinks-ce | at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:132)
jetlinks-ce | at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1782)
jetlinks-ce | at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:144)
jetlinks-ce | at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:73)
jetlinks-ce | at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2344)
jetlinks-ce | at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2152)
jetlinks-ce | at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onSubscribe(FluxOnErrorResume.java:68)
jetlinks-ce | at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54)
jetlinks-ce | at reactor.core.publisher.Mono.subscribe(Mono.java:4213)
jetlinks-ce | at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:97)
jetlinks-ce | at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:165)
jetlinks-ce | at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onError(Operators.java:2021)
jetlinks-ce | at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:390)
jetlinks-ce | at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onError(MonoPeekTerminal.java:251)
jetlinks-ce | at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onError(FluxMap.java:252)
jetlinks-ce | at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onError(FluxPeekFuseable.java:894)
jetlinks-ce | at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onError(FluxPeekFuseable.java:894)
jetlinks-ce | at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onError(FluxPeekFuseable.java:894)
jetlinks-ce | at reactor.core.publisher.MonoNext$NextSubscriber.onError(MonoNext.java:87)
jetlinks-ce | at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onError(MonoFlatMapMany.java:197)
jetlinks-ce | at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
jetlinks-ce | at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.whenError(FluxRetryWhen.java:213)
jetlinks-ce | at reactor.core.publisher.FluxRetryWhen$RetryWhenOtherSubscriber.onError(FluxRetryWhen.java:255)
jetlinks-ce | at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:406)
jetlinks-ce | at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onNext(FluxConcatMap.java:243)
jetlinks-ce | at reactor.core.publisher.DirectProcessor$DirectInner.onNext(DirectProcessor.java:333)
jetlinks-ce | at reactor.core.publisher.DirectProcessor.onNext(DirectProcessor.java:142)
jetlinks-ce | at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99)
jetlinks-ce | at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onError(FluxRetryWhen.java:180)
jetlinks-ce | at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:185)
jetlinks-ce | at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect$TcpClientSubscriber.onError(HttpClientConnect.java:352)
jetlinks-ce | at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:185)
jetlinks-ce | at reactor.netty.resources.PooledConnectionProvider$DisposableAcquire.onError(PooledConnectionProvider.java:500)
jetlinks-ce | at reactor.netty.internal.shaded.reactor.pool.AbstractPool$Borrower.fail(AbstractPool.java:408)
jetlinks-ce | at reactor.netty.internal.shaded.reactor.pool.SimplePool.lambda$drainLoop$5(SimplePool.java:233)
jetlinks-ce | at reactor.core.publisher.FluxDoOnEach$DoOnEachSubscriber.onError(FluxDoOnEach.java:172)
jetlinks-ce | at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:185)
jetlinks-ce | at reactor.netty.resources.PooledConnectionProvider$PooledConnectionAllocator$PooledConnectionInitializer.operationComplete(PooledConnectionProvider.java:281)
jetlinks-ce | at reactor.netty.resources.PooledConnectionProvider$PooledConnectionAllocator$PooledConnectionInitializer.operationComplete(PooledConnectionProvider.java:231)
jetlinks-ce | at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:577)
jetlinks-ce | at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:570)
jetlinks-ce | at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:549)
jetlinks-ce | at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:490)
jetlinks-ce | at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:615)
jetlinks-ce | at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:608)
jetlinks-ce | at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:117)
jetlinks-ce | at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.fulfillConnectPromise(AbstractEpollChannel.java:636)
jetlinks-ce | at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.finishConnect(AbstractEpollChannel.java:655)
jetlinks-ce | at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.epollOutReady(AbstractEpollChannel.java:529)
jetlinks-ce | at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:465)
jetlinks-ce | at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378)
jetlinks-ce | at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
jetlinks-ce | at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
jetlinks-ce | at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
jetlinks-ce | at java.lang.Thread.run(Thread.java:748)
jetlinks-ce |
jetlinks-ce | 保存ElasticSearch数据失败:
jetlinks-ce | io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Connection refused: localhost/127.0.0.1:9200
jetlinks-ce | Caused by: java.net.ConnectException: finishConnect(..) failed: Connection refused
jetlinks-ce | at io.netty.channel.unix.Errors.throwConnectException(Errors.java:124)
jetlinks-ce | at io.netty.channel.unix.Socket.finishConnect(Socket.java:243)
jetlinks-ce | at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.doFinishConnect(AbstractEpollChannel.java:672)
jetlinks-ce | at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.finishConnect(AbstractEpollChannel.java:649)
jetlinks-ce | at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.epollOutReady(AbstractEpollChannel.java:529)
jetlinks-ce | at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:465)
jetlinks-ce | at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378)
jetlinks-ce | at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
jetlinks-ce | at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
jetlinks-ce | at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
jetlinks-ce | at java.lang.Thread.run(Thread.java:748)

进入jetlinks-ce的docker中,查看其配置文件/application/BOOT-INF/classes/application.yml。有如下配置:
elasticsearch:
client:
host: localhost
port: 9200
max-conn-total: 128
connect-timeout: 5000
socket-timeout: 5000
connection-request-timeout: 8000

会不会问题就出在这个localhost参数上?因为该docker中明显不会启动es

在docker的命令行中,执行curl localhost:9200,得到:
curl: (7) Failed to connect to localhost port 9200: Connection refused

访问docker所在主机的IP地址:curl 192.168.1.73:9200,可以发现es服务是OK的:
{
"name" : "koWFGVt",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "1AzvR2FhS4yqWg4T_FZJLg",
"version" : {
"number" : "6.8.11",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "00bf386",
"build_date" : "2020-07-09T19:08:08.940669Z",
"build_snapshot" : false,
"lucene_version" : "7.7.3",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}

数据库脚本有吗?

Caused by: io.r2dbc.postgresql.ExceptionFactory$PostgresqlNonTransientResourceException: ���ݿ� "jetlinks" ������
at io.r2dbc.postgresql.ExceptionFactory.createException(ExceptionFactory.java:98)
at io.r2dbc.postgresql.ExceptionFactory.handleErrorResponse(ExceptionFactory.java:110)
at reactor.core.publisher.FluxHandle$HandleSubscriber.onNext(FluxHandle.java:96)
... 37 common frames omitted

运行开源版报以上错误,postgresql数据库脚本有吗?

🐛[BUG]设备属性点击列表查询内容为空

🐛 bug 描述

设备属性点击列表查询内容为空,实际可以从es上查询出来属性上报的内容

📷 复现步骤

设备管理---》设备---》运行状态---》属性右上角列表按钮

🏞 期望结果

💻 复现代码

image
image
image
image

© 版本信息

  • Jetlinks-ui-antd 版本: [e.g. 4.0.0]
  • umi 版本
  • 浏览器环境
  • 开发环境 [e.g. mac OS]

🚑 其他信息

场景联动404

image
跑起来后,访问后台管理场景联动,跳404页面,看接口是返回404。这个功能是社区版不支持吗
(前后端都是1.7分支)

找不到协议jar包

windows启动和k8s启动
设备接入-》协议管理-》创建协议
找不到协议jar包 目录 /home/pi 下没有协议jar包(服务器上不存在 /home/pi目录)

[QUESTION]How JETLINKS maintains the connection status of the device

I have some questions about the way JETLINKS maintains and stores the connection status of devices:

Update Strategy

  • Whenever the server side receives a message or heartbeat from the device
  • Timed scan of last activity time

Storage

  • Using Redis to store the last active time of a device
  • Using Postgres to store the last active time of a device

Please help me understand it

设备事件无法查看记录

步骤:在设备物模型下添加事件 ==》设备上报事件 ==》事件记录查询为空
上报后事件次数会加一,刷新后会为零,记录显示为空,可以确定ElasticSearch中有该事件记录。

多回复消息如何合并处理

问题:调用设备功能时,有的设备回复消息会有多条,如何处理成一条消息,并返回一个FunctionInvokeMessageReply呢。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.