JAVA在物联网开发场景下,需要避的大坑以及优化方向

物联网时代马上来临了。
现在java开发已经不是传统的开发了。很多时候会涉及到物联网的对接。
在这里我将最近几年的物联网开发经验坐下整理,也算是积累吧。

1. 框架选择

这里的框架涉及到JAVA长连接框架, 序列化框架, 服务器操作系统等等
首先要否定的是 自己动手写一个。 这个难度真的太高了。
NIO框架: 推荐使用 netty
序列化框架: 推荐magic-byte. https://github.com/MisterChangRay/magic-byte
这是我自己封装的。 在我司项目跑了2年了。
另外就是在硬件协议接入时。 最好在TCP层进行数据安全的校验。 此时需要对linux防火墙做出扩展。

2. 方案设计

一般来说 物联网设备在连接之初需要进行安全鉴定, 入网 , 然后才是正常的报文传输。
这里有几点需要注意的地方,

2.1 设备端密钥方案

设备端密钥主要用于报文传输时进行加密校验。 提高数据安全性,一般推荐一机一密。 即每个设备都拥有独立的密钥。 这样最安全。 或者一型一密。一种型号一个密钥。
密钥是或不可缺的,必要的。在设计时最好将密钥也设计为动态绑定。这样即使单机密钥被破解后。可以灵活更换。

2.2 设备端接入点

设备端接入点主要负责设备接入。 在设备接入时。 此端压力最大。 推荐设备端接入和数据处理服务独立。 避免每次服务上下线所有设备都重连。
设备重连量小可能没什么问题(小于1W台)。 建议同时开多个端口,我开了10个负责建连接。
量大则可能瞬间击垮服务。造成服务不可用。所以设备接入业务最好设计为只处理连接的安全验证和报文数据的接收转发。
至于设备接入时验证方案。可以要求设备端在设备连接规定时间内,必须上报一段数据来验证密钥的准确性。否则就T下线。
如果想更安全一点可以考虑对TCP协议进行修改。在TCP协议头中包含可选配置数据区。在这块数据区做标识。这样可以在TCP层就进行拦截。提高攻击门槛。
参考【自定义TCP封包过滤】https://github.com/MisterChangRay/custom-tcp-filter

2.3 设备接入和数据处理

设备端接入已经进行数据的解密和安全验证了。 数据处理时只需要关注数据完整性。 此时需要注意,

  1. 由于设备接入和设备数据处理是异步的。所以此时可能需要数据报文中包含一个顺序的字段。
  2. 需要设计一个字段 对 元数据再次签名, 可以使用 CRC32 之类的
  3. 可以的话, 这里可以对元数据 自定义一套加密算法。很简单的那种都可以的。 比如和签名字段异或一下之类的。 进一步提高攻击门槛
2.4 报文方案设计总结
  1. 报文数据自带递增ID, 最好和时间无关性。
  2. 报文需要进行签名
  3. 可以的话自定义一套算法对元数据再加密一次。
  4. 协议最好不要采用字符串协议,流量开销太大

3. 服务器或JVM调优

硬件接入需要对TCP协议, 服务器, 和JVM进行配置。

  1. tcp协议。 增加连接区缓冲区大小; 减少或关闭自动重试和重连; 关闭连接重用。
  2. 服务器。 调整最大句柄数。 增加读写缓冲区。
  3. JVM。 由于连接的特性, 推荐使用G1。 服务最好有2GB或以上内存
    以上优化推荐 google 关键字 : tcp百万连接优化

附上我github地址, 求关注求点赞: https://github.com/MisterChangRay

posted @ 2021-12-09 11:18  枫潇雨  阅读(902)  评论(0)    收藏  举报