1.REDIS-SDK

需求背景

当用户将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));
    }
}

2.MQTT-SDK

需求背景

当用户将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));
    }
}