网关设备接入
此章节内容仅针对网关含NVR(以下简称网关,也称主设备)相关设备接入进行说明。
概述
RTCX云平台支持设备直连云平台,也支持网关直连云平台,而网关下的子设备,则通过网关接入云平台。
网关通过接入DeviceSDK可以将网关和子设备的拓扑关系以及子设备的在线状态上报到RTCX云平台,在客户端可以查看网关和子设备的拓扑关系以及各自的在线状态,并且可以对子设备进行直播、回放、物模型配置、PTZ控制等相关操作。
适用场景
适用于子设备不能直连或者需要拓扑关系管理的场景,例如:接入Wi-Fi网关、蓝牙网关、ZigBee网关、NVR等。
三元组信息
-
您需要在RTCX控制台生成网关设备的 productKey/deviceName/deviceSecret 三元组信息,并将其写入到网关设备中。
-
通过DeviceSDK初始化网关设备的时候,三元组信息必填(productKey/deviceName/deviceSecret )。
-
通过DeviceSDK初始化子设备的时候,只需要填写 deviceName信息,子设备 deviceName 由厂商自行 命名,但是需要保证deviceName 在当前产品型号下的唯一性。建议采用[网关的deviceName + 子设备标识] 作为子设备的deviceName。
-
子设备的productKey和deviceSecret信息,由DeviceSDK动态向平台获取,并内部维护。
网关接入过程
子设备接入之前,需要先将网关接入到云平台,网关的接入过程和普通IPC接入流程类似,需要同时接入IoTSDK和StreamSDK,具体流程可以参考普通IPC接入流程: IoTSDK接入 和 StreamSDK接入
子设备接入过程
子设备不直接连接RTCX云平台,所以无需为子设备安装RTCX DeviceSDK。子设备完全由厂商自行开发。
网关发现子设备、监控子设备在线状态,以及将来自RTCX云平台的信令发送给子设备等功能,均由网关厂商自行实现,或网关厂商与子设备厂商定义协议实现。
网关接入到RTCX云平台之后,子设备上线过程如下:
- 子设备接入网关
- 网关调用 xs_iot_open 接口创建子设备
- 网关调用 xs_iot_connect 接口连接子设备
- 网关设备DeviceSDK向云平台发起子设备的登录请求(子设备和网关复用同一条信令连接),并获取子设备在平台上的绑定关系,如果未绑定,则动态发起子设备的绑定流程
- 子设备登录成功之后,客户端会显示当前子设备在线
网关 接入到RTCX云平台之后,子设备下线过程如下:
- 子设备从网关移除
- 网关调用 xs_iot_disconnect 接口通知云平台子设备的在线状态
- 网关调用 xs_iot_close 接口将子设备和网关的拓扑关系在云平台上解绑
DeviceSDK接入流程步骤
步骤1:初始化网关设备
- 初始化设备SDK(包括IoTSDK以及StreamSDK)
/*初始化rtcx-iotsdk*/
static void initIotSdk()
{
/*初始化iotsdk回调函数指针*/
xs_iot_callbackFun_st cbFun;
initIotCallbackFun(&cbFun); //初始化回调函数指针列表
/*设置设备的工作模式,区分长上电设备和低功耗保活设备*/
xs_iotInitParam_st initParam;
memset(&initParam, 0, sizeof(initParam));
initParam.configPath = "/etc/config"; //必须是flash中真实存在的可读写路径
initParam.workMode = XS_IOT_WORK_MODE_LONG_TIME_POWER;
initParam.maxSubDeviceNum = SUB_DEV_COUNT; //网关设备,必须设置最大支持的子设备个数
ret = xs_iot_init(&cbFun, &initParam);
}
/*初始化rtcx-streamsdk*/
static void initStreamSdk()
{
/*初始化StreamSDK配置参数*/
xs_streamConfig_st initConfig;
memset(&initConfig,0,sizeof(initConfig));
initConfig.device_type = XS_DEVICE_TYPE_GATEWAY; //设备类型设置成 XS_DEVICE_TYPE_GATEWAY
initConfig.sub_num = SUB_DEV_COUNT; //最大子设备个数也设置一下
/*初始化streamsdk回调函数指针*/
xs_stream_callbackFun_st streamCbFun;
memset(&streamCbFun, 0, sizeof(streamCbFun));
initStreamCallbackFun(&streamCbFun); //初始化回调函数指针列表
xs_stream_Init(&initConfig, &streamCbFun);
}
- 创建网关设备,建立连接
/*创建网关,并建立连接,返回生成的deviceId*/
static xs_int32 initPrimaryDevice(xs_deviceInfo_st* deviceInfo)
{
/*创建网关*/
xs_int32 devId = xs_iot_open(XS_IOT_DEV_TYPE_MASTER, deviceInfo);
if (devId < 0){
//创建网关错误
return devId;
}
xs_int32 code = xs_iot_connect(devId);
if (code != XS_STREAM_EC_SUCCESS) {
//连接错误
}
/*启动streamsdk服务*/
xs_stream_start();
return devId;
}
步骤2:添加子设备
创建子设备,并建立连接,子设备建立连接之后,SDK内部触发自动绑定流程
static xs_int32 createSubDevice(xs_deviceInfo_st* deviceInfo)
{
if (!deviceInfo->deviceName) {
//子设备只需要有deviceName即可,productkey和device secret信息SDK内部维护
return -1;
}
int32_t devId = xs_iot_open(XS_IOT_DEV_TYPE_SLAVE, &g_devAuth[devSeq].devInfo);
if (devId < 0){
return -1;
}
xs_DeviceParams_st deviceParam;
memset(&deviceParam,0,sizeof(deviceParam));
deviceParam.lensCount = 1; //网关子设备,只支持单目,不支持多目设备
xs_stream_setDeviceParams(devId, &deviceParam);
//创建子设备流,此函数可以参考SDK demo程序
createStreamSource(devId);
//子设备上线
xs_iot_connect(devId);
return devId;
}
子设备上线(xs_iot_connect)后,SDK会将拓扑关系和在线状态同步到云端,云端会保存子设备和网关的绑定关系以及在线状态。