跳到主要内容

物模型功能

更新时间:2025-04-25 10:37:52

物模型SDK提供了App端的物模型(属性、事件、服务),用来开发设备界面,实现手机对设备的查看和控制。

import com.polaris.iot.appsdk.libthing.PanelDevice;
import com.polaris.iot.appsdk.libthing.callback.IPanelCallback;
import com.polaris.iot.appsdk.libthing.enums.ThingDataTypeEnum;
import com.polaris.iot.appsdk.libthing.model.ThingTSL;

import com.polaris.iot.appsdk.libthing.model.ThingDataBase;
import com.polaris.iot.appsdk.libthing.model.ThingTSLDataType;
import com.polaris.iot.appsdk.libthing.model.ThingTSLProperty;
import com.polaris.iot.appsdk.libthing.model.ThingTSLService;

初始化物对象

class PanelDevice(
private val iotId: String,
productKey: String?,
deviceName: String?,
private val origin: String?
)

PanelDevice panelDevice = new PanelDevice(iotid);

panelDevice.init(context, new IPanelCallback() {
@Override
public void onComplete(boolean bSuc, Object o) {
}
});
//context是应用的上下文,IPanelCallback是初始化回调接口
// bSuc表示初始化结果,true为成功,false为失败
// o表示具体的数据,失败时是一个IoTSDKError结构,成功时忽略

设备控制

设备控制是基于物的模型对设备定义的属性、事件、服务进行操作。关于属性、事件、服务的描述,

获取设备状态

 panelDevice.getStatus(new IPanelCallback() {
@Override
public void onComplete(boolean bSuc, Object o) {
IoTLogger.d(TAG,"getStatus(), request complete," + bSuc);
JSONObject data = new JSONObject((String)o);
}
});
// bSuc表示是否获取成功,true为成功,false为失败
// o 表示具体的数据,失败时是一个IoTSDKError结构,成功时是json字符串格式如下
/* {
"code":200,
"data":{
"status":1
"time":1232341455
}
}
说明:status表示设备生命周期,目前有以下几个状态,
0:未激活;1:上线;3:离线;8:禁用;time表示当前状态的开始时间
*/

获取设备属性

多目设备返回的属性的值列表中有多个元素,可根据镜头ID获取列表对应下标元素

panelDevice.getProperties(new IPanelCallback() {
@Override
public void onComplete(boolean bSuc, Object o) {
IoTLogger.d(TAG,"getProps(), request complete," + bSuc);
JSONObject data = new JSONObject((String)o);
}
});
//bSuc表示是否获取成功,true为成功,false为失败
//o表示具体的数据,失败时是一个IoTSDKError结构,成功时是json字符串格式如下
/* {
"code":200,
"data":{
"propertyMap":{
"WorkMode": [{
"time": 1516347450295,
"value": 0
}]
}
}
}
*/

设置设备属性

多目设备区分镜头设置属性,可指定镜头设置

Map<String, Any> items = new HashMap<>()
panelDevice.setProperties(items, new IPanelCallback() {
@Override
public void onComplete(boolean bSuc, Object o) {
IoTLogger.d(TAG,"setProps(), request complete,"+bSuc);
JSONObject data = new JSONObject((String)o);
}
});
//items格式参考如下:
/*
"items": {
"LightSwitch":0
}
*/
//bSuc表示是否获取成功,true为成功,false为失败
//o表示具体的数据,失败时是一个IoTSDKError结构,成功时忽略

//多目区分镜头设置属性时,需要可带上lensId
int lensId = 0;
mPanelDevice.setProperties(lensId, items, new IPanelCallback() {
@Override
public void onComplete(boolean bSuc, Object o) {
IoTLogger.d(TAG,"setProps(), request complete,"+bSuc);
JSONObject data = new JSONObject((String)o);
}
});
注意

当存在录制计划功能时,设置录制计划属性时,各项的时间跨度不可重叠,需要app自行控制

调用设备服务

panelDevice.invokeService(identifier: String, args: Map<String, Any>, new IPanelCallback() {
@Override
public void onComplete(boolean bSuc, Object o) {
IoTLogger.d(TAG,"callService(), request complete,"+bSuc);
SignallingRsp rsp = (SignallingRsp) o;
}
});

//参数格式参考如下
/*
"identifier":"Rhythm",
"args": {
"Saturation":80,
"LightDuration":50,
"Hue":325,
"Value":50
}
*/

//bSuc表示是否获取成功,true为成功,false为失败
//o表示具体的数据,失败时是一个IoTSDKError结构,成功时需要返回忽略,需要返回请解析成SignallingRsp 对象

调用示例如下:

  • PTZ云台控制
