前段时间,我需要与一个无法实际使用手机的人进行沟通。 需要一个简单的呼叫设备,只需按一下按钮即可进行语音呼叫。 然而,这种需求消失了,他亲自去医院看了看病人,认为这样的解决方案可能会派上用场。
现在,我看到了该设备作为SIP门铃的个人用途。
也许只需稍作改动,即可将VoIP电话与家庭自动化系统结合起来。 作为使用选项-SIP门铃,对讲机,语音通信系统(客户人员,主管秘书)等

整个决定取决于免费和开源软件:操作系统-Raspbian Stretch(Debian 9),家庭自动化系统-MajorDoMo,VoIP服务器-Freeswitch,能够在终端模式Linphonec上运行的IP电话软件客户端。
在这一部分中,我们将主要讨论如何安装Linphonec控制台SIP客户端。
我们将需要:
- Raspberry Pi-单板计算机(我有Raspberry Pi 3B模型)
- Micro SD存储卡,至少16 GB,USB充电器,外壳。
- USB声卡(最便宜的一种,使用Gembird),麦克风,扬声器(耳机)。
- 按钮和一对用于GPIO引脚的BBJ跳线。
1.
第一步-为RPI安装MajorDoMo映像当前,Raspberry Pi的映像的当前版本为v。 3.40。 以下是MajorDoMo图片和更改的简短说明:
Raspberry Pi的MajorDoMo基本图像安装后以及系统启动时,将扬声器连接到3.5连接器-我们将听到系统消息和Raspberry的IP地址。
默认用户名是:pi密码:raspberry。
2.安装FREESWITCH,
为Raspberry安装FRESWITCH VoIP服务器之后,我们继续进行必要组件的安装。 可选的,但以后可能有用的步骤。
安装RPi-Monitor
安装一个小的但有用的RPI监视器实用程序,以显示我们的Raspberry PI的资源。
RPi-Monitor是基于Web的Raspberry Pi板监视软件。 该工具可用于控制磁盘空间,CPU负载,内存和网络流量,温度的使用。 RPI-Monitor的安装非常简单,并且可以直观地显示有关系统的信息。
首先,我将提供到源的链接:
RPi-Monitor 。
安装RPi-Monitor公用密钥并将其添加到受信任的存储库中:
sudo apt-get install dirmngr sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 2C0D3C0F sudo wget http://goo.gl/vewCLL -O /etc/apt/sources.list.d/rpimonitor.list
接下来,更新系统并安装RPI监视器本身:
sudo apt-get update sudo apt-get install rpimonitor
在运行监视器的端口8888中,在浏览器中打开计算机的IP,然后查看RPI状态。

在Raspberry Pi OS中安装USB声卡并设置声音
不幸的是,我们的Raspberry mini电脑没有自己的内置麦克风和输入。 因此,要连接麦克风,您将必须使用外部USB声卡。 我们将卡连接到Raspberry USB端口,并执行命令(显示系统中的声音设备):
cat /proc/asound/cards
我们看到了两张bcm2835卡的答案-内置,外部定义为USB音频设备:
0 [ALSA]:bcm2835_alsa-bcm2835 ALSA
bcm2835 ALSA
1 [设备]:USB音频-USB音频设备
GeneralPlus USB音频设备,速度为usb-3f980000.usb-1.4操作系统可以看到我们的声卡,但尚未在系统中注册。
创建一个文件:
sudo nano /etc/modprobe.d/alsa-base.conf
我们写(粘贴)以下行:
选项snd-usb-audio索引= 1保存(在编辑器中Ctrl + X)。
创建另一个文件:
sudo nano /etc/asound.conf
添加内容:
文件内容 pcm.!default { type plug slave { pcm "hw:1,0" } } ctl.!default { type hw card 1 }
我们编辑以下配置文件:
sudo nano /usr/share/alsa/alsa.conf
将默认的声卡从0更改为1(USB卡),显然,默认情况下,0是小型计算机的内置声音输出,请在2行中设置以下参数:
defaults.ctl.card 1 defaults.pcm.card 1
更改将生效,重新启动后,我们会在控制台中输入以下内容进行超载:
sudo reboot
我们将麦克风和扬声器(耳机)连接到外部音频卡。 重新启动后,运行Alsamixer声音配置实用程序。
alsamixer
我们会看到默认情况下在系统中定义的设备:

