OWT
OWT 信令交互过程:
A POST /tokens/
A SocketIO connect
A SocketIO login
A SocketIO publish
A SocketIO soac offer
A SocketIO soac candidate
Portal SocketIO soac answer
B POST /tokens/
B SocketIO connect
B SocketIO login
B SocketIO subscribe
B SocketIO soac offer
B SocketIO soac candidate
Portal SocketIO soac answer
SocketIO logout
token
1 | -(void)getTokenFromBasicSample:(NSString *)basicServer roomId:(NSString *)roomId onSuccess:(void (^)(NSString *))onSuccess onFailure:(void (^)())onFailure{ |
data base64 decode之后1
2
3
4
5
6{
"tokenId":"63ec8bb0e20782d930e787bb",
"host":"172.19.35.107:8080",
"secure":true,
"signature":"NWE0YjQzM2M1Zjk3NDMwMTRkOGM3Nzg5Zjk3MGQ1YWZkM2I2YmI1MWNmZDk2NzM5NGJiYjBhNWRkMDA2NGE2OQ=="
}
connect
上一步 token 的 response, host 就是 socket链接的 url 地址。
connect就是与server建议长连接(socketIO),OWT.framework对外暴露的OWTConferenceClient中并没有提供connnect的方法,connect的过程其实是在join方法中
join
1 | ../src/talk/owt/sdk/conference/objc/OWTConferenceClient.mm |
1 | ../src/talk/owt/sdk/conference/conferenceclient.cc |
可以看到 先进行了 token 的校验,然后 进行 signaling_channel_->Connect,本质上 join 其实就是 执行connect。
publish
1 | -(void)doPublish{ |
1 |
|
1 | ../src/talk/owt/sdk/conference/conferenceclient.cc |
1 |
|
const std::string kEventNamePublish = “publish”;
publish_stream_label 不为空,发送publish message
1 |
|
1 |
|
1 | .../src/third_party/webrtc/pc/peer_connection.cc |
从 mediastream 获取 tracks 的信息,audio & video 构造publish message, 通过 signaling_channel_ 发送到 OWT server。
publish的过程最终还是进到了 webrtc里面 peer_connection的 AddTransceiver方法。
AddTransceiver 创建 transceiver ,Transceiver表示的是收发相同mid的receiver和sender的一个组合体 ,负责收发媒体数据,以Track为载体。
offer
publish 消息发送成功之后,就构造offer message , SetLocalDescription 后通过 signaling_channel_ 发送到 OWT server。
1 | ../src/talk/owt/sdk/conference/ConferencePeerConnectionChannel.cc |
1 |
|
answer
先看下 ConferenceSocketSignalingChannel channel 方法中 这段逻辑
1 | ../src/talk/owt/sdk/conference/ConferenceSocketSignalingChannel.cc |
const std::string kEventNameSignalingMessage = “soac”; //only for soac message
const std::string kEventNameOnSignalingMessage = “progress”;
发送offer 是 kEventNameSignalingMessage soac 事件, OWT server 收到 offer 之后,会通过 progress事件 返回 answer, 看下 OnNotificationFromServer 逻辑
1 |
|
1 |
|
1 | .../src/talk/owt/sdk/base/peerconnectionchannel.cc |
如果收到对方发的offer,才需要创建answer,如果是SFU模式,client 都是直接跟 owt server 交互,是不需要创建answer,如果是 MCU模式,就需要 CreateAnswer。
1 |
|
CreateAnswer 回调 跟 createoffer 的 回调逻辑处理是一样的 OnCreateSessionDescriptionSuccess,不多赘述
最后也会通过signaling_channel_发给owt server
subscribe
1 | OWTConferenceSubscribeOptions* subOption = |
1 | .../src/talk/owt/sdk/conference/objc/OWTConferenceClient.mm |
1 |
|
1 |
|
subscribe 的过程 跟 publish有很多类似的地方,AddTransceiver 创建 sender & receiver 收发媒体流,构造subscribe message 通过 signaling_channel_ 发送 到 owt server
发送成功之后,创建offer、发送sdp、setlocalsdp 、接受owt server 的answer、setremotesdp 等等跟publish的过程是一样,不再赘述。
signaling channel
看下在 ConferenceSocketSignalingChannel::Connect 方法中的一段代码
1 |
|
kEventNameOnSignalingMessage 这个之前介绍过了
kEventNameOnUserPresence : 有用户加入或者离开(action 区分),server 通过 participant 事件通知 client,
kEventNameStreamMessage : 用户发布流后,server 通过 stream 事件通知 client
kEventNameTextMessage : 自定义消息
kEventNameOnDrop : server 断开连接
1 | .../src/talk/owt/sdk/conference/conferencesocketsignalingchannel.cc |
observer & delegate
各种事件的传递,通过 observer & delegate 回调的方式 从 c++ 到 OC
以conferenceClient举例
1 |
|
通过 ConferenceClientObserverObjcImpl 这个类包装下,打通 oc 跟 c++ 链路。
类似的用法 还有 ConferencePublicationObserverObjcImpl 、ConferenceSubscriptionObserverObjcImpl、ParticipantObserverObjcImpl 不一一说了
再来看下 各种 observer 的定义 以及 AddObserver & RemoveObserver 的方法声明
1 |
|
1 | .../src/talk/owt/sdk/conference/conferencepeerconnectionchannel.h |
1 | .../src/talk/owt/sdk/include/cpp/owt/conference/conferenceclient.h |