thingsboard3.3.4版本之后就有了对应的边缘网关的管理功能,对应的边缘网关项目为thingsboard-edge,相比于之前的普通网关或者设备上传遥测数据,边缘网关增加了很多优势:1、边缘端与云端断开连接时,在边缘端缓冲数据,等连接上之后再将缓冲的数据上传到云端,如下图所示:

2、距离设备更近,网络稳定性更高,能够更快的完成设备联动操作

本文主要讲下边缘网关连接云端的过程:

1、在thingsboard项目创建对应的边缘实例

2、 使用上图中的Edge Key与secret启动thingsboard-edge项目

3、边缘端与云端通信是通过grpc实现的,下面就是建立连接流程

EdgeGrpcService

    @Overridepublic StreamObserver<RequestMsg> handleMsgs(StreamObserver<ResponseMsg> outputStream) {return new EdgeGrpcSession(ctx, outputStream, this::onEdgeConnect, this::onEdgeDisconnect, mapper,sendDownlinkExecutorService).getInputStream();}

接下来看下EdgeGrpcSession的构造过程:

    EdgeGrpcSession(EdgeContextComponent ctx, StreamObserver<ResponseMsg> outputStream,BiConsumer<EdgeId, EdgeGrpcSession> sessionOpenListener,Consumer<EdgeId> sessionCloseListener, ObjectMapper mapper,ScheduledExecutorService sendDownlinkExecutorService) {this.sessionId = UUID.randomUUID();this.ctx = ctx;this.outputStream = outputStream;this.sessionOpenListener = sessionOpenListener;this.sessionCloseListener = sessionCloseListener;this.mapper = mapper;this.sendDownlinkExecutorService = sendDownlinkExecutorService;initInputStream();}

下面是建立连接的核心方法:initInputStream

    private void initInputStream() {this.inputStream = new StreamObserver<>() {@Overridepublic void onNext(RequestMsg requestMsg) {if (!connected && requestMsg.getMsgType().equals(RequestMsgType.CONNECT_RPC_MESSAGE)) {ConnectResponseMsg responseMsg = processConnect(requestMsg.getConnectRequestMsg());outputStream.onNext(ResponseMsg.newBuilder().setConnectResponseMsg(responseMsg).build());if (ConnectResponseCode.ACCEPTED != responseMsg.getResponseCode()) {outputStream.onError(new RuntimeException(responseMsg.getErrorMsg()));} else {connected = true;}}if (connected) {if (requestMsg.getMsgType().equals(RequestMsgType.SYNC_REQUEST_RPC_MESSAGE)) {if (requestMsg.hasSyncRequestMsg() && requestMsg.getSyncRequestMsg().getSyncRequired()) {startSyncProcess(edge.getTenantId(), edge.getId());} else {syncCompleted = true;}}if (requestMsg.getMsgType().equals(RequestMsgType.UPLINK_RPC_MESSAGE)) {if (requestMsg.hasUplinkMsg()) {onUplinkMsg(requestMsg.getUplinkMsg());}if (requestMsg.hasDownlinkResponseMsg()) {onDownlinkResponse(requestMsg.getDownlinkResponseMsg());}}}}@Overridepublic void onError(Throwable t) {log.error("Failed to deliver message from client!", t);closeSession();}@Overridepublic void onCompleted() {closeSession();}private void closeSession() {connected = false;if (edge != null) {try {sessionCloseListener.accept(edge.getId());} catch (Exception ignored) {}}try {outputStream.onCompleted();} catch (Exception ignored) {}}};}

initInputStream方法除了有建立连接的processConnect,还有处理来自边缘端上行消onUplinkMsg方法,以及处理云端下发到边缘端的消息响应的onDownlinkResponse方法。

