このトピックでは、ApsaraVideo Real-time Communication (ARTC) SDK のデータチャネルを使用してメッセージを送受信する方法について説明します。
サンプルコード
Android クライアントでのカスタムメッセージの送受信: Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/DataChannelMessage/DataChannelMessageActivity.java
iOS クライアントでのカスタムメッセージの送受信: iOS/ARTCExample/BasicUsage/DataChannelMessage/DataChannelMessageVC.swift
Harmony クライアントでのカスタムメッセージの送受信: Harmony/ARTCExample/entry/src/main/ets/pages/basicusage/DataChannelMessagePage.ets
前提条件
有効な Alibaba Cloud アカウントと ApsaraVideo Real-time Communication アプリケーションが必要です。手順については、「アプリケーションの作成」をご参照ください。App ID と App Key は アプリケーション管理コンソール から取得できます。
ARTC SDK をプロジェクトに統合し、基本的なリアルタイム音声・映像機能を実装する必要があります。SDK の統合については、「SDK のダウンロードと統合」をご参照ください。音声・映像通話の実装については、「音声・映像通話の実装」をご参照ください。
ARTC のデータチャネル機能は、ストリーマーが音声またはビデオストリームをプッシュすることに依存します。そのため、通話を確立し、音声またはビデオのプッシュを開始した後にのみ使用してください。ご利用のシナリオで実際の音声またはビデオストリーミングが必要ない場合は、無音の音声ストリームをプッシュしてこの依存関係を満たし、データチャネルを有効にしてください。
機能の実装

ストリーマーはメッセージを送受信できます。視聴者はメッセージの受信のみ可能です。
カスタムメッセージチャネルの有効化
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,
},
}),
);Mac
NSString* parameter = [NSString stringWithFormat:@"{\"data\":{\"enablePubDataChannel\":true,\"enableSubDataChannel\":true}}"];
[self.engine setParameter:parameter];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;
/* テキストや画像など、すべてのデータタイプがサポートされています。 */
msg.data = xxxx;
mAliRtcEngine.sendDataChannelMsg(msg);iOS
AliRtcDataChannelMsg* msg = [[AliRtcDataChannelMsg alloc] init];
msg.type = AliRtcDataMsgCustom;
/* テキストや画像など、すべてのデータタイプがサポートされています。 */
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');
// データは ArrayBuffer 形式で、任意のタイプ (テキストや画像など) にすることができます。
mAliRtcEngine.sendDataChannelMessage(
new AliRtcDataChannelMsg(data),
);Mac
AliRtcDataChannelMsg* msg = [[AliRtcDataChannelMsg alloc] init];
msg.type = AliRtcDataMsgCustom;
/* テキストや画像など、すべてのデータタイプがサポートされています。 */
msg.data = xxxxx;
[self.engine sendDataChannelMessage:msg];Windows
AliEngineDataChannelMsg msg;
msg.type = AliEngineDataChannelCustom;
/* テキストや画像など、すべてのデータタイプがサポートされています。 */
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(`データチャネルメッセージを受信しました:uid=${uid}, type=${msg.type}`);
/* TODO: カスタムメッセージを処理するロジックを記述します。 */
});Web
mAliRtcEngine.on('dataChannelMsg', (uid, message) => {
// カスタムメッセージを処理するロジックを記述します。
console.log('dataChannelMsg', uid, message);
});Mac
- (void)onDataChannelMessage:(NSString *)uid controlMsg:(AliRtcDataChannelMsg *)controlMsg {
/* TODO: カスタムメッセージを処理するロジックを記述します。 */
}Windows
public:
virtual void OnDataChannelMessage(const char* uid, const AliEngineDataChannelMsg& msg) override {
/* TODO: カスタムメッセージを処理するロジックを記述します。 */
}