自定义消息发送和接收

本文将介绍自定义消息发送和接收的实现原理和示例代码。

示例代码

Android端自定义消息发送与接收Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/DataChannelMessage/DataChannelMessageActivity.java

iOS端自定义消息发送与接收iOS/ARTCExample/BasicUsage/DataChannelMessage/DataChannelMessageVC.swift

前提条件

功能实现

image.jpeg

说明

主播角色可以发送和接收消息,观众角色仅支持接收消息。

开启自定义消息通道

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);

Linux

Java相关示例代码请参见Java快速接入>消息收发

C++相关示例代码请参见C++快速接入>消息通讯

Python相关示例代码请参见Python快速接入>消息通讯

发送自定义消息

在建立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];

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);

Linux

Java相关示例代码请参见Java快速接入>消息收发

C++相关示例代码请参见C++快速接入>消息通讯

Python相关示例代码请参见Python快速接入>消息通讯

接收自定义消息

通过监听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);
});

Windows

public:
virtual void OnDataChannelMessage(const char* uid, const AliEngineDataChannelMsg& msg) override {
    /* TODO:编写自定义消息的处理 */
}

Linux

Java相关示例代码请参见Java快速接入>消息收发

C++相关示例代码请参见C++快速接入>消息通讯

Python相关示例代码请参见Python快速接入>消息通讯