使用左右光标键,选择所需的设备,上下调整,注意所选设备下的符号:
xOOx-设备已打开,xMMx-设备已关闭。 从屏幕截图中可以看到,默认情况下,我的麦克风在系统中处于关闭状态。
要打开/关闭设备,您需要按键盘上的
M。退出alsamixer(退出ctr + C)。
检查系统中的声音。 扬声器和麦克风连接到声卡的相应USB输出。
我们给出命令:
arecord -D plughw:1,0 -f cd /home/pi/test_record.wav
使用此命令,声音文件通过麦克风记录到适当的目录(在本例中为用户的家庭pi)。 停止记录
Ctrl + c 。
检查记录的文件:
aplay /home/pi/test_record.wav
我们稍后会进行更好的检查。
安装Linphonec控制台VoIP客户端
没有图形界面的操作系统中没有多少程序可以运行;我选择了Linphone软件包。
该软件包非常大,具有许多潜在功能,但是到目前为止,我们只需要一个小型实用程序Linphonec,它可以在终端中工作并具有自动应答(自动接听)功能。
对于她来说,将执行以下操作。
我注意到从Raspbian存储库安装时,安装了一个相当旧的版本3.6.1,该版本无法在ALSA声音系统上正常工作,我的声音消失了,程序本身崩溃了几次。
因此,我将使用最新版本。
为了从源代码中自动组装程序包,我们安装了其他依赖项:
sudo apt-get install cmake automake autoconf libtool intltool yasm libasound2-dev libpulse-dev libv4l-dev nasm git libglew-dev
转到主目录:
cd /home/pi/
下载Linphone软件包本身,下载大约花费了20分钟。
git clone git://git.linphone.org/linphone-desktop.git --recursive
从第一次甚至第二次我都无法编译Linphone程序包。 因此,我将给出我的行动算法。
我们使用systemctl服务管理系统停止了几乎所有当前正在运行但尚未使用的服务。
组装时出现错误,我们的微型PC根本没有足够的资源。 释放它们进行安装。
停止服务 sudo systemctl stop freeswitch.service sudo systemctl stop majordomo.service sudo systemctl stop avahi-daemon.socket sudo systemctl stop avahi-daemon.service sudo systemctl stop mosquitto.service sudo systemctl stop mysql sudo systemctl stop mpd.service sudo systemctl stop mpd.socket sudo systemctl stop homebridge.service sudo systemctl stop nginx.service sudo systemctl stop bluetooth.target sudo systemctl stop bluetooth.service
为了以防万一,我们可以制作一个临时的(重新启动之前)交换文件(硬盘空间),以供RAM不足时操作系统使用。
要检查交换文件是否包含在我们的Raspbian(Debian)安装中,请输入:
sudo swapon --show
输出为空,这意味着系统没有交换文件。
添加1G交换并创建文件:
sudo fallocate -l 1G /swapfile
只有root用户可以读取和写入页面文件,因此我们设置了正确的权限:
sudo chmod 600 /swapfile
我们使用mkswap工具在文件中配置Linux交换区域,并通过键入以下命令来激活它:
sudo mkswap /swapfile sudo swapon /swapfile
下载软件包时转到创建的目录:
cd linphone-desktop
我们准备安装没有图形界面的版本:
sudo ./prepare.py no-ui -DENABLE_OPENH264=ON -DENABLE_WEBRTC_AEC=OFF -DENABLE_UNIT_TESTS=OFF -DENABLE_MKV=OFF -DENABLE_FFMPEG=ON -DENABLE_CXX_WRAPPER=OFF -DENABLE_NON_FREE_CODECS=ON -DENABLE_VCARD=OFF -DENABLE_BV16=OFF -DENABLE_V4L=OFF
使用–j4属性进行构建(即,同时构建4个线程。
sudo make -j4
安装时,我们可以在RPI-Monitor中查看计算机的状态:

对我而言,构建时间约为30-40分钟。
编译的程序文件出现在OUTPUT / no-ui / bin目录中。 要运行该程序,让我们进入它:
cd OUTPUT/no-ui/bin
检查程序的版本:
./linphonec -v
我们得到的结果是:版本:3.12.0
重载我们的树莓
重新启动时,交换文件消失,恢复了在启动中注册的所有正在运行的服务。
一个小的Freeswitch初始设置。
FREESWITCH服务器默认安装在/ usr / local / freeswitch /目录中。 conf文件夹包含配置文件。 默认情况下,安装了香草测试配置,该配置在大多数情况下用于使您熟悉VoIP服务器的可能性,并且包含大量显然对于家庭使用而言是多余的示例。 首先,让我们看看VoIP服务器的现成配置。
编辑配置文件vars.xml
sudo nano /usr/local/freeswitch/conf/vars.xml
首先,将默认密码1234更改为一个不同的值,例如1111。如果您不这样做,则在每次呼叫之前设置一个暂停,然后拨打10秒。
默认情况下,正如我在上一篇文章中所写,我们有20个订阅者号码1001-1020。 默认情况下,还会安装Dialplan。
由于某些原因,与六个月前相比,当mod_xml_rpc模块打开时,服务器不断崩溃。
Dialplan FreeSWITCH广泛使用正则表达式。 默认的拨号计划负责处理呼叫,Local_Extension文件的下一部分负责发送给我们的本地号码。 注释掉几行:
sudo nano /usr/local/freeswitch/conf/dialplan/defaults.xml
对话框编辑,在此部分插入注释符号:
对话框编辑数字1001-1019 <extension name="Local_Extension"> <condition field="destination_number" expression="^(10[01][0-9])$"> <action application="export" data="dialed_extension=$1"/>
我认为,尽管FS具有一定的工作能力,但还有一点点题外之意,我们进行了几处更改后,最好自己重做FS配置文件,包括 订阅,拨号计划等,但是您不能在一篇文章中介绍所有内容,因此我们转向终端客户。配置并启动Linphonec终端客户端
从当前的pi用户以自动应答模式运行Linphonec:
/home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec -a
首次启动时,Linphonec尝试创建数据库文件和设置文件。 但是,启动错误。
启动linphonec时出错 2019-08-02 18:02:58:715 mediastreamer-error-Connection to the pulseaudio server failed 2019-08-02 18:02:58:946 belle-sip-error-udp bind() failed for ::0 port 5060: Address already in use 2019-08-02 18:02:58:947 belle-sip-error-TCP bind() failed for ::0 port 5060: Address already in use 2019-08-02 18:02:59:126 liblinphone-fatal-Unable to open linphone database. Aborted
最初,我们将处理最后一个错误,即打开数据库文件。
数据库文件是通过以下路径在主目录中创建的:/home/pi/.local/share/linphone
如果Linux文件(或目录)的名称以“。”开头,则被认为是隐藏的。 例如,“。myfile”。 通常,此类文件由应用程序用来存储需要向用户隐藏的设置,配置和其他信息。
从当前用户(pi)创建目录
mkdir /home/pi/.local mkdir /home/pi/.local/share mkdir /home/pi/.local/share/linphone
我们启动程序,程序启动,但是它给出了一个错误:
端口打开错误 2019-08-07 11:29:32:780 mediastreamer-error-Connection to the pulseaudio server failed 2019-08-07 11:29:32:866 belle-sip-error-udp bind() failed for ::0 port 5060: Address already in use 2019-08-07 11:29:32:866 belle-sip-error-TCP bind() failed for ::0 port 5060: Address already in use
我们解决了创建数据库的第一个问题;在最初启动时,该程序生成了一个数据库文件。
与Pulseaudio声音系统相关的错误-不会干扰程序的功能,我计划使用ALSA,如有必要,可以始终在以前安装声音服务器。
第二个-端口5060繁忙。 这些端口是SIP应用程序常用的端口。 我们可以退出程序并给出命令:
sudo netstat -tulpn | grep LISTEN
我们将看到端口5060使用我们的VoIP FREESWITCH服务器。 好吧,我们将使用免费端口。
我们回到linphonec程序。 并进行一些设置。
首先,更改Linfon的端口,然后向VoIP服务器指示注册,检查注册状态并查看声卡列表,使用的卡并在外部USB上对其进行配置(Linphone程序中的索引为2):
ports sip 5062 register sip:1001@192.168.15.13 192.168.15.13 1111 linphonec> help register status register soundcard list soundcard show soundcard use 2 soundcard show

在注册团队中,我们使用以下格式:Sip用户ID-默认情况下,我们有20个订户,编号为1001-1019。 这些数字是订户的用户名订户登录名@ [域名]-域名-我们的Raspberry的IP地址。 Sip代理-匹配RPI IP地址,最后-我们最近设置1111的用户密码。
退出程序(Ctrl + x),设置并不总是即时应用。 在主目录/ home / pi中退出后,控制台客户端配置文件出现:.linphonerc。
我们已经可以通过编辑SIP客户端的配置文件进行更改。
在新的启动控制台上,SIP客户端。
在当前SSH会话的同时,打开一个新会话,使用您的用户名和密码登录。
我们启动alsamixer。 在一个会话中,我们有Linphonec,在第二个会话中,有一个声音调整实用程序。
我们通过在智能手机或PC上的SIP客户端上进行呼叫设置(如有关安装FREESWITCH的文章中所述),方法是将默认密码更改为您自己的密码并拨打一个号码(在我们的情况下为1001)。我们可以转到freswitch门户,地址为IP_Raspberry:8080,查看订户注册,状态电话等

使用alsamixer,我们调整声音。 声音更改可即时应用,而无需退出程序。
不幸的是,由于使用了便宜的声卡,我无法获得令人满意的声音,扬声器中听到了回音。 可以将其最小化,但将其完全删除-我没有成功。
因此,由于无法以一种方式删除,因此我们以另一种方式删除。
关闭Linphonec,编辑配置文件:
sudo nano /home/pi/.linphonerc
在声音部分,我们将最后三行带入此形式:
Linphonerc声音部分 [sound] remote_ring=/home/pi/linphone-desktop/OUTPUT/no-ui/share/sounds/linphone/ringback.wav playback_gain_db=0.000000 mic_gain_db=0.000000 ringer_dev_id=ALSA: bcm2835 ALSA playback_dev_id=ALSA: bcm2835 ALSA capture_dev_id=ALSA: USB Audio Device
这样,我们迫使铃声和声音输出设备在内置的3.5覆盆子插孔上工作,而录音设备-麦克风通过外部声卡工作-回声消失了。
将扬声器切换到树莓派自己的接口。
我们考虑以下时刻:在加载时,在某些情况下,智能家居系统通过此音频输出播放其系统消息。
把它们关掉。 我们将IP_Rasberry传递到主页,打开MajorDoMo家庭自动化系统。
我们在“属性”选项卡上输入控制面板-“计算机”对象(扩展设备)-“ ThisComputer”,然后设置值:
ThisComputer.minMsgLevel 100 ThisComputer.volumeLevel 0

将条目添加到cron(旨在在特定时间或特定时间间隔执行任务的守护程序。crontab实用程序用于编辑任务):
crontab –e
我注意到我们是在用户pi下执行此操作的。
在最末端插入行:
@reboot /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec –a
重新启动时,打开计算机电源,此行将在自动应答模式下启动Linphonec程序。
返回MajorDoMo:
让我们转到服务部分的主页:
在此部分的菜单中,创建了用于重新引导(关闭)计算机的按钮。
事实是,为了节省SD存储卡的资源,更改会在一定时间(15分钟)后记录在“智能家居”系统中。 因此,如果您需要使覆盆子超负荷,那么最好做正确的事。 我们重新启动系统。

重新启动后,转到MajorDoMo主页,转到控制面板,就像上一篇文章一样,我们使用以下格式从控制台拨打电话:
GetURL("http://freeswitch:works@192.168.1.103:8080/webapi/originate?user/1001%201003%20XML%20default")
遵循命令,Linphonec会自动接听电话。 在RPI扬声器中,正在播放声音文件,正在将呼叫发送到第二部软电话(PC /智能手机)。 拿起听筒后(通过按程序中的应答按钮),建立了连接。

在此,我完成了这一部分。 稍后,我将尝试使用GPIO描述按钮本身,并在本地网络之外设置呼叫。