跳到主要内容

设备管理

更新时间:2025-04-09 17:14:18

包括设备绑定,设备解绑,设备列表

package com.polaris.iot.appsdk.libuserdevicemgr

object UserDeviceMgr {

/**
* 获取用户设备列表
* @param deviceListReq [DeviceListReq]
* @param iotCallback [IoTCallback]
*/
fun getDeviceList(deviceListReq: DeviceListReq, iotCallback: IoTCallback)

/**
* 获取设备详细
* 第三方可能用自己的设备列表,只有iotId,productKey,deviceName 需要请求数据用于后续业务开发
*/
fun getDeviceDetail(deviceList: List<DeviceInfo>, listener: OnResultListener<List<DeviceInfo>>)

/**
* 获取网关设备子设备列表
*
* @param childListReq [DeviceChildListReq]
* @param iotCallback [IoTCallback]
*/
@JvmStatic
fun getChildDeviceList(childListReq: DeviceChildListReq, iotCallback: IoTCallback)

/**
* 修改设备昵称
*@param iotId 设备的唯一标识符。
*@param nickName 设备的昵称或别名。
*@param iotCallback [IoTCallback]。
*/
fun setDeviceNickname(iotId: String, nickName: String, iotCallback: IoTCallback)


/**
* 设备解绑
* @param iotId iotId 平台为设备颁发的ID,设备的唯一标识符。
* @param iotCallback [IoTCallback]
*/
fun deviceUnbind(iotId : String, iotCallback: IoTCallback)

}

设备绑定

总体介绍参考设备绑定开发指南

绑定流程:

  1. 调start方法,添加状态变为STARTED时获取bindToken (每次start都返回新的bindToken,有效时长30分钟)
  2. 将bindToken传递给设备(二维码、蓝牙等),设备保证网络连通情况下,通过DeviceSDK进行设备绑定
  3. App只监听设备绑定是否成功的回调(超时自行控制,最大超时依赖bindToken的有效时长)

用户绑定设备,开始与结束需要匹配调整。

注意
  • 流程调用start开始后,退出添加流程必须调用stop
  • 设备绑定详细流程说明请点击
object UserDeviceAdd {
/**
* 添加设备匹配随机数,通过配网途径传递给设备 只读
* 仅当添加状态变为DeviceAddStatus.STARTED后有值
*/
@JvmStatic
val bindToken: String

/**
* 开始添加
* @param listener [OnDeviceAddListener] 添加流程状态监听
*/
@JvmStatic
fun start(listener: OnDeviceAddListener)

/**
* 开始添加 传入productKey与deviceName多一次校验更安全
* @param productKey 产品型号
* @param deviceName 产品序列号
* @param listener [OnDeviceAddListener] 添加流程状态监听
*/
@JvmStatic
fun start(productKey: String, deviceName: String, listener: OnDeviceAddListener)

/**
* 停止添加,与[start]匹配调用
*/
@JvmStatic
fun stop()
}

示例

import com.polaris.iot.appsdk.libcommon.constants.IoTSDKError
import com.polaris.iot.appsdk.libcommon.log.IoTLogger
import com.polaris.iot.appsdk.libcommon.utils.JsonUtils
import com.polaris.iot.appsdk.libuserdevicemgr.OnDeviceAddListener
import com.polaris.iot.appsdk.libuserdevicemgr.UserDeviceAdd
import com.polaris.iot.appsdk.libuserdevicemgr.enums.DeviceAddStatus

