YATE內部的訊息機制

2021-04-18 21:59:27 字數 2214 閱讀 7186

訊息是yate的乙個主要組成部分。所有的模組間通訊都使用訊息而不使用函式呼叫,這主要是因為我們考慮當乙個模組發生變化的時候不影響或不依賴於其他模組,也因為這樣讓我們的模組除錯可以更容易些。乙個訊息是幾個元件的容器:

所有的訊息在yate內部是二進位制形式的。然而我們可以通過rmanager模組提供乙個對人友好的形式。

yate內部訊息傳遞通過記憶體共享(memory sharing)。在這種方式下,可以提高系統的效能。其他可以考慮的形式如管道或sockets,沒有記憶體共享靈活和高效。當被傳遞到外部模組(external modules)時,訊息被轉換成字串編碼的形式,這樣所有能處理文字的外部模組都可以處理訊息了。

訊息會被訊息處理器處理。訊息處理器會註冊要處理的訊息和優先順序,當訊息被處理時會根據優先順序依次呼叫訊息處理器。訊息處理器可以修改訊息包含的元件(引數,返回值,甚至名稱),並且能夠決定要不要把訊息傳遞到下乙個訊息處理器還是終結訊息的處理。如果返回true終結訊息,false繼續下乙個模組。

乙個訊息處理的很好的例子是「call.route」訊息:

當乙個呼叫到達到某個點時,乙個訊息像下面這樣產生:

&message *m = new message("call.route"); 

m->addparam("driver","iax");

if (e->ies.calling_name)

m->addparam("callername",e->ies.calling_name);

else

m->addparam("callername",e->session->callerid);

if (e->ies.called_number)

m->addparam("called",e->ies.called_number);

else

m->addparam("called",e->session->dnid);

我們把訊息傳送到引擎,然後檢查是否有模組(module)接收並處理了,最後將訊息消滅。

if (engine::dispatch(m))

output("routing returned: %s",m->retvalue().c_str());

else

output("nobody routed the call!");

m->destruct();

引擎在接收到上面的訊息後,會把它根據優先順序傳送到註冊了此訊息的模組。

我們也可以讓訊息排隊,讓引擎內部的執行緒池進行排程。此時我們不用主動銷毀訊息,由引擎代勞。

message *m = new message("alert");

m->addparam("reason","hardware malfunction");

engine::enqueue(m);

訊息處理器的構成

訊息處理器必須從messagehandler繼承,然後自己實現裡面的received函式。

class routehandler : public messagehandler

virtual bool received(message &msg);

};bool routehandler::received(message &msg)

最後在外掛程式(模組)初始化方法內安裝此處理器。

void regfileplugin::initialize()

1. engine messages

2. channel messages

3. call messages

4. user messages

5. resource subscribe/notify messages

6. sip messages

7. encode or decode protocol specific messages

8. socket operation messages

9. clustering related messages

10. instant messaging related messages

11. jabber / xmpp messages

12. miscellaneous messages

R 的內部機制

在前面的章節中,我們已經學習了 r 語言的基礎功能,並且了解了如何運用向量 矩 陣 列表和資料框表示不同形式的資料,以及用內建函式解決簡單的問題。但是僅僅了解 這些功能並不能解決所有問題。現實中的資料分析通常需要對資料進行仔細的轉換和聚合,而這些操作則需要各種各樣內建的或是由擴充套件包提供的函式。為...

Android Window內部機制

2.1 引數合法性檢查 如果是子window還需要調整布局引數 2.2 建立viewrootimpl並將view新增到列表中 2.3 通過viewrootimpl更新介面並完成window新增過程 view繪製過程由viewrootimpl完成。在setview內部通過requestlayout完成...

Android的訊息機制

android的訊息機制主要是指handler的執行機制,而handler的執行離不開messagequeue和looper的支撐。其中messagequeue稱為訊息佇列,用作儲存一組訊息,並以佇列的形式對外提供插入和刪除工作 具體實現 使用單鏈表的結構來儲存訊息列表 messagequeue不能...