iot-fox-cloud
它是fox-cloud的对接服务,它提供了将本地数据推送给fox-cloud的能力,同时也提供了来自fox-cloud云端的远程控制能力。
通过该服务,fox-edge本地数据在发生变化的时候,会被推送到fox-cloud之中。
同时,也可以接收来自云端的各种远程操作请求。
它包括 数据推送组件 和 请求转发组件
云端发布器
它的作用是将边缘节点的数据,进行发布到云端的redis/mongodb
它在将边缘节点的数据,统一汇聚到云端的redis后,方便云端数据进行统一查询处理
它在实体同步线程EntityManageScheduler中,对本地Redis/Cache/云端Redis,进行串行操作,
因为是串行操作,所以它不需要考虑多线程的并发带来的各种复杂性的业务顺序和安全问题
四种数据同步模式
模式1:增量Record类型的同步MySQL的数据到云端
该模式是通过周期比对云端和本地最新的数据的记录ID,以此判定是否需要对云端进行增量同步
实现者是RecordEntitySynchronizer
对应的是DeviceRecordEntity和OperateRecordEntity
背景:该表的数据是不断递增的,数据量大,所以采用分页的增量同步,而且这个数据比较重要,所以它重新同步的时候,云端会进行备份旧数据
模式2:增量Logger类型的同步MySQL的数据到云端
该模式是通过周期比对云端和本地最新的数据的记录ID,以此判定是否需要对云端进行增量同步
实现者是LoggerEntitySynchronizer
对应的是DeviceHistoryEntity
背景:该表的数据是不断递增的,数据量大,所以采用分页的增量同步,该数据的安全性第,不会形成备份数据
模式3:全年同步MySQL的数据到云端
该模式是通过周期比对云端和本地最新的时间戳,以此判定是否需要对云端进行全量同步
实现者是ObjectEntitySynchronizer
对应的是DeviceObjectEntity和TriggerObjectEntity
背景:该表的数据在变更的时候会发生增删改,表的数据比较大,但是基本不会变化,所以采用变更就全量同步的方案
模式4:增量同步Redis的Entity数据的数据到云端
该模式是通过订阅本地EntityManager的Redis数据变更,对云端数据进行增删改
实现者是StatusEntityPublisherNotify
对应的是其他在redis的Entity
背景:这些实体的数据量很小,但是每个数据会进行来回刷新,所以采用捕获变更,并将这些更新发布到云端的方案
云端转发器
它的作用是监听来自云端的Mqtt消息,并转发给各个服务
边缘节点是被动响应的服务器,并且它的IP不是固定IP,端口也可能因为NAT而动态变化
这就导致了云端或者另外一个域的客户端如果想主动向它发起操作请求,那么可能连它在哪里都找不到
这样就需要边缘节点去某个固定的转发服务器主动去查询来自客户端的请求
在云端侧服务器或者另外一个域的服务器,架设一个MqttBroker,替双方转发彼此的通信消息。
此时,在边缘节点上启动proxy-cloud-service服务,主动监听MqttBroker的消息,处理后,再回复消息回去。
为什么会选择MqttBroker,因为MQTT是一个面向物联网的轻量级消息队列,有较好的实时性。
云端转发器,会监听/fox/proxy/c2e/{edgeId}/forward的topic,当收到请求操作的消息后,会将该操作请求,以restful接口的方式
转发给gateway服务。当操作完成之后,发送请求者可以在/fox/proxy/e2c/forward/{edgeId}上收到返回的结果。
由于是转发给gateway的方案,所以消息结构,也是原来的resful的消息结构。
考虑到安全性,目前restful的资源,被限定为manager服务的资源,也就是/kernel/manager/**的资源
发送topic: /fox/proxy/c2e/{edgeId}/forward
接收topic: /fox/proxy/e2c/forward/{edgeId}
1、查询system 通道查询API 接口
原来的restful api的结构为
"resource": "/kernel/manager/channel/page",
"method": "post",
"body": {
"pageNum": 1,
"pageSize": 2
}
那么,再携带一个用于报文识别的uuid,就可以进行下列远程操作了
具体的报文
发送:/fox/proxy/c2e/BFEBFBFF000906A3/forward
{
"uuid": "1b1df78266b9449c9d5705f821a2b4c1",
"resource": "/kernel/manager/channel/page",
"method": "post",
"body": {
"pageNum": 1,
"pageSize": 2
}
}
返回:/fox/proxy/e2c/forward/BFEBFBFF000906A3
{
"uuid": "1b1df78266b9449c9d5705f821a2b4c1",
"resource": "/kernel/manager/channel/page",
"method": "post",
"body": {
"msg": "操作成功",
"code": 200,
"data": {
"total": 24,
"list": [{
"channelParam": {
"ip": "127.0.0.1",
"port": 102,
"rack": 0,
"slot": 1,
"plcType": "S1200"
},
"createTime": 1696820977407,
"channelName": "西门子-S7-PLC-1",
"channelType": "s7plc",
"updateTime": 1696907665211,
"id": 59
}, {
"channelParam": {
"host": "192.168.2.80",
"port": 9528
},
"createTime": 1695801924643,
"channelName": "192.168.2.80:9527",
"channelType": "tcp-client",
"updateTime": 1695801924643,
"id": 58
}]
}
},
"msg": "",
"code": 200
}