//开始绑定流程
UserDeviceAdd.start(productKey,deviceName,new OnDeviceAddListener() {
@override
public void onDeviceAddStatus(status: DeviceAddStatus,exception: IoTSDKError) {
//监听添加状态
switch(status){
case DeviceAddStatus.STARTED:
//获取设备配网绑定随机数(有效时长30分钟),传递给设备
//比如二维码配网,配网随机数需要填入二维码信息中供设备识别获取
String bindToken = UserDeviceAdd.getBindToken();
break;

case DeviceAddStatus.SUCCESS:
case DeviceAddStatus.FAILED:
break;
}
})

//结束绑定流程
//stop在用户退出添加流程时调用,或在收到添加结果状态后调用
UserDeviceAdd.stop();

设备解绑

import com.polaris.iot.appsdk.libcommon.constants.IoTSDKError
import com.polaris.iot.appsdk.libcommon.log.IoTLogger
import com.polaris.iot.appsdk.libcommon.utils.JsonUtils
import com.polaris.iot.appsdk.libuserdevicemgr.UserDeviceMgr
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceUnbindReq;
import com.polaris.iot.appsdk.libapiclient.callback.IoTCallback;
import com.polaris.iot.appsdk.libapiclient.callback.IoTResponse;
import com.polaris.iot.appsdk.libapiclient.request.IoTRequest;


UserDeviceMgr.deviceUnbind(new DeviceUnbindReq(deviceInfo.getIotId()), new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {
Toast.makeText(DeviceListActivity.this, "删除设备[" + deviceInfo.getDeviceName() + "]失败", Toast.LENGTH_SHORT).show();
}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
Toast.makeText(DeviceListActivity.this, "删除设备[" + deviceInfo.getDeviceName() + "]成功", Toast.LENGTH_SHORT).show();
getDeviceList();
}
});

设备列表

import com.polaris.iot.appsdk.libuserdevicemgr.UserDeviceMgr;
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceInfo;
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceListReq;
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceListResp;
import com.polaris.iot.appsdk.libapiclient.callback.IoTCallback;
import com.polaris.iot.appsdk.libapiclient.callback.IoTResponse;
import com.polaris.iot.appsdk.libapiclient.request.IoTRequest;

UserDeviceMgr.getDeviceList(new DeviceListReq(1, 20, null), new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {
Toast.makeText(DeviceListActivity.this, "获取设备列表失败", Toast.LENGTH_SHORT).show();

}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
DeviceListResp deviceListResp = (DeviceListResp) response.getData();

List<DeviceInfo> deviceList = deviceListResp.getData();
}
});

设备详细

当不使用SDK中的设备列表,需要获取设备详细以正常使用后续播放等

List<XXXDeviceInfo> thirdDeviceList //接入方自有设备列表 需要有iotId productKey deviceName
List<DeviceInfo> list = thirdDeviceList.stream().map(it->new DeviceInfo(it.getIotId(),it.getProductKey(),it.getDeviceName()))
.collect(Collectors.toList());

UserDeviceMgr.getDeviceDetail(list, new OnResultListener<List<DeviceInfo>>() {
@Override
public void onResult(List<DeviceInfo> result) {
onDeviceListResp(result);
//播放等操作
}

@Override
public void onError(@NonNull IoTSDKError error) {

}
});

网关设备子设备

获取网关设备子设备列表

import com.polaris.iot.appsdk.libuserdevicemgr.UserDeviceMgr;
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceInfo;
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceChildListReq;
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceListResp;
import com.polaris.iot.appsdk.libapiclient.callback.IoTCallback;
import com.polaris.iot.appsdk.libapiclient.callback.IoTResponse;
import com.polaris.iot.appsdk.libapiclient.request.IoTRequest;

private DeviceInfo mDeviceInfo;
private void getDeviceList() {

RecyclerView rvDeviceList = binding.rvDeviceList;
TextView tvNoDeviceTip = binding.tvNoDeviceTip;
long reqStartTime = System.currentTimeMillis();
UserDeviceMgr.getChildDeviceList(new DeviceChildListReq(mDeviceInfo), new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {

}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
DeviceListResp rsp = (DeviceListResp) response.getData();
if (rsp == null) return;
List<DeviceInfo> deviceList = rsp.getData();
}
});
}

修改设备昵称

String iotId= "设备ID";
String nickName= "名称";
UserDeviceMgr.setDeviceNickname(iotId, nickName, new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {
showToast("修改设备昵称失败");
}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
showToast("修改设备昵称成功");
}
});

设备缩略图

使用场景:设备列表展示界面,当设备处于列表可见区域时调用

package com.polaris.iot.appsdk.libuserdevicemgr
/**
* 设备缩略图管理
*/
object DeviceThumbnailMgr{
/**
* 获取设备直播缩略图
*
* @param deviceInfo [DeviceInfo]设备信息,设备列表获取
* @param listener 获取结果监听
*/
@JvmStatic
fun getLiveThumbnail(deviceInfo: DeviceInfo, listener: OnResultListener<ThumbnailInfo>)
}

