更新时间:2024-03-04 08:53:14
App 启动状态时,设备成功绑定到家庭且处在在线状态下。App 端通过监听 MQTT 43 协议消息,可收到来自门铃设备的呼叫。之后,App 端可以通过 MQTT 308 协议消息对门铃呼叫进行接听、挂断、拒绝等操作。为了让您更方便地接入门铃业务,降低开发成本,IPC SDK 对这个流程做了完整封装。
当收到门铃呼叫时,IPC SDK 会通过 门铃呼叫监听 通知 App。后续,App 可通过 IPC SDK 对门铃呼叫进行接听、挂断、拒绝等操作。
App 完全退出时,MQTT 连接也随之断开。此时,App 可以通过接入推送来通知用户来自门铃设备的呼叫。用户点击门铃推送通知后,在弹出的门铃呼叫页面,可进行接听、挂断、拒绝等操作。但是,由于此时的门铃呼叫不是通过 MQTT 协议通知 App,所以 IPC SDK 对这种情况的呼叫无感知,同样,使用 IPC SDK 进行接听、挂断、拒绝等操作都会失败。
为了解决这个问题,您可以调用 IPC SDK 开放的方法,在用户点击门铃推送的时候,手动把来自推送的门铃呼叫加入到 IPC SDK 的管理范畴。更多信息,请参考:其他来源门铃呼叫处理。
如果想要在门铃呼叫页面显示视频流,需要另外接入 视频直播。
目前,IPC 的可视门铃(type
为 ac_doorbell
),完全采用上述方案。但需特别注意,不是所有门铃设备的呼叫原理都跟上述一致。
以 低功耗门铃(type为doorbell)为例,虽然门铃呼叫是通过 MQTT 43 协议消息通知 App,但是接听、挂断、拒绝等操作都是通过 DP 点进行。因此,您可以通过 门铃呼叫监听 来监听来自设备的呼叫。但是对这类设备的接听、挂断、拒绝等操作,需要使用 DP 点相关 API (设备控制)进行单独开发。
对于部分门锁设备,门铃呼叫、接听、挂断、拒绝等操作全是通过 DP 点进行,那么 IPC SDK 对门铃呼叫业务的封装,就完全不适用。
当应用退出时,MQTT 连接也随之断开。此时,门铃呼叫通知将依赖消息推送。为改善用户体验,您需要另外接入推送 SDK。更多详情,请参考 集成 Push。
当按下门铃时,App 端将会收到推送消息。用户可点击推送消息,进行下一步操作。
App 进程必须处于活跃状态。
示例代码
IThingIPCDoorBellManager doorBellInstance = ThingIPCSdk.getDoorbell().getIPCDoorBellManagerInstance();
门铃呼叫用 ThingDoorBellCallModel
模型类封装,用来保存门铃呼叫相关信息以及维护门铃呼叫的当前状态。
唯一标识为 messageId
,即门铃呼叫的消息 ID。一次门铃呼叫对应一个 ThingDoorBellCallModel
模型。
参数 | 描述 |
---|---|
type | 门铃呼叫类型:doorbell、ac_doorbell、自定义 |
devId | 设备 ID |
messageId | 门铃呼叫消息的唯一标识 |
time | 门铃呼叫触发的时间点,Unix 时间戳,单位:秒 |
answeredBySelf | 是否已被自己接听 |
answeredByOther | 是否已被其他人接听 |
canceled | 是否已经被取消 |
门铃呼叫状态使用 ThingDoorBellCallModel
模型类来维护。如果您想知道某个门铃呼叫的状态,可通过此接口返回对应的 ThingDoorBellCallModel
实例来获取。
接口说明
ThingDoorBellCallModel getCallModelByMessageId(String messageId);
参数说明
参数 | 说明 |
---|---|
messageId | 门铃呼叫消息的唯一标识 |
注册门铃呼叫监听者,传入监听者子类。
前提条件
App 进程处于活跃状态。当 App 进程被清理时,该监听无效。
接口说明
void addObserver(ThingSmartDoorBellObserver observer);
参数说明
参数 | 说明 |
---|---|
observer | 门铃呼叫监听者 |
ThingSmartDoorBellObserver
门铃呼叫监听者,包含门铃呼叫整个生命周期的回调,详见下表:
接口名 | 参数列表 | 返回值 | 描述 |
---|---|---|---|
doorBellCallDidReceivedFromDevice | ThingDoorBellCallModel,DeviceBean | void | 收到设备的门铃呼叫事件 |
doorBellCallDidHangUp | ThingDoorBellCallModel | void | 设备端挂断了门铃呼叫 |
doorBellCallDidAnsweredByOther | ThingDoorBellCallModel | void | 门铃呼叫已经被其他人接听,由业务层去处理是否需要自动取消或者仍然可以接听。
|
doorBellCallDidCanceled | ThingDoorBellCallModel,boolean | void | 门铃呼叫被取消。isTimeOut 参数表明是超时自动取消,还是设备端主动取消 |
doorBellCallDidAnswered | ThingDoorBellCallModel | void | 门铃呼叫已接听 |
doorBellCallDidRefuse | ThingDoorBellCallModel | void | 门铃呼叫已拒绝 |
示例代码
private ThingDoorBellCallModel mCallModel;
private final ThingSmartDoorBellObserver observer = new ThingSmartDoorBellObserver() {
@Override
public void doorBellCallDidReceivedFromDevice(ThingDoorBellCallModel callModel, DeviceBean deviceModel) {
mCallModel = callModel;
}
@Override
public void doorBellCallDidAnsweredByOther(ThingDoorBellCallModel callModel) {
}
@Override
public void doorBellCallDidCanceled(ThingDoorBellCallModel callModel, boolean isTimeOut) {
}
@Override
public void doorBellCallDidHangUp(ThingDoorBellCallModel callModel) {
}
};
收到设备的门铃呼叫事件 doorBellCallDidReceivedFromDevice
时,您需要将 ThingDoorBellCallModel
对象或者其中门铃呼叫唯一标识符 messageId
保存起来,作为后续接听、挂断、拒绝等方法的传参。
门铃呼叫监听不使用后,需要在合适的时机移除。
接口说明
void removeObserver(ThingSmartDoorBellObserver observer);
示例代码
移除指定的监听者,调用方法:
if (doorBellInstance != null) {
doorBellInstance.removeObserver(observer);
}
正在接听某个设备的门铃呼叫时,设置是否自动忽略掉此设备的后续呼叫。
接口说明
void setIgnoreWhenCalling(boolean ignoreWhenCalling);
参数说明
参数 | 说明 |
---|---|
ignoreWhenCalling |
true 。 |
设置门铃呼叫超时时间,在规定时间内门铃呼叫未处理时,会回调 ThingSmartDoorBellObserver#doorBellCallDidCanceled
进行通知,并结束此次门铃呼叫。
接口说明
void setDoorbellRingTimeOut(int doorbellRingTimeOut);
参数说明
参数 | 说明 |
---|---|
doorbellRingTimeOut | 门铃呼叫超时时间,默认值为 25,单位:秒 |
收到门铃呼叫之后,可接听门铃。但是,呼叫可能因为已经被接听、取消或者别的原因而导致无法成功接听。如果接听失败,失败原因会以返回值错误码的形式告知。更多详情,请参考 错误码。
接口说明
int answerDoorBellCall(String messageId);
参数说明
参数 | 说明 |
---|---|
messageId | 门铃呼叫消息的唯一标识 |
示例代码
if (doorBellInstance != null && mCallModel != null) {
doorBellInstance.answerDoorBellCall(mCallModel.getMessageId());
}
收到门铃呼叫之后,可直接拒绝接听门铃。
接口说明
void refuseDoorBellCall(String messageId);
参数说明
参数 | 说明 |
---|---|
messageId | 门铃呼叫消息的唯一标识 |
示例代码
if (doorBellInstance != null && mCallModel != null) {
doorBellInstance.refuseDoorBellCall(mCallModel.getMessageId());
}
门铃呼叫接听后,可挂断接听。挂断接听可能由于呼叫未被接听等原因为失败,失败原因会以返回值错误码的形式告知。更多详情,请参考 错误码。
接口说明
int hangupDoorBellCall(String messageId);
参数说明
参数 | 说明 |
---|---|
messageId | 门铃呼叫消息的唯一标识 |
示例代码
if (doorBellInstance != null && mCallModel != null) {
doorBellInstance.hangupDoorBellCall(mCallModel.getMessageId());
}
门铃呼叫除了通过 MQTT 协议消息通知客户端,还可能通过推送,所以提供此接口。接口可以根据外部传入参数来生成门铃呼叫模型,达到管理后续门铃接听、挂断、拒绝等操作。
接口说明
void generateCallModel(String deviceId, String messageType, String msgId, long startTime);
参数说明
参数 | 说明 |
---|---|
deviceId | 设备 ID |
messageType | 消息类型 |
msgId | 消息 ID |
startTime | 门铃呼叫开始时间 |
cid | 子设备 NodeId,可空 |
示例代码 |
ThingIPCSdk.getDoorbell().getIPCDoorBellManagerInstance().generateCallModel(deviceId, messageType, msgId, startTime, String cid);
错误码 | 说明 |
---|---|
0 | 操作成功,无错误 |
-2300 | 呼叫处理失败,原因可能为:
|
-2301 | 调用接听呼叫接口时,如果已经被其他用户接听,返回此错误码 |
-2302 | 调用接听呼叫接口时,如果设备端已经取消掉了此次呼叫,返回此错误码 |
-2303 | 调用接听呼叫接口时,如果已经超时,返回此错误码 |
-2304 | 调用接听呼叫接口时,如果已经接听过,返回此错误码 |
-2305 | 调用挂断呼叫接口时,如果门铃呼叫没有被接听,返回此错误码 |
-2306 | 不支持此类型设备,比如 doorbell 类型设备 |
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