rust sip电话(基于tauri 、pjsip库)

本文尝试下rust 的tauri 桌面运用 原因在于体积小

1、pjsip 提供了rust 接口官方的 rust demo 没编译出来 在git找了个sip-phone-rs-master

       https://github.com/Charles-Schleich/sip-phone-rs

可以自己编译下pjsip lib库替换该项目的lib

2、创建一个tauri demo 引用

[dependencies]

tauri = { version = "1", features = ["shell-open"] }

serde = { version = "1", features = ["derive"] }

serde_json = "1"

te-telephony-rs = {path="../../sip-phone-rs-master"}

3.稍微修改下sip-phone-rs项目加了消息回调用到以下

pj_str_t 转CString 找了很久,r

    let c_str =  unsafe { 

        CString::from_vec_unchecked(std::slice::from_raw_parts(ci.state_text .ptr as *const u8, ci.state_text .slen as usize)

        .to_vec())

     };

引用lazy_static   然后做方法消息回调

#[derive(Debug)]

pub struct MyChannel{

    pub sr:mpsc::Sender<String>,

    pub rr:mpsc::Receiver<String>

}

impl MyChannel {

    pub fn new( sr:mpsc::Sender<String>, rr:mpsc::Receiver<String>)->MyChannel{

        MyChannel{ sr,rr  }

    }

}

unsafe  impl Sync for MyChannel {

   

}

lazy_static! { 

    pub static ref GLOBAL_MYCHANNEL: Arc<MyChannel > = {

        let ( sr,rr) = mpsc::channel();

        Arc::new(  MyChannel::new(sr, rr)  )

     };

用法

  GLOBAL_MYCHANNEL.sr.send( format!("reg={}={}",renew,code) );

最后显示到页面

pub fn xunmsg(app: AppHandle<Wry>) {

    let main_window = app.get_window("main").unwrap();

    let main_window_clone = main_window.clone();

    thread::spawn(move  || {

        let cloneChannel= GLOBAL_MYCHANNEL.clone();

        loop{

            let z=cloneChannel.rr.try_recv().unwrap_or_default();

            if z.len()>1{

                println!("get:{:?}",z);

                main_window_clone.emit("msg_callstate", Payload { message: z }).unwrap();

            }

            sleep(Duration::from_secs(1));

        }

    });

}

最后效果7.54M 好小  比包括一个google 内核小的多

sip客户端和freeswitch 需求可到https://item.taobao.com/item.htm?id=653611115230

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值