更新时间:2023-06-05 02:49:25下载pdf
涂鸦智能摄像机(IPC)通常具有侦测报警的功能,可以通过设备功能打开侦测开关。
侦测告警主要分 声音检测 和 移动检测 两种。当设备检测到声音或者物体移动时,会上报一个警告消息,如果您的 App 集成了推送功能,App 还会收到一个推送通知。集成推送请参考 集成 Push。
类说明
类名 | 说明 |
---|---|
ThingSmartCameraMessage | IPC 侦测报警事件消息管理 |
查询警告消息列表前,需要使用设备 ID 和时区初始化消息管理器。
接口说明
- (instancetype)initWithDeviceId:(NSString *)devId timeZone:(NSTimeZone *)timeZone;
参数说明
参数 | 说明 |
---|---|
devId | 设备 ID |
timeZone | 时区,默认使用用户手机的系统时区,即 [NSTimeZone systemTimeZone] |
可以通过 IPC SDK 查询到有警告消息的日期,以便于在日历上直观展示。
接口说明
- (void)messageDaysForYear:(NSInteger)year
month:(NSInteger)month
success:(void (^)(NSArray<NSString *> *result))success
failure:(void (^)(NSError *error))failure;
参数说明
参数 | 说明 |
---|---|
year | 年,如:2020 |
month | 月,如:2 |
success | 成功回调,返回当月有消息记录的日期数组,result 为字符串数组,元素为日期字符串,如:01 、11 、30 |
failure | 失败回调,error 表示错误信息 |
侦测警告消息根据触发方式定义有多种类型,部分类型又可以划分为一个大的分类。IPC SDK 提供查询默认分类的列表,以便于分类查询警告消息。
接口说明
- (void)getMessageSchemes:(void (^)(NSArray<ThingSmartCameraMessageSchemeModel *> *result))success
failure:(void (^)(NSError *error))failure;
参数说明
参数 | 说明 |
---|---|
success | 成功回调,返回消息分类数据模型的数组 |
failure | 失败回调,error 表示错误信息 |
ThingSmartCameraMessageSchemeModel
数据模型
字段 | 类型 | 说明 |
---|---|---|
describe | NSString | 消息分类描述 |
msgCodes | NSArray | 消息分类所包含的消息类型数组 |
msgCodes
属性的值,以查询这个分类包含的所有类型的警告消息。msgCode
属性。msgCodes
消息类型说明
类型 | 说明 |
---|---|
ipc_motion | 移动侦测 |
ipc_doorbell | 门铃呼叫 |
ipc_dev_link | 设备联动 |
ipc_passby | 有人经过 |
ipc_linger | 有人徘徊 |
ipc_leave_msg | 门铃消息留言 |
ipc_connected | 门铃已接听 |
ipc_unconnected | 门铃未接听 |
ipc_refuse | 门铃拒接 |
ipc_human | 人形检测 |
ipc_cat | 宠物检测 |
ipc_car | 车辆检测 |
ipc_baby_cry | 婴儿哭声 |
ipc_bang | 异响 |
ipc_antibreak | 强拆报警 |
ipc_low_battery | 低电量告警 |
由于设备能力的不同,能触发的消息类型会有差别。消息分类和消息类型不同:
ipc_passby
、ipc_linger
、ipc_motion
可以组合成一个移动侦测的消息分类。通过 IPC SDK 查询和删除侦测警告消息。
接口说明
- (void)messagesWithMessageCodes:(NSArray *)msgCodes
Offset:(NSInteger)offset
limit:(NSInteger)limit
startTime:(NSInteger)startTime
endTime:(NSInteger)endTime
success:(void (^)(NSArray<ThingSmartCameraMessageModel *> *result))success
failure:(void (^)(NSError *error))failure;
参数说明
参数 | 说明 |
---|---|
msgCodes | 消息类型数组,设置为 nil 可以查询所有类型的消息 |
offset | 偏移量,0 表示从第一个警告消息开始 |
limit | 分页大小,最大数量为 200 |
startTime | 查询不早于 startTime 上报的消息,设置为 0 表示不限制开始时间,使用 Unix 时间戳 |
endTime | 查询不晚于 endTime 上报的消息,使用 Unix 时间戳 |
success | 成功回调,返回警告消息数据模型数组 |
failure | 失败回调,error 表示错误信息 |
参数说明
- (void)removeMessagesWithMessageIds:(NSArray *)msgIds
success:(void (^)(void))success
failure:(void (^)(NSError *))failure;
参数说明
参数 | 说明 |
---|---|
msgIds | 待删除的警告消息的 ID 数组 |
success | 成功回调 |
failure | 失败回调,error 表示错误信息 |
ThingSmartCameraMessageModel
字段 | 类型 | 说明 |
---|---|---|
dateTime | NSString | 警告消息上报的日期字符串 |
msgTypeContent | NSString | 消息类型描述 |
attachPic | NSString | 图片附件地址 |
attachVideos | NSArray | 视频附件地址数组 |
msgSrcId | NSString | 触发警告消息的设备 ID |
msgContent | NSString | 消息内容 |
msgTitle | NSString | 消息标题 |
msgId | NSString | 消息 ID |
msgCode | NSString | 消息类型 |
time | NSInteger | 警告消息上报时间的 Unix 时间戳 |
根据消息类型不同,可能会有不同的附件:
attachPic
属性可以查询图片附件的地址。attachVideos
属性可以查询视频附件的地址。通常情况下,这个属性只有一个元素。为了保证数据的隐私安全性,可以选择使用加密图片的消息。
接口说明
图片加密默认为关闭。开启图片加密后,消息中携带的图片会加密。您需要使用 ThingEncryptImage
组件显示图片,详情请参考 加密图片。
@property (nonatomic, assign) BOOL enableEncryptedImage;
视频消息中的视频附件,是加密后的视频,您需要通过 ThingSmartCameraKit/ThingSmartCameraMessageMediaPlayer
提供的接口播放。
接口说明
- (UIView<ThingSmartVideoViewType> *)videoView;
接口说明
- (void)playMessage:(ThingSmartCameraMessageModel *)messageModel attachmentType:(ThingCameraMessageAttachmentType)attachmentType success:(void(^)(void))success failure:(void(^)(int errCode))failure finished:(void(^)(int errCode))onFinish;
参数说明
参数 | 说明 |
---|---|
messageModel | 告警消息数据模型 |
attachmentType | 需要播放的附件类型,告警消息中可能包含视频消息和音频消息 |
success | 播放成功回调 |
failure | 播放失败回调 |
onFinish | 视频播放结束回调,errCode 表示错误码,0 表示正常播放结束 |
接口说明
- (void)playMessageAttachment:(NSString *)attachmentPath type:(ThingCameraMessageAttachmentType)attachmentType success:(void(^)(void))success failure:(void(^)(int errCode))failure finished:(void(^)(int errCode))onFinish;
参数说明
参数 | 说明 |
---|---|
attachmentPath | 附件的 URL |
attachmentType | 附件的类型,音频附件还是视频附件,图片附件请使用 ThingEncryptImage 组件展示 |
success | 播放成功回调 |
failure | 播放失败回调 |
onFinish | 视频播放结束回调,errCode 表示错误码,0 表示正常播放结束 |
接口说明
- (int)pausePlay:(ThingCameraMessageAttachmentType)attachmentType;
接口说明
- (int)resumePlay:(ThingCameraMessageAttachmentType)attachmentType;
接口说明
- (void)stopPlay:(ThingCameraMessageAttachmentType)attachmentType;
接口说明
- (void)enableMute:(BOOL)mute success:(void(^)(void))success failure:(void (^)(NSError * error))failure;
参数说明
参数 | 说明 |
---|---|
mute | 是否静音 |
success | 成功回调 |
failure | 失败回调 |
返回值
类型 | 说明 |
---|---|
int | 错误码,0 表示操作成功 |
ThingSmartCameraMessageMediaPlayerDelegate
为消息播放器代理协议。
接口说明
- (void)mediaPlayer:(ThingSmartCameraMessageMediaPlayer *)player didReceivedFrame:(CMSampleBufferRef)frameBuffer videoFrameInfo:(ThingSmartVideoFrameInfo)frameInfo;
参数说明
参数 | 说明 |
---|---|
player | 播放器对象 |
frameBuffer | 视频帧 YUV 数据 |
frameInfo | 视频帧头信息 |
frameInfo.nDuration | 视频总时长 |
frameInfo.nProgress | 当前视频帧的进度 |
接口说明
- (void)mediaPlayer:(ThingSmartCameraMessageMediaPlayer *)player didReceivedAudioFrameInfo:(ThingSmartAudioFrameInfo)frameInfo;
参数说明
参数 | 说明 |
---|---|
player | 播放器 |
frameInfo | 音频帧头信息 |
frameInfo.nDuration | 音频总时长 |
frameInfo.nProgress | 当前音频帧的进度 |
3.20.0 版本之前的 SDK 使用 ThingSmartCloudManager
中的接口来播放告警消息中的附件,该接口已经在 3.20.0 版本废弃,请尽快修改。
警告消息 和 存储卡回放 没有直接联系。但在存储卡事件录制模式的情况下,警告消息和存储卡视频录制的触发原因和时间点是一样的。
存储卡录制的开关和侦测报警的开关也没有关联。所以,即使在存储卡事件录制的模式下,警告消息和存储卡中的视频录像也不是一一对应的。
但是存在警告消息发生的时间点有视频录像的情况,IPC SDK 暂未提供这种关联查找的接口。您可以通过警告消息的触发时间,在当天的存储卡录像视频片段中,查找是否有对应的视频录像来建立这种关联。
- (void)enableDetect {
if ([self.dpManager isSupportDP:ThingSmartCameraMotionDetectDPName]) {
bool motionDetectOn = [[self.dpManager valueForDP:ThingSmartCameraMotionDetectDPName] thingsdk_toBool];
if (!motionDetectOn) {
[self.dpManager setValue:@(YES) forDP:ThingSmartCameraMotionDetectDPName
success:^(id result) {
// 开启移动侦测成功
} failure:^(NSError *error) {
// 网络错误
}];
}
[self.dpManager setValue:ThingSmartCameraMotionHigh
forDP:ThingSmartCameraMotionSensitivityDPName
success:^(id result) {
// 成功设置移动侦测灵敏度为高灵敏度
} failure:^(NSError *error) {
// 网络错误.
}];
}
}
- (void)viewDidLoad {
[super viewDidLoad];
self.cameraMessage = [[ThingSmartCameraMessage alloc] initWithDeviceId:self.devId timeZone:[NSTimeZone defaultTimeZone]];
[self.cameraMessage getMessageSchemes:^(NSArray<ThingSmartCameraMessageSchemeModel *> *result) {
// 消息分类模型
self.schemeModels = result;
// 查询第一个分类的消息
[self reloadMessageListWithScheme:result.firstObject];
} failure:^(NSError *error) {
// 网络错误
}];
}
- (void)reloadMessageListWithScheme:(ThingSmartCameraMessageSchemeModel *)schemeModel {
NSDateFormatter *formatter = [NSDateFormatter new];
formatter.dateFormat = @"yyyy-MM-dd";
NSDate *date = [formatter dateFromString:@"2020-02-17"];
// 查询从 2020 年 2 月 17 日零点到现在的警告消息中的前 20 条
[self.cameraMessage messagesWithMessageCodes:schemeModel.msgCodes Offset:0 limit:20 startTime:[date timeIntervalSince1970] endTime:[[NSDate new] timeIntervalSince1970] success:^(NSArray<ThingSmartCameraMessageModel *> *result) {
self.messageModelList = result;
} failure:^(NSError *error) {
// 网络错误
}];
}
Swift
func enableDectect() {
guard self.dpManager.isSupportDP(.motionDetectDPName) else {
return;
}
if let isMontionDetectOn = self.dpManager.value(forDP: .motionDetectDPName) as? Bool, !isMontionDetectOn {
self.dpManager.setValue(true, forDP: .motionDetectDPName, success: { _ in
// 开启移动侦测成功
}) { _ in
// 网络错误
}
}
self.dpManager.setValue(ThingSmartCameraMotion.high, forDP: .motionSensitivityDPName, success: { _ in
// 成功设置移动侦测灵敏度为高灵敏度
}) { _ in
// 网络错误
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.cameraMessage = ThingSmartCameraMessage(deviceId: self.devId, timeZone: NSTimeZone.default)
self.cameraMessage.getSchemes({ result in
// 查询第一个分类的消息
self.schemeModels = result
if let schemeModel = result?.first {
reloadMessage(schemeModel: schemeModel)
}
}) { _ in
// 网络错误
}
}
func reloadMessage(schemeModel: ThingSmartCameraMessageSchemeModel) {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
let date = formatter.date(from: "2020-02-17")
// 查询从 2020 年 2 月 17 日零点到现在的警告消息中的前 20 条
self.cameraMessage.messages(withMessageCodes: schemeModel.msgCodes, offset: 0, limit: 20, startTime: Int(date!.timeIntervalSince1970), endTime: Int(Date().timeIntervalSince1970), success: { result in
self.messageModelList = result;
}) { _ in
// 网络错误
}
}
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