跳到主要内容

物模型功能

更新时间:2026-04-03 11:20:37

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

// 导入物模型头文件
import 'package:airtc_engine/src/thing/rtcx_thing.dart';
import 'package:airtc_engine/src/thing/rtcx_thing_controller.dart';

初始化

  • 初始化方法如下:
class RTCXFluThingApi {
/// 初始化物模型
RTCXFluThingResult buildThing(RTCXFluThingReq req);

/// 注册物的状态、属性变化或者事件触发的 observer, Thing 类只会 Weak 持有此 observer,
/// 调用者需要自行保证 observer 的生命周期,如果 dealloc 了,将不再有效
void registerThingObserver();

/// 反注册物的状态、属性变化或者事件触发的 observer
void unregisterThingObserver();

/// 发送指令 必须初始化物模型后调用
@async
RTCXFluThingResult invokeService(RTCXFluThingCommand command);

/// 获取物的 iotId
String iotId();

/// 获取物的 productKey
String getProductKey();

/// 获取物的 deviceName
String getDeviceName();

void destroy();
}

  • 状态回调代理方法如下:
class RTCXFluThingCallback {
/// 物的状态变更回调, 0:离线;1:在线;2:休眠;3:休眠离线;
void onStatusChange(String uuid, RTCXFluThingObserver value);

/// 物有事件触发,如提示,告警等
void onEventHappen(String uuid, RTCXFluThingObserver value);

/// 物的属性发生变化
void onPropertyChange(String uuid, RTCXFluThingObserver value);

/// 设备被解绑通知
void onDeviceUnbind(String uuid, RTCXFluThingObserver value);

/// 设备端透传信息到用户端通知
void onDeviceTransferMessage(String uuid, RTCXFluThingObserver value);
}

使用 RTCXFluThingController 调用示例如下:

  • 物模型对象初始化
  // 初始化物模型
late RTCXFluThingController _thingApi;
@override
void initState() {
super.initState();
// 物模型通道
RTCXFluThingReq req = RTCXFluThingReq(
productKey: widget.productKey,
deviceName: widget.deviceName,
iotId: widget.iotId,
deviceType: widget.deviceType,
);
_thingApi = RTCXFluThingController();
_thingApi.buildThing(req);
_thingApi.registerThingObserver();
_thingApi.onStatusChange.listen((data) {
print("onStatusChange:"+data.toString());
});
_thingApi.onDeviceTransferMessage.listen((RTCXFluThingObserver observer) {
print("onDeviceTransferMessage:"+observer.toString());
});
}
  • 释放资源
  @override
void dispose() {
super.dispose();
_thingApi.destroy();
}
  • 监听获取设备物模型、上下线消息、属性变化消息、解绑消息、事件触发消息、设备透传消息
   // 监听状态变化
_thingApi.onStatusChange.listen((data) {
print("onStatusChange:"+data.toString());
var status = data.params!['status'];
if(status != null && status is int) {
switch(status) {
case 0:
// 离线
break;
case 1:
// 在线
break;
case 2:
// 休眠
break;
case 3:
// 休眠离线
break;
default:
break;
}
}
});

// 物的属性发生变化
_thingApi.onPropertyChange.listen((data) {
// 属性变化
});

// 物有事件触发,如提示,告警等
_thingApi.onEventHappen.listen((data){

});

// 设备被解绑通知
_thingApi.onDeviceUnbind.listen((data){

});

// 设备端透传信息到用户端通知
_thingApi.onDeviceTransferMessage.listen((RTCXFluThingObserver observer) {
print("onDeviceTransferMessage:"+observer.toString());
});
  • DeviceName
  void getDeviceName() {
try {
final result = _thingApi.getDeviceName();
print("getDeviceName:${result}");
} catch(e) {
print("getDeviceName e:${e.toString()}");
}
}
  • ProductKey
  void getProductKey() {
try {
final result = _thingApi.getProductKey();
print("getProductKey:${result}");
} catch(e) {
print("getProductKey e:${e.toString()}");
}
}
  • iotId
  void getIotId() {
try {
final result = _thingApi.iotId();
print("iotId:${result}");
} catch(e) {
print("iotId e:${e.toString()}");
}
}

设备服务

  // RTCXFluThingCommand中
// command服务的唯一标识符
// params调用服务的入参,请参考物的模型 tsl,形如 {"arg1":"val1", "arg2":"val2"}
// extraData附加控制属性
/// 发送指令,必须初始化物模型后调用
Future<RTCXFluThingResult> invokeService(RTCXFluThingCommand command) {
return _api.invokeService(uuid, command);
}

调用示例如下:

  • 设备缩略图
  Future<void> getDeviceThumb() async {
try {
final result = await _thingApi.invokeService(
RTCXFluThingCommand(
command: "GetDevPicture",
params: {
"definition": 1,
"picType": "jpg",
},
),
);
Fluttertoast.showToast(msg: "获取缩略图${result == true ? "成功" : "失败"}, ${result.dataObject}");
} catch(e) {
Fluttertoast.showToast(msg: "获取缩略图失败:${e.toString()}");
}
}
  • PTZ控制
  Future<void> ptzActionControl() async {
try {
final result = await _thingApi.invokeService(
RTCXFluThingCommand(
command: "PTZActionControl",
params: {
"ActionType": 1,
"Step": 10,
},
),
);
if(result.success && result.dataObject != null) {
Map<String, dynamic> dataObjectMap = jsonDecode(result.dataObject!);
}
print("ptzActionControl result:${result.success},dataObject:${result.dataObject}");
} catch(e) {
print("ptzActionControl e:${e.toString()}");
}
}