Giter Site home page Giter Site logo

jetlinks / jetlinks-community Goto Github PK

View Code? Open in Web Editor NEW
5.1K 138.0 1.6K 66.75 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 Issues

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

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

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

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

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

admin使用token踢用户下线问题

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

数据库脚本有吗?

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数据库脚本有吗?

采用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

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

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

你好,老周,有个问题

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

设备事件无法查看记录

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

多回复消息如何合并处理

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

[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

场景联动404

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

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)

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

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

如何修改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个端口是否需要修改?

谢谢!

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

🐛 bug 描述

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

📷 复现步骤

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

🏞 期望结果

💻 复现代码

image
image
image
image

© 版本信息

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

🚑 其他信息

用户登录问题

`` 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));
}));

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

设备详情空白页面

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

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

EventBus的疑问.

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

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包

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

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"
}

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

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

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

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

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

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

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

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.