跳到主要内容

网关设备接入

更新时间:2025-04-25 19:03:58

此章节内容仅针对网关含NVR(以下简称网关,也称主设备)相关设备接入进行说明。

概述

RTCX云平台支持设备直连云平台,也支持网关直连云平台,而网关下的子设备,则通过网关接入云平台。

网关通过接入DeviceSDK可以将网关和子设备的拓扑关系以及子设备的在线状态上报到RTCX云平台,在客户端可以查看网关和子设备的拓扑关系以及各自的在线状态,并且可以对子设备进行直播、回放、物模型配置、PTZ控制等相关操作。

适用场景

适用于子设备不能直连或者需要拓扑关系管理的场景,例如:接入Wi-Fi网关、蓝牙网关、ZigBee网关、NVR等。

三元组信息

  1. 您需要在RTCX控制台生成网关设备的 productKey/deviceName/deviceSecret 三元组信息,并将其写入到网关设备中。

  2. 通过DeviceSDK初始化网关设备的时候,三元组信息必填(productKey/deviceName/deviceSecret )。

  3. 通过DeviceSDK初始化子设备的时候,只需要填写 deviceName信息,子设备 deviceName 由厂商自行命名,但是需要保证deviceName 在当前产品型号下的唯一性。建议采用[网关的deviceName + 子设备标识] 作为子设备的deviceName。

  4. 子设备的productKey和deviceSecret信息,由DeviceSDK动态向平台获取,并内部维护。

网关接入过程

子设备接入之前,需要先将网关接入到云平台,网关的接入过程和普通IPC接入流程类似,需要同时接入IoTSDK和StreamSDK,具体流程可以参考普通IPC接入流程: IoTSDK接入StreamSDK接入

子设备接入过程

子设备不直接连接RTCX云平台,所以无需为子设备安装RTCX DeviceSDK。子设备完全由厂商自行开发。

网关发现子设备、监控子设备在线状态,以及将来自RTCX云平台的信令发送给子设备等功能,均由网关厂商自行实现,或网关厂商与子设备厂商定义协议实现。

网关接入到RTCX云平台之后,子设备上线过程如下:

  1. 子设备接入网关
  2. 网关调用 xs_iot_open 接口创建子设备
  3. 网关调用 xs_iot_connect 接口连接子设备
  4. 网关设备DeviceSDK向云平台发起子设备的登录请求(子设备和网关复用同一条信令连接),并获取子设备在平台上的绑定关系,如果未绑定,则动态发起子设备的绑定流程
  5. 子设备登录成功之后,客户端会显示当前子设备在线

网关接入到RTCX云平台之后,子设备下线过程如下:

  1. 子设备从网关移除
  2. 网关调用 xs_iot_disconnect 接口通知云平台子设备的在线状态
  3. 网关调用 xs_iot_close 接口将子设备和网关的拓扑关系在云平台上解绑

DeviceSDK接入流程步骤

步骤1:初始化网关设备

  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);
}
  1. 创建网关设备,建立连接
/*创建网关,并建立连接,返回生成的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会将拓扑关系和在线状态同步到云端,云端会保存子设备和网关的绑定关系以及在线状态。

步骤3:子设备上下线

当子设备和网关拓扑关系建立之后,如果子设备和处于连接状态,需要通过xs_iot_connect() 通知SDK,SDK会将状态同步到云端,此时APP上看到设备是在线状态。

当子设备和网关连接断开之后(拓扑关系还在),需要通过 xs_iot_disconnect() 函数通知SDK,SDK会将状态同步到云端,此时APP上看到设备是离线状态。

子设备上线和离线的通知也是通过下面的回调函数触发,通过devId进行区分

/**
* @brief 设备在线状态回调
* @param [IN] devId: 设备ID,xs_iot_open接口返回的ID
* @param [IN] connectStatus: 在线状态,1表示设备在线, 0 表示设备离线
* @return 0:成功, 其他值:错误码
*/
typedef xs_int32(*xs_connectStatusCallback)(xs_int32 devId, xs_int32 connectStatus);

步骤4:子设备物模型/上报告警

子设备物模型相关的回调以及报警消息的上报,也和普通IPC设备采用相同的接口,区别就是通过子设备的 devId进行区分。具体接口和功能可以参考普通IPC的接入流程文档。

步骤5:删除子设备

当子设备和网关的拓扑关系解除之后,需要通过 xs_iot_close 函数通知SDK,SDK会通知云端子设备已经解绑,此时APP上就不会再显示子设备信息

static void destroySubDevice(xs_int32 devId)
{
/*先销毁流,再销毁设备*/
destroyStreamSource(devId);
xs_iot_disconnect(devId);
xs_iot_close(devId);
}

注意:子设备绑定和解绑的操作可以在离线状态下执行,SDK内部会记录子设备和网关的拓扑关系,待设备和云端重新建立建立后,会将拓扑关系和在线状态同步到云端。

步骤6:反初始化网关设备

程序退出时,可以反初始化网关设备(不会影响平台端网关设备和用户的绑定关系),此步骤是非必要操作,也可以不执行

/*反初始化设备*/
static void uninitPrimaryDevice(xs_deviceInfo_st* deviceInfo)
{
xs_iot_disconnect(devId);
xs_iot_close(devId);
}