#sip #voip #sofia

sys 索菲亚-sip

Rust对索菲亚-sip的绑定

1个不稳定版本

0.1.0 2021年7月6日
0.0.1 2021年6月27日

#4#voip

MIT 许可证

6.5MB
156K SLoC

C 135K SLoC // 0.2% comments Visual Studio Project 14K SLoC Rust 2K SLoC // 0.2% comments Automake 1.5K SLoC // 0.3% comments M4 1K SLoC // 0.2% comments AWK 651 SLoC // 0.2% comments Batch 304 SLoC // 0.4% comments Visual Studio Solution 197 SLoC Bitbake 125 SLoC // 0.0% comments RPM Specfile 86 SLoC // 0.1% comments Perl 84 SLoC // 0.0% comments C++ 69 SLoC // 0.5% comments Shell 36 SLoC // 0.5% comments

包含 (Cab文件, 52KB) autotools.vsd, (Cab文件, 36KB) SIP_outgoing_call.vsd, (Cab文件, 18KB) SIP_basic_incoming_operation.vsd, (Cab文件, 24KB) SIP_basic_outgoing_operation.vsd, (Cab文件, 33KB) SIP_incoming_call.vsd, (Cab文件, 27KB) SIP_outgoing_operation_with_auth.vsd 以及更多.

索菲亚-SIP

索菲亚-SIP的Rust绑定(Alpha阶段)。

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
sofia-sip = "0.1.0"

示例

use sofia_sip::{Handle, Nua, NuaEvent, Sip, Tag, TagBuilder};

fn main() {
    /*
    A                    B
    |-------MESSAGE----->|
    |<--------200--------|
    |                    |

                           ______(NETWORK)_____
                          /                    \
    A                 NUA STACK (A)
    |                     |
    |    nua::handle( )   |
    |-------------------->|
    |                     |
    |  handle::message()  |
    |------------------->[_]      [MESSAGE]
    |                    [_]------------------>
    |                    [_]
    |                    [_]
    |                    [_]      [200 OK]
    |    ReplyMessage    [_]<------------------
    |<------------------ [_]
    |                     |
    |                     |
    */

    /* bind on :5080 */
    let sip_bind_url = "sip:*:5080";

    /* send to a SIP contact running in 192.168.0.51 on default port */
    let sip_to_url = "sip:[email protected]:5060";

    /* build params for Nua::create */
    let tags = TagBuilder::default()
        .tag(Tag::NuUrl(sip_bind_url).unwrap())
        .collect();

    /* create NUA stack */
    let mut nua = Nua::create(tags).unwrap();

    /*
    Handling of the events coming from NUA stack is done
    in the callback function that is registered for NUA stack
    */
    nua.callback(
        |nua: &mut Nua,
         event: NuaEvent,
         status: u32,
         phrase: String,
         _handle: Option<&Handle>,
         sip: Sip,
         _tags: Vec<Tag>| {
            println!("({:?}) status: {} | {}", &event, status, &phrase);
            match event {
                NuaEvent::ReplyShutdown => { /* received when NUA stack is about to shutdown */ }
                NuaEvent::IncomingMessage => {
                    /* incoming NEW message */
                    println!("Received MESSAGE: {} {}", status, &phrase);
                    println!("From: {}", sip.from());
                    println!("To: {}", sip.to());
                    println!("Subject: {}", sip.subject());
                    println!("ContentType: {}", sip.content_type());
                    println!("Payload: {:?}", sip.payload().as_utf8_lossy());

                    /* quit after new message */
                    nua.quit();
                }
                NuaEvent::ReplyMessage => {
                    /* quit if response != 200 */
                    if status != 202 {
                        nua.quit();
                    }
                }
                _ => {

                }
            }
        },
    );

    /* Message to be send */
    let my_message = "Hi Sofia-SIP-sys";

    /* build params for Handle::create */
    let tags = TagBuilder::default()
        .tag(Tag::SipTo(sip_to_url).unwrap())
        .tag(Tag::NuUrl(sip_to_url).unwrap())
        .collect();

    /* create operation handle */
    let handle = Handle::create(&nua, tags).unwrap();

    /* build params for handle.message() */
    let tags = TagBuilder::default()
        .tag(Tag::SipSubject("NUA").unwrap())
        .tag(Tag::SipTo(sip_to_url).unwrap())
        .tag(Tag::NuUrl(sip_to_url).unwrap())
        .tag(Tag::SipContentType("text/plain").unwrap())
        .tag(Tag::SipPayloadString(my_message).unwrap())
        .collect();

    /* The message() function enqueue a SIP MESSAGE on NUA STACK */
    handle.message(tags);

    /* enter main loop for processing of messages */
    println!("enter the main loop");
    nua.run();
    println!("the main loop exit");
}

文档

索菲亚-SIP Rust绑定试图尽可能模仿索菲亚-SIP C库的API。您可以首先学习索菲亚SIP用户代理库 - "nua" - 高级用户代理模块的概念。

在此简介之后,请阅读Nua模块的测试

索菲亚-SIP C文档

索菲亚SIP用户代理库 - sofia-sip-ua

常用运行时库

SIP信令

HTTP子系统

SDP处理

其他

致谢

作者

许可证

在静态编译之前,请阅读这篇文档

路线图

  • 版本 0.1.0 -> 已完成

    • NUA:支持发送和接收SIP MESSAGE,允许使用SIP创建聊天。
  • 版本 0.2.0

    • NUA:支持发送SIP INVITE(SDP)/REGISTER(auth)和接收SIP INVITE(SDP),允许创建一个简单的软电话。
    • 其他模块:支持使NUA目标工作。
  • 版本 0.3.0

    • NUA:支持接收SIP REGISTER(auth),允许创建一个简单的SIP PBX。
    • 其他模块:支持使NUA目标工作。
  • 版本 1.0.0

    • NUA:为NUA提供完全绑定。
    • SDP:完全支持SDP解析。

NUA是lib-sofia的高级用户代理模块。要了解更多关于sofia模块的信息,请访问libsofia-sip-ua子模块的参考文档

依赖项