0%

记录一下配置Asterisk踩的坑

1.在国内自建 stun,这个比较简单的,用 coturn 建一个就行了。openwrt 下可以用restund,但是我还没解决动态 ip 怎么更新的问题,所以暂时是在固定 ip 的云主机上用 coturn 搭建。
2.用标准5060端口,实测发现在非标准端口下 linphone 发包的时候没有携带端口号,导致45秒断线,其他客户端暂未发现此问题,推测是 linphone 客户端的问题。非标端口做了 srv 记录也是一样。
3.asterisk 位于路由器后面时,路由器端口映射5060和 rtp 端口。
asterisk 本机 hostname 要改成 sip 域名,并添加 hosts  sip 域名只向本机私网 ip。
在 sip.conf 里面要配置localnet=x.x.x.x/255.255.255.0 ;Zero conf local network,否则会有30秒断线问题。

参考:Asterisk call drop after 30 seconds - Stack Overflow

4.linphone 客户端开启推送通知后 sip Contact 字段包含 token 信息长度超255字节,会被asterisk 丢弃溢出部分,导致接听32秒断线。对于自建 asterisk 需要取消推送通知选项。对于 linphone 官方服务可以开启。

参考:infamous 30 or 33 second call disconnect of incoming calls - linphone · Issue #265 · BelledonneCommunications/linphone-android · GitHub
5.sip.conf 配置(rtp直通、nat穿透、拨打外域部分)

1
2
3
4
5
6
7
8
tlsdontverifyserver=yes  
srvlookup=yes
media_address=ddns.domain.net
externhost=ddns.domain.net
localnet=x.x.x.x/255.255.255.255; asterisk private ip
directmedia=update
directrtpsetup=yes
icesupport=yes

6.安卓自带 sip 客户端 在离开 WiFi 范围网络失效,自动切换到数据,或者反过来切换的时候,不会重新连接sip服务器注册,只有手动切换数据 WiFi 的时候会主动重新注册。

如果 sip 服务器用的是双栈网络,在数据网络用了 ipv6,即使手动切换到 WiFi 也会用 ipv6 进行连接。

如果 WiFi 没有 ipv6 会注册失败。为此我的 sip 服务器只绑定了 ipv4。动态 ip 更换 ip 之后安卓自带 sip 客户端不会重新解析域名,需要手动切一下数据 WiFi 激活注册。

总结一下就是安卓自带 sip 客户端是个半成品,不实用。

7.关于 chan-dongle

openwrt-19.07.8 自带 chan-dongle 版本太旧,可以正常使用不支持长短信。

openwrt-21.02.1 自带 chan-dongle 版本,棒子初始化不正常(mt7620平台,E1750棒子)。

支持长短信、openwrt_sdk 编译通过、棒子初始化正常,所有功能都可以使用的版本。

fix Cannot parse UCS-2 error (#131) · wdoekes/asterisk-chan-dongle@ca9b692 · GitHub

openwrt-19.07 Makefile

1
2
3
4
PKG_SOURCE_VERSION:=ca9b69276738af1d571ec120e103d317701760c2
PKG_SOURCE_DATE=2021-04-19
PKG_RELEASE:=1
PKG_MIRROR_HASH:=skip

8.openwrt-19.07.8 官方编译的 asterisk-16.22.0 有闪退问题(mt7620平台)

使用 sdk 编译回退到 asterisk-16.10 正常

1
src-git telephony [https://git.openwrt.org/feed/telephony.git^edbeb1b9a30153b06cbb8120cdd718e1ac0ba7d2](https://git.openwrt.org/feed/telephony.git%5Eedbeb1b9a30153b06cbb8120cdd718e1ac0ba7d2)