thingsboard之边缘网关建立连接过程相关推荐

  1. (十六)深入理解蓝牙BLE之“建立连接过程和连接失败分析”

    目录 建立连接过程: 连接失败分析: 连接失败原因1: 连接失败原因2:

  2. ssl 原理和建立连接过程

    ssl 与http关系 ssl ("Secure Sockets Layer")加密原理 和https的关系 https = http + ssl ssl 位置: SSL握手 证书 ...

  3. 27.Linux网络编程 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器

    基本概念叫协议 什么叫协议? 协议是一个大家共同遵守的一个规则, 那么在这个网络通信当中,其实就是双方通信和解释数据的一个规则,这个概念 你也不用记,你只要心里明白就可以了, 分层模型, 物数网传会表 ...

  4. TSL/SSL 建立连接过程

    抓包分析SSL/TLS连接建立过程[总结] 1.前言 最近在倒腾SSL方面的项目,之前只是虽然对SSL了解过,但是不够深入,正好有机会,认真学习一下.开始了解SSL的是从https开始的,自从百度支持 ...

  5. 2. ZK客户端与服务端建立连接的过程(基于NIO)

    ZK客户端与服务端建立连接的过程 引例 1. 启动SendThread 2. 状态初始化 3. 开始连接 4. 处理服务端连接响应 5. 流程图 在上一篇<客户端启动源码分析>文章中讲到了 ...

  6. 蓝牙主机从机建立连接绑定过程

    蓝牙主机从机建立连接绑定过程 center与simplePeripheral建立连接过程 center首先进行osal_init_system()初始化各个任务,SimpleBLECentral_In ...

  7. linux 建立http连接失败,【linux】http请求建立连接的时候为啥是tcp三次握手,而不是二次或者四次?...

    面试被问到这样的问题,求大神指教? 回答 我简单点说吧. 无论多少次握手都不能满足传输的绝对可靠. TCP的核心思想:保证数据可靠传输 其次:保证传输效率. 那么,就可以开始回答了: 为什么要握手(为 ...

  8. 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)...

    之前做好的asp.net部署后,发现 访问数据库时: 异常:已捕获: "已成功与服务器建立连接,但是在登录过程中发生错误. (provider: SSL Provider, error: 0 ...

  9. 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)

    已成功与服务器建立连接,但是在登录过程中发生错误. (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确.) 参考文章: (1)已成功与服务器建立连接 ...

最新文章

  1. Matlab与线性代数 -- 单位矩阵
  2. URL/URI/URN的认识
  3. 8月第2周中国五大顶级域名增4.1万 美国减6.8万
  4. 【转】Python开发指南:最佳实践精选
  5. 从搭建脚手架到在npm上发布react组件
  6. php js动态删除数组元素,javascript如何删除数组中的指定元素
  7. UI基础UIView常见属性及方法
  8. aizu 0121 Seven Puzzle
  9. 对话「平衡车之父」:把Solowheel带回中国
  10. LG-P3939 数颜色
  11. 星宸科技嵌入式CPU-SSD222D芯片在人脸门锁应用
  12. 《信息安全工程师教程》学习笔记01(第一章)
  13. 游戏运营全过程剖析,游戏开发,游戏运营,游戏推广问题分析
  14. excel oracle 可为空,类似excel定位功能用不为空值填充为空列,用sql怎么实现
  15. 优化距离计算函数的matlab实现
  16. win10 系统连接 wifi 的小地球图标还在但 wifi 选项没有了的解决办法
  17. 【已解决】ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.
  18. 重新定义一个全新的区块链运行架构:他们的技术有何不同?
  19. 学考计算机使用说明,《大学计算机》上机考试系统操作指南
  20. 凡泰极客「开放银行」主题私享会圆满落地

热门文章

  1. 3d游戏建模如何学习?资深大咖经验分享
  2. 使用HTML CSS制作静态网站【中秋节】
  3. CSS动画:transition画一个爱心
  4. 中国GDG Google I/O之行所见:带回国际创新风采,做中国开发者连接世界的桥梁
  5. 【HTML期末作业】大学生抗疫感动专题网页设计作业 抗疫最美逆行者网页 致敬疫情感动人物网页设计制作
  6. php日志,monolog - PHP 日志神器
  7. 【LaTex写作】关于LaTex的所有名词及其解释
  8. A*寻路中第四种烘培寻路方法Recast Mesh方法:
  9. Flume部署安装详细图文步骤(单节点)
  10. 【微机原理笔记】第 1 章 - 微型计算机基础概论