このトピックでは、カスタムメッセージを送受信する方法について説明し、サンプルコードを提供します。
サンプルコード
Android でのカスタムメッセージの送受信: Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/DataChannelMessage/DataChannelMessageActivity.java
iOS でのカスタムメッセージの送受信: iOS/ARTCExample/BasicUsage/DataChannelMessage/DataChannelMessageVC.swift
前提条件
有効な Alibaba Cloud アカウントを持ち、ApsaraVideo Real-time Communication アプリケーションを作成済みであること。詳細については、「アプリケーションの作成」をご参照ください。アプリケーション管理コンソールから App ID と App Key を取得します。
ARTC SDK をプロジェクトに統合し、基本的なリアルタイム音声・映像機能を実装済みであること。SDK の統合については、「SDK のダウンロードと統合」をご参照ください。音声・映像機能の実装については、「音声・映像通話の実装」をご参照ください。
実装

ストリーマーロールのユーザーはメッセージの送受信ができます。視聴者ロールのユーザーはメッセージの受信のみ可能です。
カスタムメッセージチャンネルの有効化
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];Harmony
const param = '{"data":{"enablePubDataChannel":true,"enableSubDataChannel":true}}';
this.rtcEngine.setParameter(param);Web
// Web クライアントでは、joinChannel の前にこれを呼び出します。
mAliRtcEngine.setParameter(
JSON.stringify({
data: {
enablePubDataChannel: true,
enableSubDataChannel: true,
},
}),
);Windows
char * param = "{\"data\":{\"enablePubDataChannel\":true,\"enableSubDataChannel\":true}}";
mAliRtcEngine->SetParameter(param);カスタムメッセージの送信
データチャンネルを確立した後、sendDataChannelMsg メソッドを呼び出してメッセージを送信します。
ストリーマーロールのユーザーはメッセージの送受信ができます。視聴者ロールのユーザーはメッセージの受信のみ可能です。
カスタムメッセージチャンネルを有効にするには、
setParameterを呼び出します。データ送信には以下の制限が適用されます:
最大ビットレートは 30 KB/s です。
データチャンネルは、1 秒あたり最大 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];Harmony
const msg = new AliRtcDataChannelMsg();
msg.type = AliRtcDataMsgType.AliRtcDataChannelCustom;
const seiData = this.stringToArrayBuffer(this.SendText);
msg.data = seiData;
// メッセージを送信
const res = this.rtcEngine.sendDataChannelMsg(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: ここにカスタムメッセージの処理ロジックを追加します。 */
}Harmony
// データチャンネルメッセージ受信用のコールバック
listener.onDataChannelMessage((uid: string, msg: AliRtcDataChannelMsg) => {
console.info(`Received data channel message: uid=${uid}, type=${msg.type}`);
/* 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: ここにカスタムメッセージの処理ロジックを追加します。 */
}