首页 > 编程语言 >关于java对接物联网设备自定义协议的安全性,以及长链接场景下需要注意的事项

关于java对接物联网设备自定义协议的安全性,以及长链接场景下需要注意的事项

时间:2023-03-15 11:46:10浏览次数:58  
标签:协议 通讯 java 自定义 报文 TCP 联网 序列化 链接

  1. 目前从事于物联网行业。 共享充电宝。 负责通讯相关。 当前设备在线量约50W 台。记录一下走得弯路。 方便大家借鉴。

    文笔不太好,希望大家轻喷。

    本文主要是从以下几个方面探讨:

    1. 物联网方案选型

    2. 通讯协议设计

    3. 后台架构设计

    4. 统计和监控

     

    1.物联网方案选型

    方案选型这一块其实蛮多的。 需要大家根据自己得业务类型来做出选择。 是直接走TCP长连接? 还是使用MQTT, HTTP这些已经封装好得协议。

    mqtt 协议开箱即用,方便快捷。 而且相关的开源项目也不少。方便借鉴和资料查找。 目前各大云平台也有IOT相关服务。 直接链入快速开发即可。 但却不在本文讨论之中。本文只讨论TCP协议。

    如果使用TCP协议, 对于业务的话则需要重传, 确认机制。 对于业务性强的领域。 可以考虑增加 短信,和UDP 进行通讯。

    我方目前采用 TCP + 短信进行通讯, 目前95% 的流量再TCP就进行处理了。(只有部分剩余机器所处网络状况不佳) 剩余 约 5 % 使用的短信进行通讯。

     

    2. 通讯协议设计

    这里推荐大家自定义私有协议。 安全性高。 报文体积小。 在这里有几点需要注意:

    1. 如果机器没有时间芯片,不推荐使用时间作为报文的序号
    2. 报文一定要增加序号, 最好自动递增
    3. 重要的报文增加 sessionId 会话编号。 即后台下发 机柜返回。方便做业务上的对应
    4. 报文建议增加简单的加密, 简单的异或都可以
    5. 报文需要设计重传机制。

    对于报文设计来说, 最好的是尽可能的将所有设备信息上报。 方便业务进行处理。 而不要在硬件上进行消息屏蔽。 应在后台业务中做出处理。

     

    3. 后台架构设计

    当前的云服务器 ECS  4C/8G/10MB , 这种配置一台可以扛住1W 以上链接。 但是在做链入设计时。 最好使用2台以上服务器来进行轮询分配。 避免单点故障。 这一点在任何系统中都应该做备灾设计。 至于开发语言。 其实用什么都可以的。 目前无论时 java/ php/ nodejs 。性能基本都足够使用。  反正我现在觉得 性能什么的都是扯淡。 业务才是最重要的。       只要业务能赚钱, 完全可以重构做2.0, 3.0; 性能时迭代上去的。

     

    4. 统计和监控

    在这里也需要注意一点, 对于物联网来说, 统计监控必须要做好。

    推荐使用列式存储, 可压缩。而且方便分析处理。 我们使用的是 clickhouse. 

    主要需要统计以下指标:

    • 链入次数
    • 接口请求走势
    • 数据上报走势
    • 异常发生走势
    • 当前在线设备

    对于设备来说, 日志可以多存一点方便跟踪和排查问题。 以上指标最好做聚合分析。 使用钉钉什么做一个推送。一有异常, 马上排查。 对于物联网设备来说, 量小一般不会有什么问题。 设备量大问题马上就暴露了。 而且由于重试等机制, 容易出现洪水攻击导致后台雪崩。 所以监控最好早点做。 防微杜渐。

最后,在物联网开发对接中, 序列化是一个必须要解决的问题。很多时间都会花在协议对接和字节操作的细节之中。所以这里我封装了一套序列化的框架,欢迎大家使用!

magic-byte: 一种简单的方式将java对象转为字节数据,用于快速高效的自定义序列化/反序列化场景,类似C的Strcut结构体,多用于私有通讯协议实现。 (gitee.com)

标签:协议,通讯,java,自定义,报文,TCP,联网,序列化,链接
From: https://www.cnblogs.com/raychang/p/17217932.html

相关文章

  • JAVA设备对接中,字节协议序列化的简单方式
    一般来说,java在和设备进行对接时都会使用私有协议或自定义协议,在序列化这些协议时会相当的繁琐,而且比较注重细节。 基于之前的对接经验,我整理并完成了一套序列化框架。......
  • 【Java工具】在代码头部加版权
    importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.RandomAccessFile;publicclassTest......
  • JAVA物联网私有协议,自定义协议开发
    在当代物联网行业中,由于隐私和安全问题,很多的公司选择使用自定义的私有二进制协议。在C语言中,由于有结构体的加持,对象和字节数组转换起来就特别简单;但在java中,在没有原生支......
  • Java中List、Map常见实现类
    一、List1.ArrayList底层是数组实现,线程不安全publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.S......
  • JavaScript删除URL指定的参数和值
    JavaScript删除URL指定的参数和值,不跳转(functionhandleLocationHref(){varurl=window.location.href;varparams=(window.location.search||'?').s......
  • java实现获取百度/微博/头条/知乎热榜数据
    ​ java实现定时获取百度/微博/头条/知乎热榜数据,做一个热榜数据榜单。目录一、效果展示二、热搜榜单三、程序代码一、效果展示效果预览地址:https://www.ewba......
  • 字符串的逐个输出(java)
    import java.util.Scanner;public class Ward{public static void main(String[]args){Scannerinput =new Scanner(System.in);Stringstr =input.next......
  • 关于.net 和 JAVA 在内存处理(GC)设计上的差距(ChatGPT水文)
    我听说,java在内存方面,有线程专用的堆空间,从而加快内存分配和回收的速度(因为没有并发的考虑?),是这样的吗?.net有类似的技术吗?是的,Java确实有线程专用的堆空间,即ThreadLoca......
  • java OSS存储文件 ofd文件格式转pdf
    javaofd文件转pdf之前有博客写了ofd与pdf文件进行相互转化,【pdf与ofd相互转化】,但是spire-pdf的jar包进行ofd转为pdf时,如果是双层ofd文件,最后转化的结果会丢失......
  • ABAP 基于Function ALV 实现单元格自定义搜索帮助
    1.实现ALV报表自定义搜索帮助效果如下:点击搜索帮助按钮,弹出框 双击值并填入单元格内 2.实现思路 2.1定义变量以及F4搜索帮助自定义类,并实现 "定义ALV变量......