通过阅读本文,您可以了解如何从RTC自定义消息通道(DataChannel)中获取智能体状态。
前提条件
已开通实时音视频应用。更多信息,请参见快速开始实时音视频。
已打开RTC自定义消息通道。更多信息,请参见自定义消息发送和接收。
解析RTC自定义消息
智能体有聆听中、思考中、讲话中三种状态码。您可以对RTC自定义消息通道中的消息体进行解析,来获取智能体的状态码。系统内置消息字段如下:
字段名称 | 描述 |
type | 消息类型 |
senderId | 发送消息的UserId |
receiverId | 接收人的UserId,如果指定消息是群发,则为空字符串 |
data | 具体的消息内容,无内容该字段可以为空 |
state | 智能体状态码 |
消息体如下:
{
"type": 1001,
"data": {
"state": 1, // 1:聆听中 2:思考中 3:讲话中
}
"senderId": "robot_1", // 发送人id
"receiverId": "" // 无需指定接收人Id,一般情况下为空
}
IOS
从RTC自定义消息通道中获取智能体状态的示例代码如下:
public func onDataChannelMessage(_ uid: String, controlMsg: AliRtcDataChannelMsg) {
if controlMsg.type != .custom {
return
}
let dataDict = (try? JSONSerialization.jsonObject(with: controlMsg.data, options: .allowFragments)) as? [String : Any]
guard let dataDict = dataDict else {
return
}
debugPrint("onDataChannelMessage:\(dataDict)")
if dataDict["type"] as? Int32 == 1001 {
let senderId = dataDict["senderId"] as? String
let receiverId = dataDict["receiverId"] as? String
let data = dataDict["data"] as? [String: Any]
if let state = data?["state"] as? Int32 {
DispatchQueue.main.async {
// 更新你的UI状态
debugPrint("Received Robot State Changed: \(state)")
}
}
}
}
Android
从RTC自定义消息通道中获取智能体状态的示例代码如下:
aliRtcEngine.setRtcEngineNotify( new AliRtcEngineNotify() {
@Override
public void onDataChannelMessage(String uid, AliRtcEngine.AliRtcDataChannelMsg msg) {
super.onDataChannelMessage(uid, msg);
if (msg.type == AliEngineDataMsgCustom) {
try {
String dataStr = new String(msg.data);
JSONObject jsonObject = new JSONObject(dataStr);
int msgType = jsonObject.optInt("type");
String senderId = jsonObject.optString("senderId");
String receiverId = jsonObject.optString("receiverId");
JSONObject dataJson = jsonObject.optJSONObject("data");
if (null != dataJson) {
if (msgType == 1001) {
int robotState = dataJson.optInt("state");
ARTCAICallRobotState artcaiCallRobotState = null;
if (robotState == IMsgTypeDef.ROBOT_STATE.ROBOT_STATE_LISTENING) {
// TODO 机器人聆听状态处理
} else if (robotState == IMsgTypeDef.ROBOT_STATE.ROBOT_STATE_THINKING) {
// TODO 机器人思考状态处理
} else if (robotState == IMsgTypeDef.ROBOT_STATE.ROBOT_STATE_SPEAKING) {
// TODO 机器人说话状态处理
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
});
文档内容是否对您有帮助?