BitVoice 手册
目录
- 部分 1. 开始使用
- 部分 2. 呼叫去向
- 部分 3. 日常呼叫
- 部分 4. 客户和洞察
- 部分 5. 运行 BitVoice
- 57. 管理员
- 58. 单点登录
- 59. 公司目录(Active Directory 和 LDAP)
- 60. 安全
- 61. 更改、备份和导入
- 62. 更新
- 63. 多个服务器作为一个电话系统
- 64. 数据存储位置(SQLite或PostgreSQL)
- 65. 托管其他组织
- 66. 编解码器和声音
- 67. Microsoft Teams(直接路由)
- 68. 导入
- 69. 配置即代码
- 70. Asterisk 兼容性(AMI、ARI 和 AGI)
- 71. AI 助手(MCP)
- 72. 存档
- 73. 法律保留
- 74. 指标:Prometheus、OpenTelemetry、Grafana、SNMP和通话记录
- 75. 呼叫生成器
- 76. SIP 跟踪
- 部分 6. 公共安全:实验室轨道
开始使用
从新安装到工作电话系统:分机、电话、电话公司、呼叫去向、办公室的紧急呼叫以及如何判断一切是否就绪。
开始使用
/BitVoice 是一个完整的电话系统,包含一个程序:电话注册的交换机,呼叫者移动的菜单和队列,语音邮件,录音,会议室,传真和电话公司的连接。所有内容都在浏览器中设置,在本手册中描述的屏幕上。没有要编辑的配置文件,也没有其他要安装的内容。
您需要
- 计算机:一个小型办公服务器,虚拟机,云实例,或者用于初步查看的笔记本电脑。Linux,macOS 和 Windows 都可以工作。Raspberry Pi 4 可以运行一个小型办公室。
- 电话:Yealink,Poly,Grandstream 或 Snom 的桌面电话可以自动设置;任何其他 SIP 电话或软电话都可以使用其自己的设置;每个浏览器也是一个电话。
- 中继(电话公司的帐户)用于呼叫外部号码和被呼叫。您可以在没有它的情况下开始:分机可以相互呼叫和回声测试。
第一次启动
启动 BitVoice 并打开它打印的地址(在桌面上它会打开浏览器本身)。Web 界面是 HTTPS 只,在此计算机上也是如此。直到您安装自己的证书(设置,证书),BitVoice 使用它自己创建的证书,因此浏览器会警告一次:选择继续到站点。设置向导 会询问四件事:组织的名称和国家,第一个管理员的密码,第一个分机和您的电话公司(如果您有)。国家设置紧急号码,呼叫者听到的音调和电话号码的书写方式。
第一个小时
- 分机:每人或每个桌子一个。每个分机都有一个号码和 SIP 密码。打开分机 (章节 3)
- 电话:将桌面电话,软电话或浏览器电话连接到每个分机。打开电话 (章节 4)
- 中继:您的电话公司帐户,因此您可以呼叫外部号码和被呼叫。打开中继 (章节 7)
- 呼叫路由:外部呼叫的去向(一个人,一个环组,一个菜单),以及外部呼叫使用的中继。打开呼叫路由 (章节 8)
- 健康 告诉您什么仍然缺失,紧急呼叫首先。打开健康 (章节 13)
然后进行测试呼叫:从任何电话拨打 *43,回声测试。您会听到自己回来的声音,这证明声音双向工作。
一条命令安装
curl -fsSL https://raw.githubusercontent.com/BioDream-LLC/bitvoice/main/deploy/install.sh | sh
在 Windows 上,使用 PowerShell:
irm https://raw.githubusercontent.com/BioDream-LLC/bitvoice/main/deploy/install.ps1 | iex
它下载计算机的最新版本,检查其SHA-256校验和和BioDream的发布签名(使用OpenSSL 3,或者使用OpenSSH的ssh-keygen,Windows 10和11,macOS和Ubuntu 20.04都有;ssh-keygen从v0.1.14开始检查版本),并将其安装为一个自启动的服务:
- Linux:
/usr/local/bin/bitvoice,一个bitvoice系统用户,数据存储在/var/lib/bitvoice,systemd服务bitvoice,Web界面在端口443上。当ufw或firewalld启用时,它会打开443、SIP(5060、5061)和呼叫的音频端口(10000到20000 UDP)。它打印要打开的地址和向导从另一台计算机请求的设置代码。 - macOS: BitVoice 在您的应用程序文件夹中(
~/Applications/BitVoice.app),当您登录时启动,Web界面在端口8443上,数据存储在~/Library/Application Support/BitVoice(仅对您开放)和日志存储在~/Library/Logs/BitVoice(bitvoice.log,保持在10 MB以下)。从Launchpad或Spotlight打开BitVoice以访问Web界面;当它停止时,这将再次启动它。它在caffeinate下运行,因此Mac不会在BitVoice运行时进入睡眠状态:处于睡眠状态的Mac不会接听呼叫,甚至其短暂的维护睡眠也会停止一切几秒钟。屏幕可能仍然会关闭。手动运行,使用caffeinate -i -s ./bitvoice以获得相同的效果。对于一台在无人登录时仍能接听呼叫的Mac,使用sudo安装(curl -fsSL https://raw.githubusercontent.com/BioDream-LLC/bitvoice/main/deploy/install.sh | sudo sh):然后BitVoice位于/Applications,在Mac启动时启动,作为自己的隐藏用户(_bitvoice)运行,提供Web界面在端口443上,数据存储在/Library/Application Support/BitVoice,日志存储在/Library/Logs/BitVoice,Mac的防火墙(如果启用)允许它接受连接。每台Mac只能有一种安装方式:安装程序在检测到另一台Mac时将拒绝安装。当Mac的防火墙启用时,为您安装的BitVoice将询问是否允许接受传入连接:允许它,以便电话可以连接。如果某个程序已经使用了该端口,安装程序将命名它并停止(使用BITVOICE_HTTPS=:8444选择另一个)。sh install.sh --uninstall(使用sudo对Mac的自身)将其删除并保留数据;--purge删除数据和日志。已在macOS 26(Apple芯片)上尝试安装为单个用户:安装,使用Mac自身的ssh-keygen检查签名,相同数据的第二次启动被拒绝,在程序被杀死后返回,从应用程序再次启动,原地升级,篡改的程序被拒绝,使用的端口被拒绝,卸载保留数据,重新安装在其上,并清除所有内容。对于整个Mac的安装(sudo),每次在GitHub的macOS机器(Apple芯片)上的更改都尝试过:作为_bitvoice在端口443上运行,用户安装拒绝在其旁边,程序被杀死后返回,升级,清除所有内容(包括隐藏用户)。尚未尝试Intel Mac。 - Windows: 作为管理员,
C:\Program Files\BitVoice,在Windows启动时启动,数据存储在C:\ProgramData\BitVoice,并为私有和域网络设置防火墙规则;否则,仅为您启动,当您登录时启动。它在Windows PowerShell 5.1(Windows Server具有)和PowerShell 7中工作,并在5.1从内部启动7。在5.1中启动。BitVoice将其日志写入数据文件夹中的bitvoice.log(保持在10 MB以下,较旧部分在bitvoice.log.1),并安装程序打印向导从另一台计算机请求的设置代码。Windows将新Wi-Fi或网络称为Public,直到被告知否则,并且防火墙规则不允许任何内容进入:对于家庭或办公室网络,安装程序说明如何使其成为Private(设置,网络和Internet,网络的属性);对于云服务器,它打印要添加的规则(在提供商的防火墙中也打开端口)。作为管理员安装,数据文件夹仅对管理员可读(它包含数据库和密钥),并且Start菜单的BitVoice打开Web界面;为您安装,Start菜单启动BitVoice,或在它已经运行时打开它。不论哪种方式,它都在设置,应用程序,已安装的应用程序中,可以删除它并询问是否也删除其数据。已在Windows 11(作为管理员和非管理员)和Amazon EC2上的Windows Server 2022上尝试:安装,外部访问,重启后再次运行。 - 尝试在: Ubuntu 24.04和20.04,Debian 12和Fedora 42(每个都使用systemd):安装,签名检查,相同数据的第二次启动被拒绝,在程序被杀死后返回,原地升级,篡改的程序被拒绝,卸载保留数据,重新安装在其上,并清除所有内容。
- 云服务器上的Linux: 它打印的地址是机器自己的私有地址;安装程序指出这一点。通过其公共地址或名称打开服务器,端口443、SIP和音频端口在提供商的防火墙中打开。
再次运行相同的命令以升级(或使用更新 (章节 62))。 sh -s -- --version v0.1.5(管道后)选择一个版本; --uninstall 删除程序和服务并保留数据, --purge 删除数据。 在Windows上,保存脚本并运行 .\install.ps1 -Version v0.1.5, -Uninstall 或 -Purge,或在已安装的应用程序中删除它。对于一个不连接到Internet的服务器,复制版本的存档和 SHA256SUMS 到一个文件夹,并设置 BITVOICE_FROM 为它。
在哪里运行
BitVoice 运行在 Linux、macOS 和 Windows 上。
| 系统 | 如何启动 | 数据位置 |
|---|---|---|
| Linux | ./bitvoice(或版本中的 systemd 服务) | ~/.config/BitVoice |
| macOS | ./bitvoice | ~/Library/Application Support/BitVoice |
| Windows | 双击 bitvoice.exe | %APPDATA%\BitVoice |
在 Windows 上,请保持打开的窗口以使用 BitVoice(关闭它将停止 BitVoice),当 Windows询问是否可以使用网络时,允许私有网络以便电话可以连接。 -data 将数据放在其他地方;-https 和 -sip 选择地址和端口;-log FILE 也将所有打印的内容写入文件,适用于没有人监视其窗口的计算机。
使用的端口
| 端口 | 用途 |
|---|---|
| 5060 UDP 和 TCP | SIP:电话和中继 |
| 5061 TCP | SIP over TLS(加密信令) |
| 4569 UDP | IAX2 中继,只有在设置后 |
| 1720 TCP | H.323 中继,只有在设置后 |
| 2000 TCP | Skinny(SCCP)电话,只有在开启时 |
| 2727 UDP | MGCP 网关,只有在开启时 |
| 10000–20000 UDP | 通话声音(RTP),在设置中配置 |
| 8443 TCP | 本 web 界面,仅 HTTPS(对其的普通 HTTP 请求将被转发到 HTTPS) |
如果另一个电话系统已经占用 5060,BitVoice 将使用下一个可用的端口,健康状态将显示这一点。
web 界面的所有内容
每个设置都有一个屏幕,每个屏幕都有一个章节。没有任何配置文件、命令行或第二个工具的需求。对于自动化,相同的屏幕是 REST API,配置可以遵循 Git 中的文件 (配置即代码 (章节 69)),但这两者都不是必须的。
BitVoice 的用途
BitVoice 首先是一个办公室和联系中心的电话系统,也是一个托管电话服务提供商:本手册的前五个部分的所有内容。 911 接听点配置文件、无线电调度控制台和 NG911 核心服务是一个单独的 实验室和设计合作伙伴轨道 (公共安全 (章节 77)):它们在设置中开启之前不在菜单中,并且不适用于实时使用。您自己的电话的紧急呼叫不属于该轨道;它们在每个电话系统的第一次启动时都可以工作。
查找你的位置
- 在任何地方按 ⌘K (Ctrl+K) 跳转到一个屏幕,或者输入一个分机的名称或号码来打开它。
- 在电话上,菜单位于左上角的 ☰ 按钮后面(以及右上角的搜索功能);选择一个页面将再次关闭它。
- 每个屏幕在右上角都有一个 帮助 链接,打开本手册的相关章节。
- 更改 保留配置的每个版本:您可以查看更改内容并撤消它。
- 三个主题(午夜、暗黑和浅色)位于菜单底部。
每个部分的成熟度
每个部分被证明的程度,简单明了。 现场测试:在真实系统、真实网络(Amazon EC2、互联网、真实服务提供商的服务)上运行。 与参考检查:与独立实现或标准自身数据进行测试。 软件测试:BitVoice 自身的测试和浏览器测试,尚未使用真实设备或帐户。 实验室:公共安全部分,尚未获得认证。
| 区域 | 成熟度 | 依赖 |
|---|---|---|
| SIP 中继:注册、呼入呼出、来电显示、忙、按键(RFC 4733) | 现场测试 | 商用运营商、SIP.US(演示账户,从 EC2):注册和呼出到公共电话网络,通过 UDP 和 TLS,验证运营商证书;MOS 4.39,无丢包。从公共电话网络呼入:T38Fax(传真呼叫到其号码,通过 UDP 注册)。Asterisk 作为运营商,跨互联网在 EC2;MOS 4.4。Kamailio 5.7(通过 TLS 注册,使用摘要签名,双向呼叫,按键)和 FreeSWITCH 1.11(TLS 和 SRTP,双向呼叫,G.722 到 G.711)作为远端;MOS 4.39 |
| 桌面电话通过 SIP | 现场测试 | Asterisk 作为桌面电话,跨互联网。尚未尝试真实的 Yealink、Poly 或 Grandstream 手持电话 |
| 浏览器电话(WebRTC) | 现场测试 | 从外部到 EC2;Chromium 浏览器测试,双向音频 |
| 两台服务器,一台 PostgreSQL,故障转移 | 现场测试 | 在 EC2 上杀死进程和计划停止:呼叫继续,提供者线路移动 |
| 一键安装 | 现场测试 | Ubuntu 24.04(x86,Arm),Debian 12,Amazon Linux 2023,Windows Server 2022,Windows 11(作为管理员和非管理员,在 PowerShell 5.1 和 7 中),Ubuntu 20.04 和 Fedora 42 在容器中,macOS 26 在 Apple Silicon(用于一个人,并在 CI 中使用 sudo 的整个 Mac);重启后恢复 |
| 容量 | 现场测试 | 同时 2,000 个呼叫,无丢包,MOS 4.41,在 16-vCPU c7i.4xlarge(约 10 个 vCPU 忙)上;在 c7g.large、c7i.large、t4g.small、M4 和 Lightsail nano 上同时 200 个呼叫。在 2,000 个呼叫时:95% 的呼叫的抖动为 4.0 ms,包之间的最大间隔为 74 ms,垃圾回收暂停的最大时间为 4.2 ms |
| FreePBX 迁移(导入) | 现场测试 | 真实的 FreePBX 17.0.33 备份(70 MB)导入全部;其他从 FreePBX 自身格式 |
| AI 转录、摘要、接待员 | 现场测试 | 通过 OpenRouter 的真实模型 |
| 无语言模型的事实和摘要 | 软件测试 | 只有虚构的 911 呼叫:43 个事实中的 23 个(53%)在密封集上,3 个事实无人预期;41/41 训练,保持 27/40 冷。从未在真实呼叫中测量。 |
| 服务器上的语音转文本(whisper) | 在 macOS 和 Linux 上现场测试 | whisper-server 1.9.5 由 BitVoice 运行:在 Mac 上,在 Ubuntu 的 EC2(x86-64)上,后者在电话应用的现场测试中写入了实时呼叫和语音邮件转录;为每个平台构建并在 CI 中尝试的下载 |
| 存档到 S3,AWS Secrets Manager 中的密钥 | 现场测试 | 真实的 AWS,我们自己的 SigV4 |
| SNMP 监控和陷阱 | 现场测试 | net-snmp 的 snmpwalk 和 snmptrapd |
| Let's Encrypt | 现场测试 | 发行和续期公共演示的证书 |
| 机器镜像(AWS)和代码配置 | 现场测试 | 通过 deploy/cloud/build-images.sh 从 Ubuntu 24.04 构建的 EC2 镜像:每个服务器从中启动;deploy/terraform,使用 OpenTofu 1.13(创建、更改、无漂移、销毁)。尚未尝试 Azure 镜像 |
| IAX2 中继 | 与参考检查 | Asterisk 23 |
| 完整的 ICE 在 NAT 后面(STUN 和 TURN 客户端) | 与参考检查 | Chromium 的 ICE 代理(主机候选人和中继),JsSIP 软电话与 BitVoice 提供的 TURN 服务器作为中继,mDNS 主机名称解析。尚未在服务器后面尝试真实的 NAT 路由器 |
| ICE 重启(电话在呼叫中间更改网络) | 与参考检查 | Chromium 在浏览器电话呼叫中重启 ICE(BitVoice 作为 ICE-lite 和完整代理),SIP.js 0.21 通过 SIP sobre WebSocket 重启:双向新凭证,新候选对,重启期间每半秒音频。尚未在真实移动网络中尝试 |
| SIP History-Info 和 Diversion(转发呼叫) | 与参考检查 | Asterisk 20 的 PJSIP 双向:其转发呼叫由 BitVoice 读取,BitVoice 的转发由 Asterisk 的 REDIRECTING() 从 History-Info 和 Diversion 读取;RFC 7044 条目在转发上保留和扩展。尚未与运营商或 Teams 尝试 |
| 公司目录(LDAP,Active Directory) | 与参考检查 | OpenLDAP 2.4(StartTLS 和 LDAPS,1203 人通过分页读取,组,登录),Samba 4 的 Active Directory(LDAPS,分页,禁用账户排除,嵌套组用于环组和角色)。尚未尝试 Microsoft 自己的 Windows Server 域控制器 |
| ARI(Asterisk REST 接口) | 与参考检查 | 每个操作的 Asterisk 发布的 ARI 被调用,并检查其答案与模型的必需字段;ari-client 2.2.0,Asterisk 的 JavaScript 库,读取 /ari/api-docs,运行应用 |
| 每个人的视频会议室(SFU,模拟播)和屏幕共享 | 与参考检查 | 三个 Chromium 浏览器在一个房间,每个发送三个大小(VP8 模拟播),接收其他两个;大小在关键帧处切换,作为图块增长和缩小。摄像头和共享屏幕(Chromium 自身的屏幕捕获)在 H.264 房间中。尚未在 Firefox 或 Safari 中尝试,或者超过三个摄像头;H.264 模拟播仅按照浏览器的顺序选择层。 |
| AGI 和 FastAGI(Asterisk 网关接口) | 与参考检查 | 每个命令的答案与 Asterisk 20.6 的 FastAGI 进行比较;使用 pyst2 编写的 FastAGI 服务器运行呼叫;EAGI 音频到程序。尚未在生产 IVR 中尝试 |
| AI 助手通过 MCP | 与参考检查 | 官方 MCP TypeScript SDK(1.32.2)作为客户端:工具列出并使用 API 令牌通过 Streamable HTTP(协议 2025-11-25)调用,并使用 OAuth 登录端到端(发现、注册、PKCE、令牌、刷新);同意页面在 Chromium 中;stdio 桥接到测试服务器。尚未在 Claude、ChatGPT 或其他助手本身中尝试,需要一个具有可信证书的互联网可达服务器。 |
| Microsoft 365 和 Google Workspace(联系人和日历) | 软件测试 | 对 Microsoft Graph(用户、组织联系人、日历 getSchedule、客户端凭据令牌)和 Google 的 People API、Calendar freeBusy 和 JWT-bearer 令牌的模拟进行测试,模拟从其发布的参考中构建;模拟检查 BitVoice 发送的内容(JWT 的签名和声明、分页、请求正文)。尚未在真实的 Microsoft 365 租户或 Google Workspace 域中尝试。 |
| 14 种语言的屏幕 | 软件测试 | 屏幕显示的每个文本(约 5,000,从代码:JSX 文本、字符串和服务器消息)由 Llama 3.3 70B 机器翻译成 13 种语言,99% 保留检查(相同的占位符、地址和代码不变);浏览器测试中绘制了德语(登录、菜单、搜索、表单、返回英语)。尚未由人工在任何语言中审查。 |
| H.323 中继 | 与参考检查 | H323Plus 1.28(其 simph323 播放和记录 WAV 文件)在 EC2:双向呼叫,使用 Fast Connect 和 G.711,每端听到对方的音调,MOS 4.39;呼叫设置也使用 Asterisk 的 chan_ooh323(其自身的声音在 Asterisk 22 中损坏) |
| SIP sobre WebSocket | 与参考检查 | JsSIP 和 SIP.js |
| 编解码器:GSM、G.726、iLBC、MP3 持续音乐 | 与参考检查 | ffmpeg、RFC 3951 参考程序和 minimp3,样本对样本 |
| 编解码器:G.711、G.722、G.729、Opus、Speex | 与参考检查 | G.711 和 G.722 字节对字节和样本对样本与 spandsp;G.729 的解码器在 ITU 的所有七个附录 A 测试向量上样本对样本(bcg729 不是),其编码器与 bcg729 在相同质量下互操作(G.729 不需要编码器匹配);Opus 包解码为 libopus 1.6.1,libopus 的包解码为 libopus;Speex 包和声音与 libspeex 1.2.1 相同;Opus 呼叫与 Android 应用 |
| 编解码器:AMR-NB、AMR-WB | 与参考检查,存在已知差距 | AMR-WB 解码与 opencore-amr 样本对样本,并在 3GPP 的 TS 26.174 测试序列上与 3GPP 的解码器完全匹配,共 167 个和 198 个;AMR-NB 编码器与 opencore-amr 的帧对帧,但其解码器接近但不完全匹配(约 31 dB 离 opencore)。两者来自固定 goamr 库 |
| 未改变的编解码器:G.722.1(Siren 7)、G.722.1C(Siren 14)、G.719、Codec2 | 软件测试 | 自己的测试:提供带有比特率或模式,回答,双向字节对字节包;不转换(没有免费的参考代码 BitVoice 可以提供用于 G.722.1 和 G.719)。尚未在真实的 Polycom 或会议系统中尝试 |
| ISDN PRI 和 BRI、T1/E1 | 与参考检查 | libpri(Asterisk 的),双方;以及在 EC2 通过真正的 DAHDI 3.4 内核驱动程序(两个跨内核连接的 span,Asterisk 20 的 chan_dahdi 作为电话公司):带有号码和名称的双向呼叫,所有 23 个通道同时,MOS 4.39。尚未尝试物理卡或线 |
| MFC-R2、E&M | 与参考检查 | OpenR2;MF 音调通过自己的测试。尚未尝试真实卡或线 |
| SS7(ISUP、MTP、链接集) | 与参考检查 | libss7(Asterisk 的 chan_dahdi 库),ITU 和 ANSI。尚未尝试真实的运营商链接 |
| 传真(T.30、T.38) | 现场测试 | 传真运营商,T38Fax(免费试用,从 EC2):BitVoice 通过公共电话网络发送传真到其自己的号码并接收传真,双方通过 T.38(2 页,14,400 位/s,页完整到达);注册使用用户名和密码,并通过 Asterisk 的 spandsp(模拟网关)在 EC2 上接收和发送传真,带有错误纠正。尚未尝试硬件传真网关 |
| 配置:Yealink、Poly、Grandstream、Snom、Fanvil、Cisco、Mitel、Sangoma、Algo、CyberData | 软件测试 | 厂商的文档格式;尚未在真实手持电话上尝试 |
| Skinny(SCCP)电话,MGCP 网关 | 与参考检查 | Skinny:来自开源 mwicat/sccp 库的电话,每个消息由 Wireshark 的解析器读取,大小与 Asterisk 的 chan_skinny 相同;MGCP:Yate 的 MGCP 网关(重启、临时答案、确认;它没有模拟端口,因此没有呼叫)。尚未尝试 Cisco 电话或网关硬件 |
| Microsoft Teams 直接路由 | 软件测试 | 对模拟 Microsoft 代理的模拟,按照 Microsoft 发布的直接路由 SIP 规则(OPTIONS、Contact、user=phone、客户端证书、Teams 通过 REFER 请求的转移)进行测试;尚未尝试 Teams 租户:Microsoft 不提供免费的 Teams Phone 许可 |
| 酒店(FIAS) | 与参考检查 | 每个 BitVoice 发送的记录都与 Oracle 发布的 FIAS 2.20.23 规范进行了检查(链接开始、链接记录、帖子、唤醒答案);自己的测试。尚未在 Opera 本身中尝试 |
| 文本、WhatsApp、Messenger、网页聊天 | 与参考检查(Twilio、Telnyx、Bandwidth、Vonage、TextMagic、WhatsApp) | 通过 Twilio、Telnyx、Bandwidth、Vonage 和 TextMagic 发送文本,并通过 WhatsApp 发送文本、模板和模板列表,使用 Stoplight Prism 构建的提供商自己的 OpenAPI 规范(拒绝规范不允许的任何内容;TextMagic 的规范是其自身客户端生成的)。尚未尝试真实账户 |
| CRM 呼叫卡、Azure Blob、Azure Key Vault | 与参考检查 | EspoCRM(真实的开源 CRM,在 Docker 中)用于呼叫卡;Microsoft 的 Azurite 模拟器用于 Blob 上传(容器 SAS、拒绝);Lowkey Vault 用于 Key Vault,具有托管身份。尚未在 Azure 本身或托管 CRM 中尝试 |
| 垃圾邮件过滤:机器人测试、未知呼叫者、垃圾邮件数据库、*32、建议 | 软件测试 | BitVoice 自己的测试:提供者通过 SIP 呼入并按下按键(RFC 4733)的机器人测试,通过和失败测试;同时有已知、始终允许和紧急呼叫回呼叫者;垃圾邮件数据库与 Twilio 文档的 Lookup 和 Nomorobo 附加组件的模拟进行比较(尚未尝试 Twilio 账户);*32 从桌面电话;从呼叫记录中建议;设置通过浏览器测试。尚未在真实的机器人呼叫或付费数据库中尝试 |
| iPhone 和 Android 应用 | 现场测试(Android) | Android:Google Pixel 8(Android 16,Wi-Fi)与 BitVoice 在 EC2 上的签名版本,使用 Let's Encrypt 证书:通过链接配对,响铃,通过 Android 的呼叫通知接听,音频双向,屏幕关闭和后台保持连接(其正在进行的呼叫通知,挂断);没有推送,它不会在后台响铃。Google Pixel 11(Android 17)在 AWS 设备农场:配对,响铃,接听,呼出;Opus,MOS 4.1。iPhone:应用(SwiftUI,CallKit,PushKit VoIP)构建到当前 SDK(Xcode 27),服务器签名 Apple VoIP 推送(APNs,ES256);与 Android 相同的真实设备修复和 App Store 列表(ios/AppStore)。两个应用都是完整的扩展:转移(盲转移,通过 REFER),保持和第二个呼叫,按键盘和静音,带有最近、视觉语音邮件(带有转录),团队忙灯,联系人,员工聊天(带有存在感的同事,直接消息和房间,带有后台通知和推送,当应用关闭时),视频会议室选择器(列出 SFU 房间,加入作为扩展,显示为电话呼叫屏幕上的视频呼叫)和呼叫上的实时 AI 转录(AI.LiveCallTranscripts);转移、保持、实时转录、聊天到达同事、房间列表、加入房间和聊天推送形状,每个都由引擎级、API 或浏览器测试覆盖。在 Pixel 8(2026-10-30,调试版本,EC2,Let's Encrypt)上:响铃和接听来自通知,保持和恢复(Android 的呼叫状态遵循),通过 Android 的呼叫系统呼出,双向 Opus,MOS 4.38,无丢包;加入视频会议室,带有摄像头(首次使用时请求),看到桌面摄像头,双方实时;后台收到聊天消息,通知并打开聊天。保持和转移到本地呼叫屏幕(CallKit,Telecom)。尚未在 iPhone 或提交中运行:推送、系统呼叫屏幕和签名需要我们自己的 Apple Developer 账户 |
| 911 配置文件、无线电控制台、NG911 核心服务、呼叫者视频 | 实验室 | NENA 的模式和示例数据,Wireshark,spandsp,OpenSSL,ExifTool,ffmpeg,NIST P25 捕获(其 IMBE 语音帧解包为 mbelib:相同的音调、谐波、语音和幅度);从未在真实的 ESInet、P25 系统或 PSAP CAD 上尝试,也未获得认证 |
| P25 第 2 阶段半速率语音(AMBE+2) | 未提供 | 专利至 2028 |
| Ed448 签名(NENA) | 未提供 | 不在 Go 的标准库中,BitVoice 不编写自己的加密;使用 Ed25519 |
| SS7 信号传输(STP)、SCCP 和 TCAP | 与参考检查 | OsmoSTP 2.3.0 通过 M3UA/TCP,使用 libosmo-sigtran 的 SCCP 回显用户:UDT 和 XUDT 双向,UDTS 返回,全球标题翻译通过 STP,一个开关在链接集上通过 IP 到达回显;TCAP 与 libosmo-asn1-tcap 双向。仅 ITU;无 SCTP、面向连接的 SCCP 或 SCCP 管理;尚未尝试真实的运营商 |
| MFC-R2 中国变体(中国 1 号) | 软件测试 | 每个呼叫信号检查与 Cisco 发布的中国表和呼叫序列(KA、KD、B 组通过发送的 KD、C 和 D 位 11);OpenR2 的中国变体与自身不一致,因此没有程序来测试;尚未尝试真实线路 |
| ALI 通过 PAM 或 E2 | 未提供 | PAM 是 Intrado 自己的协议,没有发布的规范;E2(J-STD-036,NENA 05-001)在移动定位中心和 ALI 数据库之间运行,而不是到 PSAP。BitVoice 使用请求和文本 ALI 链接和 HELD |
分机
/extensions一个分机是一个人的电话号码或一个桌面的电话号码。电话使用分机号码和其 SIP 密码 登录;呼叫该号码会同时响铃所有以该号码登录的电话。
添加分机
- 打开 分机 (章节 3) 并点击 添加分机。下一个可用的号码和一个强大的 SIP 密码会被填入。
- 输入人的 姓名(当他们呼叫其他人时显示)和 电子邮件(用于通过电子邮件发送语音邮件)。
- 填入 911 地点:网站、楼层和房间。它会随着紧急呼叫一起发送。
- 选择如果 没有人接听 时会发生什么:默认为语音邮件,或者另一个分机、一个组或一个菜单。
- 保存。分机可以立即登录。
字段
| 字段 | 作用 |
|---|---|
| 号码 | 2 到 8 位数字;不能与其他分机、组、队列、房间或功能代码相同 |
| SIP 密码 | 电话登录使用的密码;至少 12 个字符;生成 会创建一个新密码 |
| 振铃时间 | 如果没有人接听 之前等待的秒数(默认为 25) |
| 外部呼叫者 ID | 对外呼叫显示的号码;空白时使用分机的 |
| 是否允许呼叫外部号码 | 关闭时仅允许内部呼叫和紧急号码 |
| 录制呼叫 | 当设置仅录制选定的分机时 |
| 热桌 | 共享电话,登录后变为登录者的电话 |
| 加密呼叫 | 媒体加密(SRTP);使用 TLS 保持密钥私密 |
| 部门 | 将此分机的呼叫成本分组 |
跟随、接听和对讲
每个人的呼叫处理设置在其分机的独立框中:
- 跟随:当此处的电话没有被接听时,会呼叫其他号码:移动电话、另一个桌面。它们会一个接一个地呼叫,或者同时呼叫,每个号码有自己的振铃时间。启用 外部号码按 1 接听 时,移动电话的接听者需要先按 1,否则移动电话的语音邮件会接听该呼叫。请参阅 功能代码 (章节 32)。
- 接听组:同一组中的任何人都可以通过拨打
*8来接听此分机的呼叫。 - 允许对讲:
*80和此号码可以自动在扬声器上接听。对于不需要此功能的人,可以关闭它。 - 个人快速拨号:此人专用的快速拨号代码,拨打
*0后即可使用。
立即转发
设置下方的 立即转发 显示并更改从电话或员工门户设置的转发:不接听、所有呼叫转发、忙时转发和未接听转发。这些是实时状态,不是配置:更改它们不会创建修订版。
连接的设备
- 电话:桌面电话、软电话或应用程序。
- 门站:门口的对讲机。接听者按键代码或在 实时呼叫 上点击 开门。如果有门控制器地址,BitVoice 会呼叫该地址(2N、Axis、Akuvox、继电器板);否则,代码会发送到门站,门站会自动开门。
- 广播喇叭:呼叫它的电话会立即被接听并通过喇叭广播。
- 模拟适配器端口:适配器上的老式电话、传真机或报警面板。呼叫仅使用 G.711,这是传真所需的。
连接的设备
打开的分机会显示所有以其登录的设备:电话的制造商和型号、连接方式(UDP、TCP、TLS 或浏览器)和登录时间。向电话提供的地址和端口也会在那里显示。
连接电话
/phones任何SIP电话或应用程序都可以工作:将其指向此服务器的地址和端口5060,使用分机号码作为用户名和其SIP密码。四大制造商的桌面电话可以自动设置,因此无需在电话的键盘上输入密码。
自动设置(配置)
- 在电话 (章节 4)页面上按添加电话,输入电话的MAC地址(在标签下)和它所属的分机。
- 选择制造商:Yealink、Poly、Grandstream(包括HT模拟适配器)、Snom、Fanvil、Cisco、Mitel、Sangoma、Algo或CyberData。
- 告知电话BitVoice的位置:在您的DHCP服务器中,将选项66设置为屏幕上显示的配置地址,以便每个电话在网络上自动找到它;或者在电话的网页中输入相同的地址,位于自动配置下。
- 重启电话。它通过HTTPS获取其文件,登录,并且其线路键显示谁在使用电话。
HTTPS或普通HTTP。电话可以通过HTTPS获取其文件。一些较旧的电话无法使用HTTPS,而许多电话不信任BitVoice自动生成的证书;对于这些情况,屏幕也显示同一端口上的普通http://地址。普通HTTP仅用于这些文件:所有其他页面仍然使用HTTPS。通过普通HTTP,电话的SIP密码以明文形式跨网络传输,因此请将其限制在可信任的办公网络中,或者安装来自权威机构的证书并开启仅为电话启用HTTPS。
文件包含分机、其密码、时区、编解码器、忙灯键和此服务器的地址。配置受到用户名和密码的保护,这些信息仅提供给电话一次。
| 制造商 | 测试模型 | 获取内容 |
|---|---|---|
| Yealink | T3x、T4x、T5x | 账户、BLF键、时间、编解码器 |
| Poly | VVX、Edge E | 与上述相同,但使用Poly自己的格式 |
| Grandstream | GRP、GXP、HT802/814 | 适配器每个端口的账户 |
| Snom | D7xx | 账户、键、时间 |
这些制造商也被配置,但使用每个制造商记录的格式编写的文件尚未在其设备上测试(电话页面将其标记为未测试):
| 制造商 | 型号 | 设备请求的文件 |
|---|---|---|
| Fanvil | X 和 V 系列 | 其 MAC 地址 .cfg |
| Cisco | 6800、7800、8800 多平台(3PCC)、SPA 适配器 | 其 MAC 地址 .xml(企业固件需要先安装多平台固件) |
| Mitel(Aastra) | 6800、6900 SIP | 其 MAC 地址 .cfg,全大写 |
| Sangoma | S 系列 | Fanvil 格式文件 |
| Algo | 广播喇叭、闪光灯、适配器 | algop 和其 MAC 地址 .conf |
| CyberData | 喇叭、对讲机、广播适配器 | 其 MAC 地址 .xml |
每个设备都有自己的账户,服务器(以及备份服务器,多个服务器),传输和加密方式,以及语音信箱号码(如果有)。将 Algo 和 CyberData 喇叭的分机设置为 广播喇叭,这样呼叫它们时会立即接听。
无配置的电话
软电话和其他品牌的电话需要相同的三个信息:服务器(本机的地址,端口 5060,或使用 TLS 的 5061),用户(分机号码)和密码(其 SIP 密码)。健康列表显示尝试了错误密码的电话;尝试几次后,地址会被暂时禁止(请参阅 安全 (章节 60))。
浏览器电话
每个屏幕底部的电话图标使浏览器成为一个电话,使用您的麦克风和扬声器。它使用 WebRTC:声音是端到端加密的,并且可以在大多数防火墙上工作,而无需任何设置。
Other WebRTC softphones (SIP over WebSocket)
Softphones and web apps built on JsSIP, SIP.js and similar libraries speak SIP over WebSocket (RFC 7118). Switch on SIP over WebSocket in Settings (章节 14) and point them at wss://<this server's name>:<web port>/ws, with the extension number as the user and its SIP password. BitVoice ends their WebRTC sound itself (ICE, DTLS-SRTP, Opus or G.711), so they reach every phone, trunk and feature as desk phones do: calls both ways, keys pressed, hold, transfers by the other party, busy lamps and message-waiting. Settings shows how many are connected.
WebSocket 不需要自己的登录:软电话使用 SIP 登录,失败的登录和过多的请求都被计入其自己的地址,就像任何电话一样。从其他站点提供的软电话页面必须信任此服务器的证书(使用 Let's Encrypt),并且当前的 Chrome 会在公共 Web 页面尝试访问本地网络上的服务器之前询问用户。
已使用两个独立的库(JsSIP 3.13 和 SIP.js 0.21)进行测试:每个库的两个软电话注册、呼叫和相互听到对方的声音。其他软电话(Linphone 的 Web 客户端、Zoiper 的)使用相同的协议,但尚未测试。
TURN,用于阻止 UDP 的网络
一些网络(酒店、客人 Wi-Fi、严格的公司防火墙)不允许 UDP 出going,或将计算机隐藏在 WebRTC 无法穿透的 NAT 后面。对于这些情况,请在 设置 (章节 14) 中启用 TURN 服务器:BitVoice 然后在端口 3478(UDP 和 TCP)上运行其自己的 TURN 服务器(RFC 8656),并使用此服务器的证书,在端口 5349 上通过 TLS。浏览器电话、员工电话和呼叫链接都获得了短期凭证,并在无法直接访问媒体端口时使用它;声音仍然是端到端加密的,BitVoice 只将其中继到其自己的地址,因此没有人可以使用它来访问其他内容。
在防火墙中打开 TURN 端口、TLS 端口和中继端口(除非更改,否则为 49152 到 49407)。TURN over TLS 需要浏览器信任的证书,用于它们使用的名称,例如来自 Let's Encrypt (章节 14) 的证书:直到有一个证书,BitVoice 不会将其提供给浏览器(它们会尝试、失败并等待),并在证书到达时提供;将其端口设置为 443,以便在具有备用地址的服务器上通过仅允许 HTTPS 的防火墙。
切换网络 durante 通话
当电话在通话过程中切换到另一个网络(例如从办公室 Wi-Fi 切换到移动网络,或者笔记本电脑从一个 Wi-Fi 切换到另一个)时,它将获得一个新的地址,旧的路径将不再传输声音。浏览器电话和 BitVoice 应用程序可以自动检测到这种情况:当浏览器指示其网络已更改,或者通话路径停止响应两秒钟时,电话将重新启动 ICE(RFC 8445 9)。它为当前通话提供新的 ICE 凭证,BitVoice 用其自己的新凭证进行响应并检查新的路径,通话将无需重新拨打即可切换到新的路径。加密将继续使用相同的密钥。在此过程中,通话将显示 重新连接...;如果路径仍然有效,则不会出现间隙,因为旧路径将继续传输通话,直到新路径上的声音出现。通过 WebSocket 的 SIP 软电话(JsSIP、SIP.js)通过重新 INVITE 具有新的 ICE 凭证来执行相同的操作。使用 BitVoice 作为 ICE-lite 或在 NAT 后面,无需执行任何开启操作。
BitVoice 在 NAT 后面
上面的 TURN 服务器帮助浏览器在严格的网络中访问没有公网地址的 BitVoice。当 BitVoice 本身没有公网地址(在办公室后面的路由器没有端口转发,或者在云网络中没有公网地址的机器)时,在 设置 (章节 14) 中的 BitVoice 在 NAT 后面 下打开 此服务器在 NAT 后面。BitVoice 然后完全参与 ICE(RFC 8445)而不是在一个地址上回答(ICE-lite)。
- 它提供给浏览器自己的地址、通过 STUN 服务器 看到的公网地址和通过 TURN 服务器 登录的中继(UDP;每个都有一个用户名和密码),并检查每对地址与浏览器,如同浏览器所做的。
- 通过 TURN 中继每个呼叫 将所有浏览器媒体通过 TURN 服务器发送,适用于需要此功能的网络。
- 查找我的地址 像呼叫一样询问服务器并列出 BitVoice 将提供的内容:自己的地址、通过 STUN 看到的公网地址(不响应的 STUN 服务器将被指出)和中继。
- 它适用于浏览器电话、呼叫链接、回声测试和 SIP-over-WebSocket 软电话,在任一角色中:BitVoice 回答浏览器的邀请,并向软电话提出邀请。浏览器将地址隐藏在 mDNS 名称(
name.local)后面的浏览器在本地网络上被解析,其地址如 web 服务器所见从一开始就被中继允许通过。 - 默认关闭;它在每个呼叫中添加了一刻时间,而服务器回答(最多一秒半)。无论哪种方式,呼叫者视频使用 ICE-lite。
员工电话
在任何计算机或移动浏览器上打开 #/phone:人员使用其分机和 SIP 密码登录,无需管理员帐户。这是一个完整的电话:拨号、接听、保持、转接和按键盘。对于他们自己的转发和语音邮件,他们使用员工门户 #/me(请参阅 员工门户 (章节 33))。
移动应用程序
BitVoice 的 iPhone 和 Android 应用程序可以通过扩展页面上的二维码进行配对。通话通过 Apple 和 Google 的推送服务唤醒应用程序,因此即使应用程序关闭,电话也会响起(只要推送已设置;请参见下文)。
Skinny 电话和 MGCP 网关
/desk-phones不支持 SIP 的电话和网关仍然可以使用。Skinny 电话和 MGCP 网关(在呼叫下)支持两种较旧的协议:
- Skinny (SCCP):运行 SCCP 固件的 Cisco 桌面电话(79xx、69xx、89xx)。通过其 MAC 地址添加每个电话,并选择其分机;启用 接受 Skinny 电话 并在其 TFTP 设置文件或菜单中将电话指向 BitVoice(TCP 端口 2000)。
- MGCP(RFC 3435):BitVoice 一次驱动其端口的网关,例如模拟电话适配器和线路卡。通过网关在其端点名称中使用的域名(aaln/1@name)、其地址和每个线路的分机添加网关;将网关的呼叫代理设置为 BitVoice(UDP 端口 2727)。
每个 Skinny 电话或 MGCP 线路都是其分机的另一个设备:它会与分机的其他电话一起响铃,呼叫出去时显示为分机,并出现在分机的设备中。页面显示每个设备的状态。
什么功能正常工作
- Skinny:注册,显示屏上的线路和号码,拨号音,拨号(号码在暂停或#后输入,或者从电话拨盘直接输入),回铃,带有来电显示的铃响,通过手柄、扬声器或软键(NewCall、Redial、Answer、EndCall)接听和挂断,忙音和重新拨号音。
- MGCP:拨号音,网关使用数字映射收集的数字,带有来电显示的铃响(当网关拒绝来电显示时无来电显示),回铃,忙音和重新拨号音,以及音频连接(CRCX、DLCX)。网关重启(RSIP)后,其端口将被重新设置。
- 两种协议的音频均为G.711 µ-law;BitVoice会将其转换为对方使用的格式。
目前,保持、转接和会议呼叫需要从分机的其他电话进行,Skinny电话的第二条线路尚未使用。
安全性
两种协议都不需要密码。Skinny电话仅接受来自本地网络的注册,并且仅当列出时才接受;MGCP命令仅从网关的地址(或没有地址时,从本地网络)执行。请将两个端口从互联网中隔离。
网关仍在处理命令时可能首先回答 "100 Trying": BitVoice 然后等待更长时间再发送命令并确认最终答案 (000),如 RFC 3435 所要求。网关不监视的端口在网页上显示网关自己的拒绝消息,例如 网关拒绝监视端口: 507 不支持的功能,来自没有模拟端口的媒体网关。
如何测试
- Skinny: 两个使用独立的 Skinny 实现(开源的 mwicat/sccp 库)构建的电话注册、呼叫、应答和挂断;未列出的电话被拒绝。Wireshark 的 Skinny 解析器可以无误地读取 BitVoice 发送的每个消息,且这些消息的大小与 Asterisk 的 chan_skinny 发送到 Cisco 电话的消息大小相同。
- MGCP: 使用 Yate 的 MGCP 网关(重启、临时应答、确认、拒绝)和 BitVoice 自己的测试网关进行整个呼叫的测试。Yate 的网关没有模拟端口,因此没有通过它进行呼叫。
电话卡
/cardsBitVoice计算机中的电话卡(Digium、Sangoma、OpenVox等具有Linux DAHDI驱动程序的卡)可以承载模拟电话和电话公司线路。一个单独的程序bitvoice-dahdi驱动卡,并通过计算机的网络连接将其端口连接到BitVoice,因此BitVoice本身永远不会直接访问内核驱动程序,卡的问题也不会停止电话系统。
设置
- 安装DAHDI驱动程序,并在/etc/dahdi/system.conf中设置端口(
fxoks=1-4用于带有电话的端口,fxsks=5-8用于带有线路的端口,并在loadzone和defaultzone中设置国家音调),然后运行dahdi_cfg。 - 在电话卡(在Calls下)中启用使用电话卡。生成一个令牌;将其复制到只有root才能读取的文件中,例如/etc/bitvoice/cards.token。
- 通过DAHDI通道号添加每个端口:一个电话端口(FXS,插入电话、传真机或门口电话)及其分机,或者一个线路端口(FXO,电话公司线路)及其线路号。对于欧洲和世界大部分地区,选择A-law;对于北美和日本,选择µ-law。
- 对于线路,在Trunks上添加一个带有电话卡线路协议的中继,并像对任何中继一样将号码路由到它;入站路由匹配每个线路的号码。
- 以可以打开/dev/dahdi的服务用户身份启动
bitvoice-dahdi -server https://127.0.0.1:8443 -token-file /etc/bitvoice/cards.token。它位于Linux下载包中的bitvoice旁边。页面显示它是否正在运行以及每个端口的状态;更改将在十秒内到达它。另一个程序仍然持有的通道(或dahdi_cfg尚未设置的通道)将每两秒重试一次,因此启动顺序无关紧要。
什么功能正常工作
- 电话:拨号音,拨号(数字由BitVoice自己的音调检测器检测;号码在暂停或#后输入),回铃,来自卡的音调区的忙音和拥塞音,来电铃响,以及呼叫期间按下的键(也以RFC 4733事件的形式发送)。
- 线路:一个响铃的线路在这里呼叫其号码,并在呼叫被接听时被接听;呼出呼叫占用一个空闲线路,等待交换机的拨号音,并以音调的形式拨号。远端挂断被检测到,当线路报告它(循环电流或极性,取决于线路)时。模拟线路不会指示远端何时被接听,因此呼出呼叫一旦号码被拨号,就被视为已被接听。
- 声音从卡到BitVoice为G.711;BitVoice将其转换为对方使用的格式。
数字线路:T1和E1 PRI
T1(23个同时呼叫)或E1(30个)线路作为主速率ISDN运行,连接到数字卡(Digium/Sangoma TE系列、OpenVox D系列等)。BitVoice直接使用PRI协议(D信道上的Q.921和Q.931呼叫控制),因此每个呼叫都带有被呼叫号码和来电显示,发出呼叫时带有分机的来电显示,电话公司指示远端何时被接听、响铃或忙。
- 在 /etc/dahdi/system.conf 中,按照通常的方法设置 PRI 的 span(例如:
span=1,1,0,esf,b8zs、bchan=1-23、hardhdlc=24用于 T1;span=1,1,0,ccs,hdb3,crc4、bchan=1-15,17-31、hardhdlc=16用于 E1),然后运行dahdi_cfg命令。 - 在 电话卡 (章节 6) 的 数字线路 下,添加 span:T1 或 E1、其第一个 DAHDI 通道、BitVoice 是否作为电话公司线路上的 PBX(通常情况)或网络(另一个 PBX 连接到 BitVoice,如同连接到电话公司一样),以及电话公司提供的交换机类型。
- 如果还没有,则在 中继 上添加卡中继,并为电话公司发送的号码(DIDs)添加入站路由。
呼出呼叫首先占用PRI,然后占用模拟线路;忙号、错误号或无空闲通道返回为忙、未找到或不可用,如网络所示。页面显示每个跨接口的D信道是否已启动以及其通道中有多少呼叫。使用劫持比特信令(fxsks、fxoks)设置的T1通道的工作方式与上述模拟端口相同。
名称、转发和呼叫转移。呼叫者的名称随着呼叫一起传入(来自显示元素,或者从国家ISDN-2网络发送的设施),并在电话上显示;呼叫出去时发送扩展名的名称以相同的方式传递。呼叫被转发的号码作为重定向号码传入(BitVoice以SIP的Diversion形式传递,包括原因:忙、无人接听、无条件),当扩展名的转发将呼叫发送回PRI时,扩展名的号码作为重定向号码传递,以便远端和电话公司知道这是谁的呼叫。当外部呼叫被接听时,BitVoice告诉网络接听的号码(连接号码)。
在跨线(用户侧,国家ISDN-2,5ESS,DMS-100或EuroISDN)上启用通过电话公司的呼叫转移,当有人将呼叫转移到同一条线上的另一个号码时,BitVoice会要求网络自己连接两个呼叫:国家ISDN-2和5ESS线上的两个B通道转移,Nortel DMS-100上的释放链路转移,EuroISDN上的显式呼叫转移(呼叫者被保持,然后连接)。DMS-100只为BitVoice放置的呼叫提供转移标识符,因此在这种情况下,两个呼叫中的一个必须是外呼(通常情况:呼叫者被转移到外部号码)。两个通道在网络连接它们后立即释放。线路需要此服务(向电话公司询问“两个B通道转移”或“ECT”);如果网络拒绝,转移仍然有效,通过BitVoice使用两个通道,如前所述。在BitVoice作为网络侧的跨线上,另一个PBX可能会要求BitVoice连接两个呼叫;BitVoice拒绝(它不是交换机),并且PBX保留两个呼叫。
不使用卡进行尝试
DAHDI自己的动态跨线可以代替卡:两个跨线在内核中连接,BitVoice在一个跨线上,另一个PBX(例如Asterisk的chan_dahdi)作为电话公司在另一个跨线上。加载dahdi、dahdi_dynamic和dahdi_dynamic_loc,并在/etc/dahdi/system.conf中:
dynamic=loc,1:0,24,0 dynamic=loc,1:1,24,0 bchan=1-23 dchan=24 bchan=25-47 dchan=48
在两者上将最后一个号码(定时)留为0:DAHDI自己的定时器驱动它们。每个跨线作为另一个跨线的定时源,只有当另一个跨线发送时才会滴答,D通道来来去去。在这里将跨线1添加为T1(第一个通道1),并将另一个PBX设置为网络侧在通道25到48上。
基本速率ISDN(BRI)
BRI同时承载两个呼叫(B1和B2),在欧洲的小型办公室中很常见;它还连接ISDN桌面电话。BRI卡(Digium B410P,OpenVox,Junghanns等基于HFC的卡)通过DAHDI与PRI卡一样工作:在/etc/dahdi/system.conf中,跨线是span=1,1,0,ccs,ami,带有bchan=1-2和hardhdlc=3。在数字线路下将其添加为BRI类型的线路;其通道是B1、B2,然后是D通道。
- BitVoice是PBX(用户侧),点对点:来自电话公司的PBX线(德国的*Anlagenanschluss*):呼叫携带被呼叫的号码,呼叫出去时携带扩展名的号码。
- 用户侧,多点:与其他设备共享的线(*Mehrgeräteanschluss*):BitVoice向网络请求自己的TEI(终端标识符),并在其他设备旁边回答呼叫到该线;电话公司发送被呼叫的号码(MSN),它与入站路由匹配。
- BitVoice是网络,多点:ISDN电话插入卡的S总线,如同插入电话公司线一样。每个电话向BitVoice请求TEI;对总线的呼叫会使总线上的每个电话都响起,第一个接听的电话接收呼叫,其他电话停止响铃。数字键入的号码(如ISDN电话拨号)收集,直到电话说它是完整的,#被按下,或者四秒钟内没有数字到达。使用卡的中继将号码路由到和从总线,如对任何线路一样。
EuroISDN(显式呼叫转移)上的名称、转发、转移和费用建议在BRI上与PRI上一样工作。
T1上的E&M中继
T1的通道设置为E&M(劫持比特信令:e&m=1-24在/etc/dahdi/system.conf中)提供24个中继,每个中继都有自己的信令:连接到另一个PBX的中继线,信道银行和长距离运营商的功能组D中继。在数字线路下,添加T1,并将信令设置为E&M,然后:
- 开始信号:眨眼开始(通常:远端准备好接收号码时眨眼,BitVoice在呼叫到达时眨眼回应),立即开始(号码紧随占用信号之后),延迟拨号(远端在准备好接收号码时占用,准备好后释放),或功能组D(眨眼开始,带有MF号码,先发送呼叫者的号码:KP 00 ANI ST,然后KP号码ST;ANI成为呼叫者ID)。
- 发送号码的方式:DTMF或MF(MF R1,KP号码ST),如大多数运营商中继所需。
- 未发送号码时的号码:呼叫到达时,如果远端占用中继而不拨号(例如,直通前台的专线),则使用此号码。
外呼占用一条空闲的中继通道,发送呼叫信号,等待对方应答(五秒内无应答则呼叫失败),发送号码,并在对方摘机后连接。入呼则在分机接听时由系统自动应答。
CAMA 中继(911,实验跟踪)。 仍通过911选择路由器和CAMA中继的PSAP,将 开始信号 设置为 CAMA(911中继)。路由器占线,BitVoice闪烁,路由器通过多频发送呼叫者的号码(ANI):增强CAMA格式为KP,两个信息数字和十位数字,ST;传统CAMA格式为KP,一个编号计划数字和七位数字,ST。对于传统CAMA,列出 区域代码用于NPD 0至3 每个区域代码对应的编号计划数字(您的路由器设置表中有这些信息);编号计划数字大于3表示路由器无法识别该线路。每个呼叫都转到 911 的入局路由,作为911呼叫,带有ANI作为其回呼号码,BitVoice通过该号码查找其位置(请参阅 911呼叫 (章节 77),位置查找(ALI))。信息数字显示在呼叫中为 CAMA(II 00)。
MFC-R2 在 E1 线路上
在拉丁美洲、亚洲和非洲的部分地区,E1 线路通常使用 MFC-R2 而不是 ISDN:30 个电路,每个电路在时隙 16 的 A 和 B 位上有其线路信号(ITU-T Q.421),并在强制多频音调中交换其号码、呼叫者类别和呼叫者号码(Q.441),向前和向后发送。首先在 /etc/dahdi/system.conf 中设置跨度为 CAS(span=1,1,0,cas,hdb3、cas=1-15:1101、cas=17-31:1101、dchan 删除),然后在 数字线路 下添加一个 E1,设置 信令 为 MFC-R2,并选择 国家变体:ITU-T、阿根廷、巴西、中国、哥伦比亚、捷克共和国、厄瓜多尔、墨西哥、菲律宾或委内瑞拉。每个国家都以不同的方式分配一些信号(忙的含义、号码结束的方式、墨西哥的额外组 C);变体包含这些信息。中国 1 号要求在号码拨打后提供呼叫者类别(KA)和号码,最后发送呼叫类型(KD: 3,表示本地呼叫),通过发送的 KD 读取忙和闲,并将 C 和 D 位都设置为 1:在那里,写入 cas=1-15:1111 和 cas=17-31:1111。
每个电路都可以双向传递呼叫。呼入呼叫带有被叫号码和呼叫者号码(隐私号码以匿名方式显示)到达入站路由;忙的分机或错误的号码根据变体的规定以忙或未分配的方式发送信号。呼出呼叫发送号码和分机的呼叫者 ID,或当呼叫者隐藏它时发送 "号码隐私" 信号。
MFC-R2信令在每个提供的变体中以及双向测试,包括拒绝呼叫的测试,与OpenR2(Asterisk的chan_dahdi使用的R2库)进行比较;E&M信令与BitVoice自己的模拟信道进行比较。
SS7
运营商可能使用SS7而不是ISDN来信令T1或E1:语音电路传递呼叫,每个呼叫都由电路标识码(CIC)命名,一个时隙传递信令链路到运营商的信号转发点或交换机,通过ISUP建立呼叫。BitVoice然后成为一个自己的信令点,具有运营商分配的点代码。在/etc/dahdi/system.conf中,将跨度设置为清晰的信道,信令时隙为mtp2或hardhdlc(E1上的时隙16,T1上的时隙24)。在 数字线 下添加跨度,设置 信令 为 SS7(ISUP),并提供:
- SS7变体:ANSI(北美;点代码网络-集群-成员,如245-16-1)或ITU-T(世界大部分地区;点代码区域-区域-点,如1-10-2,或一个简单的数字)。
- 我们的点代码 和 相邻点代码,网络(国家的,通常的,或国际的),信令 链路代码(SLC,0,除非另有说明),和 第一个CIC:跨度的第一个语音信道的代码,其他信道按照顺序排列。所有这些信息都来自运营商。
链路集。 具有相同变体、点代码和网络的跨度形成一个链路集(最多16个链路):每个跨度的信令链路是其链路之一,需要其自己的 链路代码,并且每个跨度的电路都属于它(它们的CIC不能重叠)。链路集中的链路共享流量,通过消息的SLS实现。链路故障(链路测试无响应,或者消息未被确认)时,其流量切换到其他链路(Q.704:COO和COA,远端未发送的消息在另一个链路上重发;或者,在规定时间内无响应时,通过时间),所有跨度的呼叫继续进行,电话卡 显示有多少链路正在服务以及此跨度的状态。当链路恢复并测试通过时,其流量切换回原链路(CBD和CBA)。只有当所有链路都下线时,链路集才会下线。测试使用libss7,两个链路,一个在呼叫中间被切断:libss7仅在链路上接收网络管理消息,其SLS命名,因此关于切断链路的切换消息(在另一个链路上发送,如Q.704所述)在那里被丢弃,两端通过时间切换,这样可以工作;在两个BitVoice端之间,它通过COO和COA进行。
当链路建立时,BitVoice对其进行对齐(MTP级别2,使用单链路集的紧急证明周期),并使用链路测试(SLTM/SLTA)对其进行证明,交换流量重启允许,并重置每个电路(GRS)。呼叫到达入站路由,带有被叫号码、呼叫者的号码(屏蔽的号码显示为匿名)和转发号码;在ANSI上,还带有呼叫者的姓名。呼叫出去时,携带分机的呼叫者ID和姓名。遵守运营商阻塞或重置电路的指令。在双重占用时,点代码较高的一端保留偶数电路,如Q.764所述,BitVoice首先占用它保留的电路。
SS7被测试与libss7(Asterisk的chan_dahdi使用的SS7库)、ITU和ANSI:对齐、链路测试、流量重启、电路重置、带有号码和名称的双向呼叫、释放、忙和阻塞;BitVoice也被测试与自身,模拟链路丢失帧(由MTP2的错误纠正重新发送)和双重占用。信令传输(作为STP为其他设备提供服务)和SCCP/TCAP(号码可移植性查询、免费翻译)不被提供:PBX是一个端点,而这些是运营商的功能。
信令转发点 (STP)。bitvoice-dahdi 也可以成为其 ITU SS7 链路集的 STP:在数字线路下方打开 信令转发点 (SS7)。其 STP 点代码 是跨度自己的。使用 转发其他点代码的消息,来自一个链路集的消息将转发到相邻点的另一个链路集,如果是其他点代码,则转发到 IP STP (M3UA):一个位于主机:端口的 IP STP 或信令网关,通过 M3UA(RFC 4666)和 TCP 进行通信,其消息将通过相同的方式返回给链路集的点(BitVoice 注册其点代码和其后的点代码,除非指定了 路由上下文)。全局标题转换 将通过全局标题发送到 STP 的 SCCP 消息发送到最长匹配前缀的点代码和子系统,就像 SCCP 中继一样。无法交付的消息将以 UDTS 或 XUDTS 的形式返回给其发送者:无需转换、无路由(MTP 故障)、无子系统或其跳数用完。STP 的状态显示 M3UA 链路以及它转发、转换和返回的消息数量。其 SCCP(UDT、XUDT、UDTS、XUDTS)和 TCAP(开始、继续、结束、中止、对话和组件)都经过 Osmocom 的 OsmoSTP、libosmo-sigtran 的 SCCP 回显用户和 libosmo-asn1-tcap 自身的 TCAP 编码器进行了检查。SCTP 不提供(Go 语言中没有):M3UA 通过 TCP 进行通信,OsmoSTP 和许多 IP STP 也支持 TCP。面向连接的 SCCP、ANSI 链路集和 SCCP 管理(SST、SSA)不提供。
费用建议。在EuroISDN线路上,开启费用建议,BitVoice会在每个呼叫时询问电话公司提供费用信息:在呼叫期间(AOC-D)和呼叫结束时(AOC-E),以货币或计费单位表示。最后的费用会记录在呼叫记录中(已收费1.50欧元,在历史记录和费用页面中显示);如果费用单位是您设置的本地货币,则该费用将作为呼叫的实际费用,而不是从干线费率中计算得出的费用。电话公司必须在该线路上提供此服务。SIP干线也可能发送相同的建议,作为3GPP AOC XML在INFO或BYE中,BitVoice以相同的方式记录它。
PRI代码被测试与libpri(Asterisk使用的ISDN库),作为用户侧和网络侧,用于National ISDN-2和EuroISDN呼叫、名称、重定向和连接号码、显式呼叫转移、两B通道转移和DMS-100 Release Link Trunk请求字节对字节(使用libpri的PBX加入BitVoice作为DMS-100),以及双向的费用建议;在BRI上,点对点和多点,作为终端和网络(TEI分配、广播到总线的呼叫、逐位拨号)。
尚未实现:在模拟电话上显示呼叫者ID或从模拟线路读取、钩闪和超出卡自身功能的回声消除。
中继线
/trunks中继线是您与电话公司的帐户。它承载来自外部号码的呼叫。其中大多数是 SIP 中继线;Asterisk 或 FreePBX 服务器,或 IAX2 提供商,可以使用 IAX2 代替。
添加 SIP 中继线
- 在 中继线 (章节 7) 上按 添加中继线。
- 输入电话公司提供的 提供商服务器(
sip.provider.com),以及如果不是 5060 的端口。 - 输入 用户名 和 密码,如果提供商说要注册(大多数都这样做),则打开 注册。
- 保存。几秒钟内,中继线将显示 已注册;如果没有,原因将显示在其旁边。
干线健康判断
当一个外呼路由上有两个或更多的干线时,BitVoice 每 15 秒判断每个干线是否正在被使用。如果一个干线的提供商停止响应保持连接检查,或者其最近的呼叫失败了一系列(在 设置 中的 干线健康判断 中设置的 连续失败呼叫 和 在(分钟) 内),并且另一个干线正在工作,则该干线将被移到其他干线之后。但是,如果只有保持连接检查失败,而呼叫仍然可以通过该干线,则不会移动该干线。如果所有干线同时失败,很可能是由于系统自身的互联网连接问题,因此不会移动任何干线。判断需要两次连续的判断(30 秒),因此干线永远不会来回切换。干线永远不会被完全移除:当其他干线失败时,它仍然会被尝试,因此紧急呼叫总是有所有可能的出口。干线的页面显示判断结果和原因;通过其他方式拨出的呼叫在其记录中会指出这一点。
- 添加一个 入站路由 用于您的号码和一个使用此干线的 出站路由 (呼叫路由 (章节 8))。
| 字段 | 作用 |
|---|---|
| 传输 | UDP(通常)、TCP 或 TLS 用于加密信令 |
| 注册 | 每隔几分钟注册一次,以便提供商知道将呼叫发送到哪里 |
| 身份验证用户名 | 只有当提供商提供单独的用户名时 |
| 来自域 | 当提供商要求时,呼叫者的地址中的域 |
| 呼叫者 ID | 呼叫出时显示的号码;扩展号自己的呼叫者 ID 优先 |
| 也接受来自 | 提供商的其他地址或网络发送的呼叫。从此计算机通过这里注册的电话以及内置的呼叫生成器发送的呼叫永远不会被视为干线的,即使它允许 127.0.0.1 |
| 同时呼叫 | 您的计划允许的限制;超过此限制的呼叫将转到路由中的下一个干线 |
| 加密媒体 | SRTP,适用于支持它的提供商。提供商如果没有 SRTP 还是可以接收呼叫,但呼叫历史将标记为 未加密 |
| 需要加密 | (与加密媒体一起)拒绝提供商不支持加密的呼叫:提供商如果没有 SRTP 接受呼叫将被挂断,提供商发送的没有 SRTP 的呼叫将被拒绝;呼叫历史将显示原因 |
| 编解码器 | 保持在 设置 中的 相同,或选择提供商支持的编解码器,优先选择最好的 |
| 费率 | 根据号码前缀的呼叫费用,用于 费用 (章节 54) |
云提供商
开始 填充 Microsoft Teams Direct Routing、Amazon Chime SDK Voice Connector 或 Azure Communication Services,并附上在其侧设置的说明。Teams 在其自己的章节中描述 (Microsoft Teams (章节 67))。
IAX2 干线到 Asterisk 和 FreePBX
选择 IAX2 作为协议以连接到另一个 Asterisk 或 FreePBX 服务器,或 IAX2 提供商。IAX2 在一个 UDP 端口(4569)上承载信令和音频,这使得它容易通过防火墙。
- 服务器地址:另一台服务器。留空时,另一台服务器将注册到 BitVoice(例如,分支办公室位于一个变化的地址);然后,用户名和密码是它注册时使用的。
- 用户名和密码:两边相同。BitVoice 回应并处理 MD5 挑战和呼叫令牌。
- 注册:注册到另一台服务器,以便它可以发送呼叫到这里。
在 Asterisk 侧,类似这样的对等体就足够了:
[bitvoice] type=friend host=dynamic secret=the shared password context=from-bitvoice
IAX2 端口 4569 只有在添加第一个 IAX2 干线时才打开,因此在同一台计算机上运行的 Asterisk 将保持它,直到那时。
H.323 干线
选择 H.323 作为协议,用于较旧的网关、PBX 和视频会议系统,它们支持 H.323 但不支持 SIP。提供网关的地址(端口 1720);仅接受来自它的呼叫。呼叫使用 快速连接 和 G.711(μ-律或 A-律;干线的编解码器列表可能将其限制为其中之一)设置,并且音频直接在网关和 BitVoice 的媒体端口之间传输。BitVoice 将其转换为另一方使用的任何内容。
这里的 H.323 故意保持小:没有网关守护进程(RAS),没有 H.245(因此,网关如果不使用快速连接,则不会收到呼叫,并且会被告知),没有视频,没有 H.235 安全性。呼叫者 ID 来自 Q.931 呼叫号码或呼叫者的拨号别名,名称来自显示或其 H.323 ID。BitVoice 的 H.225.0 和 H.245 编码已针对独立的 ASN.1 编码器进行了检查,但尚未针对网关硬件进行检查。
转发呼叫
当呼叫已经转发到您(某人的号码转发到您的号码,或者Teams用户的号码)时,提供商使用History-Info(RFC 7044)或Diversion(RFC 5806)来指示。BitVoice支持两者:呼叫历史 (章节 47)显示转发自的号码,包括最初拨打的号码和原因,呼叫的原因链显示为文字,呼叫记录保存这些信息(forwardedFrom、original、forwardReason)。当提供商要求保持历史记录的私密性时,号码不会被保存。
当一个分机将呼叫转发到一个中继线(全部转发、忙时转发、无人接听时转发)时,提供商会被告知哪个分机转发了呼叫以及原因,这样提供商可以显示您的号码并计费到正确的账户:默认情况下,使用两个头部,并保留呼叫的历史记录和转发信息。对于混淆的提供商,可以在中继线的高级设置中选择转发呼叫显示其归属。在T1/E1电话卡上,任一头部都成为网络的重定向号码。
状态的含义
| 状态 | 含义 |
|---|---|
| registered | 已登录;可以接收呼叫 |
| ready | 不注册,或者IAX2等待呼叫 |
| unreachable | 服务器名称不在DNS中,或者没有响应 |
| failed | 提供商拒绝了登录;显示拒绝原因 |
| standby | 服务器共享此中继线,一次一个,另一个服务器持有它 |
呼叫路由
/routes呼叫路由决定两个问题:外部呼叫去向(根据拨打的号码)和外部号码的中继线使用。
入站路由
每个入站路由匹配被呼叫的号码(或任意号码)并将呼叫发送到一个目的地:分机、铃音组、队列、菜单、时间表、脚本、会议室、AI接待员或语音邮件。号码以任何形式匹配:+1 212 555 0100、2125550100和12125550100是相同的。
- 一个号码的路由优先于任意号码的路由。
- 一个路由可以限制为一个中继线,用于两个提供商都发送的号码。
- 启用紧急模式(设置)后,每个入站呼叫都会转到一个地方,而不是按照路由规则:疏散、关闭、事件。
出站路由
出站路由根据模式匹配拨打的号码,并将其发送到中继线:如果第一个中继线不可用或满载,会尝试下一个。
| 模式 | 匹配 |
|---|---|
X | 任何数字 |
Z | 1到9 |
N | 2到9 |
[1-5] | 一组中的一个 |
.结尾 | 一个或多个后续数字 |
NXXNXXXXXX | 十位北美号码 |
1NXXNXXXXXX | 同上,前面加1 |
011. | 美国的国际呼叫 |
- 删除从前面删除数字(外线的9);然后添加到前面添加一些数字(国家代码)。
- 顺序很重要:第一个匹配的路由将被使用。拖动路由来更改顺序。
- 高级号码(900等)除非路由指定,否则将被拒绝。
紧急号码
紧急号码始终可用。一个路由如果命名了该号码,将被首先使用;如果没有路由,所有可用的中继线将被依次尝试。呼叫紧急号码永远不会因为分机限制、托管组织限制或缺少路由而被拒绝。健康状况警告当没有中继线可以承载它们时。
PIN 集
/pin-sets一个 PIN 集 (章节 9) 是一个出局路由在呼叫出去之前要求的 PIN 列表:为了限制国际或长途呼叫给具有 PIN 的人员,或按客户和项目的代码对呼叫进行计费。
- 添加 PIN 集 并列出其 PIN(每个 4 到 10 位数字)。
- 打开 保持 PIN 在呼叫记录中 以将使用的 PIN 写入每个呼叫的记录作为其帐户代码(CSV、syslog 和 PostgreSQL 呼叫记录输出的 accountcode 列,以及 API 中的
account)。 - 在 呼叫路由 (章节 8) 上,打开一个出局路由并在 要求 PIN 下选择该集。
拨打该路由的呼叫者会听到“请输入您的 PIN,然后按 #”,输入后呼叫将被发送出去。三个错误的 PIN 将结束呼叫,并将尝试记录为安全事件。无论其路由如何,紧急号码永远不会要求 PIN,转发呼叫和跟我号码也不会被要求:只有从电话拨打的人。
呼叫者 ID 查询
/lookups许多电话公司发送呼叫者的号码但没有名称。BitVoice 首先在 公司联系人 (章节 38) 中查找;之后,一个入局路由可以要求一个 呼叫者 ID 查询 (章节 10):
- 网页地址:您的 CRM 或任何服务,使用
{number}代替号码(例如https://crm.example.com/api/callers?phone={number})。纯文本答案在第一行给出名称;对于 JSON,请提供 名称字段 作为点路径(例如data.contact.name;数字进入列表,如results.0.name)。基本身份验证是可选的。 - OpenCNAM:北美呼叫者名称数据库,使用您的帐户 SID 和身份验证令牌。
在 呼叫路由 (章节 8) 上的入局路由中选择查找(呼叫者 ID 查询)。电话在响铃时显示名称,并将其写入呼叫记录。
查找永远不会阻止呼叫:BitVoice 最多等待其 等待(1.5 秒,除非您更改它,最大 5 秒),然后在没有名称的情况下响铃。答案将被保留一天(或您设置的时间长度,或者使用 -1 永远保留)。因此,经常呼叫的呼叫者不会在每次呼叫时被查找;服务不知道的号码将在一小时后再次被要求。查找页面上的 尝试 按钮要求一个号码立即使用已保存的设置进行查找。
紧急呼叫
紧急号码总是会被呼叫出去,无论是从哪个扩展号呼叫,即使该扩展号不能呼叫外部号码。这一章是关于从 BitVoice 运行的电话进行的紧急呼叫:办公室呼叫 911。接听 911 呼叫是 911 配置文件 (章节 77)。
BitVoice 在每个紧急呼叫中执行的操作
- 路由它,始终:一个路由,首先命名该号码;如果没有,则每个工作的中继一次。限制永远不会阻止它:一个不允许外部呼叫的扩展号,一个达到呼叫限制或被暂停的托管组织,一个达到其通道限制的中继。
- 发送呼叫者的位置:如果 发送呼叫者的地址 已打开(设置),则呼叫将携带站点的民用地址、楼层和房间到提供商作为 PIDF-LO。
- 通知现场人员(美国的 Kari 法案):通知 下的扩展号将在其电话上收到一条消息,每个打开的 BitVoice 屏幕都将显示一个警报,而 也发送电子邮件 下的地址将收到一封包含呼叫者名称、扩展号、站点、楼层和房间的电子邮件,以便有人可以在门口迎接响应人员。
- 允许呼叫回复:在紧急呼叫后的一小时内,传入的呼叫永远不会被拒绝,因此应答点可以始终呼叫回复。
设置
- 在 设置 (章节 14) 中检查紧急号码(按国家设置:美国为 911 和 933)。
- 在 站点 (章节 12) 下添加每个建筑物,包括其街道地址和其电话使用的网络。
- 为每个扩展号分配其站点、楼层和房间。
- 确保一个出局路由和中继可以携带紧急呼叫;健康 (章节 13) 将在没有可用中继时发出警告。
- 填写 通知 和 也发送电子邮件。
- 拨打
933(在美国)以听到您的提供商有记录的地址。
远程工作者
注册从其站点网络外部的电话是一个远程工作者:其电话页面询问其位置,该地址将被使用。警报指示何时未确认。
紧急模式
一个不同的功能:一个开关将所有来电转移到一个地方(疏散、封闭、事件)。设置来电转移的位置,一个可选的代码,如 *55 和允许拨打它的分机,在 设置 (章节 14) 中;在 仪表板 (章节 1) 上打开它,或通过拨打代码(上升音为开启,低音为关闭)。当它打开时,每个屏幕上都会显示一个红色条。
站点和办公室 911
/sites一个站点是一个建筑:其街道地址和其电话使用的网络。站点是紧急呼叫指示呼叫者位置的方式,精确到楼层和房间。在美国,Kari 法案和 RAY BAUM 法案要求企业电话系统提供此功能。
添加站点
在 站点 (章节 12) 上,按 添加:
| 字段 | 含义 |
|---|---|
| 名称 | 人们称呼它:总部 |
| 街道、城市、州或省、邮政编码、国家 | 应急人员被发送到的民用地址 |
| 网络 | 其电话使用的地址范围,例如 10.1.0.0/16;每行一个 |
然后,对于每个分机,指定其站点、楼层 和 房间。健康 (章节 13) 列出没有位置的分机。
如何找到电话的位置
- 从站点网络注册的电话位于该站点,具有分机的楼层和房间。
- 热桌携带其自身的站点、楼层和房间,而不是登录的人员(热桌 (章节 36))。
- 从站点网络外部注册的电话是 远程工作者。在新的位置首次注册时,用户将被要求在其电话页面上确认其地址;紧急呼叫将携带该地址。
- 如果远程工作者从未确认,则呼叫仍将发出,但带有分机的通常站点,并且警报将指示地址未被确认。
现场警报
在设置中启用 当有人呼叫 911 时发送电子邮件,则指定的人员将在紧急呼叫开始时立即收到呼叫者的名称、分机、站点、楼层和房间,因此有人可以在门口迎接应急人员。通知 分机将在其电话上收到消息,每个打开的 BitVoice 屏幕都将显示警报。请参阅 紧急呼叫 (章节 11)。
健康
/health健康指示系统是否准备好接听呼叫,如果没有,需要做什么。每行以简单的语言说明问题,并链接到解决问题的屏幕。每次进行任何更改后,请检查它。
它检查什么
| 检查 | 为什么重要 |
|---|---|
| 紧急呼叫可以发出 | 路由和工作中继携带紧急号码 |
| 没有紧急位置的分机 | 其 911 呼叫将不携带楼层或房间 |
| 电话服务 | SIP 正在监听,并在哪个端口 |
| 未连接的电话 | 没有人以其身份登录的分机 |
| 中继 | 已注册或未注册的原因 |
| 没有录制提示的菜单 | 呼叫者将听到沉默 |
| 时区 | 时间表遵循它 |
| 录音及其保留 | 磁盘空间和录音保留时间 |
| 证书 | TLS 证书何时过期 |
| 密钥库 | Vault 无法读取的机密 |
| 其他服务器 | 当多个服务器共享数据库时,每个服务器是否正在运行 |
问题以颜色显示:红色表示阻止呼叫(无紧急路由),黄色表示应查看(未连接的电话),灰色用于信息。
设置
/settings设置包含有关整个系统的所有信息。每个部分都单独保存,每次保存都是 更改 (章节 61) 的修订版。
| 部分 | 内容 |
|---|---|
| 系统 | 名称,国家,时区,语言,公众电话和提供商看到的地址 |
| 号码 | 回声测试,语音邮件和停车号码,以及紧急号码 |
| 编解码器 | 电话可能使用的编解码器,优先使用最好的 (编解码器 (章节 66)) |
| 通话录音 | 关闭,所有通话,或选定的分机;同意规则;录音保留时间 |
| 声音 | 语音邮件和通话期间的清理 |
| 保护 | 登录失败后的禁用,受信任的网络,分机通话次数,高级号码 |
| 紧急 | 发送呼叫者的地址,谁被通知,谁被发送电子邮件,紧急模式 |
| 人工智能 | 人工智能服务,模型,以及哪些人工智能功能已启用 (人工智能 (章节 28)) |
| 单点登录 | 身份提供者 (单点登录 (章节 58)) |
| Asterisk 兼容性 | 为 Asterisk 编写的程序的 AMI 和 ARI (Asterisk 兼容性 (章节 70)) |
| 人工智能助手 (MCP) | 是否允许人工智能助手(如 Claude 或 ChatGPT)连接,并是否可以执行操作 (人工智能助手 (章节 71)) |
| Microsoft 365 和 Google Workspace | 将人员和共享联系人导入联系人,并为谁不在办公室设置日历 (联系人 (章节 38), 日历 (章节 39)) |
| 移动应用 | 唤醒应用的推送服务 |
| 电子邮件 | 语音邮件,传真和警报的邮件服务器 |
| 密钥库 | 在 AWS Secrets Manager 或 Azure Key Vault 中存储的机密 |
| 从 Git 配置 | 将配置与存储库中的文件保持同步 |
| 数据库 | SQLite 或 PostgreSQL (数据库 (章节 64)) |
| 证书 | 此接口和 SIP over TLS 的证书:从 Let's Encrypt,手动安装或 BitVoice 自己的 |
密码和密钥保存后将不再显示;留空以保持它们。查看者看到的设置中每个秘密都已删除。
证书和 Let's Encrypt
BitVoice 从自动生成的证书开始,浏览器和电话会对其发出警告。对于具有公共名称的服务器,在证书下启用 Let's Encrypt:输入名称(pbx.example.com),可选地输入电子邮件地址,然后应用。BitVoice 从 Let's Encrypt 获得免费证书,立即将其用于 Web 界面,SIP over TLS 和 Teams,并在证书到期前约 30 天自动续期(Let's Encrypt 证书有效期为 90 天或更短)。状态行显示其发行时间,续期时间以及如果失败的原因;它将在一小时后尝试再次续期,然后尝试频率降低,在 Let's Encrypt 的限制范围内。立即检查 尝试立即续期。
Let's Encrypt 需要从互联网访问服务器下的每个名称,以证明它是您的:
- http-01 (除非 Web 界面在端口 443 上,否则为默认选择):对端口 80 的请求。BitVoice 自身在端口 80 上响应 (在 Linux 上,需要打开低端口的权限,例如
setcap cap_net_bind_service=+ep bitvoice),或在路由器上将端口 80 转发到 Web 界面的端口,后者也会响应。任何其他到达端口 80 的内容都会被发送到 HTTPS,以获取证书的名称。 当 BitVoice 无法打开端口 80 时,Let's Encrypt 窗口会以琥珀色显示原因和解决方法 (此程序的确切setcap行,或者 systemd 的AmbientCapabilities=CAP_NET_BIND_SERVICE;或者其他程序已经占用了该端口)。 测试名称 然后会通过互联网请求每个名称的测试文件,如 Let's Encrypt 所做的,并指出每个名称是否到达了 BitVoice,到达了其他内容,或者不在 DNS 中。有些路由器不将自己的公共地址回路到内部 (无发夹 NAT):在这种情况下,内部测试会失败,尽管 Let's Encrypt 从外部访问成功。 - tls-alpn-01:到端口 443 的 TLS 连接,由 Web 界面的自己的端口响应:适用于其 Web 界面在 443 上的服务器。
其他不需要帐户绑定的 ACME 证书颁发机构 (例如公司自己的 step-ca 或 Let's Encrypt 的用于测试的暂存服务) 可以在 Authority 下选择。 通配符名称需要 DNS 证明,而 BitVoice 不支持这种证明:请手动安装这些证书。 集群中的每个服务器都会获得自己的证书。
您的语言界面
BitVoice的界面有英文和其他十三种语言:德语、法语、西班牙语、意大利语、葡萄牙语、荷兰语、波兰语、瑞典语、丹麦语、挪威语、芬兰语、日语和简体中文。
选择语言
每个浏览器都有自己的语言:在菜单中选择(语言列表位于主题旁边),在登录页面上选择,或在设置向导的第一页上选择。直到您选择,BitVoice将使用浏览器自己的语言(如果是支持的语言),否则使用英文。选择的语言仅在此浏览器中保存:两个在同一服务器上的人可以分别使用自己的语言工作。
所有界面元素都已翻译:菜单、标题、按钮、提示、服务器消息和屏幕阅读器宣布的名称。搜索(⌘K)可以找到页面的名称(您的语言或英文)。保留原样:用户输入的内容(名称、号码、注释)、地址、代码、编辑器中的脚本以及产品和协议的名称。日期和数字遵循浏览器自己的设置。
翻译方式和质量
翻译由机器(大型语言模型)完成,适用于屏幕上显示的所有文本,约有5,000个。没有人工检查过这些翻译。一些由多个部分组成的句子(数字和单词)可能读起来很别扭,一个术语可能在两个地方被翻译成两种不同的方式。任何没有翻译的内容,例如更新的屏幕,将保持英文。
帮助 保持此手册的英文版本,如原文所写,在每个章节的顶部都有一个链接指向bitvoice.org上的机器翻译的章节。
电话部分是独立的:呼叫者听到的内容(提示、语音邮件菜单)使用默认的提示语言(声音 (章节 20)),除非扩展或队列有自己的语言设置。
呼叫去向
呼叫者移动的基本构建块:组和队列、菜单和时间表、脚本和 AI 接待员、语音邮件和显示所有的图表。
呼叫流程
/flow检查每种情况
检查每种情况,位于呼叫流程 (章节 16)的顶部,尝试在每种情况下测试整个呼叫计划,而不仅仅是一个样本:
- 您的日程安排在未来一年中实际覆盖的每一种开放和关闭的组合(包括每个节假日),以15分钟为步长;
- 每一种日夜切换的组合(或,如果有六个以上,则每一个单独切换);
- 每一个呼入路由,以及每个菜单中呼叫者可以按的每个键,每个"如果没有人接听"和每个队列超时;
- 每一个分机拨打每个紧急电话号码。
It lists what it finds, the worst first: a call goes nowhere (a group with nobody to ring and nowhere to go next), a loop, works, but look at it (a queue with no agents), nothing routes to it (a menu or schedule no call reaches), a branch no situation takes (a schedule that is never closed, so its closed side is never used), and emergency calls rest on one trunk (if it fails, they cannot get out). Each finding names the situations that show it: the time and which schedules were open, the toggles switched over, and the path (a call to +12125550100 → Press 2 (Billing) → No answer). Try this call fills Try a call below with that exact situation and traces it.
相同的检查在更改之前运行:直接询问 的提议和 恢复此修订版 都会列出更改会破坏当前工作的内容。
尝试呼叫
输入呼叫者(一个分机或外部号码),输入他们要拨打的号码和时间,然后按 尝试。BitVoice 将按照实际呼叫流程处理呼叫,而不会实际拨打电话:包括呼入路由、当时的时间表、路由脚本(它们在沙盒中运行)、菜单、组和队列,以及如果没有人接听会发生什么。该呼叫的路径将被标记;菜单的按键、时间表的另一侧等其他路径可以被打开。绿色表示正常,琥珀色表示需要检查(未连接的电话、脚本回退),红色表示呼叫在此处失败。勾选 假设每个电话都已连接 以查看计划的设计,而不是当前状态;到达 选择仅有一条路由的干线。
图表
图表显示来自外部的呼叫流向:每个呼入路由,然后是菜单、组、队列、时间表、脚本和人员。
单击一个框(或使用 Tab 键导航并按 Enter)以更改从中呼叫的流向:路由的目标、分机或组的 如果没有人接听、时间表的开启和关闭目标、菜单的按键(直接在此处添加或删除按键)、脚本的回退或接待员的人员。保存将检查更改并创建修订版。打开其完整编辑器 将转到项目的页面。添加呼入路由 添加路由而不离开图表。
铃音组
/ring-groups一个铃音组是一个号码,可以同时呼叫多个分机:销售团队、前台和备份、车间的所有人。
铃响策略
- 同时: 所有成员的电话同时铃响,第一个接听的成员接收呼叫。其他成员停止铃响。
- 一个接着一个: 每个成员按照列表顺序,依次铃响一段时间。使用箭头移动成员,或者Alt+↑和Alt+↓。
如果成员不在(在日历中标记为会议,或者设置为请勿打扰),将跳过他们;组将呼叫其他成员。具有移动应用的成员将通过推送唤醒并铃响。
如果没有人接听
如果在铃响时间内没有人接听,呼叫将转到如果没有人接听: 一个成员的语音邮件、队列、菜单、另一个组。如果没有设置,将一直铃响,直到呼叫者放弃。
组、队列或接听?
| 使用 | 何时 |
|---|---|
| 一个铃音组 | 几个人,任何人都可以接听呼叫,呼叫应该立即铃响 |
| 一个队列 | 呼叫者可能需要等待有人空闲,应该听到他们的位置 |
| 一个接听组 | 每个人都有自己的呼叫,但同事可能会为他们接听 |
队列
/queues一个队列按照顺序持有呼叫者,并播放音乐,当有人空闲时,会呼叫下一个代理。它是联系中心的核心,也适用于任何办公室,呼叫速度快于人们可以接听的速度。
呼叫如何被接通
| 策略 | 谁会被呼叫 |
|---|---|
| 最长空闲 | 最长时间没有呼叫的空闲代理 |
| 轮流呼叫 | 每个空闲代理依次被呼叫,接着上一次的代理 |
| 呼叫所有 | 所有空闲代理同时被呼叫 |
| 最少呼叫 | 今天呼叫次数最少的代理 |
| 按顺序(线性) | 总是从列表顶部开始:第一个空闲代理 |
| 随机 | 任何空闲代理,随机选择 |
| 加权随机 | 根据权重随机选择,惩罚较低的代理更容易被选中 |
- 顺序:代理列表的顺序;可以上下移动。按顺序和轮流呼叫遵循此顺序。
- 惩罚 排名代理(0至100,空时为0):呼叫会被提供给惩罚最低的空闲代理,惩罚较高的代理只有当没有惩罚较低的代理可用时才会被呼叫。可以使用惩罚来设置一个队列的第一行和溢出线。
- 权重 排名共享代理的队列:当一个队列有更高的权重且有人等待时,其代理会优先处理其呼叫者。
- 结案 给代理在呼叫后一段时间的缓冲期。
- 最长等待:等待时间较长的呼叫者会被转到队列的超时目标。0表示永远等待。
- 保持音乐:呼叫者听到队列的音乐(来自声音 (章节 20)的任何类别),系统的音乐或队列音调。
- 通知等待的呼叫者 他们在队列中的位置和预计等待时间(今天已接听呼叫者的平均等待时间,单位为分钟),每隔几秒钟,在队列的语言中。文字来自声音 (章节 20)中的队列提示;在录制这些提示之前,呼叫者不会听到任何声音。
队列 屏幕是一个实时的墙板:显示谁正在等待,等待了多长时间,以及每个代理的状态。
代理
代理拨打 *45 登录或退出所有队列,拨打 *46 暂停(休息)和恢复;暂停和退出登录的代理不会被提供呼叫。墙板有相同的按钮,并显示代理暂停的原因。
| 状态 | 含义 |
|---|---|
| 可用 | 空闲;将被提供下一个呼叫者 |
| 响铃 | 被提供呼叫 |
| 忙 | 正在通话 |
| 结案 | 刚刚结束;结案时间正在运行 |
| 暂停 | 休息中,给出原因 |
| 离开 | 在会议中或时间休假,从他们的日历中 |
| 退出登录 | 不接受队列呼叫 |
监督员
在 实时呼叫 (章节 46) 中, 监控 呼叫监督员的电话;当他们接听时,他们可以 监听 (无人听见), 耳语 (只有代理听见)或 强插 (双方都听见),并可以在呼叫期间切换这些模式。
粘性队列和VIP
打开队列中的 粘性 开关,返回的呼叫者(在过去30天内被接听过的呼叫者,或者您设置的时间)将首先被提供给上次接听他们的代理,如果该代理可用;如果他们没有接听,队列将按照正常流程继续。 VIP呼叫者 ,在队列底部,将被置于每个队列的前面,排在已经等待的VIP呼叫者之后,并在板上标记为VIP。
外呼拨号器
/dialer外呼 拨号器 (章节 19) 为 队列 (章节 18) 的代理呼叫联系人列表:续约、预约提醒、催收、调查。每个 活动 都有其队列、其列表和其呼叫方式:
| 模式 | 如何呼叫 |
|---|---|
| 预览 | 代理请求下一个联系人,查看其详细信息,然后呼叫它(代理的电话先响)或跳过它 |
| 进步 | 每个空闲代理一个呼叫 |
| 电力 | 每个空闲代理一组呼叫(1到3) |
| 预测 | BitVoice 根据代理的呼叫调整呼叫,逐渐增加呼叫,当放弃呼叫率接近限制时减少 |
- 添加活动:其队列、其呼叫者ID(联系人看到的号码)、在时区内允许呼叫的时间、联系人的电话响铃时间、尝试次数和尝试之间的间隔。
- 打开 联系人 并 添加列表:一个具有标题行和名为
number(或phone)的列的CSV文件;name和任何其他列将在预览中显示给代理。跳过重复和格式错误的号码。 - 录制 消息(在活动中):谁呼叫以及为什么,以及 "按9如果您不想接收这些呼叫"。如果没有空闲代理,它将播放给接听的人,并且,如果您选择,在接听机的问候语之后。
- 启动 它。它仅在其时间内呼叫,并在暂停或没有待处理呼叫时停止呼叫。
人员和机器. BitVoice 监听接听后的前几秒:长时间的连续问候是答录机;短暂的 "你好?" 和暂停是人。当有疑问时,它将答案视为人。当机器可以被挂断(并尝试再次拨打),留言,或像任何人一样传递给代理。
放弃的呼叫. 当没有可用代理时,两秒内有人接听,听到消息并计为 放弃。使用电力和预测拨号,如果过去一百个答案中放弃呼叫的比例超过活动的限制(除非您更改它,否则为 3%,这是美国规则),活动将每个可用代理拨打一个呼叫,直到恢复正常。活动显示其放弃率、呼叫铃声和可用代理的实时状态。
不接听电话. 活动不会呼叫 不接听电话 列表中的任何号码,无论它来自哪个列表;任何人在消息期间按 9 将立即被添加。手动添加号码或通过 API (POST /api/dnc) 添加。对于国家注册表(在美国,FTC 的国家不接听电话注册表:下载您呼叫的区域代码作为平面文件),在 国家注册表 下选择文件并 导入:每行包含一个号码(如 FTC 编写的 212,5550100,或每行一个号码),标题和破坏行被跳过和计算。如果 替换最后一次导入 已启用,之前下载的号码将被删除,因此注册表中删除的号码可以再次呼叫;手动添加或按 9 添加的号码始终保持。注册表必须至少每 31 天刷新一次(美国规则);页面计算列表和注册表中有多少个号码。API 是 POST /api/dnc/import?replace=1,带有文件作为正文。
声音:提示、语言和保持音乐
/sounds声音 (章节 20) 包含BitVoice对呼叫者说或播放的所有内容,除了问候和菜单提示,这些是在使用的地方录制的。
提示,支持所有语言
提示 是BitVoice说的一件事: "请输入您的PIN", "您的位置在队列中是",读出数字。拨号目录、拨入(DISA)、唤醒呼叫和队列公告使用这些提示。BitVoice具有每个提示的英文、西班牙文、法文、德文、意大利文、葡萄牙文、荷兰文和波兰文版本;数字逐位读出,在每种语言中听起来相同。
- 呼叫者听到 设置每个人的语言。一个队列、一个拨入号码、一个目录或一个分机可以选择另一种语言。
- 每个提示可以 在浏览器中录制 、 上传 (任何音频文件;它将被转换为电话音频)或 由语音服务创建 :在设置、AI中设置语音模型,一个按钮可以从其文字创建一种语言的所有提示。已经录制的提示将被保留,除非您要求替换它们。
- 添加语言 任何其他语言(例如sv、ja或pt-BR的代码);其提示可以被录制或上传,显示英文文字作为参考。
- 语言中缺失的提示将以默认语言播放,然后以英文播放;如果没有录制任何提示,呼叫者将听到一个短音调,因此在录制单个提示之前,每个功能都可以正常工作。
保持音乐
保持音乐分为 类别 (例如Calm、Jazz、Sales offers...),每个类别是一个列表,按顺序播放或 随机 播放。可以上传任何浏览器可以读取的格式的音频文件,长度最长为15分钟;MP3和WAV文件也可以直接发送到API(PUT /api/music/{class}/{name}),BitVoice可以自己解码MP3(MPEG-1、2和2.5 Layer III,使用minimp3相同的解码器)
互联网广播。一个班级可以播放一个流媒体代替其音轨:在 互联网广播 下输入一个MP3流媒体的地址(Icecast、Shoutcast、大多数互联网广播)。当第一个呼叫者被放置在该班级的等待状态时,BitVoice连接并播放同一个流媒体给所有等待的呼叫者,并在最后一个呼叫者离开后半分钟断开连接。如果无法访问流媒体,班级将播放其自己的音轨(或保持音调,如果没有音轨),并显示原因。
| 谁听到它 | 哪种音乐 |
|---|---|
| 被放置在等待状态的呼叫者 | 持有呼叫者的分机选择的音乐,否则为默认音乐 |
| 被停靠的呼叫者 | 停靠呼叫者的音乐,否则为默认音乐 |
| 队列中的等待呼叫者 | 队列的音乐,否则为默认音乐 |
| 等待会议领导者的呼叫者 | 默认音乐 |
默认音乐 可以是保持音调,因此在选择音乐之前不会有任何变化。在队列或分机上选择 保持音调 将保持该音调。
按名称拨号目录
/directories一个 按名称拨号目录 (章节 22) 允许呼叫者在不知道其号码的情况下联系某人:他们在拨号盘上拼出姓名的第一个字母(2代表ABC,3代表DEF,直到9代表WXYZ),然后被转接。
- 添加目录,命名它,并分配一个号码(例如411),或留空号码并将其用作菜单选项。
- 选择呼叫者拼出的内容:姓氏(通常)、名字 或 任意。
- 选择 谁被列出,或没有人被列出所有具有电话的人。
呼叫者听到 "请输入姓名的前三个字母"。如果只有一个匹配项,则立即转接。如果有多个匹配项,则每8个读出一次:每个人的姓名,然后 "按1呼叫此人",2和3,直到9,表示更多姓名。没有匹配项:"没有人匹配",然后他们再试一次(最多三次)。
语音名称:在每个人的分机上录制其名称(语音名称:在浏览器中录制或上传文件),目录将读出该名称;在此之前,它将读出分机号码。目录的词语来自 声音 (章节 20) 中的目录提示,以其语言显示。
拨入(DISA)
/dial-in一个 拨入 (章节 23) (DISA, "直接内部系统访问")允许某人从外部呼叫,证明其身份,然后通过办公室再次呼叫:呼叫使用办公室的呼叫者ID、其路由和其费率,就像他们在办公桌上一样。
- 添加拨入,并设置 PIN (4到10位数字),允许使用它的号码(仅从这些号码),或两者。两者之一是必需的。
- 选择呼叫 作为 的分机:其外部呼叫权限、呼叫者ID和外部路由适用。它必须允许外部呼叫。
- 为其分配一个号码以便在内部拨打,并在 呼叫路由 (章节 8) 上将电话号码发送到它(选择拨入作为目标)。
呼叫者听到 "请输入您的PIN,然后按#",然后 "请输入要呼叫的号码,然后按#",然后被转接。这些词语来自 声音 (章节 20) 中的拨入提示。
语音机器人(AudioSocket)
/voice-bots一个 语音机器人 (章节 24) 是您自己的程序(AI 代理、语音识别 IVR、录音机),它通过 AudioSocket 接受呼叫,AudioSocket 是 Asterisk 使用的简单协议:BitVoice 接听呼叫,打开到机器人的 TCP 连接,并发送呼叫的 UUID,然后发送呼叫者的声音作为 20 ms 帧的 8 kHz 16 位线性音频和每个按键;机器人发送回来的任何声音都被播放给呼叫者。为 Asterisk 的 AudioSocket 编写的机器人和语音服务连接器可以在 BitVoice 中无需更改即可使用。
- 添加语音机器人:其名称、机器人的地址 (
10.0.0.9:9092) 和可选的号码以拨打它。 - 选择呼叫者在 机器人无法接受呼叫或中断 时将去哪里(人、队列、语音邮件):这是必需的,以确保机器人宕机时不会丢弃任何呼叫者。
- 从 呼叫路由 (章节 8) 发送呼叫到它,菜单选项、计划或切换。
当机器人发送 AudioSocket 挂断时,呼叫结束;当呼叫者挂断时,机器人会收到一个挂断。如果机器人在三秒内无法访问,或者其连接在没有挂断的情况下中断,呼叫者将被转移到备用选项,并且故障将被记录。
要将程序引入正在进行的呼叫(监听转录器、对无人耳语的助手),请使用 ARI 的外部媒体:请参阅 Asterisk 兼容性 (章节 70)。
日/夜切换
/toggles一个 日/夜切换 (章节 25) 是呼叫流程的切换开关(FreePBX 将其称为呼叫流程控制)。发送到它的呼叫将转到其 正常 目的地,或在有人 切换 时转到另一个目的地:办公室因风暴提前关闭,某人在出门时拨打 *281,呼叫将转到语音邮件,直到它被切回正常状态。它将保持其状态,即使在重启后。
- 添加切换,给它一个代码(1 到 3 位数字:在
*28后拨打)并选择呼叫的正常和切换后的目的地。两边都可以是计划,因此切换可以位于营业时间之前并覆盖它们。 - 选择谁可以从电话切换它(没有人可以让任何扩展进行切换)。
- 从 呼叫路由 (章节 8) 发送呼叫到它,菜单选项或计划,就像发送到任何其他目的地一样。
通过拨打 *28 和其代码(上升音调:切换;下降音调:恢复正常)切换它,或者在切换页面上切换它,或者通过 API (POST /api/toggles/{id}/state)。监视 *281 的忙灯键将在切换打开时亮起,因此关闭办公室的人可以从他们的桌子上看到它。切换代码本身位于 功能代码 (章节 32) 上。
时间表
/schedules时间表会根据您是否营业,将呼叫转接到不同的目标。将一个入站路由指向时间表,然后将时间表指向菜单(营业时间)和语音信箱(非营业时间)。
营业时间
每行时间都是一个日期范围和一个开始、结束时间。允许有多行:周一到周五 9:00 到 17:00,以及周六 10:00 到 13:00。时间可以跨越午夜(22:00 到 06:00)以适应夜班。
假期
假期 会被视为全天关闭,无论时间表如何设置。每个日期都可以添加一个名称;名称将在 呼叫流程 (章节 16) 中显示,当您尝试在该日期拨打电话时。
时区
时区是设置中的时区。当时钟更改时,时间表将遵循本地时间。
脚本(JavaScript 和 Lua)
/scripts脚本决定了当菜单、时间表和组不足以处理呼叫时的转接目标:来自某个地区的呼叫者转接到某个办公室,VIP 号码直接转接到某人,或者根据您自己的数据做出决定。或者,设置为 运行整个呼叫,它将接听呼叫并运行它,就像 Asterisk 的 dialplan 或 AGI 脚本一样:提示、语音、键、录音、呼叫人员、转接(如下)。脚本可以使用 JavaScript 或 Lua 在 脚本 (章节 27) 中编写。
安全设计
- 路由脚本最多运行 200 毫秒。如果脚本失败或运行时间过长,呼叫将转接到脚本的 回退,以确保不会丢失呼叫。(呼叫脚本有自己的限制,见下文。)
- 脚本在沙盒中运行:无法访问网络或磁盘。路由脚本只能选择目标;呼叫脚本只能执行以下列出的步骤,针对其自己的呼叫。
- 紧急呼叫永远不会运行脚本。
脚本看到的内容
call 包含:
| 字段 | 含义 |
|---|---|
from、fromName | 呼叫者的号码和名称 |
to | 被呼叫的号码 |
direction | inbound 或 internal |
trunk | 中继 |
weekday、hour、minute | 当前时间(0 是星期日) |
date | YYYY-MM-DD |
脚本返回的内容
一个目标, {type, target}: 类型是 extension, ringgroup, queue, menu, schedule, voicemail 或 hangup, 目标是其号码。返回空使用默认值。 log("text") 写入脚本的运行列表。
JavaScript
if (call.from.startsWith("212")) {
log("New York caller")
return { type: "ringgroup", target: "600" }
}
if (call.weekday === 0 || call.weekday === 6) return { type: "voicemail", target: "100" }
Lua
if string.sub(call.from, 1, 3) == "212" then
log("New York caller")
return { type = "ringgroup", target = "600" }
end
if call.weekday == 0 or call.weekday == 6 then
return { type = "voicemail", target = "100" }
end
使用脚本
将一个入站路由、菜单键或时间表指向脚本, 就像指向任何目标一样。 测试 运行脚本使用您描述的呼叫, 不会实际拨打电话; 运行列表显示每次实际运行的结果、所用时间和任何错误。 呼叫流程 (章节 16) 也会在尝试呼叫时运行脚本。
运行整个呼叫的脚本
选择 运行整个呼叫。脚本然后从上到下运行, 每一步等待直到完成:
| 步骤 | 功能 |
|---|---|
play(name) | 播放来自 声音 (章节 20) 的提示音,使用呼叫者的语言(goodbye、digit-5...),或 digits:1234,或一个音调:beep、confirm、error、off、hold。如果提示音尚未录制,则为一个蜂鸣声。 |
say(text) | 使用设置中的语音服务朗读文字,如果没有设置语音服务,则为一个蜂鸣声 |
collect({max, timeout, interDigit, end, say, prompt}) | 收集按键:最多 max 个(32),等待 timeout 秒用于第一个按键(5),等待 interDigit 秒用于每个后续按键(3),直到 end(#)。say 或 prompt 首先提出请求。返回按键,如果没有按键,则返回 ""。 |
record({box, seconds, beep}) | 将消息录制到分机的邮箱中,直到 # 或时间结束;返回录制的秒数 |
wait(seconds) | 等待,返回按下的按键 |
dial(destination, ringSeconds) | 向目标分机发出呼叫,呼叫者听到回铃声。如果被接听:双方通话,脚本结束(true)。如果没有被接听:返回 false,脚本继续执行。 |
transfer(destination) | 将呼叫转接;脚本结束 |
hangup() | 结束呼叫 |
log(text) | 写入运行日志 |
目标可以是号码 (此处为扩展、铃组或队列, 否则为通过出站路由的外部号码; 永远不是紧急号码) 或如上所述的 {type, target}。在声音期间按下的按键停止声音; play 和 say 返回按键, 以及下一个 collect 从按键开始。返回目标将呼叫发送到该目标。
const k = collect({ max: 1, timeout: 5, say: "Press 1 for sales, 2 for support." })
if (k === "1") return { type: "ringgroup", target: "600" }
if (k === "2") {
if (dial("101", 20)) return
say("Nobody is free. Leave a message after the tone.")
record({ box: "101" })
hangup()
}
Lua 有相同的步骤 (collect{max = 1})。给脚本一个 要拨打的号码 以从扩展拨打它。
其限制确保呼叫安全: 脚本自己的代码最多在两步之间运行四分之一秒; 呼叫最多有 1,000 步; 整个脚本在其 最长运行时间 后停止 (默认 10 分钟, 最多 60 分钟)。当它失败、停止或在未挂断或转接的情况下结束时, 呼叫转到其 默认 目标; 挂断的呼叫者立即停止脚本。 尝试 运行脚本使用您指定的按键并列出每一步, 不会实际拨打电话。
AI 接待员、语音邮件分类和提问
/receptionistsAI 功能使用 设置 (章节 14) 中指定的 AI 服务:OpenAI 兼容服务(默认为 OpenRouter)或自行运行的服务。需要发送给 AI 服务的内容,因此请选择一个值得信赖的服务;对于 911 中心,其自己的政府云被视为本地云.
AI 接待员
选择一个接待员作为呼叫的目标:路由、菜单选项或分机的 如果无人接听。它会声明自己是自动的,仅从 已批准的信息 中回答,记录消息,预订回呼(参见 回呼 (章节 30)),或转接到 有人。按 0 或要求与人通话始终会接通,并且在 AI 服务或语音模型出现问题时也会如此:呼叫者永远不会被卡在 AI 接待员那里.
模型
模型 执行文本工作:摘要、接待员的回复和用简单语言提问。语音转文本需要一个可以处理音频的模型;将其设置为 语音转文本模型(例如在 OpenRouter 上使用 google/gemini-2.5-flash),以使用一个仅处理文本的模型(例如 meta-llama/llama-3.3-70b-instruct)进行其余工作.
Speech to text in the building
Speech can be written down without any language model: a speech recogniser (whisper) hears the audio and writes what was said, nothing more. Who writes speech down, in the AI settings, has three choices:
- The model above: the audio goes to the AI service, whose model must take audio.
- This server: BitVoice runs whisper itself. Choose a Whisper model and save: BitVoice fetches it once from the whisper.cpp project (
baseis 60 MB;small,mediumandlarge-v3-turboare more accurate and slower; all understand about 100 languages), checks it against its published SHA-256, and starts whisper.cpp'swhisper-serveron 127.0.0.1 beside it, restarting it if it stops. Callers' audio never leaves the computer and nothing is paid per call.whisper-server(MIT licence) comes in BitVoice's downloads next to the program, and the installers put it beside BitVoice; BitVoice also finds one installed on its own (brew install whisper.cpp). The settings show where it stands (fetching the model, starting, running, or why it is not), and so does Health (章节 13). While it is not running, transcripts fail and say why: they are never sent anywhere else instead. - A speech-to-text service: whisper.cpp's
whisper-serveron another computer in the building (http://192.168.1.20:8178/inference), for one machine with a GPU serving several BitVoice servers, or any OpenAI-compatible…/audio/transcriptions(with Its model, such as whisper-1, and Its key). Plainhttpis accepted only to this computer or a private network address; anything else must behttps. To run one:whisper-server -m ggml-base-q5_1.bin --host 0.0.0.0 --port 8178 -l auto.
无论谁撰写,每个记录都会被保存:语音信箱、录音电话、实时 911 通话和接听人员听到呼叫者的话。没有模型,模型 可能会被留空:记录被撰写,摘要从事实中撰写(如下),需要语言模型的内容(操作项、语音信箱分类、通话洞察、接听人员的回复、直接询问)会被省略。识别器关于其听到的内容的注释,例如 [BLANK_AUDIO] 或 (silence),将被丢弃,因此安静的部分永远不会被读取为有人在说话。
通话中提到的事实(无语言模型)
每个记录也会被规则读取,无需语言模型,用于呼叫接听者记录的通话事实:发生了什么,哪里,受伤的人数(或无人受伤),状况(呼吸、清醒、出血...),危险(火灾、烟雾、气体、武器、化学品、燃料),车辆、呼叫者与需要帮助的人的关系,以及回电号码。每个事实都显示了它来自的句子和说它的那一方,在记录的 通话中提到的事实 中。没有模型,摘要仅从这些事实中撰写,并说明了这一点。
- 没有添加任何无人提及的内容。"无人受伤" 是一个事实;呼叫者转述他人的话("她说他不呼吸")被标记为 报告;"24 松树巷。不是的,42" 保留 42;一个简单的 "没有" 回答了刚刚提出的问题。
- 它是忠实的,而不是完整的:它不知道的词会被忽略。在三个虚构的 911 通话集(无真实呼叫者的词)中,它发现:
| 集 | 找到的事实 | 没有人预期的找到的事实 |
|---|---|---|
| 训练集(规则从中编写) | 41 个事实中的 41 个 | 0 |
| 保留集,在任何规则编写之前冷启动评分 | 27 个事实中的 40 个(67%) | 2 |
| 保留集,在从其缺失中编写的第二组规则之后 | 40 个事实中的 40 个 | 0 |
| 密封集,冷启动评分(永远不会从中编写规则) | 43 个事实中的 23 个(53%) | 3 |
密封评分是预期在未见过的通话中的评分,这三个集合由与规则相同的人编写,因此真实通话可能会表现更差。请在记录旁边阅读事实,而不是代替它。
更大的模型需要更多处理器:一次写出多个通话的服务器应该从 base 开始,或者使用一个带有 GPU 的机器作为建筑物的语音转文本服务。在 Apple 电脑上,whisper 使用 GPU。
语音信箱分类
启用 转录和总结语音信箱 后,每个消息也会被标记为紧急、正常或低优先级,并附上其类型(销售、支持、计费...)。紧急消息会在每个管理员的屏幕上引发警报。
直接询问
在 更改 (章节 61) 中,描述一个更改("在 5 点后将销售电话转到语音信箱")。AI 会提出它,BitVoice 会像对待其他任何更改一样检查它,并显示确切的更改内容。没有任何内容会在您按下 应用 之前更改,并且它会成为您可以恢复的修订版。密码永远不会发送给 AI。
语音信箱
/voicemail每个扩展可以有一个邮箱。未接听的呼叫者听到其问候语并留言; 人员可以在电话上听到它, 在屏幕上阅读它, 或通过电子邮件获取它。
启用语音信箱
在扩展上启用 语音信箱。 如果无人接听 则设置为邮箱。给它一个 PIN (4 到 10 位数字): 它从其他电话打开邮箱, 并在员工门户和热桌上登录人员。
| 设置 | 含义 |
|---|---|
| 最长消息 | 10 到 900 秒 (默认 180) |
| 电子邮件新消息 | 发送到扩展的电子邮件地址, 附带消息 |
| 问候语 | 在浏览器中录制, 上传, 或从电话录制; 如果没有, 呼叫者听到一个哔声 |
收听
- 从扩展自己的电话拨打
*97: 消息按最新顺序播放; 按键重播、删除或保留每个消息。 - 从其他任何电话拨打
*97, 输入邮箱号码及其 PIN。 - 在 语音信箱 (章节 29) (管理员) 或员工门户 (人员) 中: 播放、标记已听、删除。
- 电话的消息指示灯在有新消息时亮起。
使用 AI
启用 转录和总结语音信箱 (设置, AI), 每个消息都会被写出, 总结为一行, 并根据其类型 (销售, 支持, 账单) 标记为紧急、正常或低优先级。紧急消息在每个管理员的屏幕上触发警报。请参阅 AI (章节 28)。
声音清理
声音清理 (设置) 删除稳定的背景噪音, 并在保存消息时均匀音量, 因此来自汽车或繁忙街道的消息更容易听清。
回呼
/callbacks要求回呼的人。人工智能接待员在呼叫者要求时预订一个:它收集他们的姓名、要呼叫的号码(提供他们正在呼叫的号码)、合适的时间和呼叫的内容,读回给他们,并且只有在呼叫者同意时才预订。它永远不会承诺确切的时间。管理员也可以手动添加回呼。
新的回呼在每个打开的屏幕上显示警报,并发送电子邮件给接待员的 接收消息 邮箱的所有者,当该分机具有电子邮件地址并且在设置中配置了电子邮件时。
要回呼,只需选择您的分机并按 回呼:您的电话先响铃,当您接听时,BitVoice 使用您的正常路由和呼叫者 ID 呼叫该号码。然后您可以添加注释并按 完成(或 取消)。完成的回呼保存在打开的回呼下方,可以再次打开。
呼叫链接和网站呼叫
/call-links呼叫链接是一个 Web 地址,可以从任何浏览器呼叫您的业务:无需电话号码,无需应用程序。将其放入电子邮件签名中,在传单或店铺窗口上打印其 QR 代码,或将 网站按钮 粘贴到您的网站中。
在 呼叫链接 (章节 31) 上,添加一个链接,选择其呼叫的目标(一个分机,一个组,一个队列,一个菜单,AI 接待员,一个时间表或语音邮件),然后保存:页面显示其地址和 QR 代码。呼叫者看到标题和您设置的文字,提供其名称(如果您要求),允许麦克风并按 呼叫现在;键盘用于菜单。接听者看到 Web: 和呼叫者的名称。
关闭 打开 以关闭线路(页面指出)。 同时呼叫 限制了可以通过一个链接呼叫的人数(除非设置,否则为 5)。地址包含一个长的随机部分,因此无法猜测;重复的错误地址将被阻止,如失败的登录。呼叫者的麦克风需要页面通过 HTTPS 提供,因此分发 HTTPS 地址。
日常呼叫
人们每天在电话上做的事情以及他们为自己设置的内容:转发、跟随、拾取、会议室、广播、热桌、传真和短信。
功能代码、转发和快速拨号
/codes功能代码是人们在电话上拨打以更改自己的设置和访问功能的代码。它们在每个电话上都有效,无论是桌面电话还是软电话,都不需要在电话本身上进行任何设置。上升的音调表示完成;下降的音调表示被拒绝。
代码一览表
| 代码 | 功能 |
|---|---|
*72 | 转发所有呼叫(然后输入号码和 #,或直接输入号码:*722125550199) |
*73 | 停止转发所有呼叫 |
*90 / *91 | 在通话期间转发 / 停止 |
*52 / *53 | 未接听时转发 / 停止 |
*78 / *79 | 开启 / 关闭请勿打扰 |
*76 | 切换请勿打扰(上升音调:现在开启) |
*21 | 切换跟随我 |
*8 | 接听呼叫中的拾取组 |
** 和一个分机 | 接听呼叫中的分机 |
*80 和一个分机 | 对讲:该电话在其扬声器上接听 |
*0 和一个代码 | 速度拨号 |
*62 | 醒来呼叫:听到它,预订一个(四位数字,例如 0630)或取消它(星号) |
*68 和一个数字 | 房间状态,用于酒店的房务 |
*28 和一个切换代码 | 切换一个 日/夜切换 (章节 25) 或返回 |
*32 | 阻止最后一个呼叫者:最后一个外部号码呼叫此电话将被添加到阻止列表(垃圾保护 (章节 56)) |
*43 | 回声测试 |
*97 | 您的语音邮件 |
70 | 停车呼叫(转移它);71 到 79 拿起它 |
*45 / *46 | 队列代理:登录或退出 / 暂停或恢复 |
*33 / *34 | 登录或退出热桌 |
*7 / *8 在呼叫期间 | 暂停和恢复录音(卡支付) |
转发
*72转发所有呼叫。拨打它,听到音调,然后拨打号码和 #。或者直接在代码后面拨打号码。*90转发在您通话期间来的呼叫。*52转发您未接听的呼叫。*73、*91和*53取消它们。
转发到另一个分机使用该分机自己的设置(其语音邮件、其跟随我),最多四个跳转,因此两个人相互转发无法形成循环。转发到外部号码通过外呼路由,如同该人拨打了它,并需要该分机允许外呼。
转发是实时状态,而不是配置:设置它不会产生任何修订,并且在重启之间保持。分机 (章节 3) 和员工门户显示和更改它。
勿扰
*78 开启,*79 关闭,*76 切换。勿扰开启时,呼叫转到语音邮件或分机的无应答目的地。手动设置的勿扰优先于日历 (日历 (章节 39))。紧急呼叫回拨仍然会响铃。
跟随我
*21 切换跟随我功能的开启和关闭,对于已设置跟随我号码的分机(在分机或员工门户中设置)。桌面电话先响铃一段时间,然后跟随我号码一个接一个或同时响铃。在外部号码上启用 按 1 功能时,人员听到提示音并按 1 接听电话;语音邮件或静默永远不会这样做,15 秒后呼叫将转移到其他地方。
接听他人的电话
*8接听您 拾取组 中最老的呼叫(在每个分机上设置;名称比较时不区分大小写)。**和一个分机号码接听呼叫该分机的电话:**101。
对讲
*80 和一个分机号码呼叫它并自动接听:其电话在扬声器上接听,双方可以通话。 Yealink、Grandstream 和 Snom 读取 BitVoice 的 Call-Info 标头,Poly 读取 Alert-Info;一些电话需要在其自身设置中启用对讲功能。一个分机可以拒绝对讲;然后呼叫正常响铃。门站永远不会接听对讲。
快速拨号
*0 和一个代码拨打一个保存的号码: *05。公司的快速拨号代码在此页面上;每个人都可以在其分机或员工门户中拥有自己的代码,并且他们的代码优先于公司的相同代码。代码为 1 到 3 位数字。
更改代码
每个代码都可以在 功能代码 (章节 32) 中更改,或使用单词 off 关闭。两个功能不能共享一个代码,并且没有代码可以是分机或组的号码:BitVoice 指出哪一个冲突。回声、语音邮件和停车号码在 设置 (章节 14) 中。
员工门户
员工门户允许每个人在无需管理员的情况下管理自己的通话:请勿打扰、转发、跟随我、快速拨号、语音邮件及其问候语、PIN,以及他们自己的通话列表。它位于 #/me 上的此服务器地址,并从登录页面链接。
登录
人员使用他们的 分机号 和 语音邮件 PIN 登录:与从电话打开语音邮件和在热桌登录时使用的 PIN 相同。没有 PIN 的分机无法登录;管理员在分机上设置一个 PIN。
来自同一地址的重复错误尝试将其锁定 10 分钟。门户会话仅限于该人的设置:永远不会访问其他分机、配置或任何人的录音。
人员可以执行的操作
| 选项卡 | 内容 |
|---|---|
| 通话去向 | 请勿打扰;每次通话的转发,当忙和未接时;跟随我号码;自己的快速拨号 |
| 语音邮件 | 可以播放和删除的消息,具有 AI 时的转录和摘要;录制或上传问候语 |
| 您的通话 | 该人的通话,最新的先显示,没有录音 |
| PIN | 更改 PIN,提供当前 PIN |
在此设置的转发和请勿打扰与使用功能代码从电话设置的相同(功能代码 (章节 32)):最后设置的哪一个生效。跟随我号码和快速拨号是分机配置的一部分,因此更改它们会在 更改 (章节 61) 上创建一个修订版本,记录为该人的操作。
聊天和状态
门户的 聊天 选项卡列出了同事的当前状态: 可用、通话中、响铃、忙(请勿打扰,会议或日历中的时间,带有原因)或 离线(无电话连接),以及他们输入的状态("午餐,2点回来")). 选择某人以向他们发送消息;消息立即到达,并且名称旁边的数字计算未读消息。 团队房间(设置,员工聊天)是针对群组或所有人的对话,当房间列出无成员时。
消息仅被对话中的人看到:管理员管理房间,从不阅读它们。 设置,员工聊天 关闭聊天,并设置消息保留时间(0 保留每个对话的最新一千条)。
会议室
/conferences会议室是一个号码,人们拨打它以共同交谈。员工从他们的办公桌拨打;外部呼叫者通过传入路由或指向房间的菜单选项到达它。
设置房间
- 打开 会议室 (章节 34) 并按 添加会议室。
- 为其分配一个 号码(任何空闲号码,默认为 500)和一个 名称。
- 可选地设置一个 PIN。呼叫者听到一个音调,输入 PIN 并按 #。三个错误的 PIN 后,呼叫将结束。
- 可选地设置一个 领导 PIN,不同于 PIN。谁输入它谁加入为领导者。
- 要允许外部呼叫者加入,请将传入路由(或菜单键)指向房间。
选项
| 选项 | 它的作用 |
|---|---|
| 等待领导者 | 其他人听到保持音调,直到领导者加入;当最后一个领导者离开时,房间关闭,所有人都挂断。需要领导 PIN。 |
| 成员加入时静音 | 用于简报和讲座:领导者说话,成员听。成员按 1 请求发言,领导者解除其静音。 |
| 录制房间 | 整个房间作为一个录音保存在 呼叫历史 (章节 47) 中,除非系统关闭录制 |
| 加入和离开时的音调 | 默认启用 |
| 最多人数 | 默认为 50,最高可达 200 |
呼叫期间的按键
1静音和解除静音自己(在成员静音的房间中,它请求发言)。2,对于领导者,锁定房间以防止新加入者,并解锁它。
房间使用期间
页面显示每个正在使用的房间:谁加入,谁正在说话(绿色灯),谁静音,谁请求发言,谁仍在等待领导者。管理员可以静音或解除任何人的静音,移除某人,并锁定或解锁房间。
房间内的每个人都能听到其他未静音的人,混合由 BitVoice 完成;每个人的电话可以使用自己的编解码器。每个人的呼叫记录都保存了一个呼叫记录,房间本身也保存了一个带有长度和录音的记录。
高清音频
在房间中打开 高清音频(新房间默认启用),并以 16 kHz 而不是 8 kHz 混合:使用宽带电话(G.722、Opus、浏览器电话)的人可以以高清音频听到彼此,具有现代呼叫的清晰度,而使用普通电话(G.711、通过提供商的移动电话)的人可以以通常的方式听到同一个房间。实时视图标记房间和每个成员是否以高清加入。高清需要 G.722 在电话使用的编解码器中(它是系统列表中的第一个,设置,编解码器)。房间的录音保持电话质量。
视频房间
在房间中设置 视频,并且加入它的视频电话(和软电话)发送其摄像头并看到一张图片,切换为人们说话,像 Asterisk 的 ConfBridge 中的那样:
- 跟随发言者:每个人看到谁已经说话了一秒钟,一旦屏幕上的那个人已经安静了一秒钟;屏幕上的那个人看到前一个。
- 显示领导者:每个人看到领导者(谁加入领导 PIN);领导者看到最后一个发言者。
- 网格:每个人同时看到所有人,左右相邻(一张图片填充屏幕,两张并排,然后 2x2 和 3x3,最高可达九张),每个人都在其加入顺序中的自己的位置,包括自己。
BitVoice 在不解码的情况下切换图片,因此几乎没有成本,并且它要求每个新图片的电话提供一个完整的帧(RTCP PLI 和 FIR,以及大多数桌面电话响应的 SIP INFO 图片快速更新),因此切换立即显示。每个成员的视频使用房间的 视频编解码器(除非您选择 VP8,否则为 H.264);没有它的电话仅以声音加入。每个查看者都获得一个稳定的流(一个源,其自己的有效载荷类型),无论谁在屏幕上。实时视图标记谁有视频和谁 在屏幕上。
网格的制作方式不同:BitVoice 将每张图片发送给服务器上的 ffmpeg,后者解码、将它们放在 1280x720 的图片中,帧率为每秒 15 帧,并对所有人进行编码。安装 ffmpeg(设置、视频转换,显示是否找到);如果没有,它将遵循发言者的网格房间,并在房间屏幕上显示。每张图片都需要处理器时间:在小型服务器上,网格房间应限制为少数。只有摄像头发送的成员才会显示:加入没有视频或摄像头停止的成员将离开网格(它永远不会在静态摄像头上冻结),并在几秒钟内重新创建网格,当更改时,图片会暂停。第十个成员及以后将被听到但不显示。实时视图标记网格的大小和谁在网格中。
每个人的视频(浏览器)
选择 每个人的视频,房间将拥有自己的页面(会议室、打开视频房间 或 #/video-room/NUMBER)。每个人都按 使用我的摄像头加入:浏览器发送其摄像头一次,以三种大小(模拟播出),并接收每个其他摄像头的自己的图片。BitVoice 以其原始形式转发图片(选择性转发单元,SFU),因此处理器时间成本很低;每个浏览器的上传和每个查看者的下载是限制房间的因素,因此最多可以有 16 个摄像头。
- 大图片获得该摄像头的全尺寸,小图片获得小尺寸;使其变大 交换它们,并在下一个全尺寸图片时发生切换,BitVoice 立即请求(RTCP PLI)。
- 上传不足的浏览器停止发送其最大尺寸;查看者随后获得仍在传输的最大尺寸。
- 声音是房间的会议,如往常:加入呼叫房间的浏览器电话,任何从电话拨打房间的人都可以听到并被听到。拨入的视频电话看到谁在说话。
- 带有 PIN 的房间在页面上要求输入 PIN。页面需要登录 BitVoice。
共享屏幕:按 共享我的屏幕 并在浏览器的自己的选择器中选择一个屏幕、一个窗口或一个浏览器标签页。房间中的每个人都可以看到它作为大图像,在您的名称下,文本保持清晰(当网络不足时,图像速率会降低)。您不需要先加入摄像头。 停止共享 或浏览器自己的 停止共享 条结束它。
- 一个房间一次显示一个共享屏幕:当有人共享时,其他人的按钮会等待,并显示谁正在共享。共享屏幕不计入 16 个摄像头。
- 可以使用 设置为大图像 将其他人设置为大图像,就像摄像头一样;屏幕保持在房间中。
- 只有屏幕的图像,从不播放其声音:房间的声音保持为会议。
- 不能共享屏幕的电话(大多数电话浏览器)显示灰色按钮。桌面电话和其他视频电话拨入房间不会看到共享屏幕;它们看到谁正在说话。
广播和扩音器
/paging广播可以通过多个电话同时进行:拨打一个广播号码,每个电话在其自身的扬声器上自动接听。可用于对仓库、学校、商店进行公告。
设置分页组
- 在 分页 (章节 35) 上按 添加分页组 并给它一个号码(默认为 800)和一个名称。
- 选择电话。设置为扩音器的扩音器(类型 扩音器)也可以作为成员。
- 可选地,一个 多播 地址和端口。
多播
多播 也将页面发送到多播地址和端口(239.0.1.10:5000),以 G.711 µ-law 格式,这些扩音器和许多桌面电话可以在不需要呼叫的情况下监听。一个组可以只有多播地址。它只在一个网络上工作:路由器不会传递多播,除非它们被设置为这样。
分页和对讲
| 分页 | 对讲 | |
|---|---|---|
| 谁可以听到 | 组中的所有人 | 一个扩展 |
| 可以回应 | 否,一种方式 | 是,双向 |
| 如何 | 拨打组的号码 | *80 和扩展号 |
不自动接听的电话不会在几秒钟内接听分页,因此没有自动接听的电话永远不会阻止分页。一些电话需要在其自身设置中允许自动接听(对讲)。
热桌
/phones热桌是共享电话,当有人登录时,它就会变成该用户的电话:适用于员工没有固定的办公桌的办公室。通过在电话设置为的分机(例如900号桌3)中打开热桌来创建一个热桌。
登录和退出
- 在电话上拨打
*33并等待音调。 - 输入您的分机号和#,然后等待音调。
- 输入您的语音信箱PIN和#。上升音调表示您已登录;下降音调表示登录被拒绝。
从那时起,呼叫您的分机将同时呼叫此热桌和您的其他电话,您从热桌发起的呼叫将显示您的号码和名称,并在费用中计算为您的呼叫。登录到另一个热桌将移动到那里。*34退出登录。五次错误尝试将锁定热桌10分钟。
管理热桌
在电话 (章节 4)中,热桌显示谁登录到了哪里;管理员可以登录(无需PIN)或退出。代码和每天签出时间在设置中。登录信息在重启后保持。
酒店和叫醒电话
/hotel##叫醒电话 任何人都可以预订叫醒电话:客人、夜班、值班人员。从他们自己的电话,他们拨打 *62:BitVoice 说已经设置的号码(如果有),然后他们输入时间作为四位数字 (0630),或按星号取消。酒店 (章节 37) 管理员可以为任何扩展预订一次或 每天 的叫醒电话。
电话响起时,系统会播放其名称;接听后,会听到“早上好,这是您的叫醒电话”(在 声音 (章节 20) 中设置的叫醒提示,以客人或分机的语言播放)。如果没有接听,系统会再次尝试(最多尝试 3 次,间隔 5 分钟,均可在设置页面中配置),并在最后一次尝试后,可以呼叫 接待 分机。在多个服务器的情况下,只有一个服务器会进行叫醒电话。
客房
在每个房间的电话的分机上启用 客房 功能。在 Hotel 中,每个房间都会显示其客人、叫醒电话和房间状态,并带有 入住 和 退房 按钮。
- 空置房间: 没有客人入住的房间只能呼叫分机和紧急电话。紧急呼叫始终有效。
- 退房清除: 删除房间的语音信箱并取消其叫醒电话、转接和勿扰设置,准备好迎接下一位客人。
- 客人的语言(来自入住信息)是房间提示语音的语言。
- 房间状态: 客房服务人员从房间电话中拨打
*68和一个数字(例如*683);酒店系统决定每个数字的含义。
酒店系统(PMS)
- FIAS:BitVoice 通过其地址和端口连接到酒店系统的 FIAS 接口(Oracle Opera 和许多支持 FIAS 的系统)。它接收入住、房间变更、退房和唤醒预订,并发送唤醒结果、房间状态和呼叫费用。在链接断开期间,应发送的内容将等待并在链接恢复时发送;页面指示链接状态。记录遵循 Oracle 的 FIAS 2.20.23 规范:BitVoice 将自己描述为电话系统(IF PB),呼叫费用是直接费用(PT C),金额以货币的最小单位表示,拨打的数字不带 + 或空格,唤醒结果重复预订的时间(到秒),以便酒店系统可以将其与自己的请求匹配。
- REST API:酒店系统调用
POST /api/hotel/rooms/<room>/checkin(名称、帐户、语言)、/checkout和PUT /api/wakeups/<room>,使用 设置、自动化 中的 API 密钥。费用以 JSON 格式发布到您指定的地址。 - 收费呼叫:从入住房间拨打的外部呼叫将被计入客人的账单,按照干线的费率(来自 费用 (章节 54))加上 加价。
每个电话的联系人
/contacts联系人是公司目录:供应商、客户和其他办公室的人员会频繁呼叫。每个电话都将其列在分机旁边,当这些号码呼入时,电话和来电卡将显示联系人的名称(当提供商发送无名称时)。一个号码无论如何书写都可以匹配:+1 212 555 0100和2125550100是同一条线。
添加联系人
添加联系人一次添加一个联系人,可以有多个号码(工作、移动、家庭、其他)。导入需要将电子表格保存为CSV文件,第一行命名列:名称、公司、工作(或电话)、移动、家庭、其他、电子邮件、备注。BitVoice首先检查整个文件,然后指出哪些行有错误;如果联系人名称与现有联系人相同,则更新现有联系人,而不是添加两次;替换所有联系人从头开始创建列表。导出将列表下载为CSV文件。
在桌面电话上
通过电话 (章节 4)设置的电话(配置)无需额外设置即可获取目录:
- Yealink:一个名为“公司”的远程电话簿,每小时刷新一次。
- Grandstream:每小时下载电话簿。
- Polycom:目录文件,在电话启动时读取。
- Snom:列表写入电话设置,因此在电话下次检查设置时更新。
在浏览器电话中
联系人在拨号盘下找到一个名称或号码并准备呼叫。
从 Microsoft 365 或 Google Workspace
BitVoice 可以将联系人与组织目录保持同步:目录中具有电话号码的每个人,以及共享联系人(Exchange 的组织联系人或 Google 的共享域联系人)。在 设置 (章节 14) 中, Microsoft 365 和 Google Workspace ,选择服务,提供所需信息,并按 检查现在 :它将登录,计算人员数量,并指出哪些扩展与人员的电子邮件匹配。保存,然后在半分钟内填充联系人;然后每半小时更新一次,或者使用 现在同步联系人 立即更新。
Microsoft 365 (应用注册;您需要能够授予管理员同意):
- 在 Entra 管理中心, 应用注册 , 新注册 :命名为 BitVoice,单租户,无重定向地址。
- API 权限 , 添加权限 , Microsoft Graph , 应用权限 :
User.Read.All,OrgContact.Read.All和Calendars.ReadBasic。然后 授予管理员同意 。 - 证书和密钥 , 新客户端密钥 :复制其值(仅显示一次)。
- 在 BitVoice 中:目录(租户)ID,应用(客户)ID 和密钥。密钥会过期(Microsoft 提供最长两年的密钥):当它过期时,卡片将指出密钥被拒绝;创建一个新密钥并粘贴它。
Google Workspace (服务账户;您需要是超级管理员):
- 在 Google Cloud 中的一个项目中:启用 People API 和 Google Calendar API ,创建 服务账户 ,并为其添加 密钥 (JSON)。
- 在 Google Admin 控制台中, 安全 , 访问和数据控制 , API 控制 , 域范围委托 , 添加新 :服务账户的客户 ID,具有以下范围
https://www.googleapis.com/auth/directory.readonly,https://www.googleapis.com/auth/calendar.freebusy。 - 在 BitVoice 中:密钥文件,以及服务账户要模拟的管理员的电子邮件地址。
接收以下内容:
- 一个人的工作电话和移动电话、姓名、电子邮件以及他们的职务和部门作为联系人的备注;组织的名称作为他们的公司。没有电话号码的人将被排除(联系人需要一个号码);已关闭的帐户将被排除。
- 来自服务的联系人将被标记为其名称,并在那里进行更改:在此处更改或删除一个联系人将被拒绝,因为下一次同步将撤消它。在此处创建或从电子表格导入的联系人将保持不变。
- BitVoice 只读取。其访问权限是上述只读权限,并且密钥或密钥存储在其他机密中:查看者永远不会看到它,并且 Git 导出将其排除在外。
日历和请勿打扰
/extensions一个分机可以遵循其人员的日历:在会议和休假期间,其呼叫将转到语音邮件,或转发到另一个分机或移动电话,而不是响铃一个无人接听的电话。同时,铃组将呼叫其他人,而在队列中,代理将显示为 离开。
在分机中,日历和请勿打扰,粘贴日历的私人地址:
- Outlook:设置,日历,共享日历,发布日历;选择日历并 "可以查看所有详细信息",然后复制 ICS 链接。
- Google 日历:设置,左侧的日历,然后 秘密地址(iCal 格式)。
检查 立即读取并列出下一次繁忙时间。BitVoice 每 5 分钟读取每个日历一次。时间休假(全天事件和 Outlook 的 "外出办公")始终计算;会议在 会议计算为繁忙 启用时计算;标记为免费的事件永远不会计算,也不会计算已取消的事件。重复会议,包括跳过和移动的事件,将被理解。如果日历无法读取,Health 将指出这一点。
现在请勿打扰 将停止分机响铃,直到关闭,日历中说什么无关紧要。分机列表显示谁离开以及离开的时间。
私人地址的作用类似于密码:任何拥有它的人都可以读取该日历,因此它与其他机密一起存储。
同时每个日历:Microsoft 365 和 Google Workspace
BitVoice 可以从 Microsoft 365 或 Google Workspace 读取每个人的日历,而不是每个分机的私人地址:在 设置 (章节 14) 中设置一次,Microsoft 365 和 Google Workspace(请参阅 联系人 (章节 38) 以获取步骤),并启用 日历指示谁不在。每个分机通过其 电子邮件 匹配到其人;具有私人地址的分机使用其私人地址。分机的设置在此处适用(会议计算为忙、忙时,呼叫),就像私人地址一样。
- Microsoft 365 将会议标记为时间段:标记为“不在办公室”的会议计算为时间段;暂定的会议和标记为“空闲”或“在其他地方工作”的时间永远不会阻止电话铃声。私人会议显示为“正在开会”,而不显示其标题。
- Google Workspace 提供忙碌时间,而不说明原因,因此它们始终计算为会议。
- 日历每 5 分钟读取一次,并在设置更改时立即读取。电子邮件未知的分机在其日历部分中指出。
移动应用程序
BitVoice 的 iPhone 和 Android 应用程序使移动电话成为一个分机的电话。它像桌面电话一样响铃,在电话自己的呼叫屏幕上,即使应用程序关闭。
设置推送
关闭的应用程序通过推送消息唤醒呼叫。在 设置 (章节 14) 中的 移动应用程序 中选择一个:
| 推送 | 您需要 |
|---|---|
| 推送中继 | BioDream 的中继(带有托管或支持)或您自己的 bvpush:其 中继地址、密钥 ID 和 密钥 |
| 自己的应用程序 | 您自己的构建:对于 Apple,团队 ID、包 ID、密钥 ID 和 密钥(.p8);对于 Google,Firebase 服务帐户(JSON) |
将 应用程序使用的地址 设置为此服务器的 https 地址,如从任何地方访问它,而不仅仅是办公室。
配对电话
- 打开分机并按 添加电话。
- 在应用程序中扫描二维码。代码有效一次,十分钟。
当呼叫到来时
BitVoice 唤醒应用程序;它连接,响铃在电话自己的呼叫屏幕上,并像分机的其他电话一样被回答:呼叫组和队列与分机的其他电话一起响铃。分机页面列出了其配对的电话,每个 可以被唤醒进行呼叫,何时最后看到和最后唤醒,以及任何推送问题。 解除配对 立即停止电话响铃,适用于丢失的电话。
在通话中
应用程序是一个完整的扩展,而不仅仅是一个拨号器:
- 转接 呼叫者到另一个扩展或外部号码(呼叫屏幕上的转接或应用程序按钮)。到停车号码,它将呼叫停放在那里。
- 保持 和取回,从呼叫屏幕或应用程序;被保持的呼叫者将听到您在那里设置的保持音乐。
- 第二个呼叫:在第一个呼叫被保持时拨打,并在它们之间切换。
- 按键 音(DTMF)在呼叫期间,以及 静音。
其他选项卡
- 最近通话: 最近的来电和去电,最新的在最上面,点击回拨(未接来电突出显示)。
- 语音信箱: 每条消息都有其转录 (章节 29)内容,如果AI可以转录,则显示转录内容,播放、回拨或删除。
- 团队: 显示谁是空闲的、谁正在通话、谁正在响铃或谁不在(忙灯),以便呼叫或转接当前通话。
- 联系人: 公司目录,用于查找姓名并呼叫。
- 聊天: 员工聊天(聊天和状态),显示同事的状态和直接消息,以及团队房间,所有这些都在电话内。新消息在应用程序在后台运行时显示为通知,点击通知打开聊天界面;如果应用程序已关闭,则通过与电话相同的推送方式接收消息。
- 加入视频房间: 选择一个视频房间 (章节 34)(它列出了所有房间以及每个房间当前的参与人数)。它会在电话上打开,电话继续在下面运行,您可以作为自己的分机加入:无需管理员登录。第一次加入时,电话会询问相机权限。离开或Android上的Back按钮会返回到电话界面;房间的声音会保持为电话上的通话,直到您挂断。电话会将房间显示为自己的通话界面上的视频通话,直到您退出房间。
- 您发起的通话也会进入电话自己的通话系统(iPhone上的CallKit,Android上的Telecom),因此蓝牙、汽车或手表都可以显示这些通话,移动来电也会知道这些通话。
实时转录在呼叫中
启用 实时转录呼叫 (设置 (章节 14),AI)后,呼叫的每一方都将被实时转录并在电话上显示。音频将在呼叫期间发送到语音转文本服务(在您自己的计算机上,如果已设置)或 AI 服务。它与 911 实时转录 (章节 13) 相同,用于普通呼叫。
视频呼叫
/settings当呼叫中的两个电话都发送视频(视频桌面电话、软电话、视频门铃)时,图像直接通过 BitVoice 传递。无需设置:除非 设置 → 视频呼叫 关闭,否则默认启用。
- BitVoice 以原样中继视频,每个电话使用自己的端口,因此电话永远不会知道对方的地址。具有共同的编解码器(几乎所有视频电话都支持 H.264)时,它永远不会解码视频;没有共同的编解码器时,它可以转换(见下文)。当它们对同一个编解码器使用不同的编号时,BitVoice 会在传输过程中重新编号。
- 图像加密(SRTP)传输到支持加密音频的电话。
- 电话请求新图像(在丢失数据包后)可以立即恢复图像。
- 在呼叫过程中打开摄像头(软电话的视频按钮)也可以正常工作:首先询问对方电话,并在对方同意后开始传输图像。
- 无视频的电话或呼叫外部号码仅接收音频。在保持或停车时,图像会暂停,并在呼叫恢复时恢复。转接后,仅当新方也发送视频时,图像才会继续传输。
- 视频使用的网络带宽远大于音频(每个呼叫每方向约 0.5-2 Mbit/s):在慢速链接和媒体端口范围内要考虑这一点。
转换视频
支持共同视频编解码器的电话和应用程序可以直接交换视频。当两方没有共同的编解码器(例如,仅支持 H.264 的桌面电话和仅支持 VP8 的浏览器)时,可以在 设置 中启用 在 H.264 和 VP8 之间转换视频:BitVoice 将提供两个编解码器,以各自的编解码器回应每个方,并使用 ffmpeg 进行转换,ffmpeg 必须安装在服务器上(使用 apt install ffmpeg、brew install ffmpeg 或提供其路径)。转换大约需要一个处理器核心,并增加一点延迟,因此默认情况下禁用,只在需要时使用。设置会指出是否找到 ffmpeg。
传真:发送和接收,传真机和模拟电话
/faxes传真机、模拟电话、门口电话和老式电话线通过 SIP 网关(或 BitVoice 计算机中的电话卡:请参阅 电话卡 (章节 6))连接:一个 ATA(Grandstream HT 系列,用于一个或两个模拟电话或传真机),或一个更大的网关(Patton SmartNode、AudioCodes MediaPack 和 Mediant)用于多个模拟端口、ISDN 线(BRI/PRI)或老式模拟电话线(FXO)。每个端口注册到 BitVoice 作为一个分机,类似于电话。
无需传真机接收传真。 在 传真 上添加一个传真号码(例如300),以及每个传真将发送到的电子邮件地址。然后,在呼叫路由 (章节 8)中将电话号码的呼叫发送到传真号码。BitVoice将像传真机一样接听,切换到T.38并接收传真;每个传真将成为一个PDF文件,保存在传真列表中(查看、PDF)并发送到电子邮件。传真中断将保留已接收的页面并显示中断信息。传真列表中每个传真将显示发送或接收机器的身份(如果与号码不同),以及页面传输的速度(14,400位/秒是最快的速度;如果传真机的传真在低速下持续失败,通常表示线路质量差)。这需要一个支持T.38的提供商(大多数提供商都支持);以声音形式发送的传真无法通过这种方式接收。使用T38Fax(一个传真运营商)进行测试:使用其用户名和密码注册到sip.t38fax.com,端口5080(UDP);允许从其网络(8.34.182.0/24和8.20.91.0/24)通过任何防火墙到达BitVoice。
发送传真。 在 传真 上,发送传真:选择传真号码、输入发送到的号码、写入备注(如果需要;它成为第一页)并添加文档。文本文件和图片(PNG、JPEG、GIF)在所有地方都有效。PDF 需要服务器上的 poppler (apt install poppler-utils、apk add poppler-utils、brew install poppler);Word、Excel、OpenDocument 和 RTF 需要 LibreOffice。页面指出服务器可以执行哪些操作。每个页面都有一个标题行,类似于传真机打印的内容:时间、传真号码的名称、其标识和页数。呼叫从标识的数字发出(+1 212 555 0300 呼叫 +12125550300),或从传真号码本身发出,当标识不是一个号码时。页面大小为北美的信纸,在其他地方为 A4,从设置中的国家确定。
BitVoice 通过您的外呼路由呼叫该号码,就像分机一样,并以线路支持的最快速率发送(14,400 位/秒,如果线路质量差,则更慢)。来自同一个传真号码的传真一次发送一个。忙线或未接电话将在 5 分钟后重试,总共三次。已发送的传真与接收到的传真一起列出:已发送、等待发送、失败(带有 再试一次)或 部分发送,当线路在发送部分页面后中断时。
Email to fax. Below the list, set up a mailbox for BitVoice to read (IMAP over TLS, port 993; for Google and Microsoft mailboxes use an app password), then Test and Save. Anyone allowed to send writes to that mailbox with the fax number in the subject (Fax 212 555 0199), or to a plus address (fax+2125550199@example.com) if the mail server takes them. Attachments become the pages and the email's own words the cover note (the signature and quoted mail are left out). It goes from the fax number that lists the sender: its Email each fax to addresses may always send, and May also send faxes by email adds others (whole addresses, or @example.com for a domain). The sender gets an email when the fax has gone through, or why it could not.
电子邮件很容易伪造,因此 BitVoice 仅在您的邮件服务器确认消息确实来自发送者的域时才发送传真(DKIM、SPF 或 DMARC,在其添加的 Authentication-Results 行中)。其他消息将被丢弃,不会回复。仅当邮件箱无法接收外部邮件时,才切换 接受发送者域未验证的邮件。
传真机在网关上。BitVoice 通过 T.38(互联网传真标准)传输传真:当网关听到传真音时,它会将呼叫切换到 T.38,BitVoice 会要求对方(您的提供商或另一个网关)也切换,然后在它们之间传递传真。如果对方不支持 T.38,呼叫将保持在 G.711 上,传真将作为声音传输,这在良好的网络上可以正常工作。实时呼叫显示 传真(T.38),直到传真传输完成。
为了确保传真可靠:
- 在网关上使用 T.38 并选择支持它的提供商。
- 将端口的扩展设置为 模拟适配器端口(扩展,类型):BitVoice 然后只提供 G.711,这是以声音形式发送的传真所需的。
- 在网关的传真端口上:传真模式 T.38,只有 PCMU 或 PCMA,线路回声消除器关闭,呼叫等待关闭,并且具有固定、高的抖动缓冲区。
收件箱:网页聊天、WhatsApp 和 Messenger
/inbox收件箱 Inbox (章节 43) 中包含所有书面对话的列表:网站上的聊天框、WhatsApp、Facebook Messenger 和 文本消息 (章节 44)。任何登录网页界面的用户都可以回答;第一个回答的人占用对话(任何人都可以使用 回答者 将其转移),关闭 将其存放,直到对方再次写入。未读对话被计数,列表会自动刷新。
网站上的聊天框
在 渠道 下,开启 网页聊天,选择其标题、颜色和第一行,并将显示的代码行放入网站的页面中:
<script src="https://pbx.example.com:8443/webchat.js" async></script>
它在每个页面的角落绘制一个聊天按钮;访客可以输入消息(如果需要,可以输入姓名),并看到您的回答。对话保持在他们的浏览器中,因此在他们在页面之间移动时会继续。列出 仅在这些网站 下的网站,以便聊天框仅在这些网站上运行。访客必须从互联网上访问此服务器的地址,并且浏览器信任其证书 (Let's Encrypt (章节 14))。BitVoice 最多接受来自同一地址的 10 个新聊天会话,时间间隔为 10 分钟。
使用 Meta 的 Cloud API 的 WhatsApp Business 号码。在 Meta 的开发者网站上,创建一个带有 WhatsApp 的应用程序,添加您的号码,并创建一个具有永久访问令牌的系统用户。在 渠道 下,开启 WhatsApp,并提供 电话号码 ID 和 商业账户 ID(均来自 API 设置)、访问令牌 和应用程序的 应用程序密钥,然后保存。在应用程序的 WhatsApp 配置中,设置 webhook:BitVoice 显示的回调地址和验证令牌,订阅 *messages*。
WhatsApp 允许您在客户最后一条消息后 24 小时内自由回答;之后,它仅接受在 WhatsApp Manager 中批准的 消息模板。回复框变成模板选择器:选择模板(它列出您的帐户模板,包括语言和类型)、填写其值({{1}}、{{2}} ...)、检查预览(客户将阅读的内容),然后 发送模板。无法填充的模板以灰色显示,附带原因:带有图片、视频或文档头的模板、头部中的变量或按钮链接、命名参数或代码按钮;以及尚未批准的模板。在 WhatsApp Manager 中创建模板;Meta 通常在几分钟内审查每个模板。
Facebook Messenger
对于 Facebook 页面:在 Meta 应用中添加 Messenger,连接页面并创建页面访问令牌。在 渠道 下,提供 页面 ID、页面访问令牌 和 应用程序密钥;然后设置 webhook(显示的地址和验证令牌),订阅 *messages* 和 *messaging_postbacks*。在对方最后一条消息后 24 小时内允许回复。从那时起到 7 天,Messenger 接受由人工代理撰写的回复(使用 Meta 的 *human agent* 标签:应用程序需要 Meta 的 Human Agent 权限,需要在应用程序审查中请求);自动问候永远不会发送。在 7 天后,收件箱不接受回复,直到对方再次写入。
每个 webhook 都使用应用程序密钥(Meta 的签名)进行检查,然后 BitVoice 才会相信它;Meta 发送的消息如果发送两次,则只保留一次。图片、语音笔记和其他附件显示为其类型("[image]");在 Meta 的应用中打开它们。
自动问候,当设置时,立即回答每个新对话的第一条消息。
商业短信(SMS)
/texts从 文本 中发送和接收来自您的商业号码的文本消息。文本消息通过短信提供商发送。内置提供商:TextMagic、Twilio、SignalWire、Telnyx、Bandwidth、Vonage、Plivo、Flowroute 和 VoIP.ms,以及 您的 webhook,用于任何其他服务或网关。可以同时使用任意数量的提供商帐户;每个号码指定哪个提供商负责其文本消息。
设置
- 在提供商的门户中,找到帐户的 API 详细信息。表单要求提供提供商所需的确切信息(Twilio:帐户 SID 和身份验证令牌;Telnyx:API 密钥;Bandwidth:API 用户、密码、帐户 ID 和消息应用程序 ID;SignalWire:还需要您的空间地址),并指出在哪里可以找到它们。
- 在 文本 中,短信设置,使用这些信息添加提供商,然后保存。BitVoice 显示一个用于接收文本消息的地址;在提供商中将其设置为接收消息的回调、webhook 或消息 URL。对于 VoIP.ms,请在末尾添加
?from={FROM}&to={TO}&message={MESSAGE}&id={ID}。发送到同一地址的传递回执将被忽略。BitVoice 必须从提供商的互联网上可达。 - 添加您要发送文本消息的每个号码(带有国家代码)、负责其文本消息的提供商以及在收到文本消息时要通知的扩展号。
US 10DLC
美国运营商会阻止来自未注册的普通商业号码的短信。请在您的短信提供商处注册您的品牌和活动;Texts 上的检查清单跟踪它们的状态,并在您的示例消息缺少运营商预期的退出词时发出警告。
会话
每个会话显示谁是对方(来自联系人)、未读短信和对话线程。输入发送;计数器显示长消息需要多少个短信。当有人回复 STOP 时,直到他们回复 START 之前,无法再向该号码发送任何内容。接收到的短信也会作为通知出现在 BitVoice 中。
转接简报
/settings因此,呼叫者不必重复自己:在设置(设置,AI)中打开 转接简报 时,当呼叫被转接时,BitVoice 会为转接到的人员写一份两句的呼叫摘要(谁正在呼叫,想要什么,已经承诺了什么)。它出现在他们的浏览器电话中,带有呼叫铃声,在 实时呼叫 (章节 46) 中,以及作为他们的桌面电话屏幕上的短信(适用于显示 SIP 消息的电话)。
当 AI 接待员将呼叫者转接给人员时,它的工作原理相同:简报来自呼叫者告诉助手的内容。
它需要 AI 服务和语音转文本模型(设置,AI),并将呼叫的音频发送到该服务以写出摘要。摘要需要几秒钟,因此可能会在电话开始铃声后立即出现。
客户和洞察
知道谁呼叫和如何进行:实时呼叫和历史、客户时间轴、CRM、录音和同意、质量、成本和呼叫者 ID 声誉。
实时呼叫
/calls实时呼叫显示每个正在进行的呼叫,随时更新:谁呼叫谁、呼叫持续时间、其编解码器和质量。
管理员可以执行的操作
| 操作 | 含义 |
|---|---|
| 挂断 | 结束呼叫的两端 |
| 开门 | 对于门站呼叫 |
| 暂停录音 | 对于卡号:暂停的部分在录音中是静音的,并在历史记录中标记(呼叫录音 (章节 51)) |
| 监听 | 静默地听到呼叫 |
| 耳语 | 只与代理人交谈;呼叫者听不到 |
| 强插 | 加入呼叫;每个人都能听到你 |
要监听、耳语或强插,请按 监控,在 从电话 下选择要使用的电话,然后按 呼叫我:您的电话将响铃,当您接听时,您将加入呼叫。您可以在呼叫过程中在监听、耳语和强插之间切换。
其他显示内容
- 来自外部呼叫的呼叫者卡片(来自您的 CRM 或以前的呼叫;请参阅 CRM (章节 49))。
- 转移呼叫的简报(转移简报 (章节 45))。
- 呼叫者 ID 的判定:已验证、部分验证 或 未验证(垃圾保护 (章节 56))。
- 如果有多个服务器,则其他服务器上的呼叫也将显示(只读):挂断或在拥有呼叫的服务器上监听。
当呼叫结束时,它将移动到 呼叫历史 (章节 47)。
呼叫历史
/history每个完成的呼叫:谁呼叫谁、什么时候、持续多久以及如何结束。可以对列进行排序、播放录音(卡号的暂停将被标记)以及以 CSV 格式下载列表。记录保留的时间在设置中设置,呼叫录音;法律保留 (章节 73) 将使其保留更长时间。
如何路由
在每个呼叫结果下,如何路由 列出了决定呼叫去向的内容,以简单的语言和顺序表示:接收呼叫的入站路由,是否有开放或关闭的时间表,切换的状态,路由脚本的选择(或其回退的处理),菜单中按下的键,哪些人不在,哪些人没有连接电话,哪些人没有接听,使用的出站路由和中继(以及健康判断器移动到其他中继之后的中继),通话欺诈防护的判断,以及,对于记录的呼叫,其各方受不同同意规则约束时,应用了哪条规则。
质量、声音和加密
质量 列显示每个已接听呼叫的评分(MOS,满分 5)和两个标记(当适用时):
- 无来自 一侧的声音:呼叫已连接,但从该电话或提供商那里永远没有收到任何声音(呼叫时间少于 5 秒、传真、保持呼叫和分页被排除)。请参阅 呼叫质量 (章节 53) 以了解要检查的内容。
- 未加密:BitVoice 请求加密(SRTP),但该侧没有加密回答。 加密 表示声音已与每个发送任何内容的一侧加密。如果要拒绝提供商的未加密呼叫,请在其中继上打开 要求加密。
转录和搜索
启用 AI 并打开 转录记录呼叫(设置,AI)后,每个记录呼叫都会被写出,包括简要摘要和操作项:有人同意或被要求做什么。每个呼叫的一侧都从录音中单独写出,因此转录显示谁说了什么以及何时说。录音旁边的转录按钮打开它;管理员也可以转录单个呼叫或再次转录一个呼叫。
搜索所说内容 根据其转录、摘要和操作项中的单词查找呼叫。只有记录呼叫才会被转录。转录与其录音一起删除,阅读或搜索转录会在审计日志中记录,就像播放录音一样。
客户时间线
/timeline客户时间线显示过去一年中与一个电话号码相关的所有内容,按最新顺序排列,因此无论谁接听都知道整个故事。
显示内容
| 项目 | 显示内容 |
|---|---|
| 呼叫 | 接听者、时长、录音、录音摘要和转录 |
| 语音信箱 | 摘要 |
| 文本消息 | 双向对话 |
| 回呼 | 请求和是否完成 |
| 备注 | 团队自己的备注 |
电话号码匹配:+1 212 555 0100 和 2125550100 被视为相同的号码。
打开方式
从呼叫者卡片(时间线)、联系人、呼叫历史中的来电、文本对话或在 时间线 (章节 48) 顶部输入号码。
备注
管理员可以 添加团队备注:它显示在所有人的时间线上,包括谁写的和何时写的,并可以被删除。
CRM:呼叫者卡片和通话日志
/settings在设置 (章节 14)中连接CRM,CRM。它可以与任何具有Web地址的系统一起工作,无需为每个产品编写代码。
呼叫者卡片
外部呼叫响铃时,实时通话显示卡片:谁(来自您的CRM或分机名称)、90天内呼叫的频率、任何回呼 (章节 30)他们正在等待,以及他们最后一次转录通话的摘要。浏览器电话向接听者显示更短的卡片:谁、过去的通话和等待的回呼,但不包括其他人的通话摘要。
对于名称,请设置 查找地址:BitVoice 使用呼叫者的号码代替 {number} 发送 GET 请求(GET),并发送 查找头 以其值(vault 引用有效),并期望带有名称、公司、url 和注释的 JSON;404 表示未知。答案将保留五分钟。 在 CRM 中打开链接 将在卡片上放置一个指向呼叫者的链接。使用 查找 尝试在保存之前尝试一个号码。
CRM 的自定义应答
大多数 CRM 根据自己的格式应答搜索结果,通常是一个匹配列表,而不是 BitVoice 的 {"name": ...}。打开 应答字段,指定每个部分的位置,使用点表示法:名称进入对象,数字进入列表,因此 list.0.name 是第一个匹配项的名称。联系人链接 可能是 CRM 提供的链接路径,或者包含路径的 Web 地址,例如 https://crm.example.com/#Contact/view/{list.0.id}。空字段读取 BitVoice 自己的名称。如果搜索没有找到任何人,则与 404 相同:卡片显示呼叫者未知。尝试使用 查找 按钮测试一个号码,然后保存。
例如,EspoCRM(已测试过的真实 EspoCRM):创建一个 API 用户(管理,API 用户,通过 API 密钥进行身份验证),并分配一个可以读取联系人和账户的角色,然后设置:
- 查找地址:
https://crm.example.com/api/v1/Contact?select=name,accountName,description&maxSize=1&where%5B0%5D%5Btype%5D=equals&where%5B0%5D%5Battribute%5D=phoneNumber&where%5B0%5D%5Bvalue%5D={number} - 查找头:
X-Api-Key,其值为 API 用户的密钥 - 应答字段:名称
list.0.name、公司list.0.accountName、备注list.0.description、链接https://crm.example.com/#Contact/view/{list.0.id}
EspoCRM 以国际格式(+15405550117)存储号码,就像 BitVoice 传递的那样。其他 CRM 以类似的方式使用自己的搜索地址和字段名称;请在其 API 文档中检查其应答的格式,或者使用 查找 按钮,其消息指示找到了什么。
呼叫日志
设置 呼叫日志地址 和 签名密钥,每次呼叫结束时都会将其发送到该地址(事件 call.ended),并在转录后再次发送其摘要、操作项和转录内容(call.summarized),以及每个预订的回呼(callback.new)。每个 POST 请求都包含 X-BitVoice-Event、X-BitVoice-Timestamp 和 X-BitVoice-Signature:sha256= 后跟 HMAC-SHA256,使用密钥、时间戳、点和正文计算。若发送失败,会尝试四次,间隔约一分钟;若仍然失败,健康 状态会显示出来。 发送测试事件 检查地址和密钥。
呼叫洞察力,用于主管
/quality对于联系中心:关于呼叫情况的证据,供主管收听,而不是自动评分。
在呼叫的 转录 中,它是如何进行的 显示,仅从录音的声音来衡量:每一方的谈话时间,两方最长的时间,两方同时开始说话的频率,两方同时说话的时间,以及安静时间(长时间的沉默通常是保持或死气)。
启用 记录每次转录呼叫的结果(设置,AI)后,AI 还将读取转录内容,并指出呼叫者在开始和结束时的状态,并列出最多六个时刻:进行得好,查看(打断呼叫者,长时间保持,模糊的答案),未回答(呼叫者提出的未得到回答的问题),以及 承诺(有人说他们将要做的事情),每个时刻都有时间和所说的话,因此您可以直接跳转到那里。管理员可以在任何转录呼叫上使用 查看此呼叫 请求它。
在 呼叫质量 (章节 50) 上,对话,按接听者 将总结指定期间每个人的转录呼叫:他们的谈话份额,他们最长的时间,打断呼叫者的频率,安静时间,结束时呼叫者不满的呼叫,以及标记的时刻。使用它来选择要收听的呼叫,而不是排名人员。
指导笔记 是您对呼叫的评论,在您写下时:在 它是如何进行的 下,写下 时刻(1:05,或留空以表示开始),和 指导笔记,然后按 添加笔记。笔记按呼叫顺序列出,包括谁写的以及何时写的;管理员可以写入和删除笔记,查看者可以阅读它们以及转录内容,添加或删除笔记也将记录在审计日志中。它们与录音一起存储,因此录音的保留和法律保留也适用于它们。 指导笔记 在呼叫质量中按人员统计。
呼叫录制和卡支付
录制在 设置 (章节 14) 中设置, 呼叫录制: 关闭, 每个呼叫, 或仅记录标记为 记录呼叫 的扩展的呼叫。录制可以从 呼叫历史 (章节 47) 播放, 并且如果启用了 AI, 则会被写出和总结。
告知他人
某些地方需要所有参与通话的人知道通话正在被录制: 公告、蜂鸣和区域规则在录制同意 (章节 52)中。
卡支付(PCI DSS)
卡号不得保存在录制中。在呼叫者读出卡号之前,分机上的人员按下 *7;*8 恢复。实时通话 (章节 46)上的 暂停录制 执行相同的操作。暂停的部分在录制中是静默的,并在通话历史中列出,因此审计员可以看到暂停的位置和持续时间。
会议室
启用 录制会议室 的房间将被保存为整个房间的单个录制(会议室 (章节 34))。
保留时间
设置决定录制、通话历史和语音邮件保留的天数;较旧的项将在一小时内删除。任何处于法律保留 (章节 73)状态的项将无论其年龄如何而被保留。存档 (章节 72)可以在其他地方保留副本。
管理员和查看者可以播放录制并阅读转录;只有管理员可以转录通话或重新转录。播放录制或阅读其转录将被记录在审计日志中。
录音同意
/settings一些地方允许在一方知道的情况下录制呼叫;其他地方需要每个人都被告知或同意。在 设置 中的 呼叫录音 中,选择如何通知录制呼叫的参与者:
- 无通知。
- 公告:在呼叫被接听时,双方都听到通知(在同一位置录制,例如 "此呼叫被录制用于培训和质量"),并且仅在通知播放后开始录制。直到录制一个,播放三个哔哔声,Health 指出如此。
- 哔哔声:在呼叫被录制期间,每 15 秒向双方播放一个短音调。
规则 选择外部号码(呼入呼叫的呼叫者,呼出呼叫的被叫号码),最长匹配优先:例如以 1415 开头的号码(加利福尼亚州)公告,49(德国)永不录制,其他所有内容均按照上述方式。规则的 无通知 在不通知的情况下录制;永不录制 完全排除这些呼叫。分机之间的呼叫遵循主设置。
您的号码也算:规则同时匹配外部号码和您的号码(呼入时被叫号码,您的来电显示),并且选择最严格的规则(永不录音优先于播报,播报优先于蜂鸣,蜂鸣优先于无提示)。因此,在需要所有方同意的地区,办公室会向其呼叫的任何人播报其号码。当各方受不同规则约束时,呼叫历史 (章节 47)中会显示应用的规则及其原因。
录音也可以在呼叫过程中使用暂停代码(卡支付)暂停。这些都不是法律建议:请检查您和您的呼叫者所在的法律法规。
呼叫质量
/quality过去一天、周、月或90天内的呼叫声音质量,从BitVoice在每个呼叫的每一侧接收到的声音来看。电话按其站点 (章节 12)(或“无站点”)分组,来自外部的呼叫按提供商的线路分组。
每个地方显示其通话、平均评分(MOS,满分 5 分:高于 4 分为良好,低于 3.6 分声音质量差)、未到达的音频包的比例以及抖动(不均匀延迟)。在下方,BitVoice 以明确的语言指出问题,例如 "总部网络上的数据包丢失:3.2% 的音频未到达,主要在 14:00 至 16:00 之间",以及需要检查的内容。柱状图显示按小时的音频丢失情况。
诊断比较同一通话的两个部分:来自该地点的电话音频和通过相同提供商的音频。当另一半音频到达干净时,丢失发生在本地,BitVoice 指出这一点;当两半音频都丢失时,本地不仅仅有问题,它指向共享的因素,即本系统的互联网连接。如果每个地方同时丢失音频,原因也是相同的。如何得出这个结论 列出了原因,步骤骤骤(通话质量规则,参见 安全 (章节 60),"BitVoice 如何决定")。通话次数少于三次的地点不予评估。每次通话的质量也在 通话历史 (章节 47) 中(质量列),以及在 实时通话 (章节 46) 中,当通话正在进行时。
一个连接但完全没有来自一方的音频的通话被单独计算,在 无音频 下,并且优先显示:这不是音频质量差,而是音频根本没有到达,几乎总是由于防火墙或 NAT 路由器允许 SIP 通过但阻止媒体传输。该地点的建议指出需要检查的内容(对于提供商,其媒体地址范围)。
费用和预算
/costsBitVoice根据您的提供商收费来计算每个呼叫的费用,并显示按部门、人员和中继线统计的当月支出,以及最昂贵的呼叫。
价格
在中继线 (章节 7)中,打开一个中继线并查看其呼叫价格。每个价格涵盖以某些数字开头的号码(如发送给提供商的号码,仅数字,因此英国为44,美国为1900),最长匹配获胜;没有数字的价格涵盖所有其他号码。提供每分钟的价格、每次接听呼叫的费用、计费步骤(60秒用于整分钟,6或1用于更精确的计费)和最低费用。呼叫入,按分钟适用于您需要支付的免费接听号码。预估费用在呼叫前检查号码。货币在费用中设置。
呼叫的费用在呼叫结束时固定,使用当时的价格;更改价格不会更改过去的呼叫。费用显示有多少次外呼没有价格。
部门和预算
为分机分配部门(在分机中)。在费用中,为每个呼叫或部门添加预算:当预算达到80%和100%时,在BitVoice中显示警报,并发送电子邮件到预算的地址和警报地址。
报警
外呼费用超过此金额在一小时内在外呼费用在一小时内超过该金额时触发报警:突然出现一系列昂贵的呼叫通常是通话费用欺诈(被盗的电话密码)的迹象:检查呼叫历史,然后禁用分机或中继线。
呼叫者ID声誉和品牌呼叫
/reputation电话公司运行垃圾邮件过滤器,可以将业务号码标记为“垃圾邮件可能”,或阻止它,然后几乎没有人会接听。呼叫者ID声誉监视您呼叫的每个号码,从您自己的呼叫中,并以简单的语言说明其表现:
- 接听:接听呼叫的比例,以及前一时期的比例。下降一半或低于20%是新标签的常见迹象。
- 立即挂断:在10秒内结束的接听呼叫。
- 被拒绝为垃圾邮件:运营商过滤器拒绝的呼叫(SIP 608)或被标记为不需要的呼叫(607)。一个608意味着该号码被标记。
- 大量使用:每天从一个号码发出超过约150个呼叫是机器人呼叫者所做的,过滤器会注意到。
呼叫次数少于20次的号码显示为无法判断。
您的外呼号码 为每个号码提供一个 名称(作为呼叫者的名称发送),一个 原因(呼叫原因)和一个 标志(一个 https:// 图片)。在启用 发送品牌 caller ID 的 trunk 上,标志和原因将作为丰富的呼叫数据(RFC 9796 Call-Info)发送;支持品牌呼叫的运营商将在被叫电话上显示它们。然而,大多数电话将显示来自 caller-name(CNAM)数据库的名称,这由您的提供商设置:请询问他们。 监视 将在 Health 上为被监视的号码添加一个警告,当其开始显示标签时。
该页面还说明了当一个号码被标记时该怎么做。
垃圾短信保护和 STIR/SHAKEN
/settings在美国和加拿大,呼叫开始的提供商签署其呼叫者 ID(STIR/SHAKEN):A 当它知道呼叫者可能使用该号码时,B 当它知道呼叫者但不了解号码时,C 当它仅传递呼叫时。您的提供商要么告诉 BitVoice 其结论(verstat),要么传递已签名的 Identity 标头,BitVoice 然后检查它:签名、它不超过一分钟旧、并且它命名了此呼叫的号码。结论显示为 已验证、部分验证、未验证 或 未验证,出现在实时呼叫和呼叫历史中。
在 设置 中的 垃圾短信保护 中,选择当呼叫者 ID 失败验证时发生什么(响铃、标记响铃或拒绝),当它没有验证时,以及当号码被保密时。标记的呼叫以 垃圾短信?(或您自己的标签)响铃,然后是呼叫者的名称。被阻止的号码 被拒绝;以 * 结尾的条目阻止一系列号码(+1900* 是每个美国高费率号码)。始终允许 的号码永远不会被拒绝或标记。在呼叫历史中,呼叫者旁边的阻止按钮将其添加到列表中;被拒绝的呼叫显示为 被阻止。
在任何分机的紧急呼叫后的一小时内,不会拒绝任何呼叫(被阻止的呼叫将带有标签),以防它是紧急服务正在呼叫回。来自 ESInet 或 CAMA 分机的 911 呼叫永远不会被拒绝或延迟,由于筛查。
BitVoice 不认识的呼叫者
呼叫者被认为是 已知 的,当其号码被 始终允许 ,在 联系人 (章节 38) 中,或者在过去一年内从这里拨出过电话,或者在过去 90 天内通过机器人测试。号码的匹配方式与其书写方式无关(带或不带国家代码,1,0 或 +)。在 BitVoice 不认识的呼叫者 下,选择对所有其他人的处理方式:
| 选择 | 呼叫者得到的结果 |
|---|---|
| 正常响铃 | 呼叫像其他呼叫一样响铃(默认) |
| 先进行机器人测试 | BitVoice 接听并说 "要连接,请按" 和一个数字,该数字每次呼叫都会改变。正确的按键将其转接到呼叫的目的地;任何其他按键或无按键(两次),将其转接到 机器人测试失败的呼叫者去向 或播放再见消息。机器人呼叫者不会按下按键 |
| 转接到其他地方 | 没有响铃:直接转接到选定的位置,例如语音信箱 |
机器人测试需要其自身的语音提示:在 声音 (章节 20) 中,录制或使用语音服务创建 筛选 提示和呼叫者语言中的数字 1 到 9。直到录制这些语音提示,呼叫将像往常一样响铃(呼叫者无法通过他们无法听到的测试),并且健康状态会指出这一点。通过测试的呼叫者将在 90 天内被视为已知呼叫者。测试会接听呼叫,因此呼叫者的提供商将从那一刻起开始收费,就像任何接听的呼叫一样。呼叫历史记录显示每个呼叫的结果(通过、失败、转接)以及原因轨迹指出发生了什么。
垃圾电话数据库
BitVoice 可以在呼叫响铃之前询问每个未知呼叫者的声誉服务。 通过 Twilio 使用 Nomorobo 填充 Twilio Lookup 中的 Nomorobo 垃圾电话评分(在 Twilio 账户中安装 Nomorobo 插件,然后输入其账户 SID 和身份验证令牌);任何其他以 JSON 格式响应的服务也可以使用:提供其地址,使用 {e164} (+12125550142)或 {number} (如提供商发送的),其中包含其判决结果(判决字段,点分路径),以及何时表示垃圾电话(一个分数大于或等于 垃圾电话评分,true,或 或当文本为 中的文本,例如 BLOCK)。选择对被判定为垃圾电话的呼叫者的处理方式:标记为垃圾电话,进行机器人测试或拒绝。
- 这些服务 每次查询收费 。已知呼叫者永远不会被查询,每个答案都会被保留一天(保留答案)。
- 一个缓慢或故障的服务永远不会阻止呼叫:在 最长等待时间 (除非您更改,否则为 1.5 秒)后,呼叫将像答案为 "不是垃圾电话" 一样响铃。
- 测试 现在询问它关于一个号码(并像任何查询一样被收费)。
阻止最后一个呼叫者
在不想要的呼叫后,从响铃的电话中拨打 *32 (功能代码 (章节 32)):最后一个外部号码在过去一天内响铃的扩展将被添加到阻止列表中,电话将朗读该号码。始终允许的号码不会被阻止,电话将指出这一点。每个号码都在审计日志中,包括谁阻止了它。
从您的呼叫中建议
BitVoice 读取过去 30 天的外部呼叫,以查找反复呼叫并立即被丢弃的号码:三个或更多呼叫,几乎所有呼叫都在 10 秒内结束,或者两个机器人测试失败,并且从未进行过真正的对话(某人说话 30 秒或更长时间)。已知号码将被排除在外。每个号码都附有原因; 阻止 将其添加到阻止列表中, 不是垃圾电话 表示它永远不会被建议。直到有人确认之前,任何号码都不会被阻止。
要检查证书与 STI 权威机构,请在 STI 证书权威机构 下粘贴其证书;没有它们,BitVoice 检查呼叫是否使用其命名的证书签名,但不检查谁颁发了该证书。
签署自己的呼叫
大多数提供商会为其客户签署呼叫。如果您的提供商允许签署(或您是运行 BitVoice 的提供商),请在分机(分机 (章节 7))上打开 签署呼叫者 ID 并提供 STI 证书(来自 STI 认证权威机构,带有您的服务提供商代码令牌)和其 私钥(P-256)。然后,通过该分机发出的每个呼叫都带有签名的 Identity 标头(ES256,如 SHAKEN 要求)。
- 证书地址(x5u) 是被叫方获取证书的地方。留空,BitVoice 将其发布在其公共地址(设置)上的
/stir/<trunk>.pem,然后必须从互联网上通过 HTTPS 访问它。 - 证明:自动给 A 当分机使用此系统的一个号码呼叫(路由号码或在分机或分机上设置的呼叫者 ID),B 当分机使用任何其他号码呼叫,C 对从外部转发的呼叫。或者将其固定为 A、B 或 C。
- 呼叫历史以 签名 A、B 或 C 标记每个签名呼叫。呼叫永远不会因无法签名而停止;原因在日志中。
运行 BitVoice
保持安全和运行:管理员和登录,安全,变化和更新,多个服务器,托管组织,编解码器,团队,导入,自动化和故障查找工具。
管理员
/users管理员是指登录此 Web 界面的用户。仅处理自己呼叫的员工使用员工门户,不需要在此处创建帐户(员工门户 (章节 33))。
角色
| 角色 | 可以 |
|---|---|
| 管理员 | 修改任何内容,播放录音,查看每个秘密字段的存在(但从不查看其值) |
| 查看者 | 查看所有内容,修改无内容;秘密被隐藏 |
更改角色或密码会立即使该用户在所有地方注销。
双步骤登录
每个人都可以为自己开启双步骤登录:设置 显示一个用于身份验证器应用程序的密钥;输入它显示的代码即可开启。从那时起,登录需要代码以及密码。关闭它需要密码。
单点登录
使用单点登录(设置),用户可以使用组织的帐户(Microsoft Entra,Google,Okta,任何 OpenID Connect 提供商)登录,并在首次使用时创建帐户。请参阅 单点登录 (章节 58)。
API 令牌
程序(Terraform,脚本)使用 API 令牌代替密码:在此页面上创建,仅显示一次,并可以随时撤销。每个令牌都是管理员或查看者。使用 指定代表的人 (用于 CAD)创建的令牌可以发送 X-BitVoice-On-Behalf-Of,其中包含用户的名称,记录将显示该人名旁边的令牌(911 呼叫 (章节 77))。
单点登录
单点登录允许人员通过任何 OpenID Connect 提供者(如 Microsoft Entra ID、Google、Okta、Keycloak 等)使用工作账户登录 BitVoice。离开组织后,他们在这里的访问权限也将被删除。
设置
在 设置 (章节 14) 中,单点登录:
- 在提供商处注册一个应用程序,使用此处显示的 重定向地址。
- 为提供商填写 设置常见的 颁发者;从提供商处复制 客户端 ID 和 客户端密钥。
- 命名提供商的 管理员组 和 查看组。 组声明 是提供商放置它们的位置(除非设置,否则为
groups)。 - 可选地更改登录页面上的 按钮文本。
- 启用 使用单点登录。
工作原理
- 此处创建的帐户是在第一次登录时创建的;组在每次登录时设置角色,因此在提供商处移动某人之间的组会更改他们在此处的角色。
- 不属于任何类型组的人将被拒绝,拒绝将记录在审计日志中。
- 如果 也允许密码 关闭,密码仅在此计算机上有效,因此提供商的中断永远不会将您锁定。
公司目录(Active Directory 和 LDAP)
BitVoice 可以读取您的公司目录,Active Directory 或其他 LDAP 服务器(OpenLDAP、Samba、389 Directory Server、FreeIPA):具有电话号码的人成为扩展,目录组填充环组,人们使用目录密码登录 Web 界面。 BitVoice 只读取目录;它永远不会写入目录。
连接
在 设置 (章节 14) 中,公司目录:
- 选择 Active Directory 或 OpenLDAP 或其他 LDAP 服务器:它设置要读取的属性(sAMAccountName 或 uid 用于登录名,displayName 或 cn、mail、telephoneNumber)。在其框中更改任何一个。
- 服务器:
ldaps://dc1.example.com(端口 636),或使用 StartTLS 启用的ldap://...。除非服务器是此计算机,否则纯 LDAP 将被拒绝,因为密码将以明文形式跨网络传输。当服务器的证书来自您的证书颁发机构时,在 公司证书颁发机构 中粘贴颁发机构。 - 读取帐户 和 其密码:允许读取人员和组的帐户(Active Directory 上的
reader@example.com)。密码可以是密钥保管库引用(设置,密钥保管库)。 - 基本 DN:人员和组的位置(
dc=example,dc=com)。 哪些人员 使用 LDAP 过滤器缩小范围;在 Active Directory 上,始终排除已禁用帐户。 - 测试 使用读取帐户登录并读取所有人,不更改任何内容:它显示找到的人数,具有号码的人数以及每个人的扩展号。
扩展和环组
- 启用 创建和更新扩展 时,每个具有号码的人都会获得一个扩展:号码的最后 保留数字(
+1 212 555 0123的 4 位是 0123;0 保留所有数字,必须为 2 到 8 位)。新扩展获得一个 SIP 密码和一个带有随机 PIN 的语音邮件;人员的名称和电子邮件来自目录。 - 目录拥有它创建的扩展:其号码、名称和电子邮件在每次同步时都遵循目录。其他所有内容(设备、转发、语音邮件设置)都由您拥有。
- 您手动创建的扩展永远不会被接管,除非它具有该人的名称或电子邮件。具有相同号码的两个人、其他人的扩展已经具有的号码或长度不正确的号码将在 查看 下列出,对于他们来说没有任何更改。
- 启用 关闭离开人员的扩展 时,目录创建的扩展将在人员离开、被禁用或丢失其号码时关闭,并在他们返回时重新打开。
- 从目录组填充环组:每行将组成员的扩展放入环组(在 Active Directory 上,嵌套组计数)。没有任何具有扩展的组将使环组保持原样。
- 目录每 读取间隔 分钟读取一次(默认为 60 分钟),并使用 立即同步 立即读取。每次更改内容的同步都是一个名为“公司目录同步”的 修订 (章节 61),因此可以撤消;最后一次同步的报告显示在按钮下方。
登录
启用 人员使用目录名称和密码登录 时,登录页面接受目录名称和密码以及 BitVoice自己的帐户:
- 管理员组 的成员作为管理员登录,查看组 的成员作为查看者(如果没有查看组,则为目录中的任何其他人)。组按名称(cn)或 DN 命名;在 Active Directory 上,嵌套组计数。没有此类组的人将被拒绝。
- 此处创建的帐户是在第一次登录时创建的,其角色在每次登录时都遵循组。它永远不会接管具有相同名称的 BitVoice 帐户。
- 空密码始终被拒绝(LDAP 将其视为匿名登录),禁用帐户无法登录,名称在传递给目录之前被转义。
- 可以像对任何其他帐户一样将双步登录添加到这些帐户中。
安全
/security互联网上的电话系统在几小时内就会被攻击:扫描器会尝试每个 SIP 端口的密码,并且被入侵的系统会拨打高费率号码。BitVoice 默认情况下具有多层防御以抵御这种攻击。
防止密码猜测
- 登录失败次数过多的地址将被暂时禁止(设置,保护):默认情况下,一分钟内十次失败将禁止该地址一小时。被禁止的地址将在 安全 (章节 60) 中列出,并可以解除禁止。
- 可信网络 永远不会被禁止:您的办公网络。
- SIP 密码是生成的,至少 12 个字符,每个分机一个。以一个分机身份登录的电话永远无法注册为另一个分机。
- 被禁止的扫描器将无法获得任何响应,因此它无法获得任何信息。
防止欺诈
- 分机只能在被允许的情况下拨打外部号码。
- 高费率号码将被拒绝,除非路由指定了它们。
- 通话欺诈防护 (下面)将在放置呼叫之前判断每个跨国呼叫。
- 费用 (章节 54) 将在预算和过度支出时发出警报:一小时内拨打大量呼叫到一个国家。
- 每个分机最多可以同时有四个呼叫(设置,保护)。
通话欺诈防护
在设置中打开 通话欺诈防护。然后,每个跨国呼叫(通过 +、00 或 011,以及与北美共享 +1 但为其他国家的地区,如牙买加,一个经典的通话欺诈目的地)将在放置之前被判断:
| 情况 | 执行操作 |
|---|---|
| 分机在过去 90 天内曾拨打过该国的呼叫 | 允许呼叫 |
| 分机在 90 天内首次拨打该国的呼叫 | 允许呼叫并记录 |
| 分机在 工作时间 之外或通过外部方式(如拨入、转接)首次拨打该国的呼叫 | 请求 PIN (如果未设置,则拒绝) |
| 分机在 10 分钟内拨打了太多跨国呼叫 | 拒绝呼叫 |
| 分机在密码猜测攻击期间首次拨打跨国呼叫(一小时内三次连续失败或禁止) | 拒绝呼叫 |
| 紧急号码 | 始终允许呼叫 |
始终允许的国家 (如 44 的国家代码)和 异常 (分机因出差而被豁免一天)将取消 "首次呼叫" 和 "工作时间之外" 的限制;它们永远不会豁免短时间内的多个呼叫或攻击,因为被盗的密码看起来是被批准的。如果无法读取呼叫历史记录,防护无法判断呼叫是否为首次呼叫,且未被测量的内容永远不会被认为是安全的:它将请求 PIN。每个判断将在 安全 (章节 60) 中列出,并附有其原因,并在 呼叫历史 (章节 47) 中的呼叫记录中显示。
BitVoice 如何决定
BitVoice 的判断者(通话欺诈防护、干线健康判断者、呼叫质量诊断和 911 呼叫者位置检查)各自遵循一个 规则书:被测量的事实、支持的结论、覆盖结论的异常以及选择。BitVoice 如何决定,在 安全 (章节 60) 中显示每个规则书。判断者遵守的规则:
- 每个答案都附有其原因:是什么支持了它、什么反对了它以及什么覆盖了它。
- 没有人测量的东西是未知的,而不是 "否"。当未知可能改变答案时,判断者选择其谨慎的选择并说明它无法测量什么。
- "无法确定" 是一个答案:当规则使情况不确定时,判断者选择其谨慎的选择并说明如此。
- 每个规则书在使用之前都会在其所有事实的每种组合中进行检查(当 BitVoice 启动时以及由其测试):永远不会同时有两个选择,并且每个规则都是可达的。屏幕显示每个规则书被检查的场景数量。
加密
- TLS 加密信令(端口 5061),因此密码和号码在网络上不可读。
- SRTP 加密呼叫的声音;浏览器电话和应用程序始终使用它。
- Web 界面在端口 8443 上具有 HTTPS,并具有其自己的证书或您安装的证书。
谁可以做什么
更改、备份和导入
/changes每个保存的更改都是一个修订版:带有编号、修改者、时间和一行摘要。配置中永远不会丢失任何内容.
比较和恢复
- 更改内容 显示修订版与其前一个版本之间的差异,字段逐一比较。
- 恢复 显示恢复将更改的内容并要求确认。恢复本身也是一个新的修订版,因此也可以撤消.
导出和导入
- 导出 将整个配置下载为一个文件(除非要求,否则不包含机密信息)。
- 导入 预览文件的更改,然后应用它们。
- 导入 (章节 68) 也可以读取 FreePBX 和 Asterisk 配置、3CX 用户列表以及 Cisco Unified CM、Avaya 和 Mitel 的 CSV 导出。
- 归档 (章节 72) 将备份、录音和语音邮件复制到 Amazon S3 或 Azure.
同时进行的更改
两个管理员同时编辑同一个内容时,无法相互覆盖:第二个保存操作将被拒绝,并显示一条重新加载的消息,且不会丢失任何内容.
更新
/updates更新 BitVoice 是一键式和安全的:它检查新版本,安装在旧版本旁边,并在新版本未保持活动时自动回滚。
安装更新
- 下载新版本并解压缩。程序旁边是 BioDream 的签名:
bitvoice.sig,或在 Windows 上的bitvoice.exe.sig。 - 在 更新 (章节 62) 上,上传程序和其
.sig文件。 - 按 安装。默认情况下,BitVoice 等待直到没有呼叫正在进行;您也可以立即安装。
- BitVoice 在新版本上重新启动。对于多个服务器,正在进行的呼叫将被转移到另一个服务器并继续。
回滚
保留了您离开的版本:回滚 在一键式点击中返回到该版本。新版本如果两次无法启动或无法保持活动一分钟,则会被前一个版本自动替换。
签名
从 v0.1.3 开始的每个版本都带有 BioDream 的发布密钥。这样的构建仅安装使用该密钥签名的程序:未签名的文件、由其他人签名的文件或单个字节更改的文件将被拒绝,显示 签名不匹配。页面指示此构建是否检查(需要)或不检查。
| 您运行 | 更新接受 |
|---|---|
| 一个版本(v0.1.3 或更晚),或您自己的构建 | 只有 BioDream 签名的程序 |
| v0.1.2 或更早版本 | 任何程序:没有密钥,.sig 文件不能被检查,将被忽略 |
多个服务器作为一个电话系统
/servers两个或多个 BitVoice 服务器共享一个 PostgreSQL 数据库,作为一个电话系统:
- 呼叫可以到达任意服务器注册的电话:环组、队列、转接到分机和来自提供商线路的呼叫都会在每个服务器的电话上响铃。
- 设置 在一个服务器上进行的更改将在所有服务器上在五秒内生效;用户、联系人、呼叫历史、录音转录和文本消息都是共享的。
- 忙灯 (BLF) 显示每个服务器上的电话正在响铃和忙;停车 槽位是共享的,因此在一个服务器上停车的呼叫可以从另一个服务器上的电话接听;广播 可以到达每个服务器上的电话;文本 消息可以到达任意注册的桌面电话。
- 一个服务器上的队列代理在呼叫中被视为其他服务器上的忙;提供商线路的通道限制计数所有服务器上的呼叫。
- 活跃呼叫 列表显示每个服务器上的呼叫(只读:挂断或在拥有呼叫的服务器上监听)。
- 呼叫记录由拥有呼叫者的服务器写入一次,并在那里记录呼叫。
设置
- 将第一个服务器的数据移到 PostgreSQL:设置,数据库。
- 使用相同的数据库启动每个其他服务器:
bitvoice -database postgres://…(或 BITVOICE_DATABASE 环境变量)。它立即加入;服务器 列表中显示。 - 在 服务器 上,检查每个服务器的地址和 SIP 端口(它们共享的网络上的地址和端口),并为每个服务器命名。每个服务器都有自己的公共地址(云服务器具有公共 IP 地址,无共享地址),其自己的公共地址 也会被设置:提供商和外部电话会被告知该地址,因此当一个服务器接管呼叫时,提供商的音频会跟随它。若留空,服务器将使用 设置 中的公共地址。
- 告知电话如何找到服务器(下文)。
- 提供商线路(下文)。
电话如何找到服务器。 由 BitVoice 设置的电话(Yealink、Polycom、Grandstream)会自动被分配另一个运行的服务器作为其备份服务器。对于其他电话,例如 Snom 和手动设置的电话,可以使用 服务器 上的以下方法之一:
- 每个服务器的 DNS 名称:例如 pbx.example.com,具有 SRV 记录(_sip._udp、_sip._tcp、_sips._tcp),列出每个服务器。BitVoice 设置的电话会被分配该名称,服务器 会检查记录与运行的服务器,并列出缺失的记录,提供创建记录的内容,准备好复制。
- 共享地址:例如 192.168.1.50/24,服务器网络上的一个未使用的地址。一个运行的服务器会持有该地址,并立即通知网络(gratuitous ARP);如果它停止,下一个服务器会在几秒内接管该地址,继续其呼叫,并在同一地址回答其电话,而无需它们重新注册。它需要 Linux 和 NET_ADMIN 和 NET_RAW 权限(在容器中:
--cap-add NET_ADMIN --cap-add NET_RAW),以及同一网络上的服务器。设置后请重启每个服务器。
提供商线路。 在每个 trunk 中,服务器之间共享 指定如何共享:
- 每个服务器使用它:每个服务器注册并放置自己的呼叫。适用于允许在一个账户上注册多个或没有注册的提供商。
- 一次一个服务器:一个服务器注册并携带线路;其他服务器显示为 备用,持有 该服务器,并通过它发送自己的呼叫。若它停止,下一个服务器会在几秒内注册。适用于只允许一个账户注册的提供商。
当服务器停止
- 呼叫继续。 每个服务器在数据库中保留其呼叫的记录;当一个服务器停止时,一个运行的服务器会在几秒内接管每个呼叫,移动音频到自己,并通知双方(重新 INVITE)。音频中会有几秒钟的间隙。计划停止(升级、重启)会立即交接呼叫,无间隙。
- 注册在接管服务器上的电话的呼叫会在那里继续,而不会干扰该电话:只有另一方会被移动。
- 电话会通过其备份服务器、DNS 名称或共享地址继续工作。
- 仅重启(升级、重启)的服务器仍然知道其自己的电话在哪里注册:它会在其数据文件夹中保留它们(
registrations.json),因此呼叫会在它们重新注册之前到达它们。 - 健康 和 服务器 会显示它已停止;当它恢复时,它不会从接管服务器那里接回任何内容。
服务器之间。服务器通过TCP或TLS(当它们具有证书时,每个服务器只接受对方发布的证书,中间的音频则使用SRTP加密)在SIP端口相互连接,并通过媒体端口(UDP,范围在设置中)发送音频。服务器之间的呼叫使用共享的秘密进行签名,并且只接受来自运行中的成员的呼叫。服务器之间的防火墙必须允许这些端口通过。
先试验:实验室。BitVoice带有一个实验室,运行两个服务器、它们的数据库和测试电话在一台计算机上使用Docker,每个服务器都有自己的地址:deploy/lab/run.sh up构建并启动它,并设置共享地址;run.sh call在不同服务器上的电话之间呼叫;run.sh failover杀死通过共享地址传递呼叫的服务器并检查呼叫是否继续(音频在大约五秒钟后返回);run.sh impaired从坏链接(延迟、抖动和5%丢失)的电话呼叫并检查BitVoice报告的呼叫质量;run.sh down删除实验室。服务器页面在https://127.0.0.1:18501和:18502(用户admin)。
数据存储位置(SQLite或PostgreSQL)
/settingsBitVoice在数据库中存储其设置和保存的版本、用户、联系人、呼叫记录、审计日志、文本、笔记和转录。录音和语音邮件作为音频文件存储在数据文件夹中。
此服务器自己的文件(SQLite, 默认):数据文件夹中的单个文件bitvoice.db,无需安装。备份数据文件夹即可拥有所有数据。
PostgreSQL:适用于多个BitVoice服务器共享一组数据,或使用Power BI、Grafana或Metabase等工具进行报告。在设置中,数据库,将数据移到PostgreSQL:创建一个空数据库和拥有它的用户,输入其地址(postgres://user:password@host:5432/database),按测试,然后复制数据并在PostgreSQL上重启。所有数据一次性复制(全部或无),BitVoice在其上重启;旧文件保持原位。回到服务器自己的文件的过程相同。呼叫进行中时,不允许移动。
共享PostgreSQL数据库的服务器在五秒内看到彼此的设置更改。每个服务器仍然回答自己的电话和呼叫;要让第二个服务器接管第一个服务器的电话,电话需要两个地址(或一个可以移动的地址)。
数据库也可以在BitVoice启动时命名,使用-database postgres://…或BITVOICE_DATABASE环境变量;它将在那里更改,而不是在设置中。
旧安装:在此版本的第一次启动时,BitVoice将其旧JSON文件复制到数据库中,并将它们移到数据文件夹中的pre-database中。
托管其他组织
/tenants一个 BitVoice 可以托管多个组织。每个组织都是一个独立的电话系统:其自身的分机、号码、干线、路由、管理员、语音邮件、录音和呼叫历史。没有一个组织可以看到其他组织的信息。它们仅共享此服务器的 SIP 端口、IAX2 端口和媒体端口。
何时使用它
- 一个提供商或 IT 公司,在一台服务器上为多个小型客户运行电话系统。 - 一个办公室或诊所组,希望在共享硬件上拥有单独的系统,并分别管理它们。 - 多个应答点共享一个系统,每个应答点保留其自身的呼叫接听者和记录。
主系统也是一个组织:此服务器最初设置的组织。其管理员管理其他组织。
添加一个组织
1. 打开 组织 (章节 65) 并按 添加组织。 2. 为其提供 名称 和 简称(小写字母、数字和破折号)。简称是其 Web 地址的一部分,例如 /t/acme/,也是其电话的登录名的一部分,例如 acme.100。简称不能更改。 3. 可选地为其提供 自己的域,例如 pbx.acme.example,并将其指向此服务器。电话注册到该域,管理员在浏览器中打开它。 4. 设置其 第一个管理员:一个用户名和至少 12 个字符的密码,以及其国家。 5. 可选地设置 限制。
该组织立即开始,拥有一个空的电话系统,准备好由其管理员按照 入门 (章节 1) 中的描述进行设置。
呼叫如何找到正确的组织
| 请求 | 转到 |
从注册到 pbx.acme.example 的电话 | 具有该域的组织 |
|---|---|
从登录名为 acme.100 的电话 | Acme,分机 100 |
| 从提供商发出的呼叫,用于某个号码 | 来自其干线并具有该号码的入站路由的组织 |
| 其他所有内容 | 主系统 |
因此,两个组织都可以具有分机 100,多个组织可以共享一个提供商帐户,具有不同的号码。
其数据的位置
在 SQLite 上,每个组织在数据文件夹中的 tenants/ 下有自己的文件夹,具有自己的数据库文件。在 PostgreSQL 上,每个组织在同一个数据库中具有自己的模式 (tenant_acme)。备份、存档和导出都是按组织进行的。
限制
| 限制 | 达到限制时发生什么 |
| 分机 | 添加一个分机将被拒绝,并显示一条消息 |
|---|---|
| 同时呼叫 | 新的呼叫将被拒绝(503),直到一个呼叫结束 |
| 存储 | 新的录音和语音邮件将不被保留 |
| 每天 AI 请求 | 转录、摘要和 AI 接待将停止,直到 UTC 午夜 |
0 表示没有限制。紧急呼叫永远不会被拒绝:达到呼叫限制或被暂停的组织仍然可以呼叫 911 并被呼叫回。
打开一个组织
打开 将您作为提供商登录到其 Web 界面,而无需其自身的帐户;它显示在其审计日志中作为提供商。其管理员使用其自身的帐户登录到其自身的地址。每个组织都有自己的登录 cookie,因此登录到一个组织永远不会登录到另一个组织。
组织永远不会看到此服务器的自身屏幕:更新、数据库、其他服务器、证书、SIP 跟踪(显示每个组织的消息)、呼叫生成器或此列表。
暂停和删除
暂停 停止登录和除紧急呼叫外的所有呼叫;没有任何内容被删除。 删除 停止组织并将其文件夹移到一边 (tenants/.removed-<name>-<time>),因此可以手动撤消错误。
编解码器和声音
编解码器是将声音转换为呼叫数据的方式。电话、浏览器和运营商各自支持一些;BitVoice 在两个不同编解码器之间进行转换,因此每个人都可以相互通话。当两方使用相同的编解码器时,声音会保持不变。
编解码器
| 编解码器 | 声音 | 带宽 | 使用者 |
|---|---|---|---|
| G.722 | 高清(宽带) | 64 kbit/s | 大多数桌面电话:它们之间的最佳选择 |
| G.711 µ-law | 电话 | 64 kbit/s | 北美和日本;每个运营商 |
| G.711 A-law | 电话 | 64 kbit/s | 世界其他地区 |
| Opus | 高清,能够应对丢包 | 24 kbit/s | 浏览器和移动应用 |
| G.729 | 电话,略粗糙 | 8 kbit/s | 薄链接,部分运营商 |
| G.726 (40 kbit/s) | 电话;最好地传输调制音调 | 40 kbit/s | 网关,部分 DECT 系统 |
| G.726 (32 kbit/s) | 接近电话 | 32 kbit/s | DECT 基站,较旧的网关 |
| G.726 (24 kbit/s) | 在 32 和 16 之间 | 24 kbit/s | 部分 DECT 系统 |
| G.726 (16 kbit/s) | 粗糙 | 16 kbit/s | 非常薄的链接 |
| AMR-WB (G.722.2) | 高清 | 6.6 到 23.85 kbit/s | 移动网络的高清语音,VoLTE 互联 |
| AMR | 电话,移动 | 4.75 到 12.2 kbit/s | 移动网络,部分运营商和网关 |
| iLBC | 电话,能够应对丢包 | 13.3 或 15.2 kbit/s | 较旧的软电话和应用 |
| Speex | 电话 | 15 kbit/s (2.15 到 24.6) | 较旧的软电话,连接到其他 Asterisk 系统 |
| GSM | 较粗糙 | 13 kbit/s | 较旧的软电话和网关 |
| G.723.1 | 粗糙;仅使用 ffmpeg 转换 | 5.3 或 6.3 kbit/s | 非常旧的视频电话和网关 |
| G.722.1 (Siren 7) | 宽带,保持不变 | 24 或 32 kbit/s | Polycom 电话,视频和会议电话 |
| G.722.1C (Siren 14) | 超宽带,保持不变 | 24 到 48 kbit/s | 会议电话,会议室系统 |
| G.719 | 全带,保持不变 | 32 到 128 kbit/s | 电视会议室系统 |
| Codec2 | 非常低的带宽,保持不变 | 0.7 到 3.2 kbit/s | 无线电链接,业余无线电网关 |
设置列出了电话可能使用的编解码器,按优先顺序排列;每个中继可以有自己的列表。模拟适配器端口始终使用 G.711,这是传真、调制解调器和报警面板所需的。
G.722.1、G.722.1C、G.719 和 Codec2 在两个使用它们的方之间保持不变,带宽或模式保持在报价中(BitVoice 不转换它们,因此使用其中一个的电话与不支持它的电话使用不同的编解码器)。将它们放在列表中,G.711 之上,在那里会议室系统或会议电话应该在相互通话时保持其声音范围。列表以 32 kHz 的 G7221C 命名 SDP,但两个都称为 G7221。
G.723.1 在两个使用它的方之间保持不变。要允许仅使用 G.723.1 的设备与其他任何设备通话,请在设置中打开 使用 ffmpeg 转换 G.723.1 并安装 ffmpeg(apt install ffmpeg,brew install ffmpeg):BitVoice 然后为每个需要转换的方向运行 ffmpeg 作为单独的程序(以任一速率听到,以 6.3 kbit/s 的速率发送,ffmpeg 编码器生成的速率),大约比其他编解码器晚 60 ms,并在几秒钟后停止调用。BitVoice 不包含任何 G.723.1 代码:ITU 的参考代码没有允许包含它的许可证,ffmpeg 是单独安装和运行的。
转换的成本
转换需要处理器时间,只有在两方不同时才会发生。每个呼叫,大约每 20 ms 需要一个核心的 0.3 ms 来处理 Opus 和 0.12 ms 来处理 G.729(大约每个核心 60 和 170 个转换呼叫);G.726 和 GSM 的成本低于 G.729;G.711 和 G.722 几乎没有成本。G.729 发送时不带 Annex B(无静默帧)。
声音清理
声音清理(设置)降低稳定的背景噪音并使音量均匀,对于语音邮件和您喜欢的呼叫有效。
Microsoft Teams(直接路由)
/trunksBitVoice可以作为Microsoft Teams租户的会话边界控制器(SBC),因此Teams用户可以呼叫BitVoice扩展和电话线,并且BitVoice可以呼叫Teams用户。
所需内容:此服务器在Microsoft 365租户验证的域中具有公共名称(sbc.example.com),端口5061对Microsoft网络52.112.0.0/14和52.120.0.0/14开放,并且具有来自公共机构的该名称的证书。Teams用户需要电话系统许可。
步骤
- 设置,证书:安装证书及其私钥(PEM)。它将立即用于此接口和 SIP over TLS,BitVoice 将其呈现给 Microsoft。
- 分机,添加,从 Microsoft Teams 开始:输入服务器的公共名称。抽屉指示证书是否涵盖它。
- 复制抽屉显示的 PowerShell 并作为 Teams 管理员运行:它添加了 SBC(New-CsOnlinePSTNGateway)、语音路由和策略,以及拨号计划规则,以便短分机号码可以按拨号方式到达 BitVoice;然后为每个 Teams 用户分配策略和其号码。
- 若要从 BitVoice 呼叫 Teams 用户,请为其号码添加一个通过 Teams 分机的外呼路由。Teams 只能通过带有 + 和国家代码的号码找到其用户:如果人们不带 + 和国家代码拨打,则在路由的 添加 中添加 + 和国家代码(呼叫的原因跟踪将在呼叫未添加 + 时输出)。
当 Teams 用户转接呼叫时,Microsoft 会要求 BitVoice 放置呼叫(一个命名其自身代理的 REFER,带有号码或 Teams 用户的 ID):BitVoice 恰好回呼 Microsoft 命名的内容,带有 Microsoft 提供的 Referred-By,因此转接到另一个 Teams 用户的效果与转接到电话号码一样。BitVoice 从不发送 Teams 一个 Replaces 头,Microsoft 拒绝它。
BitVoice每分钟向Microsoft发送一次OPTIONS,Contact中包含SBC名称,如Microsoft所需,并尝试sip、sip2和sip3.pstnhub.microsoft.com。媒体始终加密(SRTP)。健康警告当证书不涵盖名称、自签名或即将结束时,以及当Microsoft停止响应时。
这遵循Microsoft发布的SBC要求,并在模拟Microsoft代理的测试中进行了测试;BitVoice不在Microsoft的认证SBC列表中。
导入
/import从 FreePBX、Asterisk 或 3CX 导入分机、环组、队列和中继;以及从 Cisco、Avaya 和 Mitel 导入人员、狩猎组、SIP 中继、入站号码和拨号模式。上传导出的文件,可以同时上传多个文件(.zip 或 .tar 文件也可以工作);BitVoice 显示导入前将更改的内容,并且导入成为可以在 更改 (章节 61) 中撤消的修订版。
从 FreePBX 迁移
最好的文件是 FreePBX 备份文件:它包含所有内容,包括 SIP 密码。
- 在 FreePBX 中:管理 → 备份和还原 → 添加备份。至少选中 核心、环组、队列 和 语音邮件(所有模块都可以),保存,然后 运行。
- 从其行下载备份文件(文件名类似于
20261001-100000-1790000000-17.0.19-1234567.tar.gz)。 - 在新服务器上安装 BitVoice 并完成设置,使用 FreePBX 未使用的分机(例如 199)和没有电话线:导入将带来线路。
- 在 导入 (章节 68) 页面上,将 .tar.gz 文件直接拖放。阅读预览:警告列表显示无法导入的所有内容。
- 选择 添加。它是 更改 (章节 61) 中的一个修订版:如果任何内容看起来不正确,请在那里撤消它,然后再次导入。
- 移动电话:将每个电话指向 BitVoice(或从 电话 (章节 4) 提供),使用相同的分机号码和 SIP 密码。
- 测试进出呼叫,然后最后移动运营商的注册(或号码端口)。
在真实系统上尝试:FreePBX 17.0.33(官方 Debian 12 安装)具有四个分机和语音邮件、一个注册的 PJSIP 中继、两个外呼路由(一个具有拨号前缀)、一个环组、一个具有惩罚的队列和三个 DIDs,使用备份和还原备份所有模块。备份文件大小为 70 MB,几乎全部是音频文件和呼叫历史:BitVoice 在上传时读取它,并且只保留配置,因此最多可以上传 512 MB 的备份文件。所有内容都成功导入:密码、语音邮件 PIN 和电子邮件、中继的注册和编解码器、路由及其前缀、环组的语音邮件(当无人接听时)、队列的惩罚和 DIDs 到组、队列和分机。
导入的内容:
- 分机:号码、名称、外呼显示号码、铃响时间和 SIP 密码(当 FreePBX 的密码短于 12 个字符时,BitVoice 会生成一个新密码:在电话中重新输入)。语音邮件及其 PIN 和电子邮件地址(以及是否以附件形式发送消息)。
- 中继:PJSIP 和 chan_sip 运营商帐户:服务器、端口、用户名、密码、注册、来源域、编解码器、显示号码、通道限制。关闭的中继保持关闭。DAHDI 中继变为电信卡中继。
- 外呼路由,按照 FreePBX 的顺序:每个模式的前缀变为要丢弃的数字,其前缀变为要添加的数字。具有不同数字的路由模式变为一个 BitVoice 路由。
- 环组:成员、铃响时间、全部铃响或一个接一个(狩猎、记忆狩猎、第一个可用),以及未接来电的去向。
- 队列:成员及其惩罚、策略(全部铃响、最近最少、最少呼叫、轮流、线性、随机)、铃响时间、完成时间和最长等待时间。
- 入站路由:每个 DIDs 到其分机、环组、队列、语音邮件或挂断。
不导入的内容以及预览中提到的内容:IVR、时间条件、公告、跟随我、自定义中继和上下文、路由上的来电显示号码匹配以及环组中的外部号码。在 菜单 (章节 21)、时间表 (章节 26) 和分机的 跟随我 中构建这些内容。较旧的备份(FreePBX 13 及更早版本)和 FreePBX 数据库的 mysqldump asterisk 以相同的方式读取。
其他系统
每个导出的格式为:
- FreePBX(仅扩展):Admin → Bulk Handler → Export → Extensions (CSV)。
- Asterisk:pjsip.conf 或 sip.conf。
- 3CX:Users → Export (CSV)。
- Cisco Unified CM:Bulk Administration → Phones → Export Phones,所有详细信息;或 Users → Export Users。电话的第一行成为扩展,行的警报名称或标签作为其名称。
- Avaya IP Office:Manager → File → Import/Export → Export,Users。
- Avaya Communication Manager:
list station保存为 CSV;虚拟站点和 VDNs 不包括在内。 - Mitel MiVoice Business:System Data Management → User and Device Configuration → Export。
组和路由。将它们与人员文件一起上传,以便每个组的成员可以通过编号或名称找到:
- Cisco Unified CM:Bulk Administration → Import/Export → Export,选中 Line Group、Hunt List、Hunt Pilot、SIP Trunk 和 Route Pattern;以 .tar 文件形式上传。每个 Hunt Pilot 都成为一个环组,具有其 Hunt List 的行组成员,Top Down 和 Circular 按顺序,Broadcast 为同时,RNA 超时时间为铃响时间。路由模式成为外呼路由:
9.[2-9]XXXXXX,PreDot 为模式9[2-9]XXXXXX,去掉 9;!变为最终点。使用@(国家计划)模式的路由需要手动编写。 - Avaya IP Office:导出 Hunt Group 和 Users(均为无标题行的 CSV)。组模式为同时;Hunt、Rotary 和 Longest Waiting 按顺序。
- Avaya Communication Manager:
list hunt-group保存为 CSV,成员在 Members 列中或单独的成员文件中。 - Mitel MiVoice Business:Ring Groups 和 Ring Group Assignment(Cascade 为顺序,Ring All 为同时),以及 Hunt Groups。
从这些导出中导入的中继默认为关闭状态且无密码,因为导出不包含这些信息。路由通过同名的导入中继进行;如果中继不存在,则路由将被忽略。轮询和最长空闲铃响更类似于队列,而不是环组:预览将指出这一点,因此您可以将其设置为队列。
这些导出(除 FreePBX 备份外)不包含 SIP 密码,因此每个扩展将获得一个新密码;语音邮件 PIN、名称和电子邮件地址在导出包含时会被复制。Cisco、Avaya H.323/DCP 和 Mitel 电话运行其制造商的软件,无法由 BitVoice 设置:导入将指出有多少个被列出。Cisco 电话可以使用 Cisco 的多平台(SIP)固件重新闪存;Avaya J100 和 Mitel 6800/6900 电话可以在 SIP 模式下手动注册到 BitVoice。
配置即代码
所有屏幕操作都通过 BitVoice 的 REST API 进行,因此任何操作都可以被脚本化、存储在 Git 中或使用 Terraform 进行管理。API 在 /api/openapi.json (/api/openapi.json) 中被描述,以供工具使用。
API 令牌
在 管理员 (章节 57) 中创建:每个程序一个,仅读取或能够更改所有内容。将其作为 Authorization: Bearer bv_... 发送。它只显示一次;当不再需要时撤销。令牌的更改在更改和审计日志中显示为其名称。
curl -H "Authorization: Bearer bv_..." https://pbx.example.com/api/extensions
Terraform 或 OpenTofu
存储库的 deploy/terraform 显示使用通用 REST 提供程序管理的扩展、环组和路由:计划显示将更改的内容,应用程序进行更改。提供程序检查 BitVoice 的证书;在 BitVoice仍然使用其自己的自签名证书时,或者从 Let's Encrypt 获取一个(设置,证书),或者在一个值得信任的网络上设置 bitvoice_insecure = true(在 Linux 上,SSL_CERT_FILE 指向 BitVoice 的证书也有效)。资源通过 BitVoice 分配的 ID 匹配,因此第二个计划显示没有更改,直到文件或屏幕更改某些内容。
从 Git 配置
在 设置 (章节 14) 中的 配置从 Git,BitVoice 每隔几分钟读取存储库中文件的配置,并显示差异或进行更改。从 导出到 Git 开始,该文件省略了密码;BitVoice 保留自己的密码,因此秘密永远不会进入存储库。
Asterisk 兼容性(AMI、ARI 和 AGI)
为 Asterisk 编写的工具可以控制 BitVoice:CRM、墙板、点击拨号按钮、呼叫记录器控制器。启用 设置 (章节 14) 中的 Asterisk 兼容性。工具将呼叫视为类似 PJSIP/100-... 的通道,如 Asterisk 上的通道。
AMI
管理接口在TCP端口5038(AMI监听:默认仅监听本机)。支持的功能包括:
| 类型 | 名称 |
|---|---|
| 操作 | 登录(明文或MD5挑战),Ping,事件,过滤,命令列表,CoreShowChannels,状态,CoreStatus,CoreSettings,PJSIPShowEndpoints,扩展状态,扩展状态列表,设备状态列表,Getvar,Originate,Redirect,BlindTransfer,Hangup,Logoff |
| 队列 | 队列状态,队列摘要,队列暂停,队列添加和队列删除(它们将代理签入或签出所有队列),代理 |
| 其他 | 停泊呼叫;ConfbridgeListRooms,ConfbridgeList,ConfbridgeKick,ConfbridgeMute,ConfbridgeUnmute,ConfbridgeLock,ConfbridgeUnlock;邮箱计数,邮箱状态;暂停监控,取消暂停监控;用户事件;重新加载(无需重新加载:更改立即生效) |
| 事件 | Newchannel,Newstate,Hangup,DialBegin,DialEnd,Hold,Unhold,PeerStatus,ContactStatus,MessageWaiting,ConfbridgeJoin,ConfbridgeLeave,ConfbridgeEnd,UserEvent |
过滤 仅保留事件的正则表达式匹配(Event: Newchannel),或在前面加 ! 以丢弃它们,如 Asterisk 一样。这里没有 Asterisk 命令行:命令 将以错误作答。
ARI
在 /ari/ 下,使用基本身份验证或 ?api_key=user:secret:
| 请求 | 执行的操作 |
|---|---|
GET /ari/channels | 正在进行的呼叫 |
POST /ari/channels?endpoint=PJSIP/100&extension=5551234 | 振铃 100,然后呼叫该号码 |
DELETE /ari/channels/{id} | 挂断 |
POST /ari/channels/{id}/redirect?endpoint=PJSIP/102 | 将呼叫转移到 102 |
/ari/endpoints,/ari/bridges,/ari/asterisk/info | 电话,桥接,版本 |
/ari/events | 事件的 WebSocket |
POST /ari/channels/externalMedia?external_host=host:port&encapsulation=rtp&format=ulaw | 一个通过 RTP(ulaw 或 alaw 经 UDP)向程序发送声音的通道;其本地端口在通道的 UNICASTRTP_LOCAL_PORT 中 |
POST /ari/channels/externalMedia?external_host=host:port&encapsulation=audiosocket&transport=tcp&format=slin&data=<uuid> | 同上,但通过 AudioSocket |
POST /ari/bridges/{call}/addChannel?channel={id} | 外部媒体通道加入呼叫:它可以听到双方,双方也可以听到它;使用 role=listener 时,没人能听到它(用于实时转录) |
POST /ari/bridges/{call}/removeChannel?channel={id} | 它离开呼叫;两方再次直接交谈 |
如果外部媒体通道在一分钟内未加入呼叫,则其将被关闭。
ARI 应用程序
ARI 应用程序(Asterisk 的 Stasis())从您的程序运行呼叫。在 设置 中的 ARI 应用程序 下添加它,Asterisk 兼容性:一个 名称,一个可选的 号码 扩展来拨打,以及一个 回退。然后像对待任何目的地一样将呼叫发送到它:一个入站路由,一个菜单键,一个时间表。
您的程序连接到 /ari/events?app=NAME(一个带有 ?api_key=user:secret 登录的 WebSocket)。每个到达应用程序的呼叫都被回答并以 StasisStart 到达,带有通道;然后程序运行它:
| 请求 | 执行的操作 |
|---|---|
POST /ari/channels/{id}/play?media=sound:goodbye,digits:42 | 播放来自 Sounds 的提示(sound:),digits:, number:, tone:beep 或存储的录音(recording:);PlaybackStarted 和 PlaybackFinished 随后跟进。DELETE /ari/playbacks/{id} 停止它。 |
POST /ari/channels/{id}/record?name=msg1&maxDurationSeconds=60&maxSilenceSeconds=5&beep=true&terminateOn=%23 | 录制(wav)到存储的录音中;RecordingStarted 和 RecordingFinished。POST /ari/recordings/live/{name}/stop 结束它,DELETE 丢弃它。 |
GET /ari/recordings/stored, .../{name}, .../{name}/file, DELETE .../{name} | 存储的录音 |
POST /ari/channels/{id}/dtmf?dtmf=123 | 向呼叫者发送按键 |
GET/POST /ari/channels/{id}/variable?variable=X&value=Y | 通道的变量 |
POST /ari/bridges?bridgeId=room1, .../addChannel?channel=a,b, .../removeChannel, .../play, DELETE | 混合桥接:每个人都能听到其他人 |
POST /ari/channels/{id}/continue?extension=101 | 放弃呼叫:到该扩展,铃响组或队列,否则为回退 |
DELETE /ari/channels/{id} | 挂断 |
POST /ari/channels?endpoint=PJSIP/101&app=NAME | 振铃 101;如果接听,则进入应用程序 |
GET /ari/applications | 应用程序,是否有程序连接,以及它们的通道 |
POST /ari/channels/{id}/mute?direction=in, DELETE .../mute | 静音呼叫者所说的话(in),他们所听到的(out)或两者 |
POST/DELETE /ari/channels/{id}/hold, .../moh, POST .../silence | 挂机音乐到呼叫者(ChannelHold,ChannelUnhold),或静音 |
GET/POST /ari/channels/{id}/variables | 多个变量同时(ChannelVarset) |
POST /ari/channels/{id}/move?app=other | 将通道移交给另一个应用程序(StasisEnd,然后在那里 StasisStart;ApplicationMoveFailed 当没有程序运行它时) |
POST /ari/channels/{id}/snoop?spy=in&app=NAME | 一个窃听通道在应用程序中,听到呼叫者所说的话,以便录制它(POST /ari/channels/{snoop}/record) |
POST /ari/channels/create?endpoint=PJSIP/101&app=NAME, 然后 POST .../dial | 一个等待拨打的通道;Dial 事件告知铃响情况,当接听时,它进入应用程序 |
GET /ari/channels/{id}/rtp_statistics | 发送和接收的数据包和字节,丢失和抖动 |
POST /ari/playbacks/{id}/control?operation=pause | 暂停,取消暂停,重新开始,反转和向前(三秒) |
POST /ari/bridges/{id}/moh, .../record, .../variable, .../play/{playbackId} | 挂机音乐到桥接,录制其混合,变量 |
POST /ari/recordings/stored/{name}/copy, POST/DELETE /ari/recordings/live/{name}/pause, .../mute | 复制录音;暂停或静音实时录音 |
POST /ari/applications/{app}/subscription?eventSource=deviceState:Custom:lamp, PUT .../eventFilter | 订阅(通道:,桥接:,端点:PJSIP/100,设备状态:)和事件过滤器({"disallowed": [{"type": "ChannelVarset"}]}) |
GET /ari/deviceStates, PUT /ari/deviceStates/Custom:lamp?deviceState=INUSE | 电话状态(PJSIP/100:NOT_INUSE,INUSE,RINGING,UNAVAILABLE)和程序维护的自定义状态(DeviceStateChanged);电话状态也作为 EndpointStateChange 到达 |
GET /ari/mailboxes, PUT /ari/mailboxes/{name}?newMessages=1&oldMessages=0 | 扩展的语音信箱计数(100@default),以及程序自己维护的邮件 |
GET /ari/sounds | Sounds 的提示,按录制语言分类,以及为 AGI 脚本上传的声音 |
PUT /ari/endpoints/sendMessage?to=pjsip:100&body=Hi | 向扩展 100 的电话发送文本 |
POST /ari/events/user/{name}?application=NAME | 应用程序的用户事件(ChannelUserevent) |
GET /ari/asterisk/ping, GET/POST /ari/asterisk/variable, GET /ari/asterisk/modules | ping,全局变量,以及 BitVoice 的部分以模块名称命名 |
BitVoice 回答了 Asterisk 发布的 ARI 的每个操作(其测试套件调用每个操作并检查返回的内容是否具有 Asterisk 描述所需的字段)。其中一些与此处无关,并以 501 状态码回答,附带原因:可加载模块(BitVoice 是一个程序),Sorcery 的动态配置(BitVoice 在其 Web 界面中设置),日志通道,桥接的视频源(ARI 桥接仅携带音频),向电话发送 REFER 请求以及声明广播呼叫。窃听者仅能听到呼叫者(spy=in),且不提供 whisper 功能:需要将通道桥接到他们的通道以与他们交谈。每个呼叫的通道事件(ChannelCreated、ChannelStateChange、ChannelDestroyed)都会发送到每个程序,就像 Asterisk 的 subscribeAll=true一样。从服务器读取接口的 ARI 库(如 ari-client 等)会在 /ari/api-docs/resources.json 中找到它。当前保留的程序,在设置中的 ARI 应用程序下,显示了程序设置的应用程序、自定义设备状态、邮件盒、全局变量和桥接程序。
按键按下会以 ChannelDtmfReceived 的形式到达;呼叫者挂断电话会以 StasisEnd 的形式到达。当没有程序连接时,呼叫会转到回退设置;当程序的最后一个连接关闭时,其呼叫也会在五秒钟后转到回退设置(以便重新连接)。对于不需要自定义程序的呼叫逻辑,可以使用 脚本 (章节 27) 来运行整个呼叫;要将音频交给程序,可以使用 语音机器人 (章节 24)。
AGI 脚本
AGI 脚本(Asterisk 的 AGI() 和 EAGI())运行一个命令一个命令的呼叫,因此为 Asterisk 编写的 IVR 和集成(如 phpagi、pyst2、Asterisk-Java、任何 FastAGI 服务器)仍然可以工作。在设置中的 AGI 脚本 下添加它,Asterisk 兼容性:
| 字段 | 含义 |
|---|---|
| 脚本名称 | 目的地如何命名它 |
| 地址 | FastAGI 服务器,agi://host:4573/script?x=1(默认端口 4573),hagi://domain/script 用于域的 _agi._tcp SRV 记录,按优先顺序尝试,或者 AGI 程序 文件夹中的程序文件名 |
| 参数 | 作为 agi_arg_1、agi_arg_2 等传递 |
| 要拨打的号码 | 可选:扩展号码可以像任何号码一样拨打它 |
| 回退 | 脚本结束或无法到达时呼叫的去向 |
| 最长运行时间 | 运行时间较长的脚本将被停止(默认一小时) |
| EAGI | 程序:呼叫者的音频(8 kHz,带符号 16 位,little-endian)在文件描述符 3 上。Linux 和 macOS |
测试 连接到服务器(或检查程序是否存在且可执行),而不发送呼叫。然后像对待任何目标一样向其发送呼叫。
BitVoice 回答呼叫,发送 agi_ 变量(agi_network_script、agi_callerid、agi_dnid、agi_extension、agi_language 等),并执行命令,回答方式与 Asterisk 20 相同(测试套件将每个回答与 Asterisk 的录音进行比较)。
| 命令 | 备注 |
|---|---|
| ANSWER、HANGUP、CHANNEL STATUS、NOOP、VERBOSE | 仅使用通道名称的 HANGUP 仅结束脚本自己的呼叫 |
| STREAM FILE、CONTROL STREAM FILE、GET OPTION、GET DATA、WAIT FOR DIGIT | 与 Asterisk 相同的转义键、样本偏移量和结束位置;CONTROL STREAM FILE 中的快进、倒退和暂停 |
| SAY DIGITS、SAY NUMBER、SAY ALPHA、SAY PHONETIC、SAY DATE、SAY TIME、SAY DATETIME | 使用设置中的语音服务,AI 会说出这些内容;没有语音服务,则使用 Sounds 中的数字 |
| RECORD FILE | s=N 静默、一个 beep、转义键;文件将保存在音频库中 |
| SET VARIABLE、GET VARIABLE、GET FULL VARIABLE | CALLERID(num)、CALLERID(name)、EXTEN、UNIQUEID、CHANNEL 等,以及 ${NAME} 表达式 |
| DATABASE GET、PUT、DEL、DELTREE | Asterisk 的数据库(AstDB),由 BitVoice 保留,并在 AGI 数据库 下显示 |
| SET CALLERID、SET EXTENSION、SET CONTEXT、SET PRIORITY、SET AUTOHANGUP、SET MUSIC | SET EXTENSION 是脚本结束时呼叫的去向 |
| SPEECH CREATE … SPEECH RECOGNIZE | 使用设置中的语音转文本,AI:结果是呼叫者说的话,作为 text0,供脚本比较;语法被接受但不使用 |
| EXEC | Answer、Hangup、Playback、Background、Read、Set、MSet、SayDigits、SayNumber、SayAlpha、Wait、Dial(依次呼叫每个号码;DIALSTATUS)、Goto、VoiceMail、Queue、MusicOnHold、Record、NoOp、Verbose、Log。其他命令返回 -2,如 Asterisk 对缺失应用程序的处理 |
BitVoice 没有拨号计划:在 Asterisk 的拨号计划中,脚本将继续执行的位置(SET EXTENSION、EXEC Goto),在这里,呼叫将在脚本结束时转到该号码(扩展号码、环组、队列、菜单或通过外部路由的外部号码)。脚本永远不会呼叫紧急号码。当呼叫者挂断电话时,FastAGI 脚本会收到 HANGUP,程序会收到 SIGHUP;只有在死通道上允许运行的命令可以运行(其他命令返回 511),如果脚本继续运行,连接将在 30 秒后关闭。每次运行都会在 最近运行 下显示,包括其 VERBOSE 行,并作为 agi.ran 发送到事件流中。
AGI 脚本的音频文件。 脚本通过 Asterisk 使用的名称播放音频文件:在 AGI 脚本的音频文件 下使用文件夹(custom/welcome;es/custom/welcome 用于西班牙语呼叫者)上传它们。支持 WAV、MP3 和 Asterisk 的 .gsm、.ulaw、.alaw、.sln 和 .sln16 格式;路径如 /var/lib/asterisk/sounds/en/custom/welcome.gsm 会找到 custom/welcome。Asterisk 的 digits/0–digits/9、beep、silence/N 和其他几个(vm-goodbye、invalid、please-hold)会播放 BitVoice 自己的提示音和音调。脚本记录的内容会保存在同一个库中,标记为 由脚本记录,保留天数可自定义(默认 30 天)。库最多可容纳 1 GB。
程序。一个程序在此服务器上以 BitVoice 的权限运行,因此它永远不会通过 Web 上传:将其复制到屏幕上显示的 AGI 程序 文件夹中 (DATA/agi-bin) 并使其可执行。它仅从环境中获取 PATH 和 AST_AGI_DIR,在该文件夹中运行,并将其写入标准错误的内容将记录到服务器日志中。FastAGI 通过纯 TCP 发送命令:请将服务器保持在此计算机或私有网络上。
登录
每个登录都有 用户名 和 密码。登录是 只读 的,除非标记为 可以更改呼叫。除非工具在其他地方运行,否则请将 AMI 保持在此计算机上:AMI 是纯的、未加密的 TCP。
AI 助手(MCP)
AI 助手(如 Claude、ChatGPT、Gemini 或 Cursor)可以通过模型上下文协议(MCP)使用 BitVoice,这是助手访问其他程序的标准方式。使用简单的语言询问它:今天早上谁打来了电话,有人回复了吗,牙医的来电者说了什么,9 点的来电为什么转到语音邮件,提供商的线路是否中断。有您的许可,它还可以拨打电话、发送短信或挂断电话。
BitVoice 是 MCP 服务器,位于 https://YOUR-SERVER/mcp(可流式传输的 HTTP;地址显示在设置中)。除非您连接的助手请求,否则不会向任何 AI 服务发送任何内容,并且只发送助手请求的内容。
启用它
在 设置 (章节 14) 中,AI 助手(MCP):
- 允许 AI 助手连接:默认关闭。关闭时,
/mcp只回答它关闭了。 - 允许助手执行操作:默认关闭。关闭时,助手只能读取内容,无论其令牌如何。开启时,具有令牌的助手也可以获得执行操作的工具。
卡片显示常见助手的地址和设置,并列出每个工具。
助手可以做什么
阅读(任何令牌):
- calls_now:当前正在进行的呼叫。
- call_history:过去的呼叫,按号码或名称、方向和时间搜索,包括每个呼叫的去向原因。
- extensions:名称、号码、部门、电子邮件;永远不会是电话的密码。
- phones_connected:哪些电话已注册,来自哪里。
- voicemail、search_transcripts:留言和录制呼叫的内容。
- queues、trunks、health:当前队列、提供商线路、BitVoice自己的检查。
- directory、text_messages:公司电话簿和短信对话。
执行(使用让助手执行,并带有可能更改内容的令牌):
- place_call:点击呼叫。扩展电话首先响铃;当有人接听时,BitVoice会像他们自己拨打一样呼叫该号码,因此应用他们的路由、呼叫者ID和限制。
- send_text:从组织的短信号码之一发送短信。
- hang_up_call:结束正在进行的呼叫。
每个工具都是API自己的路由,以助手身份运行:它看到并更改令牌允许的内容,应用相同的检查,并且其更改在审计日志中以其名称记录。答案限制在大约60,000个字符;当答案被截断时,助手被告知缩小其搜索范围。
连接助手
登录的助手(Claude.ai和ChatGPT自定义连接器等):使用BitVoice的地址添加连接器。助手在浏览器中打开BitVoice的登录页面;正常登录(密码、两步验证、单点登录),页面将显示哪个助手请求和返回位置。管理员可以允许其执行或仅允许阅读;查看者的助手仅阅读。不允许将其拒绝并返回空白。其访问权限然后在管理员 (章节 57)中,API令牌中,以AI助手,已登录的形式显示:它仅在/mcp中工作,永远不会用于API的其余部分,持续一个小时,空闲时间最长30天,自动续期。撤销立即结束它。这些助手从自己的服务器访问BitVoice,因此需要一个可从互联网访问的地址和一个可信任的证书(Let's Encrypt,在证书 (章节 14)中)。
给定令牌的助手(Claude Code、Cursor、VS Code等工具):在管理员 (章节 57)中创建API令牌,仅读取,除非它应该执行操作,并以Authorization: Bearer bv_...的形式提供:
claude mcp add --transport http bitvoice https://pbx.example.com:8443/mcp --header "Authorization: Bearer bv_..."
启动程序的助手(Claude Desktop等):BitVoice程序带有一个桥接器,bitvoice mcp,它通过HTTPS将每个消息传递给服务器。提供服务器的地址和令牌:
{ "mcpServers": { "bitvoice": { "command": "bitvoice", "args": ["mcp", "-url", "https://pbx.example.com:8443"], "env": { "BITVOICE_TOKEN": "bv_..." } } } }
With BitVoice's own certificate (not one from an authority), the bridge refuses it and prints its SHA-256: check it is your server's, then add "-pin", "THAT-SHA256" to the arguments. Only that certificate is then accepted.
安全离开
- 仅令牌:浏览器的BitVoice登录永远不会到达
/mcp,并且其他网站的页面将被拒绝(Origin),因此网页无法使用助手连接。 - 助手可能出错。除非它们需要执行操作,否则为其提供只读令牌;它们执行的任何操作都在审计日志中记录,并且始终会先呼叫人员的电话。
- 按照MCP指定的OAuth 2.1登录:助手注册自己(仅限公用客户端,使用PKCE),仅返回注册的地址(https或http到其自身计算机),并且代码仅在一分钟内有效一次。
- 在其他人的BitVoice上托管的组织为其助手提供令牌;在那里使用OAuth登录尚未尝试。
存档
/archive存档会在其他地方保留录音、语音邮件和配置的副本:Amazon S3 存储桶(或任何兼容 S3 的存储)或 Azure Blob Storage 容器。如果此服务器的磁盘丢失,存档仍然保留它们。
设置存档
- 在 存档 (章节 72) 页面上,选择 存档位置:Amazon S3 或 Azure。
- 对于 S3:存储桶、其 区域、可选的 存储桶中的文件夹 和 端点(用于兼容 S3 的存储),以及 访问密钥 ID 和 密钥。复制策略 只授予 BitVoice 附加到用户或角色的权限。
- 对于 Azure:具有写入权限的 容器 SAS URL,以及可选的 容器中的文件夹。
- 选择要复制的内容:通话录音、语音邮件 或两者。
##存档发生了什么 每十分钟,BitVoice 会复制新的录音和尚未存档的消息,并每天复制一次配置的日期副本(config/2026-10-13.json)。页面显示最后一次运行、最后一次成功和任何错误。
删除此处的内容(通过保留或手动删除)不会删除存档的副本:设置存储桶或容器的生命周期规则以确定存档保留内容的时间。
法律保留
/holds法律保留保持可能需要的通话记录、录音和语音邮件,并阻止任何人删除它们,直到其被释放。使用它当律师要求保留记录时。
添加保留
在 法律保留 (章节 73) 上,按 添加:
| 字段 | 含义 |
|---|---|
| 名称 | 事务名称 |
| 原因 | 为什么,用于记录 |
| 号码 | 覆盖的分机和外部号码(101, +15551234567),或 全部 |
| 从,到 | 覆盖的日期;空表示无限制 |
保留期间
- 保留让其覆盖的内容保持原样,无论其年龄如何。
- 没有人可以删除被保留的通话、录音或语音邮件,包括管理员。
- 被保留的通话在 通话历史 (章节 47) 中显示锁定图标。
释放
释放 使保留的内容再次受保留设置的约束:比保留时间更老的内容将在下一次清理时被删除。已释放的保留内容保持在列表中,包括何时和由谁释放,添加和释放保留内容也记录在审计日志中。
指标:Prometheus、OpenTelemetry、Grafana、SNMP和通话记录
/settingsPrometheus 从Web地址的 /metrics 中抓取数据。创建一个API令牌(在管理员下,查看者令牌足够)并将其提供给Prometheus作为其bearer令牌:
scrape_configs:
- job_name: bitvoice
scheme: https
authorization: { credentials: bv_... }
static_configs: [{ targets: ['pbx.example.com'] }]
它读取正在进行的通话(按状态)、已结束的通话(按方向和结果)、通话时间、注册的电话、每个中继的状态和往返时间、等待的呼叫者和每个队列中的代理、接收和丢失的音频包、MOS评分的直方图,以及预订的回呼。计数器在BitVoice重启时从零开始,如Prometheus所期望的。
OpenTelemetry:在设置、指标中,输入收集器的OTLP/HTTP地址(和一个头,例如Authorization,及其值)以每分钟(或您设置的时间间隔,至少15秒)推送相同的测量值。立即推送 检查保存的设置。
Grafana仪表盘 下载一个预制的仪表盘:在Grafana中导入它并选择您的Prometheus数据源。
SNMP
对于支持SNMP的监控系统(Zabbix、PRTG、LibreNMS、Nagios、SolarWinds),在设置中启用 SNMP代理。它回答SNMPv2c GET、GETNEXT和GETBULK,仅读取,UDP端口161(或您选择的其他端口:Linux上端口161需要打开低端口的权限),并且仅来自您列出的网络。选择一个不是公共或私有的 社区:它是一个密码,会以明文形式跨网络传输。
它提供标准系统组(sysDescr、sysUpTime、sysContact、sysName、sysLocation)和BitVoice自己的值,位于 基础OID 下:正在进行的通话和响铃、注册的电话、中继的上下文、等待的呼叫者、已结束的通话、通话秒数、丢失的包、平均通话质量、中继表(名称、上下文、延迟)和队列表(等待、代理、已回答、已放弃)。在设置旁边下载 BITVOICE-MIB 以便您的监控系统加载。BioDream LLC尚未获得企业编号,因此默认的基础OID位于Net-SNMP的实验空间中;在您的企业编号下放置一个以保持稳定。
陷阱(SNMPv2)在中继下降或恢复、紧急呼叫或集群服务器停止响应时发送到每个接收者。SNMPv3尚不支持。
通话记录其他地方
除了通话历史外,每个记录可以在通话结束时转到:
- Syslog(RFC 5424,JSON格式)通过UDP、TCP或TLS,用于日志服务器或SIEM。
- 每日CSV文件,具有Asterisk的Master.csv列,以便为Asterisk设计的报告和计费工具可以读取它。在通话历史 (章节 47)底部下载文件。电子表格可能会将某些单元格作为公式运行,因此以安全方式写入。
- PostgreSQL表,位于其他数据库中,首次使用Asterisk的
cdr列(calldate、clid、src、dst、duration、billsec、disposition、uniqueid...)以及BitVoice的方向、中继、成本和MOS创建。每个通话只写入一次。
发送测试记录 尝试使用保存的设置测试Syslog服务器和数据库。
呼叫生成器
/loadtest呼叫生成器将真实呼叫和真实音频放入 BitVoice 中,从本计算机开始:查看服务器可以承载多少个呼叫以及它们的性能如何,或者在更改后检查呼叫是否仍然按照预期进行。
运行测试
| 设置 | 含义 |
|---|---|
| 呼叫号码 | 位于 BitVoice 内的号码:分机、组、队列、菜单 |
| 来电显示 | 显示的来电号码 |
| 接听方式 | 生成器自己接听的分机;或无人接听(菜单、回声测试) |
| 呼叫次数 | 总共的呼叫次数 |
| 同时进行 | 最多同时进行的呼叫次数,最高 2,000 个。每个转发呼叫都占用 媒体来源 和 媒体目标(设置)中的媒体端口:默认的 10000-20000 可以容纳大约 1,800 个呼叫,因此需要扩大范围以容纳更多的呼叫 |
| 每秒新呼叫 | 呼叫开始的速度 |
| 每个呼叫持续时间(秒) | 每个呼叫的通话时间 |
读取结果
| 结果 | 含义 |
|---|---|
| 接听,失败 | 以及为什么呼叫失败,按原因 |
| 接听时间,中位数和95% | 呼叫者等待的时间 |
| 音频丢失 | 未到达的音频数据包的比例 |
| 音频评分 | 音频质量的估计(MOS):4及以上为良好,低于3.6为差 |
| 抖动,95%的呼叫 | 音频返回的不均匀程度(RFC 3550的平均到达抖动);电话可以平滑高达20毫秒 |
| 最长间隔,最差呼叫 | 任何呼叫中两个音频数据包之间的最长等待时间;它们每20毫秒到达一次,因此服务器停顿在这里显示 |
| 内存暂停,最大暂停 | Go运行时在运行过程中为了整理内存而暂停所有内容的频率和最大时间 |
| 随时间变化的呼叫 | 负载图 |
SIP 跟踪
/traceSIP 跟踪实时显示 BitVoice 发送和接收的消息:当电话无法注册或呼叫失败时,应查看的第一个位置,以及提供商的支持团队将要求的内容。
查找消息
BitVoice 在内存中保留最后 2,000 条消息(没有写入磁盘,并在重新启动后消失)。在过滤器中输入号码、地址或 Call-ID 的一部分。按 刷新 以获取最新消息。
选择一条消息以查看其全部内容,以及旁边的 呼叫流:同一呼叫的每个消息按顺序显示,包括电话、BitVoice 和提供商之间的消息,如图所示。
阅读跟踪
| 您看到 | 它通常意味着 |
|---|---|
| REGISTER 回复 401,然后无反应 | 电话没有密码或密码错误 |
| REGISTER 回复 403 | 地址被禁止,或电话以其他分机的身份登录 |
| INVITE 回复 404 | 没有路由匹配所拨号码 (呼叫路由 (章节 8)) |
| INVITE 由提供商回复 403 | 提供商拒绝呼叫者 ID 或号码 |
| 486 | 另一侧忙 |
| 488 | 两侧没有共同的编解码器 (编解码器 (章节 66)) |
| 200 OK,然后在约 30 秒后 BYE | ACK 从未到达:中间路由器重写或丢弃消息(关闭其 "SIP ALG") |
| 呼叫连接,但无人听到任何声音 | 声音被阻塞:检查设置中的公共地址和防火墙中的媒体端口 |
公共安全:实验室轨道
911 接听点配置文件,调度台和 NG911 核心服务。它们是实验室和设计合作伙伴轨道:建立和测试在记录的捕获,样本数据和替代品,但不认证为实时 911 或调度台,并且尚未尝试使用实时 ESInet,P25 系统或 CAD。它们在设置中关闭时不在菜单上。来自您自己的电话的紧急呼叫(入门)不是此轨道的一部分:它们是每个电话系统的一部分。
911 呼叫(911 配置文件)
/psapBitVoice 作为 PSAP 的呼叫处理系统来接听 911 呼叫:来自紧急服务网络(ESInet、NENA i3)的呼叫带有呼叫者的位置和网络数据,呼叫接听者立即看到这些信息,并在呼叫被接听时通知 CAD。
设置。
- 在 中继 (章节 7) 中,添加来自 ESInet 提供商(或 NG911 核心的 ESRP)的中继,并开启 来自 ESInet。
- 在 呼叫路由 (章节 8) 中,将其呼叫发送到您的呼叫接收者:一个队列或一个铃组。
- 在 911 呼叫 中,输入您的机构 ID(一个域,例如
psap.county.example.gov)和 CAD 接收的地址和端口,以及其 EIDO 地址。
当 911 呼叫响铃时,它在 911 呼叫 中显示以下信息:
- 地址 网络发送的(民用位置),和 位置 以及其不确定性(在一定米数范围内),在地图上绘制其不确定性圆圈(一旦设置了地图,见下),以及一个链接到 OpenStreetMap;
- 提供商,服务类型(无线,VoIP,住宅,商业),设备和订阅者,当呼叫带来它们时(附加数据,RFC 7852);
- 读取它时发生的任何错误。
位置通过呼叫值传入,或作为 BitVoice 使用 HELD 获取的引用。具有引用的呼叫具有 重新投标位置:BitVoice 重新询问,用于移动的呼叫者或其第一次修复不精确的呼叫者。
当重新投标更改位置时,位置检查 表明哪一个显示在第一位,并且为什么:新位置作为规则;当它是精确的设备修复(GPS,100 米内)且不到两分钟旧时,显示第一个位置;以及 两个 当两个位置的不确定性超过允许的不确定性时,因此呼叫接收者询问呼叫者。无论如何,第一个位置都会保留在呼叫中。
当呼叫接收者接听 时,CAD 获取以下信息,每个信息都单独发送,以便即使 CAD 关闭,也不会阻止呼叫:
- ALI 溢出:CAD 系统读取的文本块(回叫号码,服务类,地址,位置和不确定性,提供商),通过 TCP 发送;
- EIDO,NENA-STA-024 的事件文档,通过 HTTPS POST 发送(如果设置了,则带有承载者令牌)。 EIDO 在呼叫中显示。地址必须是
https,或者仅在 CAD 与 BitVoice 位于同一台计算机时为http(http://127.0.0.1:…):EIDO 携带呼叫者的位置和令牌,因此它永远不会跨网络发送,包括私有网络。同样适用于 将无线电事件发送到 CAD。保存任何其他纯http地址将被拒绝;由旧版本保存的地址仍然有效,因此 BitVoice 仍然可以启动,其他更改仍然可以保存,但不会向其发送任何内容,且 健康 (章节 13) 将其显示为红色,直到它被更改。
ALI溢出本身是普通的TCP,因为遗留的CAD监听器接受它,因此它不能被要求加密。当它发送到另一台计算机时,Health警告:保持该路径不在任何共享网络上,使用直接的串行链接(serial:/dev/…)或VPN或专用电路到CAD。同时设置机构ID:EIDOs和i3日志以它命名机构,Health (章节 13)在它为空时发出警告。
911 呼叫永远不会被拒绝。 来自 ESInet(或 CAMA 中继)的语音呼叫,其入站路由将其拒绝,因为路由挂断,铃响组中没有人,或者路由不存在,或者没有人接听,将 所有呼叫接收者 铃响:所有启用的分机,以及任何在其铃响时连接的电话,直到有人接听或呼叫者挂断。文本呼叫以相同的方式等待在此屏幕上。呼叫的 如何路由 说出了发生了什么,且 健康 (章节 13) 会警告此类路由,以便可以纠正。仅测试呼叫(urn:service:test.sos)和不是 911 呼叫的呼叫保留其路由的拒绝。
也不因转接而被丢弃。 当呼叫接收者转接 911 呼叫且转接无法连接,因为分机没有连接电话或没有人接听它时,呼叫返回给该呼叫接收者,同时他们仍在通话中。如果他们已经挂断(大多数桌面电话在盲转接后立即挂断),则 所有呼叫接收者 铃响,直到有人接听。911 呼叫永远不会被转到分机的语音邮件或其他无人接听的目的地,其路由跟踪显示了发生了什么。在任何呼叫中,挂断后立即请求转接的电话仅释放自己:转接继续进行。
呼叫者消失。 当呼叫的一方停止发送声音一分钟(失去电源或信号的电话不发送挂断)而另一方仍在发送时,呼叫以原因 *呼叫者的音频停止*(或是谁的)结束,在呼叫记录和 CAD 收到的 call.ended 事件中(cause,endedBy)。处于保持状态、传真或声明发送无内容(分页扬声器)的方永远不会以这种方式结束。沉默仍发送数据包,因此无法说话的呼叫者保持呼叫连接。
实时转录。 启用 实时书写 911 呼叫(设置,AI)后,每个已接听的 911 呼叫的一方都被实时书写为其被说出的内容,通过设置的语音转文本服务(以便音频保持在建筑物内 (章节 28)),否则通过 AI 服务,根据发言者暂停进行切割,并在呼叫下显示为 实时转录。CAD 以 call.transcript 事件的形式接收每个片段:{"call": id, "lines": [{"speaker": "Caller", "side": "caller", "text": "…", "second": 12.4}]}。呼叫的音频在呼叫持续期间发送到 AI 服务,记录或不记录。录音的转录仍在呼叫结束时到达。
CAD dispatchers by name. A CAD acting through one API token can name the dispatcher behind each request: make the token with Names the person it acts for (Administrators, API tokens) and send X-BitVoice-On-Behalf-Of: <the person's name>. The exposure log, text calls taken, calls ended and the audit log then name that person with the token (*Dana Ruiz via bitdispatcher CAD*). From any other token the header is ignored.
呼叫者视频和照片。 在 911 呼叫中,向呼叫者发送视频链接 仅为此次呼叫创建一个链接:从 文本链接发送号码 中发送短信给呼叫者,或读出。若无法发送短信(未设置短信号码,或呼叫者未发送号码),屏幕和 API 的 problem 将显示原因。呼叫者在其手机浏览器中打开链接(无需应用程序):共享实时视频 发送后置摄像头的实时视频(WebRTC,WHIP:RFC 9725),发送照片或视频 发送他们已经拍摄的内容,包括行车记录仪和动作相机文件。在呼叫中:
- 实时视频显示 实时;观看呼叫者的视频 以模糊方式播放,显示(可能令人不安) 显示它;再次模糊 隐藏它;
- 每个文件显示其大小、拍摄时间(由相机自己的时钟确定)、位置(来自其 GPS,当它有时)、及其 SHA-256,在到达时计算,以便稍后可以显示该文件的副本;显示 打开它;作为证据保存 保留呼叫文件超过保留期;
- 其下的查看链接(WHEP)允许 CAD、单位屏幕或其他位置在无需登录的情况下观看相同的实时视频:将其视为密钥。
视频永远不会从呼叫中获取:每个实时视频都有自己的端口,该服务器最多接受同时实时视频(默认为4个,除非设置),每个视频都要求保持在视频比特率以下,视频在10秒内停止则结束。呼叫者的手机必须在链接地址(https)和媒体端口(UDP)上访问此服务器。文件保留文件和曝光日志天(空白:直到删除),保留呼叫除外。
录制实时视频。 启用录制呼叫者的实时视频,呼叫者的实时视频将与照片和剪辑一起保存为一个文件:手机发送的相同图片,不进行转换,存储在IVF文件(H.264或VP8,每张图片都有自己的时间)中,并在写入时计算哈希值。由于丢失包而损坏的图片将被省略,而不是保存为损坏的图片,手机将被要求提供完整的图片以继续。显示播放它(从ffmpeg创建的WebM或MP4副本中,相同的图片在另一个容器中;如果没有ffmpeg,只能下载原始文件);下载原始文件提供哈希值对应的文件。ffmpeg、VLC和法医视频工具可以打开原始文件。
到CAD。 发送到CAD的EIDO(NENA-STA-021)以附加数据的形式引用每张照片、剪辑和录音,以及实时视频:urlPurpose为caller-photo、caller-video、caller-video-recording或caller-video-live,additionalDataByReferenceUrl为位于/m/{viewToken}/{n}或实时视频位于/whep/{viewToken}的文件。BitVoice在文件到达或实时视频开始或停止时将EIDO发送到CAD。链接使用链接地址(或此服务器的公共地址);如果两者都没有,EIDO将不引用任何媒体。每个通过这些链接的获取都记录在曝光日志中。事件流也会说同样的事情(GET /api/events:call.media、call.video)。BitVoice的EIDO经过NENA发布的EIDO模式的检查。
不存在的链接不会被快速猜测:尝试保持地址的尝试将被暂时拒绝。来自呼叫者的文件在沙盒中提供服务,而不是作为此服务器的页面。
曝光。 每个实时视频的显示和每个照片或剪辑的打开都在911呼叫中计算在曝光下:谁、多久、跨多少个呼叫。它是用于主管和中心的健康计划。
电话在911呼叫中发送的视频(SIP视频通过ESInet)可以以相同的方式观看:观看在没有链接视频的情况下将其用作源。
仅有号码的呼叫。 一个带有回呼号码但没有位置的911呼叫(来自CAMA干线或ESInet呼叫,其位置未到达)可以查找:提供位置查找(ALI)您的ALI数据库或位置服务器的HELD接口的地址(RFC 5985,按照RFC 6155的规定,通过电话号码查询)。BitVoice在呼叫到达时询问,且不会延迟呼叫,当答案返回时,位置出现在呼叫中;呼叫说明当查找失败及其原因。
传统的 ALI 链接。 没有 HELD 服务器,BitVoice 可以通过 ALI 控制器或 ALI 数据库的数据链接,以旧方式请求:它发送请求并以文本形式读取记录,通过网络(ALI 链接地址 主机:端口)或串行端口(serial:/dev/ttyUSB0?baud=9600&parity=none,带有 bits 和 stop;USB 串行适配器有效;在 Linux 和 macOS 上,而不是 Windows:那里,使用串行到网络转换器及其地址)。请求 是要发送的内容:{ani10} 十位回呼号码,{ani7} 其最后七位,{pos2} 位置, STX 和 ETX(当为空时为 {ani10})。答案是读取到其 ETX。ALI 布局在提供商和州之间有所不同,因此您需要放置每个字段:其行、其列和其长度(0:到行末),从 ALI 屏幕的打印输出中;街道(整行) 将街道行分成其各个部分,或逐一放置各个部分。粘贴示例记录并 读取示例 以查看带有列标尺的行以及每个字段的读取内容;询问 向链接本身询问一个号码。记录的地址和位置成为呼叫的位置,其名称成为呼叫者的名称,其服务类别显示在呼叫中。不是请求和文本答案的协议(PAM、E2 和其他供应商的自有协议)不被支持:它们需要网关。
ALI 串行端口溢出。 ALI 溢出到 也接受一个串行端口(serial:/dev/ttyS0?baud=9600),用于从串行电缆读取 CAD 的溢出。
地图。 在911设置下的地图中,为BitVoice提供其地图瓦片:一个.mbtiles文件,包含您所在区域的栅格瓦片(PNG、JPEG或WebP),该文件位于此服务器上,用于无需互联网即可工作的地图(您的GIS团队、TileMill、gdal2tiles或瓦片供应商可以创建一个),或一个瓦片服务器,其地址中包含{z}、{x}和{y}(您的县的,或一个商业的:注意其条款;公共OpenStreetMap服务器不用于此)。无论哪种方式,呼叫接听者的浏览器都仅从BitVoice获取瓦片:它读取文件或从瓦片服务器获取并在内存中保留最后的瓦片。同一张地图显示了无线电位置在无线电控制台上。矢量瓦片不受支持。
i3 日志 保留每个呼叫的 NENA i3 事件(呼叫开始、应答、位置、EIDO 发送),每天一个文件。应答时间 显示在您的目标内应答的呼叫数量(NENA:90% 在 15 秒内,95% 在 20 秒内),放弃的呼叫,以及每个呼叫者的平均应答时间。每天一行(CSV) 下载州 911 办公室通常要求的计数(呼叫、应答、放弃、在目标内和在 20 秒内、平均和最长等待时间)用于选择的日期;每个呼叫一行(CSV) 列出每个 911 呼叫,包括何时应答、由谁应答以及是否为文本呼叫。每个州都有其自己的表格:在 报告布局 下布局您的表格。通过此屏幕或通过 CAD 接听的文本呼叫计入接听者;在呼叫者离开之前无人接听的呼叫计为放弃。
报告布局。 新报告布局 按照您的州或县表格的布局排列报告:每行代表什么(一天、一周、一个月、每天的一小时、一个呼叫者或所有行),一个总行,以及列,按顺序排列,每个列都有其自己的标题(如果表格的单词不同):呼叫、应答、放弃(一个计数或一个份额)、在几秒内应答(一个计数或一个份额;秒数由您决定,因此对于一个表格为 10 和 20,另一个表格为 15 和 40)、在超过几秒后应答、平均和最长等待时间、90% 呼叫在几秒内应答的时间、平均呼叫长度以及文本呼叫(TTY、实时文本、文本到 911)。等待时间从呼叫到达到呼叫者应答。选择一个布局和日期,然后 运行 以在此处读取,电子表格(CSV) 以下载,或者 打印页面 以获取一个可以打印或保存为 PDF 的普通页面。布局与设置一起保存,因此它们会随备份一起保存并进入 Git。
TTY 呼叫。 聋人和听力障碍的呼叫者可能使用 TTY(文本电话,Baudot 45.45 位/秒)呼叫 911。BitVoice 从每个 911 呼叫的第一刻开始监听 TTY:呼叫者输入的内容会出现在呼叫的 文本 下,随着输入,暂停或新行开始新行。静默呼叫可能是等待您的 TTY:一旦您应答,通过 TTY 回复 即使在任何内容到达之前也会发送文本。输入回复并按 发送:它会以 TTY 音调的形式发送给呼叫者(在播放期间,呼叫者的声音会被静音,因为 TTY 按照顺序进行),全部为大写字母,TTY 礼仪适用:每个回合结束时使用 GA(“继续”),并在签名时使用 SK。TTY 无法显示的字符会被省略。语音、音乐和触摸音调永远不会被视为 TTY 文本:字符仅在其每个位都是干净的 TTY 音调时才会被计算。对话会与呼叫一起保存在呼叫历史记录和 i3 日志中(每个回合一个 MessageLogEvent)。在 911 设置中取消选中 在 911 呼叫中监听 TTY 以停止监听。
转接。转发的 911 呼叫保持其位置:PIDF-LO 与呼叫一起转发。
实时文本(RTT)。一部发送文本的电话(RFC 4103,例如 VoLTE 电话和 NG911 呼叫)由 BitVoice 自身回答,因为桌面电话不显示文本:每个字符在呼叫者输入时出现在呼叫中,您的回复以文本形式返回。RTT 自带的冗余可以弥补丢失的数据包;超出此范围的丢失文本显示为。
短信至 911。短信控制中心(TCC)通过会话发送短信到 PSAP,无语音(MSRP,RFC 4975,通过 ESInet 中继)。BitVoice 回答并等待标记为 短信至 911 的 911 呼叫,其中包含收到的短信;没有电话铃响。接收此文本 将您设为呼叫接收者(然后开始计时,CAD 获取 ALI 溢出和 EIDO)。在对话下面的框中回复,并在完成后点击 结束对话。TCC 关闭会话也会结束它。通过 911 呼叫的对话发送的 SIP MESSAGE 被视为呼叫者的文本,以相同的方式处理,回复通过 SIP MESSAGE 发送。仅接受来自标记为 来自 ESInet 的中继的短信。
提供会话的 TCC 通过 TLS(TCP/TLS/MSRP,msrps:路径,RFC 4975 第 14 节)获取会话,使用此服务器的证书(设置 › 证书;没有这样的证书将拒绝此类请求)。TCC 的证书必须是其请求中命名的证书(a=fingerprint,SHA-256);当它未命名任何证书时,必须通过设置在核心服务下设置的 PSAP 准入机构根证书进行验证(如果已设置)。BitVoice 的回复以相同的方式命名其自己的证书。
无论通过何种方式,整个对话都与呼叫一起保存在呼叫历史记录和 i3 日志中。
尚未实现的功能:通过 NG911 核心转发文本会话(ESRP 路由语音;文本会话在到达时回答);EIDO 传递标准自己的订阅(NENA-STA-024 WebSocket):BitVoice 将 EIDOs 发布到一个地址。
无线电调度控制台
/radio调度员通过与电话呼叫相同的耳机在无线电频道上进行通信。BitVoice通过无线电过IP(RoIP)网关访问无线电;无线电网络本身保持在运行它的人员手中。
设置。 在控制台设置下,选择一个控制台号码(例如800),然后添加每个频道:其名称、网关发送频道音频的此服务器的端口,以及网关的地址和端口用于输出音频。在网关:RTP,G.711 µ-law,到此服务器的地址和端口;在语音(VOX)上按键无线电。每个频道使用其端口和下一个端口,位于电话呼叫使用的范围之外。
加入。 调度员从他们的桌面电话拨打控制台号码,或按使用浏览器电话加入。然后,他们可以听到每个频道的混音流量;听取/静音在一个频道上可以将其从他们的耳机中删除。频道上的灯在接收时亮起。
通话。 按住频道的按住通话按钮(或聚焦它并按住空格键):您的语音仅发送到该频道,并且频道显示TX和您的分机号。一次只有一个调度员可以在一个频道上通话;按钮在有人通话时对其他人被禁用。没有人通话时,不会向频道发送任何内容,因此语音键控无线电永远不会被保持在空中。
补丁。 按补丁在一个频道上,然后按补丁到这里在另一个频道上:两个频道可以相互听到(例如,一个消防频道和一个互助频道),直到您按取消补丁。
P25对讲组。 一个频道也可以是P25对讲组,直接通过ISSI(TIA-102.BACA,P25子系统之间的接口;启用发送CSSI控制台PTT单词时,BitVoice将控制台子系统的单词添加到每个请求中)。选择P25对讲组(ISSI),提供对讲组ID、RFSS的SIP地址和ID,以及其语音的端口。在此控制台上的P25系统下,输入WACN和系统ID、RFSS ID您的P25管理员为此控制台提供的ID、调度员作为单位ID传输的ID,以及ISSI在此使用的SIP端口;P25系统必须将此服务器识别为具有该地址的RFSS。图块在组呼叫建立时显示P25(当未建立时显示P25下和原因),并以红色显示EMERGENCY时的无线电单位ID。按住通话请求主RFSS的频道(请求频道...);您的语音一旦被授予,即可发送,如果被拒绝(有人具有更高的优先级),则图块显示拒绝原因。语音在BitVoice中被转换为和从IMBE(P25语音编码器)
加密对讲组。在 加密密钥 下,添加每个无线电店提供的流量密钥:名称、算法(AES-256、DES-OFB 或三重 DES)、密钥 ID 和十六进制密钥(TIA-102.AAAD)。密钥保存后将不再显示,甚至管理员也无法查看,留空则保持原状。控制台在收到加密传输时,如果具有相同算法和密钥 ID 的密钥,则显示锁定图标和算法旁边的对讲单元;否则,传输将被静音,控制台将显示 无密钥:静音。要在对讲组上以加密方式传输,选择 传输 下的密钥;控制台的图块将显示 TX AES-256(或所选算法)。完整的配置导出(设置、管理员备份)包含密钥,因此请将这些文件保存在安全的地方。
私人呼叫。在 P25 系统上,位置栏中的 呼叫无线电 按钮可以通过单元 ID 呼叫一台无线电(打开 紧急 按钮以作为紧急呼叫)。呼叫成为一个单独的图块,私人呼叫:单元 197,具有 按住说话 和 挂断 按钮。无线电也可以呼叫控制台,在控制台传输的单元 ID 上:呼叫作为一个图块出现,标记为 被呼叫(当无线电作为紧急呼叫时,显示为红色,带有 紧急 标记),每个调度员都可以听到它,当任一方挂断时,呼叫结束。在控制台的 P25 设置中的 私人呼叫 下,提供无线电的 home RFSS 的 SIP 地址和 ID(为空时使用第一个对讲组的 home),以及是否应对私人呼叫进行加密的密钥。
警报音。在一个频道上 发送警报音 可以发送以下音调之一:警报 1,持续 3 秒的 1000 Hz 音调;警报 2,1000 Hz 和 1500 Hz 之间的 warble;警报 3,1000 Hz 脉冲;或一个短的 蜂鸣。音调在播放期间占用频道(图块显示 音调 和您的分机),每个监控频道的调度员都可以听到它发出,且在 P25 对讲组上,一旦 home RFSS 授予频道,音调就会发出。
紧急情况。当无线电以紧急方式传输(其紧急按钮)时,其图块变为红色,显示 紧急 和单元 ID,服务器日志记录它,并立即通知 CAD(如下)。紧急情况在无线电停止说话后保持在每个控制台上,直到调度员按下 确认:图块随后显示确认者和时间,CAD 收到 radio.emergency.ack 事件。确认显示所显示的单元:如果另一单元的紧急情况在确认前一刻取代了它,BitVoice 将拒绝,图块将显示新单元,因此不会错误地沉默第二个紧急情况。CAD 通过 API 确认也可以执行相同的操作:POST /api/radio/channels/{id}/ack 带有 {"unit": "bee07.1d5.00044d"}(或无线电 ID,"1101")在通道的紧急情况现在是另一单元时回答 409;没有正文时,它确认通道持有的任何内容。
Simulselect。要在多个频道上同时说一件事,请在每个频道上选中 选择,然后在图块上方的栏中按住 在 N 个频道上说话。这是一个全部或没有的操作:如果另一个调度员正在说话其中一个频道,则没有一个被激活,您将被告知哪一个。
无线电位置。无线电通过无线电系统的数据侧报告其位置,而不是控制台加入的语音侧:P25 位置服务、摩托罗拉的 LRRP 或供应商自己的位置服务,由无线电店的数据或 AVL 网关收集。让网关(或其旁边的一个小脚本)使用 API 令牌向 BitVoice 发送每个报告:POST /api/radio/locations 带有 {"unit": 1205, "lat": 40.2633, "lon": -76.8823, "speed": 42, "heading": 90, "accuracy": 8, "at": "2026-10-15T14:05:00Z"},或最多 500 个列表(速度为 km/h,方向为度,精度为米;所有三个和时间都是可选的)。控制台上的 无线电位置 列出每个无线电的最后一个位置,包括其名称,CAD 收到每个位置作为 radio.location 事件。BitVoice 不解码 LRRP 或 P25 位置服务本身。
无线电名称。在 无线电名称 下,通过 P25 单元 ID 为无线电命名(1205 是 "Engine 5",例如):图块在无线电说话时显示名称旁边的单元,且无线电日志和 CAD 事件包含名称。
无线电日志和录音。在 录音和 CAD 下打开 录制每个传输:每个频道上的每个传输(无论是接收还是发送)都作为一个录音保存,并在 无线电日志 中添加一行:时间、频道、谁(无线电的单元或调度员的分机)、时长以及是否为紧急情况、警报音、加密或私人呼叫。接收到的传输从第一句话开始,结束于最后一个词后 1.5 秒。使用搜索框查找单元、调度员或频道,并按 播放 以收听。录音的保存时间与呼叫录音的保存时间相同(设置、录音)。
Radio data to CAD. Give CAD's address under Send radio events to CAD at (and a shared secret if CAD wants one; it is sent as a bearer token and never shown again). BitVoice then POSTs each event (radio.unit, radio.emergency, radio.emergency.ack, radio.transmission and radio.location) as JSON, {"type": ..., "agency": ..., "data": {...}}: radio.unit when a radio starts talking on a channel (its unit ID, WACN, system, the channel, emergency, encryption), radio.emergency for an emergency (tried three times if CAD does not answer), and radio.transmission for each finished transmission as it appears in the radio log. CAD can also read the log itself with GET /api/radio/log (filters: channel, q, since, until). A CAD that is down never holds up the console. P25 radios' GPS positions are not part of this: they travel over P25 packet data (location services), not over the ISSI's voice.
尚未实现:P25 第 2 阶段(TDMA)语音使用其自身的半速率语音编码器。一个第 2 阶段系统在其 ISSI 对讲组中携带全速率(第 1 阶段)语音或其转码器转换时,可以与控制台配合工作,这是常见的:请咨询您的 P25 管理员。一个对讲组的语音以此控制台无法解码的块形式到达(最可能是未转码的半速率语音)在其图块上显示 此处静默,同时无线电正在说话,以免有人认为这是一个安静的频道。解码它需要两件事 BitVoice 没有:半速率语音编码器(AMBE+2,专利至 2028 年:从其所有者处获得许可,或使用具有许可的硬件语音编码器芯片),以及 ISSI 的半速率语音块格式(TIA-102.BACA-B,由 TIA 出售,不公开)。
NG911 核心服务(ECRF、ESRP、LVF、BCF、LIS、日志记录)
/core对于运行自己的 NG911 核心的州或地区 911 管理机构:BitVoice 作为 ECRF 回答 LoST,并将每个 911 呼叫作为 ESRP 路由到服务呼叫者的 PSAP。
服务区域。从 GIS 导出边界作为 GeoJSON 多边形(urn:service:sos 的 PSAP 边界;urn:service:sos.police 和其他的警察、消防或 EMS 区域),并在 核心服务 上上传。多边形的 name、uri 和 number 属性将被读取;为没有 URI 的区域提供默认 PSAP URI。编辑 区域以添加其服务的城市或县,适用于位置仅为民用地址的呼叫者。测试位置 显示哪个区域将回答位置或城市,就像 LoST 查询一样。
ECRF。打开 回答 LoST 查询 并列出允许查询的地址(您的 ESInet):其他元素向 /lost(RFC 5222)发送 findService 并获取 PSAP 的 URI。特定服务(sos.police)首先从其自身的区域回答,然后从 sos 答复。未被您区域覆盖的位置可以转到 森林指南(RFC 5582:ECRF 的国家目录):代表询问者递归查询并返回答案(答案路径中的两个服务器),任何其他查询都将被重定向到它,已经通过此 ECRF 的查询将被拒绝为循环。
ESRP。列出 PSAP:每个 PSAP 的 URI(如区域名称)、到达它的中继以及其溢出 PSAP,并选择默认 PSAP。然后将 ESInet 的传入 911 呼叫发送到 呼叫路由 (章节 8) 中的 ESRP。每个呼叫根据其位置(来自此服务器的区域或通过 LoST 的外部 ECRF)转发到相应的 PSAP,携带其位置和请求的服务;如果该 PSAP 不接受呼叫,则转发到其溢出 PSAP;如果没有位置或来自未被区域覆盖的位置,则转发到默认 PSAP。每个决定都记录在 911 呼叫 (章节 77) 的 i3 日志中。
策略规则。一旦 ECRF 选择了 PSAP,策略规则 下的规则将按顺序检查,并且第一个满足所有条件的规则将决定:将呼叫转发到另一个 PSAP 或拒绝为忙。规则可以检查服务(例如仅限火灾呼叫)、ECRF 选择的 PSAP、时间表(夜班中心关闭期间)、没有位置的呼叫、BCF 标记为可疑的呼叫以及呼叫到达的中继。每个决定都记录在 i3 日志中作为命名规则的 RouteLogEvent。
边界控制(BCF)。启用 检查来自ESInet的呼叫,每个来自ESInet trunk的呼叫都会被检查:位于 始终拒绝 的地址将被拒绝,超过允许的每分钟呼叫次数或同时保持的呼叫数量的地址也将被拒绝(电话拒绝服务攻击会从少数来源发送大量呼叫)。被拒绝的呼叫将收到503并带有Retry-After。启用 让标记为可疑的呼叫通过 以发送这些呼叫并让策略规则决定(发送到一个筛选中心或拒绝);真正的呼叫者在洪水中不会丢失。 边界控制:最新 列出了被拒绝或标记的内容。 检查STIR/SHAKEN签名 检查每个携带签名的呼叫的签名呼叫者ID(Identity头)与在设置中的呼叫筛选中设置的STI根:签名失败的呼叫将被标记为可疑并发送到其他地方,并列在BCF日志中;911呼叫永远不会被拒绝,而未签名的呼叫(今天的大多数呼叫)将被忽略。每个呼叫离开BitVoice作为自己的新请求(BitVoice是一个回复代理),仅携带BitVoice理解和传递的头部和正文:位置、附加数据和会话。 检查媒体 检查每个ESInet呼叫的每个RTP数据包,在其被使用或传递之前:来自呼叫的SDP中未命名的地址的数据包、未命名的有效载荷类型的数据包、头部长度(CSRCs、扩展、填充)不匹配的数据包、大小超过 最大数据包(空白时为1,500字节)或超过 每秒数据包(空白时为150;G.711在20毫秒发送50个数据包)的数据包将被丢弃和计数。每种类型的第一个、第十个、第100个等将被记录在 边界控制:最新(作为*媒体丢弃*)和呼叫的注释中。呼叫永远不会因媒体而结束:呼叫者保留良好的数据包。来自CAMA trunk的呼叫来自本地卡程序,不会被检查。
地址验证(LVF)。以GeoJSON格式上传您的911 GIS地址数据,使用NENA GIS数据模型(NENA-STA-006):带有FromAddr_L、ToAddr_L、Parity_L、IncMuni_L等的道路中心线,以及带有Add_Number、St_Name、Inc_Muni等的站点/结构地址点。具有validateLocation="true"的LoST查询将在其答案中获取地址的有效、无效和未检查部分(RFC 5222),以便运营商和位置服务器可以在911呼叫使用之前纠正地址。 检查地址 在这里执行相同的操作:精确的地址点是最佳匹配,然后是街道段,其右侧的范围包含该号码(尊重奇数和偶数侧);Street和St、North和N等拼写被视为相同。
i3日志服务。启用 运行i3日志服务:核心的其他元素(ESRPs、BCFs、PSAPs)将通过POST发送其日志事件(NENA-STA-010)到 /i3log/LogEvents,每个事件都使用元素的证书在其x5c头中签名为JWS。每个事件以JWS的扁平化JSON形式发送(签名或使用算法none,日志服务可能接受:标记为未追踪到PCA),被检查和保存,答案是其日志事件ID。使用 GET /i3log/LogEvents/{logEventId} 读取;使用 GET /i3log/LogEvents 列出(startTime、endTime、logEventType、limit、start);使用 /i3log/LogEventIds、/CallIds、/IncidentIds 和 /AgencyIds 找到呼叫或事件的ID;使用 /i3log/Conversations?callId= 读取呼叫的文本对话。 GET /i3log/Versions 指定此服务支持的版本。 接收的日志事件 列出了当天的事件以及每个事件的签名者。每个答案都被检查以确保符合NENA的i3日志服务的OpenAPI定义;此服务尚未与其他供应商的元素一起测试。
PSAP凭证机构。在 PSAP凭证机构根 下粘贴PCA的根证书:签名的日志事件将被接受,只有当其签名者的证书链到其中一个根证书(且未过期)时,才会被接受,并显示为 PCA。没有这些根证书,仅检查签名,事件将显示为 未追踪到PCA。
位置记录(LIS)。打开 回答位置请求(LIS),并上传一个电子表格(CSV)位置记录:一个标题行,每行包含一个 号码(ALI 数据,导出),一个 网络(例如 10.20.3.0/24 的地址范围,或一个地址:一个建筑,一个楼层,一个 VLAN,一个 Wi-Fi 网络)或一个 MAC 地址(一个设备:一个桌面电话,一个墙上的网络交换机端口),然后是地址作为 hno,rd,sts,unit,floor(或 flr),a3(城市),a1(州),pc 和 country,以及 lat,lon 和 radius(如果已知)(其他名称,如 phone,street,zip,subnet 和 ip 也被理解)。PSAP,传统网络网关和电话然后从允许的地址请求 /held(HELD,RFC 5985)并获得一个 PIDF-LO。一个请求通过电话号码,IP 地址或 MAC 地址(RFC 6155)命名其设备;一个不命名任何设备的请求将为其请求的地址返回答案,就像一个办公室或校园网络上的 LIS 一样。一个地址通过包含它的最窄网络进行定位,因此一个楼层的 /24 将优先于校园的 /16。没有记录的设备将获得 HELD 的 locationUnknown;一种其他类型的身份(NAI,端口)将获得 notLocatable。BitVoice PSAP 将其 位置查找(ALI) 指向此处。查找一个号码,地址或 MAC 地址 检查一条记录并指出它来自哪个网络。再次列出的一个号码,网络或 MAC 地址将替换其旧记录;替换每条记录 将从头开始。只有允许的地址会被回答:一个回答关于其被询问的任何地址的 LIS 必须不对任何人开放。
The i3 web services. Under NENA i3 web services, switch on what this core offers the other elements of your ESInet, at /i3/<service>/v1, for the addresses under May ask only. Each answers as NENA's published OpenAPI definitions say (NENA-STA-010.3, the NENA911 repositories), and each has a tab under i3 web services:
- Policy Store (
/i3/PolicyStore/v1/Policies,/PolicyEnums): agencies store, update and delete their routing policies (Policy Routing Rules), each a JWS signed by the agency that owns it (the signer's certificate must name the owner, and come from the PCA when its roots are set). A policy is kept byte for byte as it came. The ESRP runs them: the OriginationRoutePolicy for This ESRP's incoming queue first, else the NormalNextHopRoutePolicy of the PSAP the ECRF chose. Of the rules whose conditions hold, the highest priority acts; when its route fails (busy, no answer within its rnaTimer, 20 seconds when it gives none), the next one does; a BusyAction answers 600 Busy Everywhere. Conditions taken: time periods, SIP headers, Additional Data, body types, location (circle or civic), call suspicion, queue state (BitVoice's own PSAPs), LoST service URN and Normal-NextHop, call source, request URI, incoming queue, and the SDP offer's media and languages; service state and security posture are taken as unknown (Unreachable and Green, as the standard says). Body-part, CAP and calling-number-verification conditions are not run: they count as false. Without a stored policy, the Policy rules above decide. The tab lists what is stored and lets you paste one, or sign one with this server's certificate. - Discrepancy reports (
/i3/DiscrepancyReports/v1): other agencies report problems with this server's services; each shows on the tab, where you answer it with a resolution, sent to the reporter. File a report sends one to another agency's DR service; its answer and later resolution show under Reports this server filed. - Bad actors (
/i3/BadActor/v1/BadActors, with the BCF): each call the BCF passes on carries its source's ID (Call-Info: <sip:ID>;purpose=emergency-source); a PSAP that finds that source attacking reports the ID, and the BCF refuses its calls, or raises their suspicion score for the policies, for A report lasts hours. Lift ends a report early. - Geocode and MSAG conversion (
/i3/Gcs/v1,/i3/Mcs/v1): civic address to position and back from the LVF's address points (the nearest within 150 m), and civic address to MSAG address (120 N MARKET STREET, HARRISBURG CITY, PA) and back, from the centerlines'MSAGComm_L/MSAGComm_Rfields. Answers are JSON objects, or XML when the asker asks for it. - Additional Data (
/i3/Adr/v1/AdditionalData?callerUri=): blocks you keep by caller (RFC 7852 XML), served by value, or by reference for an asker that wants JSON. One block per caller is served by value: the first kept. - Locator (
/i3/ServiceAgencyLocator/v1): this agency's own record (its ID from the 911 calls page, with its logging and discrepancy addresses) and the agencies you add. - Dequeue (
/i3/DequeueRegistration/v1/Registrations): positions or PSAPs sign up to take a queue's calls (this ESRP's queue, or a PSAP's URI); the ESRP sends calls for that queue to them, the most preferred first (preference 5 before 1), over the PSAP's trunk. - Test calls: a PSAP asks this core to send it test calls (
/i3/TestCall/v1/SendTestCalls/{agency ID}: every so many minutes, five at least, between two dates, with a location); BitVoice places each tourn:service:test.sosover the PSAP's trunk and keeps what came back. Place one now tries one. - PSAP states (SIP, not REST): Subscribe to each PSAP's queue and service state has the ESRP SUBSCRIBE (RFC 6665) to every PSAP listed, over its trunk, for
emergency-QueueStateandemergency-ServiceState(NENA-STA-010.3 4.2.1.3 and 2.4.2), for an hour at a time, renewed before it ends. What the PSAPs NOTIFY shows under PSAP states and is what the policy rules' queue state, service state and security posture conditions read. A PSAP whose queue says Inactive, Disabled, Full or ResourceExhausted (or holds its most calls), or whose service says Unstaffed, ScheduledMaintenanceDown, Overloaded, GoingDown or Down, is passed over for its overflow, and the call's notes say so; when every PSAP in the chain says it cannot take calls, the call is sent as listed anyway, never left with nowhere to go. A PSAP that does not answer the SUBSCRIBE is Unreachable (as the standard says a subscriber must assume) and is tried again each minute; one that refuses it (489, 603 ...) is tried again in ten minutes. - This server's states: Tell other elements this server's element, service and queue state answers SUBSCRIBEs for
emergency-ElementState,emergency-ServiceStateandemergency-QueueStatefrom the addresses under May ask (others get 603 Decline; a queue that is not this server's incoming queue, 488). The queue's length is the 911 calls not yet answered here, and it says Full at Most calls waiting in the queue (20 when blank); the service says Overloaded at this server's call limit, else Normal. NOTIFYs go out when the state changes, at most one a second, and once a minute regardless (the standard's default rates); their bodies are checked against NENA's notify-body schemas.
测试呼叫到PSAP。 BitVoice PSAP通过自身回答来自ESInet的测试呼叫(urn:service:test.sos,NENA-STA-010.3第9节,RFC 6881):其回答包括PSAP的名称、服务和呼叫的位置,前三个音频包被发送回去,然后挂断。来自同一位置的第二个测试呼叫在两分钟内被拒绝(486),同时五个同时呼叫也被拒绝。ESRP像真正的呼叫一样传递测试呼叫,仍然标记为测试。切换到911呼叫页面的回答测试呼叫以拒绝它们(404)。
JWS算法:NENA-STA-010.3要求使用EdDSA和Ed448。BitVoice使用的Go标准库具有Ed25519,但不支持Ed448,因此EdDSA签名使用Ed25519密钥检查,并且也支持ECDSA和RSA签名;Ed448证书被拒绝。
您是指。 无效的地址可以从相同的数据中获得最多五个建议,每个建议都说明了原因:街道上一个或两个字母不同(交换的一对字母算作一个),同一街道在下一个城镇,或者街道上最近的号码,在可能的情况下保持在同一侧(偶数保持偶数)。使用填充建议。带有地址的位置。 使用地址提供纬度和经度(以及位置的半径,当已知时):该位置与地址自己的地址点进行检查,允许其半径和100米(一个地块的大小和GIS错误)。答案提供距离和两个位置是否一致,如果不一致,则提供地址点最近的位置。仅从道路中心线知道的地址没有点可供检查,答案指出这一点。LoST的validateLocation没有位置,因此通过LoST请求的运营商仅获得验证结果。