OpenWRT 通过 3G Modem 加 asterisk 将 GSM 通话转为 SIP - V2EX
klh

OpenWRT 通过 3G Modem 加 asterisk 将 GSM 通话转为 SIP

  •  
  •   klh Dec 31, 2019 7486 views
    This topic created in 2324 days ago, the information mentioned may be changed or developed.

    本文主要实现 OpenWRT 系统通过 Huawei 3G Modem 加 asterisk 套件将 GSM 通话转为 SIP 通话

    安装 openwrt 下的 asterisk16 套件

    opkg update opkg install asterisk16-app-system asterisk16-chan-dongle asterisk16-pjsip asterisk16-codec-ulaw asterisk16-codec-alaw asterisk16-res-rtp-asterisk asterisk16-bridge-simple 

    调整 PJSIP 作为默认服务,并且新增几个 PJSIP 账户,用以测试内线通

    /etc/asterisk/pjsip.conf

    [transport-udp] type=transport protocol=udp ;udp,tcp,tls,ws,wss bind=0.0.0.0 [6003] type=endpoint transport=transport-udp cOntext=from-internal disallow=all allow=ulaw auth=6003-auth aors=6003 [6003-auth] type=auth auth_type=userpass password=6003 username=6003 [6003] type=aor max_cOntacts=1 [6004] type=endpoint transport=transport-udp cOntext=from-internal disallow=all allow=ulaw auth=6004-auth aors=6004 [6004-auth] type=auth auth_type=userpass password=6004 username=6004 [6004] type=aor max_cOntacts=1 

    新增分机拨打模板,

    /etc/asterisk/extension.conf

    [from-internal] exten => _Z.,1,Dial(PJSIP/${EXTEN},60,Trg) same => n,Hangup() 

    用 asterisk 查看分机状态,拨打过程中pjsip show endpoints中显示的状态会从Not in use转换为In use

    asterisk -rvvvv OpenWrt*CLI> pjsip show contacts Contact: <Aor/ContactUri..............................> <Hash....> <Status> <RTT(ms)..> ========================================================================================== Contact: 6001/sip:[email protected]:53117;transport= 378e2db08b NonQual nan Contact: 6001/sip:[email protected]:53117;transport= 378e2db08b NonQual nan Contact: 6003/sip:[email protected]:49989;transport= 2ec100f865 NonQual nan Contact: 6003/sip:[email protected]:49989;transport= 2ec100f865 NonQual nan Contact: 6004/sip:[email protected]:5060 586381001a NonQual nan Contact: 6004/sip:[email protected]:5060 586381001a NonQual nan Objects found: 6 -- PJSIP/6001-00000005 is ringing -- PJSIP/6001-00000005 is ringing > 0x2262b00 -- Strict RTP learning after remote address set to: 192.168.234.127:52518 -- PJSIP/6001-00000005 answered PJSIP/6004-00000004 > 0x2270c60 -- Strict RTP learning after remote address set to: 192.168.104.11:11866 -- Channel PJSIP/6001-00000005 joined 'simple_bridge' basic-bridge <ee120657-8627-4868-b677-cb0d896a2b5a> -- Channel PJSIP/6004-00000004 joined 'simple_bridge' basic-bridge <ee120657-8627-4868-b677-cb0d896a2b5a> > 0x2262b00 -- Strict RTP switching to RTP target address 192.168.234.127:52518 as source > 0x2270c60 -- Strict RTP switching to RTP target address 192.168.104.11:11866 as source OpenWrt*CLI> pjsip show endpoints Endpoint: <Endpoint/CID.....................................> <State.....> <Channels.> I/OAuth: <AuthId/UserName...........................................................> Aor: <Aor...........................................> <MaxContact> Contact: <Aor/ContactUri..........................> <Hash....> <Status> <RTT(ms)..> Transport: <TransportId........> <Type> <cos> <tos> <BindAddress..................> Identify: <Identify/Endpoint.........................................................> Match: <criteria.........................> Channel: <ChannelId......................................> <State.....> <Time.....> Exten: <DialedExten...........> CLCID: <ConnectedLineCID.......> ========================================================================================== Endpoint: 6001 In use 1 of inf InAuth: 6001-auth/6001 Aor: 6001 1 Contact: 6001/sip:[email protected]:53117;transp 378e2db08b NonQual nan Transport: transport-udp udp 0 0 0.0.0.0:5060 Channel: PJSIP/6001-00000005/AppDial Up 00:00:04 Exten: CLCID: "6004" <6004> Endpoint: 6002 Unavailable 0 of inf InAuth: 6002-auth/6002 Aor: 6002 1 Transport: transport-udp udp 0 0 0.0.0.0:5060 Endpoint: 6003 Not in use 0 of inf InAuth: 6003-auth/6003 Aor: 6003 1 Contact: 6003/sip:[email protected]:49989;transp 2ec100f865 NonQual nan Transport: transport-udp udp 0 0 0.0.0.0:5060 Endpoint: 6004 In use 1 of inf InAuth: 6004-auth/6004 Aor: 6004 1 Contact: 6004/sip:[email protected]:5060 586381001a NonQual nan Transport: transport-udp udp 0 0 0.0.0.0:5060 Channel: PJSIP/6004-00000004/Dial Up 00:00:04 Exten: 6001 CLCID: "" <6001> Objects found: 4 > 0x2270c60 -- Strict RTP learning complete - Locking on source address 192.168.104.11:11866 > 0x2262b00 -- Strict RTP learning complete - Locking on source address 192.168.234.127:52518 

    有条件的情况下建议可以考虑使用 IAX 分机替代 SIP 分机,这样只需要 NAT 打通一个 UDP 端口就能通话,而不用像 SIP 那样要考虑 ALG,ICE,STUN 等方案

    下面是新增一个 IAX 分机的用例

    opkg update opkg install asterisk16-chan-iax2 

    /etc/asterisk/iax.conf

    [general] bindport=4569 bindaddr=0.0.0.0 iaxcompat=yes nochecksums=yes disallow=all allow=ulaw [6010] type=friend username=6010 secret=6010 cOntext=from-internal host=dynamic callerid=6010<6010> 

    /etc/asterisk/extensions.conf

    [from-internal] exten => 6010,1,Dial(IAX2/6010,60,Trg) 

    由于 3G modem 还没到货,所以目前先更新到这里,等到货后继续配置。

    12 月 27 号收货,继续更,用到的型号是 Huawei K3765.

    K3765 3G modem 1

    K3765 3G modem 2 K3765 3G modem

    在 openwrt 下配置 dongle 设备,请结合实际数据配置

    /etc/asterisk/dongle.conf

    [general] interval=20 [defaults] cOntext=dongle-in group=0 exten=+862022221234 [dongle0] imei=123451234512345 

    通过 asterisk 控制台查一下设备状态,

    asterisk -rvvvv RiWifi*CLI> dongle show devices ID Group State RSSI Mode Submode Provider Name Model Firmware IMEI IMSI Number dongle0 0 Free 16 3 3 FFFFFFFFFFFFFF K3765 11.126.03.04.521 123451234512345 123451234512345 Unknown 

    接下来新增呼出、呼入的分机配置

    /etc/asterisk/extensions.conf

    [from-internal] exten => _1.,1,Dial(Dongle/g0/${EXTEN:1}) ;呼出设置,结合实际,我这边是加了"1"这个前缀,例如我的 SIP 分机要拨打 10011,那么拨号就是 110011 [dongle-in] exten => +862022221234,1,Dial(IAX2/6010,60,Trg) ;呼入设置,我这边就是配置成所有呼叫直接转到 IAX-6010 分机,复杂点的可以做 IVR,号码本,不过只有一路的电话就不需要搞这么复杂了。 

    最后,拨号测试

    呼入测试

    呼入测试 1

    呼入测试 2

    呼出测试

    呼出测试 1

    呼出测试 2

    refer: https://www.ppuu.org/2019/12/openwrt-asterisk-dongle-gsm-to-sip/

    32 replies    2021-07-26 20:46:09 +08:00
    Archeb
        1
    Archeb  
       Dec 31, 2019 via Android   1
    好复杂,对我来说转发个短信就够了

    不过感谢楼主分享精神
    tallest
        2
    tallest  
       Dec 31, 2019   1
    看着好像很好玩儿的样子!!
    privil
        3
    privil  
       Dec 31, 2019   1
    优秀!好厉害,之前找过类似的方案
    klh
        4
    klh  
    OP
       Dec 31, 2019
    @privil #3 多谢,写的比较简约
    MidLinn
        5
    MidLinn  
    PRO
       Dec 31, 2019   1
    大佬!真会折腾,佩服一下。
    klh
        6
    klh  
    OP
       Dec 31, 2019
    @MidLinn #5 哈哈,主要还是因为我这边有张联通固话 SIM 卡,出了所在地就会没有信号了,所以才会想起用这个去解决
    cyang
        7
    cyang  
    PRO
       Dec 31, 2019   1
    优秀!
    tallest
        8
    tallest  
       Dec 31, 2019
    话说,大佬,这玩意儿手机卡能不能玩儿啊?
    拨号用的啥拨号诶?系统自带的拨号盘可以嘛?
    LiYanHong
        9
    LiYanHong  
       Dec 31, 2019
    之前也想这样,出国把卡放家里,还能通过网络用卡,但没找到现成方案,只好用了双享号。
    想问下是虽然是 3g dongle,但是用的 gsm 网络?是否有短信方案,这样就完美了。
    klh
        10
    klh  
    OP
       Dec 31, 2019
    @LiYanHong #9 用的是 GSM 网络,处理短信的话在 extensions.conf 上面加处理指令就行
    下面单纯举个例子,还没测试可用性
    [dongle-in-sms]
    exten => sms,1,Noop(Incoming SMS from ${CALLERID(num)} ${BASE64_DECODE(${SMS_BASE64})})
    exten => sms,n,System(smstodingtalk '${CALLERID(num)}: ${BASE64_DECODE(${SMS_BASE64})} ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DONGLENAME} -
    ${CALLERID(num)}: ${BASE64_DECODE(${SMS_BASE64})}' >> /var/log/asterisk/sms.txt) ;调用 smstodingtalk 脚本处理短信内容
    exten => sms,n,Hangup()

    [dongle-in-ussd]
    exten => ussd,1,Noop(Incoming USSD: ${BASE64_DECODE(${USSD_BASE64})})
    exten => ussd,n,System(smstodingtalk '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DONGLENAME}: ${BASE64_DECODE(${USSD_BASE64})}')
    exten => ussd,n,Hangup()
    klh
        11
    klh  
    OP
       Dec 31, 2019
    @tallest #8 移动、联通手机卡可以的,符合制式就行,拨号我用的是支持 IAX 的 zoiper
    LiYanHong
        12
    LiYanHong  
       Dec 31, 2019
    我觉得把功能整合下,加个 webui,需求应该很大,国外党的福音。
    klh
        13
    klh  
    OP
       Dec 31, 2019
    @LiYanHong #12 如果用 WebUI 建议直接买个树莓派刷 RasPBX 就行啦,一般 OpenWRT 性能带不动这么大的 WebUI
    NSAgold
        14
    NSAgold  
       Dec 31, 2019 via Android
    近期不是说 2g 准备退网了么...这类 modem 现在应该没有支持 VoLTE 的吧
    ericFork
        15
    ericFork  
       Dec 31, 2019
    类似方案折腾过一整轮了,我来问个角度奇怪的问题,楼主的联通固话 SIM 是哪里办的?现在还能办吗?
    klh
        16
    klh  
    OP
       Dec 31, 2019
    @ericFork #15 现在好像比较难找了
    ericFork
        17
    ericFork  
       Dec 31, 2019
    @hiplon #16 你当年是在营业厅办的么?
    ziseyinzi
        18
    ziseyinzi  
       Dec 31, 2019 via Android
    联通要推 2G 了,有没有 VoHSPA 的方案
    isyu
        19
    isyu  
       Jan 1, 2020 via Android
    还有类似 iax 这样的语音标准,是易于通过 nat 的吗? SIP 和 h323 之类的,在 nat 环境下都有不少问题。
    klh
        20
    klh  
    OP
       Jan 1, 2020
    @isyu #19 应该没有了,毕竟 SIP 是事实上的行业标准,IAX 其实也很少会用于 UE 终端上面,平时更多的是做 trunk 用
    fengjueming
        21
    fengjueming  
       Jan 1, 2020
    自己的解决方案是 Raspbx+dongle,频段对得上的话是能走 WCDMA 的。
    关于 VoLTE,现在能直接买到的大厂的 USB Dongle 不支持语音,虽然可以买 Modem 自己魔改,但成本太高了。偷懒一点的办法就是找个支持 VoLTE 的手机,用 chan_mobile 走蓝牙。
    端口穿透的话我用的 WireGuard 接到服务器上转发的。
    ihipop
        22
    ihipop  
       Jan 5, 2020 via Android
    @fengjueming 联通电信都要退 2G 网了,尤其电信强推 VoLte 了,就没有办法了只能走蓝牙?
    fengjueming
        23
    fengjueming  
       Jan 8, 2020
    @ihipop 这款应该是支持 WCDMA 的,至少短时间内联通问题不大,长期来看真的只能走蓝牙(或者魔改一下 LTE 模块)
    klh
        24
    klh  
    OP
       Jan 8, 2020
    @fengjueming #23 测试过是支持 WCDMA 的,在 PC 端或者 usb_switchmode 修改一下制式就行,不过我这张固话卡只支持 GSM
    ihipop
        25
    ihipop  
       Jan 8, 2020 via Android
    @fengjueming 站内有相关帖子说有个别地方联通在逐步关闭 3G 语音通话了。。
    JingKeWu
        26
    JingKeWu  
       Jan 10, 2020
    有没有支持 4g 的网关
    qfdk
        27
    qfdk  
    PRO
       Jan 13, 2020 via iPhone
    最近研究发短信的方案 现在买了个 SIM800C, 打算写个 api 来调用, 不知道老哥有没有现成的方案? 就是模拟个短信发订单信息, 第三方的简直太贵了
    klh
        28
    klh  
    OP
       Jan 14, 2020
    @qfdk #27 如果 asterisk 能支持该模块用 asterisk 发短信很简单,类似 asterisk -rx 'gsm send sms 3 1357080XXXX "hello, this is openvox gsm card"'就行;
    如果 asterisk 不直接支持可能要看一下用 AT 指令去发。
    skydrive
        29
    skydrive  
       Jun 20, 2020
    @hiplon 大佬,按你的教程安装、配置了 asterisk,用的也是华为的 K3765,但是接收短信时报错了:

    WARNING[4523]: at_response.c:1311 at_response_cmgr: [dongle0] Error parsing incoming message: Cannot parse UCS-2

    不知道你有没有碰到过这样的问题

    dongle show devices
    ID Group State RSSI Mode Submode Provider Name Model Firmware IMEI IMSI Number
    dongle0 0 Free 24 3 3 CHINA MOBILE K3765 11.126.03.09.00 xxxxxxxxxx xxxxxxxx Unknown

    dongle show device state dongle0
    -------------- Status -------------
    Device : dongle0
    State : Free
    Audio : /dev/ttyUSB1
    Data : /dev/ttyUSB2
    Voice : Yes
    SMS : Yes
    Manufacturer : huawei
    Model : K3765
    Firmware : 11.126.03.09.00
    IMEI : xxxxxxxxxxxx
    IMSI : xxxxxxxxxxxxx
    GSM Registration Status : Registered, roaming
    RSSI : 24, -65 dBm
    Mode : GSM/GPRS
    Submode : EDGE
    Provider Name : CHINA MOBILE
    Location area code : 2400A5
    Cell ID : 104C
    Subscriber Number : Unknown
    SMS Service Center : +86138xxxxxxxx
    Use UCS-2 encoding : No
    Tasks in queue : 0
    Commands in queue : 0
    Call Waiting : Disabled
    Current device state : start
    Desired device state : start
    When change state : now
    Calls/Channels : 0
    Active : 0
    Held : 0
    Dialing : 0
    Alerting : 0
    Incoming : 0
    Waiting : 0
    Releasing : 0
    skydrive
        30
    skydrive  
       Jun 20, 2020
    忽略上一条吧... 通过降级 asterisk16-chan-dongle 解决了,最新版的有 bug...
    acbot
        31
    acbot  
       Jul 26, 2021
    openwrt-asterisk-dongle-gsm-to-sip 这个咋我不能打开
    klh
        32
    klh  
    OP
       Jul 26, 2021
    About     Help     Advertise     Blog     API     FAQ     Solana     3536 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 83ms UTC 11:59 PVG 19:59 LAX 04:59 JFK 07:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86