對(duì)基于VOIP業(yè)務(wù)的對(duì)講有一點(diǎn)了解之后,那我們?cè)賮?lái)看看要完成一次對(duì)講需要多少狀態(tài)來(lái)表示。大概有下面幾種狀態(tài):
1.granted:當(dāng)你向服務(wù)器申請(qǐng)講話的時(shí)候,并不是你申請(qǐng)了就一定會(huì)成功,因?yàn)樵谝粋€(gè)群組里面能講話的只能是一個(gè)人,如果當(dāng)前有人在講話那么你肯定就不能講了,所以當(dāng)你申請(qǐng)之后服務(wù)器會(huì)給一個(gè)返回表示是否可以講話,那么如果服務(wù)器返回了granted那么說(shuō)明你當(dāng)前可以講話了。但是如果你收到了grant但是你沒(méi)有發(fā)送語(yǔ)音,那么在幾秒之后服務(wù)器可能會(huì)把你斷掉。
2.idle:顧名思義就是空閑的意思,空閑就說(shuō)明當(dāng)前沒(méi)有人在說(shuō)話。
3.revoke:對(duì)于revoke消息有很多種情況,例如你講話超時(shí)服務(wù)器會(huì)給你返回一個(gè)revoke表示你的話語(yǔ)權(quán)被剝奪,還有可能是因?yàn)閯e人的優(yōu)先級(jí)比你高所以你也被剝奪了。一般被剝奪之后會(huì)有一個(gè)被剝奪的原因。
4.deny:deny拒絕,當(dāng)服務(wù)器返回granted的時(shí)候表示你可以講話了,那如果不能講話的時(shí)候返回什么呢,那就是deny了。還有一些其他的情況也會(huì)出現(xiàn)deny了,比如服務(wù)器設(shè)置了你當(dāng)前是僅聽(tīng)的狀態(tài),也就是你的發(fā)言被禁了。
5.taken:taken消息表示當(dāng)前有人要發(fā)言了,在收到這個(gè)消息之后就可能收到語(yǔ)音了。
這些狀態(tài)看起來(lái)比較簡(jiǎn)單,但是對(duì)于多會(huì)話以及網(wǎng)絡(luò)的影響,就顯得不那么簡(jiǎn)單了。
首先是消息丟失的問(wèn)題:大家都知道,基于數(shù)據(jù)業(yè)務(wù)的對(duì)講使用UDP的居多,因?yàn)閁DP比較及時(shí)。那么相信大家也知道UDP有一個(gè)致命的缺點(diǎn)那就是丟包的問(wèn)題。那大家就會(huì)想了如果在傳輸過(guò)程中把消息丟了那該怎么辦呢?為此客戶端和服務(wù)端都做了相應(yīng)的改進(jìn)。在服務(wù)端那就是連續(xù)發(fā)同一個(gè)消息,例如將granted連續(xù)發(fā)送5次,如果5次都丟了那說(shuō)明網(wǎng)絡(luò)環(huán)境真的很不好。服務(wù)端的改進(jìn)可以解決一大部分丟包的問(wèn)題,但是并不能完全解決,對(duì)于接收方如果恰巧就發(fā)送消息的時(shí)間短網(wǎng)絡(luò)不好把消息全丟了。但是服務(wù)器并不知道你沒(méi)有收到taken的消息,還是繼續(xù)給你發(fā)語(yǔ)音,那就會(huì)出現(xiàn)一長(zhǎng)串的語(yǔ)音發(fā)送到你。所以這個(gè)時(shí)候客戶端如果只是根據(jù)有沒(méi)有收到taken消息來(lái)判斷是否要收聽(tīng)是不是有點(diǎn)武斷呢,可能真的會(huì)丟失信息??墒侨绻覀冇檬欠袷盏秸Z(yǔ)音為判斷的標(biāo)準(zhǔn),那么是否會(huì)更合理呢,盡管在有的時(shí)候可能看不到講話人的信息,但是總比把語(yǔ)音丟掉比較好吧。所以這個(gè)時(shí)候可能不僅僅要判斷消息還要檢測(cè)語(yǔ)音的情況來(lái)判斷是否要播放。
其實(shí)是網(wǎng)絡(luò)亂序:最主要的就是語(yǔ)音消息和控制消息的混亂,例如語(yǔ)音先來(lái)控制消息后來(lái),那就會(huì)導(dǎo)致客戶端的判斷錯(cuò)誤。
再次對(duì)于多會(huì)話:對(duì)于同一終端,在同一時(shí)間只能有一個(gè)人說(shuō)或者一個(gè)人聽(tīng),如果聽(tīng)多個(gè)人的講話,那么就會(huì)比較混亂,這個(gè)時(shí)候就必須要有一個(gè)控制的策略。