Schnellstart: Hinzufügen von Datenkanalmessaging zu Ihrer Anruf-App
Die DataChannel-Feature-API ermöglicht Echtzeitmessaging während Audio- und Videoanrufen. In dieser Schnellstartanleitung wird veranschaulicht, wie Sie das Datenkanalfeature integrieren, um den Austausch von Textnachrichten zwischen Teilnehmern innerhalb eines Gruppenaufrufs zu ermöglichen. Beachten Sie, dass es viele verschiedene Messaginglösungen außer dem Datenkanalfeature gibt, und Sie sollten die geeignete Lösung für Ihr spezifisches Verwendungsszenario auswählen.
Wichtig
Beachten Sie, dass unsere aktuelle Implementierung der DataChannel-Feature-API in einem Peer-to-Peer-Anrufszenario kein direktes Messaging zwischen einem Webbrowser und einer nativen App unterstützt.
Erstellen eines DataChannelSender-Objekts
Sie müssen zunächst ein DataChannelSender-Objekt erstellen, um Nachrichten senden zu können. In dieser benutzerdefinierten Messaginganwendung wird empfohlen, channelId
eine Zahl zuzuweisen, die dazu dient, verschiedene Anwendungsfälle der Anwendung zu unterscheiden. Beispielsweise können Sie channelId
die Zahl 1000 für benutzerdefinierte Nachrichten zuweisen.
const dataChannel = call.feature(Features.DataChannel);
const messageSender = dataChannel.createDataChannelSender({
channelId: 1000
});
Es gibt einige andere Optionen, z. B. Zuverlässigkeit, Bandbreite und Priorität. Sie können diese vorerst ignorieren und die Standardwerte verwenden. Das Absenderobjekt ist zwar erstellt, doch benötigen Sie noch ein Empfängerobjekt, um Nachrichten zu empfangen.
Registrieren eines Listeners zum Abrufen des DataChannelReceiver-Objekts
Zum Abrufen eines Empfängerobjekts müssen Sie einen Listener registrieren, der das dataChannelReceiverCreated
-Ereignis erfasst.
Beim Erstellen eines Empfängerobjekts gibt das SDK das Ereignis zusammen mit dem Empfängerobjekt aus.
dataChannel.on('dataChannelReceiverCreated', receiver => {
// receiver.channelId
// receiver.senderParticipantIdentifier, which shows the sender id
});
Innerhalb der Listener-Rückruffunktion können Sie auf das Empfängerobjekt zugreifen und Informationen wie channelId
und die Teilnehmer-ID des Absenders senderParticipantIdentifier
abrufen.
Es liegt in Ihrer Verantwortung, den Empfängerobjektverweis zu verwalten, da das SDK das Ereignis einmal für jedes erstellte Empfängerobjekt ausgibt.
Behandeln des MessageReady- und Close-Ereignisses des DataChannelReceiver-Objekts
Wenn eine Nachricht eingeht, empfängt das DataChannelReceiver-Objekt die Nachricht, speichert sie in seinem internen Puffer und gibt ein messageReady
-Ereignis aus.
Es ist nicht erforderlich, den messageReady
-Ereignislistener zu registrieren, um Nachrichten zu empfangen, da Sie die readMessage
-API jederzeit aufrufen können.
Als bewährte Methode wird jedoch empfohlen, Nachrichten innerhalb des messageReady
-Listenerrückrufs zu lesen. Wenn die Nachrichtenverarbeitung lange dauert, können Sie diese an einen Web Worker auslagern, um zu verhindern, dass der Nachrichtenempfang blockiert wird.
dataChannel.on('dataChannelReceiverCreated', receiver => {
if (receiver.channelId === 1000) {
receiver.on('close', () => {
console.log(`data channel id = ${receiver.channelId} from ${JSON.stringify(receiver.senderParticipantIdentifier)} is closed`);
});
receiver.on('messageReady', () => {
const message = receiver.readMessage();
// process the message
});
}
});
Festlegen von Teilnehmern
Sie können Sie die DataChannelSender.setParticipants
-API verwenden, um die Empfänger für Ihre Nachrichten anzugeben. Das Absenderobjekt verwaltet die letzte von Ihnen bereitgestellte Teilnehmerliste.
Der Teilnehmertyp ist CommunicationIdentifier
, den Sie von remoteParticipant.identifier
abrufen können. Weitere Informationen finden Sie unter Zugriff auf Remoteteilnehmer-Eigenschaften.
const user = call.remoteParticipants[0]; // assume the user wants to send a message to the first participant in the remoteParticipants list
messageSender.setParticipants([user.identifier]);
Beachten Sie, dass die Teilnehmerliste auf 64 Teilnehmer begrenzt ist. Wenn die Teilnehmerliste ein leeres Array ist, sendet das SDK die Nachricht an alle Teilnehmer des Anrufs.
Senden und Empfangen von Nachrichten
Die DataChannel-Feature-API erfordert, dass Sie Daten vom Typ Uint8Array
übergeben. Sie können eine JavaScript-Zeichenfolge nicht direkt mit der sendMessage
-API senden.
Wenn Sie beispielsweise die Zeichenfolge abc
senden möchten, können Sie sender.sendMessage('abc')
nicht verwenden. Stattdessen müssen Sie die Daten zuerst in einen Bytepuffer serialisieren.
const data = (new TextEncoder()).encode('abc');
sender.sendMessage(data);
Es folgt ein weiteres Beispiel für das Senden eines JSON-Objekts.
const obj = {...}; // some object
const data = (new TextEncoder()).encode(JSON.stringify(obj));
sender.sendMessage(data);
Empfangen und Decodieren der Nachricht
dataChannel.on('dataChannelReceiverCreated', receiver => {
if (receiver.channelId === 1000) {
const textDecoder = new TextDecoder();
receiver.on('close', () => {
console.log(`data channel id = ${receiver.channelId} from ${JSON.stringify(receiver.senderParticipantIdentifier)} is closed`);
});
receiver.on('messageReady', () => {
const message = receiver.readMessage();
const text = textDecoder.decode(message.data);
console.log(`from ${JSON.stringify(receiver.senderParticipantIdentifier)}:${text}`);
});
}
});
Ein vollständiges Beispiel finden Sie unter dem folgenden Link: https://github.com/Azure-Samples/communication-services-web-calling-tutorial
Wichtig
Beachten Sie, dass die aktuelle Datenkanal-Feature-API in einem Peer-to-Peer-Anrufszenario kein direktes Messaging zwischen einem Webbrowser und einer nativen App unterstützt.
Überblick
Die Datenkanal-Feature-API ermöglicht Echtzeit-Datenmessaging während Audio- und Videoanrufen. In dieser Schnellstartanleitung wird veranschaulicht, wie Sie das Datenkanal-Feature in Ihren Anruf integrieren und die Datenkanal-APIs verwenden, um Datennachrichten über einen Datenkanal zu senden und zu empfangen.
Voraussetzungen
Informationen zum Einrichten einer Beispiel-App mit Sprachanrufen finden Sie unter dem Schnellstart: Sprachanruf.
Klassen
name | Beschreibung |
---|---|
DataChannelCallFeature | Wird zum Starten und Verwalten des Datenkanal-Features verwendet. |
DataChannelSender | Wird verwendet, um einen Datenkanal als Sender zu verwalten und Daten zu senden. |
DataChannelReceiver | Wird verwendet, um einen Datenkanal als Empfänger zu verwalten und Daten zu empfangen. |
DataChannelSenderOptions | Wird zum Darstellen von Optionen zum Erstellen eines Datenkanalsenders verwendet. |
Enumerationen
Name | Beschreibung |
---|---|
DataChannelPriority | Beschreibt die Prioritätsoptionen des Datenkanals. Werte: { NORMAL , HIGH }. |
DataChannelReliability | Beschreibt die Zuverlässigkeitsoptionen des Datenkanals. Werte: { LOSSY , DURABLE }. |
Fehlercode
Name | Beschreibung |
---|---|
DATA_CHANNEL_FAILED_TO_START | getDataChannelSender() kann mit diesem Fehlercode fehlschlagen. Er gibt an, dass der zugrunde liegende Datenkanal noch nicht verwendet werden kann. |
DATA_CHANNEL_RANDOM_ID_NOT_AVAILABLE | getDataChannelSender() kann mit diesem Fehlercode fehlschlagen. Er gibt an, dass alle verfügbaren zufälligen Kanal-IDs bereits verwendet wurden. |
DATA_CHANNEL_SENDER_CLOSED | sendMessage() kann mit diesem Fehlercode fehlschlagen. Er gibt an, dass der Sender bereits zuvor geschlossen wurde. |
DATA_CHANNEL_MESSAGE_SIZE_OVER_LIMIT | sendMessage() kann mit diesem Fehlercode fehlschlagen. Er gibt an, dass die Größe der Nachrichtendaten den Grenzwert überschreitet. Sie können den Grenzwert für die Nachrichtengröße mithilfe von getMaxMessageSizeInBytes() in DataChannelSender abrufen. |
DATA_CHANNEL_MESSAGE_FAILURE_FOR_BANDWIDTH | sendMessage() kann mit diesem Fehlercode fehlschlagen. Er gibt an auf einen Fehler beim Senden der Nachricht hin, weil nicht genügend Bandbreite vorhanden ist. |
DATA_CHANNEL_MESSAGE_FAILURE_FOR_TRAFFIC_LIMIT | sendMessage() kann mit diesem Fehlercode fehlschlagen. Er weist darauf hin, dass der Versand der Nachricht fehlgeschlagen ist, weil die Gesamtnutzung des Datenkanals nicht den Regeln für die Verkehrsbegrenzung entspricht. Details zum Datenverkehrslimit finden Sie in der Dokumentation zum Konzept des Datenkanals. |
Methoden
Aktivieren des Datenkanal-Features
- Rufen Sie das laufende Aufrufobjekt ab, das während der Vorbereitungsschritte eingerichtet wurde.
- Rufen Sie das Objekt für Datenkanal-Feature ab.
DataChannelCallFeature dataChannelCallFeature = call.feature(Features.DATA_CHANNEL);
Empfangen einer Datennachricht
- Definieren Sie DataChannelReceiverCreatedListener:
DataChannelReceiverCreatedListener receiverCreatedListener = new DataChannelReceiverCreatedListener() {
@Override
public void onReceiverCreated(DataChannelReceiverCreatedEvent e) {
DataChannelReceiver receiver = e.getReceiver(); // get the new data channel receiver
int channelId = receiver.getChannelId(); // get the channel id
CommunicationIdentifier senderId = receiver.getSenderIdentifier(); // get the message sender id
// listen to the message received event and closed event from this receiver
// receiver.addOnMessageReceivedListener(messageReceivedlistener);
// receiver.addOnClosedListener(receiverClosedListener);
}
};
- Registrieren des
receiverCreatedListener
.
dataChannelCallFeature.addOnReceiverCreatedListener(receiverCreatedListener);
- Definieren des MessageReceivedListener
MessageReceivedListener messageReceivedListener = new MessageReceivedListener() {
@Override
public void onMessageReceived(PropertyChangedEvent e) {
DataChannelMessage message = e.getReceiver().receiveMessage(); // read the data message from the receiver
int sequence = message.getSequenceNumber(); // get the message sequence number
byte[] data = message.getData(); // get the data content
}
};
- Definieren des ReceiverClosedListener
ReceiverClosedListener receiverClosedListener = new ReceiverClosedListener() {
@Override
public void onReceiverClosed(PropertyChangedEvent e) {
DataChannelReceiver receiver = e.getReceiver(); // get the data channel receiver to be closed
}
};
- Registrieren Sie
messageReceivedListener
undreceiverClosedListener
.
receiver.addOnMessageReceivedListener(messageReceivedlistener);
receiver.addOnClosedListener(receiverClosedListener);
Senden einer Datennachricht
- Konfigurieren des DataChannelSenderOptions
DataChannelSenderOptions options = new DataChannelSenderOptions();
options.setChannelId(1000);
options.setBitrateInKbps(32);
options.setPriority(DataChannelPriority.NORMAL);
options.setReliability(DataChannelReliability.LOSSY);
List<CommunicationIdentifier> participants = Arrays.asList( /* identifier1, identifier2, ... */ );
options.setParticipants(participants);
- Abrufen des DataChannelSender und Senden einer Datennachricht
DataChannelSender dataChannelSender = dataChannelCallFeature.getDataChannelSender(options);
// msgData contains the byte[] data to be sent
dataChannelSender.sendMessage(msgData);
// change participants in the channel if needed
dataChannelSender.setParticipants(new ArrayList<CommunicationIdentifier>());
Wichtig
Beachten Sie, dass die aktuelle Datenkanal-Feature-API in einem Peer-to-Peer-Anrufszenario kein direktes Messaging zwischen einem Webbrowser und einer nativen App unterstützt.
Überblick
Die Datenkanal-Feature-API ermöglicht Echtzeit-Datenmessaging während Audio- und Videoanrufen. In dieser Schnellstartanleitung wird veranschaulicht, wie Sie das Datenkanal-Feature in Ihren Anruf integrieren und die Datenkanal-APIs verwenden, um Datennachrichten über einen Datenkanal zu senden und zu empfangen.
Voraussetzungen
Informationen zum Einrichten einer Beispiel-App mit Sprachanrufen finden Sie unter dem Schnellstart: Sprachanruf.
Klassen
name | Beschreibung |
---|---|
DataChannelCallFeature | Wird zum Starten und Verwalten des Datenkanal-Features verwendet. |
DataChannelSender | Wird verwendet, um einen Datenkanal als Sender zu verwalten und Daten zu senden. |
DataChannelReceiver | Wird verwendet, um einen Datenkanal als Empfänger zu verwalten und Daten zu empfangen. |
DataChannelSenderOptions | Wird zum Darstellen von Optionen zum Erstellen eines Datenkanalsenders verwendet. |
Enumerationen
Name | Beschreibung |
---|---|
DataChannelPriority | Beschreibt die Prioritätsoptionen des Datenkanals. Werte: { normal , high }. |
DataChannelReliability | Beschreibt die Zuverlässigkeitsoptionen des Datenkanals. Werte: { lossy , durable }. |
Fehlercode
Name | Beschreibung |
---|---|
dataChannelFailedToStart | getDataChannelSender() kann mit diesem Fehlercode fehlschlagen. Er gibt an, dass der zugrunde liegende Datenkanal noch nicht verwendet werden kann. |
dataChannelRandomIdNotAvailable | getDataChannelSender() kann mit diesem Fehlercode fehlschlagen. Er gibt an, dass alle verfügbaren zufälligen Kanal-IDs bereits verwendet wurden. |
dataChannelSenderClosed | sendMessage() kann mit diesem Fehlercode fehlschlagen. Er gibt an, dass der Sender bereits zuvor geschlossen wurde. |
dataChannelMessageSizeOverLimit | sendMessage() kann mit diesem Fehlercode fehlschlagen. Er gibt an, dass die Größe der Nachrichtendaten den Grenzwert überschreitet. Sie können den Grenzwert für die Nachrichtengröße mithilfe von maxMessageSizeInBytes in DataChannelSender abrufen. |
dataChannelMessageFailureForBandwidth | sendMessage() kann mit diesem Fehlercode fehlschlagen. Er gibt an auf einen Fehler beim Senden der Nachricht hin, weil nicht genügend Bandbreite vorhanden ist. |
dataChannelMessageFailureForTrafficLimit | sendMessage() kann mit diesem Fehlercode fehlschlagen. Er weist darauf hin, dass der Versand der Nachricht fehlgeschlagen ist, weil die Gesamtnutzung des Datenkanals nicht den Regeln für die Verkehrsbegrenzung entspricht. Details zum Datenverkehrslimit finden Sie in der Dokumentation zum Konzept des Datenkanals. |
Methoden
Aktivieren des Datenkanal-Features
- Rufen Sie das laufende Aufrufobjekt ab, das während der Vorbereitungsschritte eingerichtet wurde.
- Rufen Sie das Objekt für Datenkanal-Feature ab.
var dataChannelCallFeature = self.call!.feature(Features.dataChannel)
Empfangen einer Datennachricht
let featureDelegate = new FeatureDelegate()
let receiverDelegate = new ReceiverDelegate()
dataChannelCallFeature!.delegate = featureDelegate
class FeatureDelegate: NSObject, DataChannelCallFeatureDelegate {
public func dataChannelCallFeature(_ dataChannelCallFeature: DataChannelCallFeature, didCreateReceiver args: DataChannelReceiverCreatedEventArgs) {
let receiver = args.receiver // get the new data channel receiver
let channelId = receiver.channelId // get the channel id
let senderId = receiver.senderIdentifier // get the message sender id
receiver.delegate = receiverDelegate
}
}
class ReceiverDelegate: NSObject, DataChannelReceiverDelegate {
public func dataChannelReceiver(_ dataChannelReceiver: DataChannelReceiver, didReceiveMessage args: PropertyChangedEventArgs) {
let message = dataChannelReceiver.receiveMessage() // read the data message from the receiver
let sequence = message?.sequenceNumber // get the message sequence number
let data = message?.data // get the data content
}
public func dataChannelReceiver(_ dataChannelReceiver: DataChannelReceiver, didClose args: PropertyChangedEventArgs) {
let channelId = dataChannelReceiver.channelId // get the data channel id to be closed
}
}
Senden einer Datennachricht
- Konfigurieren des DataChannelSenderOptions
let options = new DataChannelSenderOptions()
options.channelId = 1000
options.bitrateInKbps = 32
options.priority = DataChannelPriority.normal
options.reliability = DataChannelReliability.lossy
let communicationIdentifiers: [CommunicationIdentifier] = [ /* identifier1, identifier2, ... */ ]
options.participants = communicationIdentifiers
- Definieren von DataChannelSender und Senden einer Datennachricht
DataChannelSender sender = dataChannelCallFeature.getDataChannelSender(options)
// msgData contains the data to be sent
sender.sendMessage(msgData)
// change participants in the channel if needed
let participants: [CommunicationIdentifier] = []
dataChannelSender.setParticipants(participants: participants)
Wichtig
Beachten Sie, dass die aktuelle Datenkanal-Feature-API in einem Peer-to-Peer-Anrufszenario kein direktes Messaging zwischen einem Webbrowser und einer nativen App unterstützt.
Überblick
Die Datenkanal-Feature-API ermöglicht Echtzeit-Datenmessaging während Audio- und Videoanrufen. In dieser Schnellstartanleitung wird veranschaulicht, wie Sie das Datenkanal-Feature in Ihren Anruf integrieren und die Datenkanal-APIs verwenden, um Datennachrichten über einen Datenkanal zu senden und zu empfangen.
Voraussetzungen
Informationen zum Einrichten einer Beispiel-App mit Sprachanrufen finden Sie unter dem Schnellstart: Sprachanruf.
Klassen
name | Beschreibung |
---|---|
DataChannelCallFeature | Wird zum Starten und Verwalten des Datenkanal-Features verwendet. |
DataChannelSender | Wird verwendet, um einen Datenkanal als Sender zu verwalten und Daten zu senden. |
DataChannelReceiver | Wird verwendet, um einen Datenkanal als Empfänger zu verwalten und Daten zu empfangen. |
DataChannelSenderOptions | Wird zum Darstellen von Optionen zum Erstellen eines Datenkanalsenders verwendet. |
Enumerationen
Name | Beschreibung |
---|---|
DataChannelPriority | Beschreibt die Prioritätsoptionen des Datenkanals. Werte: { Normal , High }. |
DataChannelReliability | Beschreibt die Zuverlässigkeitsoptionen des Datenkanals. Werte: { Lossy , Durable }. |
Fehlercode
Name | Beschreibung |
---|---|
DataChannelFailedToStart | GetDataChannelSender() kann mit diesem Fehlercode fehlschlagen. Er gibt an, dass der zugrunde liegende Datenkanal noch nicht verwendet werden kann. |
DataChannelRandomIdNotAvailable | GetDataChannelSender() kann mit diesem Fehlercode fehlschlagen. Er gibt an, dass alle verfügbaren zufälligen Kanal-IDs bereits verwendet wurden. |
DataChannelSenderClosed | SendMessage() kann mit diesem Fehlercode fehlschlagen. Er gibt an, dass der Sender bereits zuvor geschlossen wurde. |
DataChannelMessageSizeOverLimit | SendMessage() kann mit diesem Fehlercode fehlschlagen. Er gibt an, dass die Größe der Nachrichtendaten den Grenzwert überschreitet. Sie können den Grenzwert für die Nachrichtengröße mithilfe von MaxMessageSizeInBytes in DataChannelSender abrufen. |
DataChannelMessageFailureForBandwidth | SendMessage() kann mit diesem Fehlercode fehlschlagen. Er gibt an auf einen Fehler beim Senden der Nachricht hin, weil nicht genügend Bandbreite vorhanden ist. |
DataChannelMessageFailureForTrafficLimit | SendMessage() kann mit diesem Fehlercode fehlschlagen. Er weist darauf hin, dass der Versand der Nachricht fehlgeschlagen ist, weil die Gesamtnutzung des Datenkanals nicht den Regeln für die Verkehrsbegrenzung entspricht. Details zum Datenverkehrslimit finden Sie in der Dokumentation zum Konzept des Datenkanals. |
Methoden
Aktivieren des Datenkanal-Features
- Rufen Sie das laufende Aufrufobjekt ab, das während der Vorbereitungsschritte eingerichtet wurde.
- Rufen Sie das Objekt für Datenkanal-Feature ab.
DataChannelCallFeature dataChannelCallFeature = call.Features.DataChannel;
Empfangen einer Datennachricht
- Definieren Sie den DataChannelReceiverCreated-Ereignishandler:
void DataChannelReceiverCreatedHandler(object sender, DataChannelReceiverCreatedEventArgs args)
{
DataChannelReceiver receiver = args.Receiver; // get the new data channel receiver
int channelId = receiver.ChannelId; // get the channel id
CallIdentifier senderId = receiver.SenderIdentifier; // get the message sender id
// add event handlers for the message received event and closed event from this receiver
// receiver.MessageReceived += MessageReceivedHandler;
// receiver.Closed += ReceiverClosedHandler;
}
- Fügen Sie
DataChannelReceiverCreatedHandler
an.
dataChannelCallFeature.ReceiverCreated += DataChannelReceiverCreatedHandler;
- Definieren des MessageReceived-Ereignishandlers
void MessageReceivedHandler(object sender, PropertyChangedEventArgs args)
{
DataChannelMessage message = (sender as DataChannelReceiver).ReceiveMessage(); // read the data message from the receiver
long sequence = message.SequenceNumber; // get the message sequence number
byte[] data = message.Data; // get the data content
}
- Definieren des Closed-Ereignishandlers
void ReceiverClosedHandler(object sender, PropertyChangedEventArgs args)
{
DataChannelReceiver receiver = sender as DataChannelReceiver; // get the data channel receiver to be closed
};
- Fügen Sie
MessageReceivedHandler
undReceiverClosedHandler
an.
receiver.MessageReceived += MessageReceivedHandler;
receiver.Closed += ReceiverClosedHandler;
Senden einer Datennachricht
- Konfigurieren des DataChannelSenderOptions
DataChannelSenderOptions options = new DataChannelSenderOptions();
options.ChannelId = 1000;
options.BitrateInKbps = 32;
options.Priority = DataChannelPriority.Normal;
options.Reliability = DataChannelReliability.Lossy;
var participants = new List<CallIdentifier> { /* identifier1, identifier2, ... */ };
options.Participants = participants.AsReadOnly();
- Definieren von DataChannelSender und Senden einer Datennachricht
DataChannelSender sender = dataChannelCallFeature.GetDataChannelSender(options);
// msgData contains the byte[] data to be sent
sender.SendMessage(msgData);
// change participants in the channel if needed
sender.SetParticipants(new List<CallIdentifier>().AsReadOnly());
Nächste Schritte
Weitere Informationen finden Sie in den folgenden Artikeln:
- Informationen zum Konzeptdokument zum Datenkanal-Feature
- Erfahren Sie mehr über die Funktionen des Calling SDK.