该模块是 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_* | 失败,对应相应错误码。 |
20、数据结构列表
该模块提供以下数据结构:
·iv_dm_report_result_e:物模型上报结果。
·iv_dm_init_parm_s:物模型初始化参数结构体。
22、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 |
23、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 | 物模型初始化参数函数回调 | 无 |
24、注意事项
1. 不建议频繁调用模块相关接口。
2. 初始化时 SDK 内部会获取最新物模型,直接读取 g_ivm_objs 即可,用户不必调用 iv_dm_property_sync 进行手动同步。
26、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; }
27、2. 物模型去初始化
iv_dm_exit();
28、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;}
29、4. 物模型上报属性
ivm_lock(); //互斥加锁 g_ivm_objs.ProReadonly.yyyy = 1; //修改全局变量的值 iv_dm_property_report(yyy, cb, param); //调用上报接口,注册回调 ivm_unlock(); //互斥解锁