示例

import com.polaris.iot.appsdk.libuserdevicemgr.model.ThumbnailInfo
DeviceInfo deviceInfo;
DeviceThumbnailMgr.getLiveThumbnail(deviceInfo, new OnResultListener<>() {
@Override
public void onError(@NonNull IoTSDKError error) {

}

@Override
public void onResult(ThumbnailInfo result) {
if (!holder.ivDeviceImg.getTag().equals(result.getIotId())) {
return;
}
runOnUiThread(() -> {
Glide.with(DeviceListActivity.this).load(result.getDownloadUrl())
.placeholder(holder.ivDeviceImg.getDrawable())
.error(R.drawable.device_default)
.into(holder.ivDeviceImg);
});
}
});

设备配置

com.polaris.iot.appsdk.libuserdevicemgr.DeviceEntityMgr

配置项 DeviceEntityEnum

package com.polaris.iot.appsdk.libuserdevicemgr.enums
enum class DeviceEntityEnum{
/**
*消息推送设置
*/
MSG_PUSH_SETTING
}

消息通知计划

/**
* 推送计划
*
* @property start 开始时间,utc时间,秒
* @property end 结束时间,utc时间,秒 (end时间应始终大于start时间,跨天的时候,end为第二天的时间)
* @property wk 对应的值仅在"rpt"为2时有效,存在重复设置值:SUN:0x0001, MON:0x0002, TUE:0x0004, WED:0x0008, THU:0x0010, FRI:0x0020, SATU:0x0040,支持按位或操作
* @property rpt 重复类型,0:执行一次 1:每天重复 2:每周重复 3:每月重复 (目前支持1和2)
* @property sta 推送关闭计划状态 1表示状态开,0表示状态关
*/
data class MsgPushSettingSchedule(
var start: Int,
var end: Int,
var wk: Int,
var rpt: Int = 2,
var sta: Int = 1,
) : Serializable {
constructor(start: Int, end: Int, wk: Int) : this(start, end, wk, 2, 1)
}

/**
* 推送设置
*
* @property sch 推送关闭计划列表
* @property sta 是否接收推送消息
* @property img 是否推送图片
*/
data class MsgPushSetting(
var sch: List<MsgPushSettingSchedule> = listOf(),
var sta: Int = 1,
var img: Int = 0,
) : Serializable

获取设备配置

/**
* 获指定配置项
*
* @param iotId 设备ID
* @param entityEnum 配置项
* @param listener 回调
*/
@JvmStatic
fun getDeviceEntity(iotId: String, entityEnum: DeviceEntityEnum, listener: OnResultListener<String?>)

示例

DeviceEntityMgr.getDeviceEntity(mIotId, DeviceEntityEnum.MSG_PUSH_SETTING, new OnResultListener<String>() {
@Override
public void onResult(String result) {
mMsgNotifySetting = JsonUtils.parseJson(result, MsgPushSetting.class);
initSettingView();
hideLoading();
}

@Override
public void onError(@NonNull IoTSDKError error) {
initSettingView();
hideLoading();
}
});

设置设备配置

/**
* 设置设备配置项
*
* @param iotId 设备ID
* @param entityEnum 设置项
* @param value 设置内容
* @param ioTCallback 回调
*/
@JvmStatic
fun setDeviceEntity(iotId: String, entityEnum: DeviceEntityEnum, value: String, ioTCallback: IoTCallback?)

示例

DeviceEntityMgr.setDeviceEntity(
mIotId,
DeviceEntityEnum.MSG_PUSH_SETTING,
JsonUtils.toJsonString(mMsgNotifySetting),
new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {
showToast(R.string.error_api_failed);
finish();
}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
finish();
}
});

云台预置位

收藏常看的云台位置,方便快速转动设备镜头至相应位置

