DIY呼叫按钮第2部分。RaspberryPi的可视电话

在这一部分中,我们将制造用于使用SIP协议进行视频通话的Raspberry Pi VoIP设备。

初始任务保持不变-通过外部影响进行呼叫(按一个按钮)。 但是这个想法的实现发生了变化。 与上一部分一样,我们将使用Linphonec终端SIP客户端,但是为了简化设置,我决定使用Zadarma.com VoIP提供程序以及免费的网络电话,包括视频支持。 对于视频通话,我使用了廉价的USB摄像头。

详细信息以及切工下的分步说明。

第一部分
该系统开箱即用地部署在RPI v3_40_int基础映像上,而无需安装任何其他组件。

链接Raspberry的基本MajorDoMo图像

我使用的网络摄像头是预算(在明斯克约7 ye)-Ritmix RVC-015M。 能够手动调整焦点。

在测试和撰写帖子的过程中,我决定放弃使用VoIP服务器(Fresswitch)。 安装VoIP服务器会使设置过程复杂化,但可以提供更大的灵活性。

例如,我们将使用Habr VoIP上展示的运营商Zadarma

要拨打电话,我们需要在SIP服务器上有两个帐户。 在一种情况下,Raspberry Pi和控制台客户端可以工作,第二种用于智能手机(或PC)。 注册过程很直观,不需要描述。

我将简要重复Linphone软件包的安装和配置,在第一部分中将提供更多详细信息。

安装和组装Linphone


准备安装:


停止运行但未使用的服务:

停止服务
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)安装中;如果输出为空,则表示系统上缺少交换文件。
添加1G交换并创建文件。

我们为此文件设置了正确的权限,只有root用户才能读取和写入页面文件。

我们使用mkswap工具在文件中配置Linux交换区域并激活它:

 sudo swapon --show sudo fallocate -l 1G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile 

安装Linphonec控制台SIP客户端和Linphonecsh管理实用程序


为了从源代码构建软件包,我们安装了其他依赖项:

 sudo apt-get install cmake automake autoconf libtool intltool yasm libasound2-dev libpulse-dev libv4l-dev nasm git libglew-dev 

我们转到主目录并下载Linphone软件包本身,下载大约花费了20分钟:

 cd /home/pi/ git clone git://git.linphone.org/linphone-desktop.git -recursive 

下载软件包时,我们进入创建的目录,准备安装没有图形界面的版本:

 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 

组装需要30-40分钟。

编译的程序文件出现在OUTPUT / no-ui / bin目录中。 要运行该程序,请转到它,检查程序的版本:

 cd OUTPUT/no-ui/bin ./linphonec -v 

我们得到的结果是:版本:3.12.0

重载我们的Raspberry。

重新启动时,将还原启动时注册的所有服务,并删除页面文件。

设置终端SIP客户端Linphonec


从当前的pi用户以自动应答模式运行Linphonec:

 /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec 

首次启动时,Linphonec尝试创建数据库文件和设置文件。 但是,启动发生错误,程序停止。

在第一部分中如何从当前用户(pi)创建目录

 mkdir /home/pi/.local mkdir /home/pi/.local/share mkdir /home/pi/.local/share/linphone 

因为 在我们的情况下,我们不使用VoIP服务器,则使用IP电话5060的标准端口。

我们将通过在Linphonec中执行以下命令来注册其中一个帐户:

 register sip:XXXXXX@sip.zadarma.com sip.zadarma.com YYYYYYY 

可以通过键入帮助注册来查看命令的格式。

在我们的情况下,XXXXXX是帐号(登录),YYYYY是注册期间发出的密码。 检查注册:

 status register 

成功注册后的响应: 已注册,身份= sip:XXXXX@sip.zadarma.com持续时间= 3600

通过按ctrl + c或quit命令退出客户端。

在主目录/ home / pi中退出后,控制台客户端配置文件出现:.linphonerc。

连接网络摄像机


我们连接到Raspberry相机。

检查我的帐户是否包含在视频组中

 cat /etc/group | grep video 

答案: 视频:x:44:pi

让我们看看您的系统中的网络摄像头是否已确定:

 sudo ls -l /dev/ | grep video 

检查是否确定了相机的麦克风:

 arecord -l 

答案是:

CAPTURE硬件设备列表
卡1:摄像机[USB2.0 PC摄像机],设备0:USB音频[USB音频]
子设备:1/1
子设备0:子设备0

一切都井井有条,也有一个麦克风。 我们将在alsemikser中对其进行检查

 alsamixer 

我将立即澄清,我的麦克风默认情况下处于打开状态,它已被确定为主要麦克风,并且几乎完全扭曲,并且具有强大的过载能力。

按F6(选择卡),选择USB PC摄像机,然后按F4-Capture设备(摄像机上的麦克风),将其级别降低至几乎为零,同时按下光标键,同时我们将选中Capture。



