该模块是 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(); //互斥解锁