class PTZPresetMgr(private val mIotId: String) {
/**
* 获取设备预置位列表
*
* @param onResultListener [OnResultListener]<List<[PTZPresetRspItem]>>
*/
fun getPresetList(onResultListener: OnResultListener<List<PTZPresetRspItem>>)

/**
* 添加预置位
*
* @param reqParams [PTZPresetReq]
* @param onResultListener [OnResultListener]<[PTZPresetRspItem]>
*/
fun addPreset(reqParams: PTZPresetReq, onResultListener: OnResultListener<PTZPresetRspItem>)

/**
* 删除预置位
*
* @param item 列表返回的预置位项[PTZPresetRspItem]
* @param onResultListener [OnResultListener]<Boolean>
*/
fun removePreset(item: PTZPresetRspItem, onResultListener: OnResultListener<Boolean>)

/**
* 更新预置位名称 如果ptz信息或图片变化请删除重新添加
*
* @param item 列表返回的预置位项[PTZPresetRspItem]
* @param onResultListener [OnResultListener]<Boolean>
*/
fun updatePreset(item: PTZPresetRspItem, onResultListener: OnResultListener<Boolean>)
}

构建对象

private var mPTZPresetMgr: PTZPresetMgr? = null
val iotId = "设备ID"
mPtzPresetMgr = PTZPresetMgr(iotId)

获取设备预置位列表


mPtzPresetMgr.getPresetList(object : OnResultListener<List<PTZPresetRspItem>> {
override fun onResult(result: List<PTZPresetRspItem>) {
IoTLogger.d(TAG, "getPresetList result=${JsonUtils.toJsonString(result)}")
mPresetListAdapter?.setDataList(result)
}

override fun onError(error: IoTSDKError) {
}
})

PTZPresetRspItem

/**
* 预置位列表项
*
* @property ptz 预置位信息
* @property name 预置位名称
* @property picId 预置位图片ID
* @property picUrl 预置位图片地址
* @constructor Create empty P t z preset rsp item
*/
data class PTZPresetRspItem(
val ptz: String,
var name: String?,
val picId: String?,
val picUrl: String?,
)

添加预置位

  1. 通过物模型或其它途径获取设备当前云台位置信息

  2. 用户输入位置名称

  3. 获取设备当前位置画面(可截图播放器当前直播画面)

val ptzPosition = "获取到的当前云台位置信息"
val name="常看位置"
val bitmap: Bitmap? = null //当前画面,可从播放器截图

val onResultListener = object : OnResultListener<PTZPresetRspItem> {
override fun onResult(result: PTZPresetRspItem) {
binding.popPresetListView.addListItem(result)
hideLoading()
}

override fun onError(error: IoTSDKError) {
IoTLogger.e(TAG, "error", error)
hideLoading()
showToast(R.string.operate_failed)
}
}
mPTZPresetMgr?.addPreset(PTZPresetReq(ptzPosition, name, bitmap), onResultListener)

PTZPresetReq

/**
* 预置位保存参数 预置位名称与截图至少有一个
*
* @property ptz 预置位信息
* @property name 预置位名称 可选
* @property bitmap 预置位截图 可选
* @constructor Create empty P t z preset req
*/
data class PTZPresetReq(
var ptz: String,
var name: String?,
var bitmap: Bitmap?,
) {
constructor(ptz: String, name: String) : this(ptz, name, null)
constructor(ptz: String, bitmap: Bitmap) : this(ptz, null, bitmap)
}

删除预置位

传入列表中获取数据,删除指定预置位

private fun doRemovePreset(data: PTZPresetRspItem, pos: Int) {
mPTZPresetMgr.removePreset(data, object : OnResultListener<Boolean> {
override fun onResult(result: Boolean) {
removeItemAt(pos)
}

override fun onError(error: IoTSDKError) {
Toast.makeText(mContext, mContext.getString(R.string.operate_failed) + "[${error.getCode()}]", Toast.LENGTH_SHORT).show()
}
})
}

修改预置位名称

更新预置位名称 如果ptz信息或图片变化请删除重新添加

val item: PTZPresetRspItem = getItem(0)

item.name = "新的位置名称"

mPTZPresetMgr.updatePreset(item, object : OnResultListener<Boolean> {
@SuppressLint("NotifyDataSetChanged")
override fun onResult(result: Boolean) {
if (result) {
notifyDataSetChanged()
} else {
item.name = oldValue
Toast.makeText(mContext, mContext.getString(R.string.operate_failed), Toast.LENGTH_SHORT).show()
}
}

override fun onError(error: IoTSDKError) {
item.name = oldValue
Toast.makeText(mContext, mContext.getString(R.string.operate_failed) + "[${error.getCode()}]", Toast.LENGTH_SHORT).show()

}
})