在Android的应用程序市场中,我安装了Linphone应用程序(尝试了几次,只有它开始广播视频。在Windows上,我使用的所有SIP客户端都可以正常工作。它在我的SIP服务器上也可以正常工作(freeswitch,如果在本地使用,不仅是网络,最好的选择是服务器+来自本地网络的呼叫网关。

有关设置Linphone Android应用程序的说明,请访问Zadarma.com。
来自SIP提供程序的说明

我们在Zadarma上注册了手机,然后(可选)我们配置视频,音频等。

为了进行测试,我们在RPI中运行带有视频通话和自动应答功能的linphonec实用程序(添加-V -a键):

 /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec -V -a 

并通过键入以下内容在终端客户端中拨打电话:

 call 576935 

VoIP服务器(域)替换是自动执行的,尽管您可以完全拨入SIP地址。

结果,我们得到:


(在距镜头2-3米的距离内,此相机的质量或多或少)。

我们可以通过在智能手机上拨打RPI号码来检查自动应答模式。

要在守护程序模式下运行和控制Linphonec,请使用Linphonecsh实用程序。

最初,在启动时,需要初始化linphonecsh -init客户端。 执行此命令后,控制台客户端将启动,而不会加载配置文件。
为了在启动时读取配置文件,将使用标志-s-V -a启动进行视频通话和自动接听来电的功能:

 /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonecsh init -c /home/pi/.linphonerc -V -a 

现在,我们可以从OS和MajorDoMo的命令行管理控制台客户端。

从终端启动视频通话的命令:

 /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonecsh dial XXXXX 

可以采取第一步。

连接按钮并使用GPIO




Raspberry Pi具有多个接口的GPIO端口(通用输入/输出)。 它包含可连接各种执行器的通用输入和输出,在我们的情况下是一个简单的按钮。

几乎所有的GPIO引脚(有几个保留)都可以设置为以下两种状态之一:“输出”(aka OUT或逻辑1)或“输入”(IN或逻辑0)。 输出电压为3.3V。

对于我的按钮,我将使用第一行中最右边的两个图钉。 将连接器#38(GPIO20)设置为“输出”(OUT),将连接器#40(GPIO21)设置为“输入”(IN)。

BBJ跳线用于连接到GPIO梳。 当树莓从网络断开时,建议连接。

让我们创建两个脚本。 第一个用于初始化GPIO端口,第二个用于Linphonecsh实用程序控制命令。

Bash脚本初始化GPIO端口:

 sudo nano /usr/local/bin/gpio21.sh 

并粘贴内容

gpio21.sh
#! / bin / bash
#设置GPIO20并设置为输出
回声20> / SYS /类/ GPIO /出口
回显> / sys / class / gpio / gpio20 /方向
回声1> / sys / class / gpio / gpio20 /值
#设置GPIO21并设置为输入
回声21> / SYS /类/ GPIO /出口
回显> / sys / class / gpio / gpio21 /方向

我们使文件可执行:

 sudo chmod +x /usr/local/bin/gpio21.sh 

我决定使用PHP来完成第二个用于单击按钮的脚本,以便随后与MajorDoMo家庭自动化系统集成。 只需按一下按钮,端口21的状态就会改变,系统会定期读取端口21的值,如果更改,则会向Linphonecsh发送拨号命令。

 sudo nano /usr/local/bin/dial.php 

并粘贴内容:

Dial.php
<?PHP
$ old_state = 0;
而(真)
{
$ state = file_get_contents('/ sys / class / gpio / gpio21 / value');
如果($ state!= $ old_state)
{
如果($ state == 1)
{
//拨打新电话
回声“ make”;
exec(“ sudo -u pi / home / pi / linphone-desktop / OUTPUT / no-ui / bin / linphonecsh拨号sip:XXXXX@sip.zadarma.com”);
休眠(200000);
}
$ old_state = $ state;
}
睡着了(20000);
}
?>

我们使文件可执行。

接下来,我们在启动文件的最后写三行:

  1. GPIO端口初始化脚本
  2. 在自动应答模式下启动管理实用程序并支持视频传输
  3. PHP脚本拨号。

 crontab -e 


 @reboot sudo /usr/local/bin/gpio21.sh @reboot sudo -u pi /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonecsh init -c /home/pi/.linphonerc -V -a @reboot sudo php /usr/local/bin/dial.php 

重载我们的Raspberry,sudo重新启动。 重新启动后,我们的可视电话即可使用。

此外,如果需要并且可能的话-集成到家庭自动化系统中,连接到SIP服务器等。

等待和进行视频通话时的RPI加载
等待和进行视频通话时的RPI加载:





一个小的题外话


最初,我计划制造一种与生病后无法独自使用电话的人进行通讯的设备,此后这种需求消失了,但决定完成这项工作,并且我发现可以将家庭自动化的组件之一用于其他目的。

创建时,我希望满足以下条件,或者至少满足三分之二:

  1. 可用性(现在(在我所在的地区)购买组件的能力。
  2. 预算(出口处设备的低成本)。
  3. 执行的简单性,或者至少是分步说明的完整性(无需特殊知识和时间成本即可重复使用该设备的人制造设备并开始使用它的能力)。

Source: https://habr.com/ru/post/zh-CN478970/


All Articles