Map<String, Object> args = new HashMap<String, Object>();
args.put("ActionType", PTZActionType.PTZ_LEFT.ordinal());
args.put("Speed", PTZSpeedMode.MIDDLE.ordinal());
// 获取物模型services中ptz参数配置
panelDevice.invokeService("StartPTZAction", args);
  • 获取WiFi列表
panelDevice.invokeService("GetWiFiList", null, new IPanelCallback() {
@Override
public void onComplete(boolean bSuc, @Nullable Object any) {
runOnUiThread(() -> {
binding.tvScanTip.setText(R.string.tip_scan_wifi_end);
if (!bSuc || any == null) {
showToast(R.string.error_api_failed);
return;
}

SignallingRsp rsp = (SignallingRsp) any;
if (rsp.getData() == null) return;
ScanWiFiRsp wiFiRsp = JsonUtils.parseJson(JsonUtils.toJsonString(rsp.getData()), ScanWiFiRsp.class);
mWifiList = wiFiRsp.getWiFiList();
List<CommonListItem> list = mWifiList.stream()
.map(item -> new CommonListItem(item.getSSID(), String.valueOf(item.getSignal()), "", String.valueOf(item.getEnc()), false))
.collect(Collectors.toList());

if (mWifiList != null) {
mCommonListAdapter.setDataList(list);
}
});
}
});
  • 格式化存储卡
panelDevice.invokeService("FormatStorageMedium");
  • 双目联动

app选择广角镜头区域,控制云台镜头转向指定位置

//坐标系:左上角(0,0) 右向X正轴 向下Y正轴
int x=0; //选择中点坐标
int y = 0; //选择中点坐标
int width = 1920; //画布宽度
int height = 1080; //画布高度
Map<String, Object> params = new HashMap<>();
params.put("X", (int) (x * 10000 / width));
params.put("Y", (int) (y * 10000 / height));
params.put("Id", IDMakeUtils.getUUID());
panelDevice.invokeService("PTZUnitedMove", params);

获取物的模型

panelDevice.getTslByCache(new IPanelCallback() {
@Override
public void onComplete(boolean bSuc, Object data) {
IoTLogger.d(TAG,"doTslTest data:" + data) ;
}
});
//bSuc表示是否获取成功,true为成功,false为失败
//data 为具体的返回数据,格式为json字符串,失败时为一个IoTSDKError结构

订阅设备事件

同一事件可能会多次触发

import com.alibaba.fastjson.JSONObject;

IPanelEventCallback subscribeEvent = new IPanelEventCallback() {
@Override
public void onNotify(@NonNull String iotId, @NonNull SubscribeEventTypeEnum eventType, @Nullable Object data) {
if (data == null) return;
IoTLogger.d(TAG, "IPanelEventCallback onNotify data=" + data);
JSONObject obj = (JSONObject) data;
if (subscribeType == SubscribeEventTypeEnum.DEVICE_THING_PROPERTIES_CHANGE) {
//设备开关
JSONObject powerState = obj.getJSONObject(ThingPropertyType.powerstate.getIdentifier());
if (powerState != null) {
String oldValue = (String) mDeviceInfo.getThingProperties().get(ThingPropertyType.powerstate.getIdentifier());
String value = powerState.getString("value");
if (Objects.equals(value, oldValue)) return;
mDeviceInfo.getThingProperties().put(ThingPropertyType.powerstate.getIdentifier(), value);
if (mTimelineBeginTime <= 0 && isVisibility) {
//直播
runOnUiThread(() -> {
doOnPause();
doOnResume();
});
}
}
} else if (subscribeType == SubscribeEventTypeEnum.DEVICE_STATUS) {
int status = obj.getInteger("status");
if (status == mDeviceInfo.getStatus()) return;
mDeviceInfo.setStatus(status);
mPlayDeviceInfo = IoTDeviceInfo.copyFrom(mDeviceInfo);
if (mTimelineBeginTime <= 0 && isVisibility) {
//直播
runOnUiThread(() -> {
doOnPause();
doOnResume();
});
}
} else {
showToast("分享设备已解绑或被取消分享");
finish();
}
}
}

panelDevice.subscribeEvent(iPanelEventCallback);

//iotId表示设备唯一标识
//topic 暂未使用
//data 为具体的返回数据,格式为com.alibaba.fastjson.JSONObject

SubscribeEventTypeEnum

enum class SubscribeEventTypeEnum {
DEVICE_UNBIND, //设备解绑
DEVICE_STATUS, //设备状态
DEVICE_THING_PROPERTIES_CHANGE, //设备物模型属性变化
}

取消订阅设备事件

panelDevice.unsubscribeEvent(iPanelEventCallback);