基于java的多设备类型物联网体系结构的实现
前言:从19年11月开始,从【金融】行业进入【物联网】。 路是封锁,我一个人摸索着前进,但学到了很多新东西。 我给了你很多高清DP。 在此感谢大家。
以下是一些经验的分享,希望对有需要的朋友有帮助。
1、体系结构思路
很久以来,我一直想用springboot mysql实现。 由于熟悉此框架,可以将机械开发工作量减少70%,因此今后更改springcloud也很有用(请注意逻辑实现)。 否则工作量会变大)。
可以说物联网和互联网有共同点,但也有很多不同的东西。
首先要说协议,互联网大多是https或http,但物联网不仅仅是这两种协议,还有UDP协议、TCP协议。
放入干货:
环境: java mysql redis rabbitMQ Mqtt
图解:
这是比较简单的逻辑图,里面的复杂逻辑还是说不出口。
这涉及几个问题。 很多物品的网络设备终端都有心率,活动数据会上升。 怎么保证同时性? 入住的数据是唯一的吗? 如何上传多个设备的数据? 怎么管理? 多个第三方服务如何分发数据?
让我说几句:
1、根据协议分析数据
终端上行数据有433协议、蓝牙、zigbee、tcp、http,还有第一代、第二代、第三代等协议。 我用了一个愚蠢的方法。 按协议解析,存储在不同的表中
我把整个枚举类集中起来存储不同的类型,用分析方法中唯一的上行数据进行区分(我以为上行数据是十六进制)
h0f 22 aebb 820001100020001 bb 23 AABB 8637
“HH0F”是a协议特有的字符,它位于a协议库中。
a协议专用于a设备,其建设表是这样的
a _ tag ————335433543354设备表
a _ data ————335433543354设备数据表
a _ gateway ——3354335433543354网关表
问题是,如果10种设备不能有30个表呢?
我知道有人上过物联网,但根据机器的种类不同,所拥有的属性也不同,可能有三种机器。
电量、数据包顺序、特征值
但是,根据机器的不同,可能还有更多的东西。 例如:
电量、包序、心率、呼吸、体温、动态值。
data表中的数据不能爆炸吗? ——仔细想想,也只是考虑了通用现场存储,data1~data20
多设备类型暂时解决了,以后怎么具体操作?
2、如何避免数据重复
在上图中,我们采用了两项服务。 一种是接受服务,另一种是处理服务的具体处理方法。
收到服务后,收到的数据在base64编码后直接发送到消息队列(rabbitMQ ),处理服务监听rabbitMQ消息并前往解析服务。 就这么简单!
但是,有一个,rabbitMQ会打开ack模式! 然后可以在负荷下做这个步骤!
问题2 )设备越多,同时也会出现问题。 我该怎么办?
Semaphore这是个好东西
来一个数据后插入。 任何数据库都受不了。 然后,批量插入。
//--------数据批量入库开始
私有状态列表tnnobjectsavedo=new ArrayList (;
私有状态持续时间=0l;
//私有静态int count send=0;
隐私声明模板=新模板(1;
@Override
公共语音音频(nndatanndata ) {
try {
semaphoreNnData.acquire (;
if(starttimenndata==0L ) {
starttimenndata=system.current time millis (;
}
listnnobjectsavedo.add(nndata;
if (system.current time millis (-starttimenndata 2000 ) )
ListlistSaveDOOne=new ArrayList (;
listsavedoone.addall (listnnobjectsavedo;
asyncinsertbatch(listsavedoone;
listNnObjectSaveDO.clear (;
startTimeNnData=0L;
}
}catch(exceptione ) {
e .打印堆栈跟踪(;
} finally {
semaphoreNnData.release (;
}
}
@Async
私密性语音同步服务batch {
this.insert batch (列表;
//countSend=countSend list.size (;
//system.out.println ('==================入库数据数量: ' countSend );
}
//--------数据批量入库结束
我做过测试。 这样的方法远远超过了2000瓶/秒。 眼前的朋友在看。
system.current time millis (-starttimenndata 2000//2秒批量签入一次
到这里来一会儿,以后我想我会再补充的!