1个不稳定版本
0.1.0 | 2021年7月6日 |
---|---|
0.0.1 |
|
#4 在 #voip
6.5MB
156K SLoC
包含 (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信令
- 索菲亚SIP用户代理库 - "nua" - 高级用户代理模块.
- 索菲亚SIP用户代理库 - "nea" - SIP事件模块.
- 索菲亚SIP用户代理库 - "iptsec" - 认证模块.
- 索菲亚SIP用户代理库 - "nta" - SIP事务模块.
- 索菲亚SIP用户代理库 - "tport" - 传输模块.
- 索菲亚SIP用户代理库 - "sip" - SIP解析模块.
- 索菲亚SIP用户代理库 - "msg" - 消息解析模块.
- 索菲亚SIP用户代理库 - "url" - URL模块.
- 索菲亚SIP用户代理库 - "bnf" - 字符串解析模块.
HTTP子系统
SDP处理
其他
致谢
作者
许可证
- Rust绑定: MIT
- 索菲亚-SIP C库: LGPL-2.1-or-later
在静态编译之前,请阅读这篇文档。
路线图
-
版本 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子模块的参考文档。