有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
该模块是 IoT Video 的必选模块,需要第二个初始化。

功能介绍

物模型部分分为:
属性(property) 属性对设备能力的描述,通过对属性的修改即可实现对设备的控制,其又可分为:读写属性 (ProWritable) 和只读属性 (ProReadonly) 。
行为(action) 控制设备执行特定的行为,并将执行的结果返回。行为与属性的区别,概念上行为是数据和方法的组合,行为有执行结果的返回。属性只有数据,修改属性后设备侧是否执行成功很难在属性本身体现。
事件(event) 设备发生特定情况,譬如灯的开关状态发生了变化,上报事件。应用侧收到事件后按预设逻辑推送事件。
物模型由用户声明好后导出相应的 json 文件, 使用工程目录下的 tool/codegen.py 脚本生成代码,执行如下命令: ./codegen.py -c <json文件>
最终生成如下代码:
iv_usrex.c:用户物模型实现源文件,实现物模型初始化相关的代码,开发者不能修改这个文件
iv_usrex_func.c:用户物模型功能实现函数,实现相应 ProWritable 和 action 的回调
iv_usrex.h:用户物模型定义头文件,定义相关数据结构,开发者不能修改这个文件
在编译时编入工程,根据用户功能需要,在设备初始化阶段注册不同物模型处理函数,SDK 在相应模型触发时回调,用户亦可调用物模型接口主动上传物模型数据,对于设备来说,支持 ProWritable 类模型数据接收和发送, 支持 ProReadonly 和 Event 类模型数据发送, 支持 Action 模型数据接收。

使用流程

注册下发消息回调 > 物模型初始化 > 发送物模型消息 > 物模型去初始化。

接口列表

该功能模块提供以下接口:
iv_dm_init:物模型初始化接口。
iv_dm_exit:物模型去初始化接口。
iv_dm_event_report:事件上报接口。
iv_dm_property_report:属性上报接口。
iv_dm_property_sync:属性同步接口。
ivm_env_init:物模型环境初始化,由脚本生成。
ivm_lock:物模型上报加锁。
ivm_unlock:物模型上报解锁。
用户需注册以下回调函数:
(*iv_dm_env_init_cb)():物模型初始化参数回调。
(*ivm_property_report_cb)():属性上报结果回调。

接口描述

iv_dm_init

功能描述
物模型初始化,进行物模型模块资源申请,设备启动时调用。
函数原型
int iv_dm_init(const iv_dm_init_parm_s *pstInitParm);
参数说明
参数名称
类型
描述
输入/输出
pstInitParm
iv_dm_init_parm_s
初始化参数。
输入
返回值
返回值
描述
IV_ERR_NONE
成功。
IV_ERR_*
失败,对应相应错误码。

iv_dm_exit

功能描述
物模型去初始化,进行物模型模块资源释放,设备退出时调用。
函数原型
int iv_dm_exit(void);
参数说明
返回值
返回值
描述
IV_ERR_NONE
成功。
IV_ERR_*
失败,对应相应错误码。

iv_dm_event_report

功能描述
上传用户自定义事件消息。
函数原型
iv_dm_event_report(const char *event_name);
参数说明
参数名称
类型
描述
输入/输出
event_name
const char
事件名。
输入
返回值
返回值
描述
IV_ERR_NONE
成功。
IV_ERR_*
失败,对应相应错误码。

iv_dm_property_report

功能描述
上报属性信息。
函数原型
int iv_dm_property_report(const char *key, ivm_property_report_cb cb, void *param);
参数说明
参数名称
类型
描述
输入/输出
key
const char *
自定义的属性 key 值。
输入
cb
ivm_property_report_cb
上报结果通知。
输入
param
void *
自定义参数。
输入
返回值
返回值
描述
IV_ERR_NONE
成功。
IV_ERR_*
失败,对应相应错误码。

注意事项

物模型上报后会触发回调cb,告诉用户最终的上报结果。
必须等待当前物模型上报成功,才能进行下一次上报,则会返回错误。
物模型上报的超时时间根据system模块中的connect_timeout确定。
尽量控制上报属性的频率, 频繁的轮询上报属性会额外占用带宽。

iv_dm_property_sync

功能描述
属性同步接口。
函数原型
int iv_dm_property_sync(int timeout_ms)
参数说明
参数名称
类型
描述
输入/输出
timeout_ms
int
同步超时时间,单位:ms,建议1000。
返回值
返回值
描述
IV_ERR_NONE
成功。
IV_ERR_*
失败,对应相应错误码。

注意事项

该接口是阻塞接口,只可以在单一线程中调用,禁止多线程调用。
调用该接口返回IV_ERR_NONE后,会将结果同步到物模型全局变量g_ivm_objs中,可以直接读取。
需要在设备处于上线状态时,调用该接口才能同步到正确的值,返回IV_ERR_DM_REQUEST_BUSY表示调用太频繁(SDK 限制调用频率5s一次),本次同步失败。

