当用户将Fox-Edge作为自己的子系统,并与自己的其他业务子系统一起,共同构成一个后台系统的时候。
比如,将Fox-Edge和自己的AI系统,共同部署在现场的一台工控机、服务器,或者是共同部署在云端的服务器上。
很多用户提出了要求,希望灵狐提供一个 RPC-REDIS-SDK ,帮助他们的开发人员,快速完成两边子系统之间的集成开发工作。
Fox-Edge是将Redis作为自己内部各服务之间进行通讯的消息中间件。
Fox-Edge子系统、Redis服务、用户自己的其他子系统,都处于一个 可以互相信任的管理域 之中。
Fox-Edge提供了一个基于Redis消息服务的JAVA版的SDK,对Redis消息的Topic和消息结构进行了封装。
那么,用户就可以用这个JAVA的SDK引入自己的工程,就可以实现对Fox-Edge各基础服务之间的 RPC(远程调用) 。
RPC-REDIS-SDK是直接访问Fox-Edge的内部服务,所以它只能被用在 同一个信任域 的场景中。
也就是说,Fox-Edge的这个SDK,你不能把它用在外部系统中。就像数据库不能直接暴露在系统外部,否则会导致信息安全上的问题。
它能够访问的服务,包括 通道服务 、 设备服务 、 持久化服务 、 管理服务 ,这些服务提供了Redis的Topic服务接口。
在java工程的pom.xml文件中引入 fox-edge-server-rpc-redis-sdk 的JAR包依赖
<dependency>
<groupId>cn.fox-tech</groupId>
<artifactId>fox-edge-server-rpc-redis-sdk</artifactId>
<version>1.1.7</version>
</dependency>
自定义一个配置类,并扫描JAR包中的名空间 cn.foxtech.rpc.sdk.redis ,实例化SDK里面的对象
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = {"cn.foxtech.rpc.sdk.redis"})
public class RpcRedisSdkConfig {
}
使用组件 RpcSdkRedisClient ,将操作请求发送给Redis的topic,然后从Redis的topic等待响应消息。
那么,就可以通过Reids作为消息中间件,在同一个管理域内,远程访问Fox-Edge的服务了
@Component
public class RpcRedisSdkTester {
private static final Logger logger = Logger.getLogger(RpcRedisSdkTester.class);
@Autowired
private RpcSdkRedisClient redisClient;
public void testChannel() {
ChannelRequestVO channelRequestVO = new ChannelRequestVO();
channelRequestVO.setType("simulator");
channelRequestVO.setName("channel-simulator");
channelRequestVO.setMode(ChannelBaseVO.MODE_EXCHANGE);
channelRequestVO.setUuid(UUID.randomUUID().toString());
channelRequestVO.setSend("01 03 00 00 00 01 84 0A");
channelRequestVO.setTimeout(2000);
this.redisClient.getChannelClient().pushChannelRequest(channelRequestVO.getType(), channelRequestVO);
logger.info("通道服务-发送请求:" + JsonUtils.buildJsonWithoutException(channelRequestVO));
ChannelRespondVO channelRespondVO = this.redisClient.getChannelClient().getChannelRespond(channelRequestVO.getType(), channelRequestVO.getUuid(), 2000);
logger.info("通道服务-返回响应:" + JsonUtils.buildJsonWithoutException(channelRespondVO));
}
}
当用户将Fox-Edge部署为一个现场的边缘端设备,然后通过 MQTT消息服务器,跟自己的云端服务进行通讯。
很多用户提出了要求,希望灵狐提供一个 RPC-MQTT-SDK ,帮助他们的开发人员,快速完成 两地系统之间 的集成开发工作。
Fox-Edge是将MQTT作为自己跟外部系统之间进行通讯的消息中间件。
Fox-Edge系统、MQTT服务器、用户自己的其他系统,处于 不同的管理域 之中,互相之间通过MQTT服务器进行分片管理。
Fox-Edge提供了一个基于消息服务的JAVA版的SDK,对MQTT消息的Topic和消息结构进行了封装。
那么,用户就可以用这个JAVA的SDK引入自己的工程,就可以实现对Fox-Edge各基础服务之间的 RPC(远程调用) 。
RPC-MQTT-SDK是将管理服务的后台API接口,以MQTT的方式对外提供该API接口。
也就是说,它的API访问管控是通过MQTT服务器那边进行安全管控。所以,务必管控好MQTT服务器的账号,Topic的访问管理。
它能够访问的服务,主要是 管理服务 ,它内置的MQTT模块帮助你的MQTT请求,转接到restful它的接口。
在java工程的pom.xml文件中引入 fox-edge-server-rpc-mqtt-sdk 的JAR包依赖
<dependency>
<groupId>cn.fox-tech</groupId>
<artifactId>fox-edge-server-rpc-mqtt-sdk</artifactId>
<version>1.1.7</version>
</dependency>
自定义一个配置类,并扫描JAR包中的名空间 cn.foxtech.rpc.sdk.mqtt ,实例化SDK里面的对象
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = {"cn.foxtech.rpc.sdk.mqtt"})
public class RpcMqttSdkConfig {
}
使用组件 RpcSdkRedisClient ,将操作请求发送给Redis的topic,然后从Redis的topic等待响应消息。
那么,就可以通过Reids作为消息中间件,在同一个管理域内,远程访问Fox-Edge的服务了
@Component
public class RpcMqttSdkTester {
private static final Logger logger = Logger.getLogger(RpcMqttSdkTester.class);
@Autowired
private RpcSdkMqttClient mqttClient;
public void test() {
this.initialize();
this.testManager();
}
private void initialize() {
// 生成一个缺省的mqtt配置参数,你也可以自己构造一个相同格式的MQTT参数
Map<String, Object> mqttConfig = this.mqttClient.buildMqttDefaultConfig();
mqttConfig.put("host", "192.168.1.21");// 这是默认的配置,建议自行管理mqttConfig
// 生成一个接收MQTT消息的handler,指明要订阅的消息
RemoteMqttHandler mqttHandler = new RemoteMqttHandler();// 这是默认的handler实现,建议根据需要自行实现一个mqttHandler
mqttHandler.setTopic("/fox/manager/e2c/forward/#");
this.mqttClient.setMqttConfig(mqttConfig);
this.mqttClient.initialize(mqttHandler);
// 等待连接建立
this.mqttClient.waitConnected(60 * 1000);
}
private void testManager() {
RestfulLikeRequestVO requestVO = new RestfulLikeRequestVO();
requestVO.setTopic("/fox/manager/c2e/F9509B1CE7B0F023/forward");// 必填参数:跟fox-edge的manager约定的topic
requestVO.setUuid(UUID.randomUUID().toString());// 必填参数:待会用来查询响应的报文消息
// 参考管理页面的浏览器查询的restful接口
Map<String, Object> body = new HashMap<>();
body.put("pageNum", 1);
body.put("pageSize", 10);
requestVO.setResource("/device/page");
requestVO.setMethod("post");
requestVO.setBody(body);
// 发送请求
this.mqttClient.sendRequest(requestVO);
logger.info("管理服务-发送MQTT请求:" + JsonUtils.buildJsonWithoutException(requestVO));
// 等待响应
RestfulLikeRespondVO respondVO = this.mqttClient.waitRespond(requestVO.getUuid(), 10 * 1000);
logger.info("管理服务-返回MQTT响应:" + JsonUtils.buildJsonWithoutException(respondVO));
}
}