本文將介紹自訂訊息發送和接收的實現原理和範例程式碼。
範例程式碼
Android端自訂訊息發送與接收:Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/DataChannelMessage/DataChannelMessageActivity.java。
iOS端自訂訊息發送與接收:iOS/ARTCExample/BasicUsage/DataChannelMessage/DataChannelMessageVC.swift。
前提條件
功能實現

說明
主播角色可以發送和接收訊息,觀眾角色僅支援接收訊息。
開啟自訂訊息通道
ARTC 預設不開啟自訂訊息通道,需要調用setParameter介面進行開啟,該介面加入頻道前後均可調用。
Android
param = "{\"data\":{\"enablePubDataChannel\":true" + ",\"enableSubDataChannel\":true}}";
mAliRtcEngine.setParameter(param);iOS
NSString* parameter = [NSString stringWithFormat:@"{\"data\":{\"enablePubDataChannel\":true,\"enableSubDataChannel\":true}}"];
[self.engine setParameter:parameter];Web
// Web 端需要在 joinChannel 之前調用
mAliRtcEngine.setParameter(
JSON.stringify({
data: {
enablePubDataChannel: true,
enableSubDataChannel: true,
},
}),
);Windows
char * param = "{\"data\":{\"enablePubDataChannel\":true,\"enableSubDataChannel\":true}}";
mAliRtcEngine->SetParameter(param);發送自訂訊息
在建立DataChannel通道後,可以通過sendDataChannelMsg介面。
重要
主播角色可以發送和接收訊息,觀眾角色僅支援接收訊息。
需要調用
setParameter開啟自訂訊息通道。發送資料有限制為:
位元速率上限為 30 KB/s。
資料通道每秒最多可發送 60 個資料包,每個資料包最大為 1 KB。
Android
AliRtcEngine.AliRtcDataChannelMsg msg = new AliRtcEngine.AliRtcDataChannelMsg();
msg.type = AliRtcEngine.AliRtcDataMsgType.AliEngineDataMsgCustom;
/* data可以是任意資料(文字、圖片等) */
msg.data = xxxx;
mAliRtcEngine.sendDataChannelMsg(msg);iOS
AliRtcDataChannelMsg* msg = [[AliRtcDataChannelMsg alloc] init];
msg.type = AliRtcDataMsgCustom;
/* data可以是任意資料(文字、圖片等) */
msg.data = xxxxx;
[self.engine sendDataChannelMessage:msg];Web
const data = new TextEncoder().encode('xxxx');
// data 可以是任意資料(文字、圖片等),格式是 ArrayBuffer
mAliRtcEngine.sendDataChannelMessage(
new AliRtcDataChannelMsg(data),
);Windows
AliEngineDataChannelMsg msg;
msg.type = AliEngineDataChannelCustom;
/* data可以是任意資料(文字、圖片等) */
msg.data = data;
msg.dataLen = dataLength;
mAliRtcEngine->SendDataChannelMessage(msg);接收自訂訊息
通過監聽onDataChannelMessage回調來接收自訂訊息。
Android
//在AliRtcEngineNotify回調中
public void onDataChannelMessage(String uid, AliRtcEngine.AliRtcDataChannelMsg msg) {
/* TODO:編寫自訂訊息的處理 */
}iOS
- (void)onDataChannelMessage:(NSString *_Nonnull)uid controlMsg:(AliRtcDataChannelMsg*_Nonnull)controlMsg {
/* TODO:編寫自訂訊息的處理 */
}Web
mAliRtcEngine.on('dataChannelMsg', (uid, message) => {
// 編寫自訂訊息的處理
console.log('dataChannelMsg', uid, message);
});Windows
public:
virtual void OnDataChannelMessage(const char* uid, const AliEngineDataChannelMsg& msg) override {
/* TODO:編寫自訂訊息的處理 */
}