本文介绍如何实现智能门铃场景的进阶功能:
设备端检测到预定义的异常事件后,会将事件通知推送到客户端。如果客户端处于后台运行或关闭状态,你还需要集成离线推送服务,确保通知可以及时到达。你可以参考第三方推送集成集成环信的离线推送服务。
客户端需要通过信令系统进行设备端的分辨率调节、远程开锁等实时操作。你可以在客户端集成声网云信令 SDK 实现设备控制。RTSA Lite SDK 具备云信令接口,可以直接与云信令 SDK 进行通信。
使用信令接口需要通过云信令 RTM Token 鉴权。你需要自行在业务后台生成 RTM Token。业务后台会分配此次通话的主叫用户 ID、被叫用户 ID 及对应的 RTM Token,并分别下发至客户端和设备端。这些参数都是后续客户端使用的声网云信令(RTM) SDK 和设备端使用的 RTSA Lite SDK 登录云信令系统所需要的。
设备端通过 RTSA Lite SDK 的 agora_rtc_login_rtm
方法登录云信令系统。
示例代码仅供参考,具体用法参考 RSTA Lite SDK 文档。
// C
// 设备端通过 RTSA Lite SDK 登录云信令系统
rval = agora_rtc_login_rtm(p_config->p_rtm_uid, p_config->p_token, &rtm_handler);
if (rval < 0) {
printf("login rtm failed\n");
goto EXIT;
}
客户端通过云信令 SDK 的 login 方法登录云信令系统。
示例代码仅供参考,具体用法参考云信令 SDK 文档。
// Java
// 客户端通过云信令 SDK 登录 RTM 系统
mRtmClient.login(token, uid, new ResultCallback<Void>() {
@Override
public void onSuccess(Void responseInfo) {
}
@Override
public void onFailure(ErrorInfo errorInfo) {
CharSequence text = "User: " + uid + " failed to log in to the RTM system!" + errorInfo.toString();
int duration = Toast.LENGTH_SHORT;
runOnUiThread(new Runnable() {
public void run() {
Toast toast = Toast.makeText(getApplicationContext(), text, duration);
toast.show();
}
});
}
});
设备端通过 RTSA Lite SDK 的 agora_rtc_send_rtm_data
方法和 _on_rtm_data
回调发送和接收信令。
示例代码仅供参考,具体用法参考 RSTA Lite SDK 文档。
// c
// 接收你登录的 RTM 系统中对端发送信令
static void __on_rtm_data(const char *user_id, const void *data, size_t data_len)
{
app_t *p_app = app_get_instance();
app_config_t *p_config = &p_app->config;
if (p_config->rtm_role == 3) {
// printf("Receive data[%s] from user[%s] length[%lu]\n", (char *)data, user_id, data_len);
printf("Receive data[%s] length[%d]\n", (char *)data, (int)data_len);
} else {
printf("data_callback %s data[], length[%lu]\n", user_id, data_len);
}
if (p_app->config.rtm_recv_dump_flag && p_app->rtm_recv_file_fd != INVALID_FD) {
if (write(p_app->rtm_recv_file_fd, data, data_len) != data_len) {
printf("write error\n");
return;
}
}
}
// 监听本地用户状态
static void __on_rtm_event(const char *user_id, uint32_t event_id, uint32_t event_code)
{
LOGD("%s event id[%u], event code[%u]", user_id, event_id, event_code);
if (event_id == 0 && event_code == 0) {
app_t *p_app = app_get_instance();
p_app->b_rtm_login_success_flag = 1;
}
}
// 监听本地信令发送结果
static void __on_rtm_send_data_res(uint32_t msg_id, uint32_t error_code)
{
LOGD("msg id [%u], error_code[%u]", msg_id, error_code);
}
// 向指定 RTM 用户发送信令
rval = agora_rtc_send_rtm_data(p_app->config.p_peer_uid, ++message_id, buffer, rval);
if (rval < 0) {
LOGE("%s send data failed, rval=%d", TAG_API, rval);
goto EXIT;
}
客户端通过云信令 SDK 的 sendMessageToPeer
方法和 onMessageReceived
回调发送和接收信令。
示例代码仅供参考,具体用法参考云信令 SDK 文档。
// Java
// 发送信令
mRtmClient.sendMessageToPeer(peer_id, message, option, new ResultCallback<Void>() {
@Override
public void onSuccess(Void aVoid) {
String text = "Message sent from " + uid + " To " + peer_id + " : " + message.getText() + "\n";
writeToMessageHistory(text);
}
@Override
public void onFailure(ErrorInfo errorInfo) {
String text = "Message fails to send from " + uid + " To " + peer_id + " Error : " + errorInfo + "\n";
writeToMessageHistory(text);
}
});
// 接收信令
@Override
public void onMessageReceived(RtmMessage rtmMessage, String peerId) {
String text = "Message received from " + peerId + " Message: " + rtmMessage.getText() + "\n";
writeToMessageHistory(text);
}