Ohos

介绍Ohos端如何接入实时消息(Real-Time Messaging,RTM)功能。

简介

实时消息具有低延时、高并发、高可靠性等特点,可用于直播聊天互动、语聊房等场景。

DingRTC的实时消息能力依托于会议,使用前需先成功入会。

相关概念

会话(Session):实时消息会话,由sessionId唯一标识。Session支持join/leave/close操作,收发实时消息前,需先创建Session并加入。DingRTC支持创建多个不同sessionId的会话,各Session之间互不干扰。

广播消息:对Session里的所有其他成员发送消息。

点对点消息:Session里的指定UserID的用户发送消息。

集成方法

  1. 入会前,从DingRtc获取DingRtmClient实例:

    let rtmClient = dingRtc.getRtmClient();
  2. DingRtmClient实例设置回调监听器:

    rtmClient.setRtmListener(new RtmListEventListener())
    
    class RtmListEventListener extends DingRtmEventListener {
    
      onRtmServerStateChanged(state: DingRtcConstants.RtmServerState, reason: number): void {
        console.error('onRtmServerStateChanged - state:', state, ', reason:', reason);
      }
    
      onJoinSessionResult(sessionId: string, result: number): void {
    
      }
    
      onLeaveSessionResult(sessionId: string, result: number): void {
    
      }
    
      onCloseSessionResult(sessionId: string, result: number): void {
    
      }
    
      onRemovedFromSession(sessionId: string, reason: number): void {
    
      }
    
      onSessionCreated(sessionId: string): void {
    
      }
    
      onSessionClosed(sessionId: string): void {
    
      }
    
      onSessionRemoteUserJoin(sessionId: string, uid: string): void {
    
      }
    
      onSessionRemoteUserLeave(sessionId: string, uid: string): void {
    
      }
    
      onMessage(sessionId: string, fromUid: string, broadcast: boolean, message: Uint8Array, size: number): void {
    
      }
    }
  3. 入会成功后,会话发起者创建并加入Session:

    rtmClient.joinSession(sessionId); // Session不存在时调用joinSession会先创建Session然后加入
  4. 会中其他成员会收到onSessionCreate事件通知,然后加入相同Session:

    rtmClient.joinSession(sessionId); // Session存在时调用joinSession直接加入
  5. 加入Session(如果Session有其他成员)或者是中途有其他成员加入Session,都会收到onSessionRemoteUserJoin事件通知。如有点对点发送实时消息的需求,需要应用层维护Session的成员列表:

      onSessionRemoteUserJoin(sessionId: string, uid: string): void {
    
      }

    同时在别人离开Session时,会收到onSessionRemoteUserLeave事件通知,按需做好Session成员列表的维护:

      onSessionRemoteUserLeave(sessionId: string, uid: string): void {
    
      }
  6. SDK支持收发UTF-8编码的字符串和二进制数据,Android端统一用byte数组作为参数来传递消息。 发送广播消息:

    let msg = "test123";
    //(Uint8ArrayString互转请参考 https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkts-91-V5)
    let data = StringUtil.stringToUint8Array(msg);
    rtmClient.broadcastData(sessionId, data);

    发送点对点消息:

    let msg = "test123";
    //(Uint8ArrayString互转请参考 https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkts-91-V5)
    let data = StringUtil.stringToUint8Array(msg);
    rtmClient.sendData(sessionId, uid, data);

    接收消息:

    onMessage(sessionId: string, fromUid: string, broadcast: boolean, message: Uint8Array, size: number): void {
      console.info('RtmListEventListener onMessage [NAPI] message: ' + StringUtil.uint8ArrayToString(message));
    }
  7. 如果本端不再使用实时消息功能,可以离开Session:

    rtmClient.leaveSession(sessionId);

    离开Session后,将收不到该Session里其他成员发送的广播消息,该Session里其他成员也无法给您发送点对点消息。

  8. 如果不再使用某个Session,可以关闭Session:

    rtmClient.closeSession(sessionId);

    关闭Session后,Session的所有成员(包括自己)都会收到onSessionClose事件通知,该Session不再可用。

注意事项

  1. 尽量在joinChannel前获取DingRtmClient实例并设置监听器,否则可能丢失部分RTM消息。

  2. 离会时,SDK内部会清空所有Session信息,实时消息功能不再可用。

  3. 远端用户不调leaveSession直接leaveChannel时,有可能收不到他的onSessionRemoteUserLeave事件通知,应用层需要在收到他的onRemoteUserOffLineNotify事件通知后,主动将该用户从所有Session的成员列表里移除。