iv_dm_init_sync_status

功能描述
获取上线后(或重连后)SDK 内部首次同步物模型是否成功的状态。
函数原型
int iv_dm_init_sync_status(void)
参数说明
返回值
返回值
描述
0
同步失败,或正在同步。
1
同步成功。

注意事项

初始化时 SDK 内部会获取最新物模型,当调用本接口兵返回成功后,直接读取 g_ivm_objs 即可,可以免去用户首次调用 iv_dm_property_sync 进行手动同步的操作。

ivm_env_init

功能描述
物模型环境初始化,有物模型代码脚本生成,无需修改。
函数原型
int ivm_env_init(void);
参数说明
返回值
返回值
描述
IV_ERR_NONE
成功。
IV_ERR_*
失败,对应相应错误码。

注意事项

该函数定义在iv_usrex.c文件中,ivm_doi_init_ProWritable中的flag参数默认为0,只有当使用云 API 修改物模型时,Method参数配置为report时,需要将对应物模型的flag参数手动设置为1,其他情况均不用修改。

ivm_lock

功能描述
物模型互斥加锁,在上报物模型前调用。
函数原型
void ivm_lock(void);
参数说明
返回值

ivm_unlock

功能描述
物模型互斥解锁,在上报物模型后调用。
函数原型
void ivm_unlock(void);
参数说明
返回值

iv_dm_env_init_cb

功能描述
物模型初始化参数函数回调。
函数原型
int (*iv_dm_env_init_cb)(void);
参数说明
返回值
返回值
描述
IV_ERR_NONE
成功。
IV_ERR_*
失败,对应相应错误码。

ivm_property_report_cb

功能描述
用户上报属性回调。
函数原型
int (*ivm_property_report_cb)(void *param, iv_dm_report_result_e result_code);
参数说明
参数名称
类型
描述
输入/输出
param
void *
用户参数
输入
result_code
iv_dm_report_result_e
上报结果
输入
返回值
返回值
描述
IV_ERR_NONE
成功。
IV_ERR_*
失败,对应相应错误码。

数据结构列表

该模块提供以下数据结构:
iv_dm_report_result_e:物模型上报结果。
iv_dm_init_parm_s:物模型初始化参数结构体。

数据结构描述

iv_dm_report_result_e

功能描述
物模型上报结果。
结构原型
typedef enum
{
REPORT_TIMEOUT = -2,
REPORT_REJECTED = -1,
REPORT_ACCEPTED = 0
} iv_dm_report_result_e;
参数说明
成员名称
描述
取值
REPORT_TIMEOUT
物模型上报超时
-2
REPORT_REJECTED
物模型上报被拒绝
-1
REPORT_ACCEPTED
物模型上报成功
0

iv_dm_init_parm_s

功能描述
物模型初始化参数结构。
结构原型
typedef struct iv_dm_init_parm_s {
int (*iv_dm_env_init_cb)(void);
} iv_dm_init_parm_s;
参数说明
成员名称
描述
取值
iv_dm_env_init_cb
物模型初始化参数函数回调

注意事项

1. 不建议频繁调用模块相关接口。
2. 初始化时 SDK 内部会获取最新物模型,直接读取 g_ivm_objs 即可,用户不必调用 iv_dm_property_sync 进行手动同步。

示例代码

1. 物模型初始化

int rc = 0;
iv_dm_init_parm_s stInitParm;
stInitParm.iv_dm_env_init_cb = ivm_env_init;
rc = iv_dm_init(&stInitParm);
if (rc < 0) {
Log_e("model init failed!");
return rc;
}

2. 物模型去初始化

iv_dm_exit();

3. 通过物模型使能录像

int iv_usrcb_ProWritable_record_enable(DeviceProperty *property)
{
property_dbg_info(property);
// User implementation code
//注意: 回调函数中,不能做阻塞式操作,不得做耗时的操作。会导致核心通讯线程阻塞!!!
iv_cm_av_data_info_s av_format;

//设置录像音视频参数
av_format.eAudioSampleRate = IV_CM_AENC_SAMPLE_RATE_44100;
av_format.eAudioMode = IV_CM_AENC_MODE_STEREO;
av_format.u32SampleNumPerFrame = 1024;

av_format.eVideoType = IV_CM_VENC_TYPE_H264;
av_format.u32Framerate = 30;
av_format.u32VideoWidth = 640;
av_format.u32VideoHeight = 360;

if (*(int32_t *)(property->data) == 1) {
iv_rd_record_start(NULL, &av_format);
} else {
iv_rd_record_stop();
}
return 0;
}

4. 物模型上报属性

ivm_lock(); //互斥加锁
g_ivm_objs.ProReadonly.yyyy = 1; //修改全局变量的值
iv_dm_property_report(yyy, cb, param); //调用上报接口,注册回调
ivm_unlock(); //互斥解锁