Tombol panggilan DIY. Raspberry Pi, MajorDoMo, Freeswitch dan Linphonec

Beberapa waktu yang lalu, saya memiliki kebutuhan untuk berkomunikasi dengan seseorang setelah suatu penyakit yang secara fisik tidak dapat menggunakan telepon. Perangkat panggilan sederhana diperlukan, panggilan suara dilakukan dengan satu sentuhan tombol. Namun, kebutuhan itu menghilang, setelah mengunjungi rumah sakit sendiri, memandangi para pasien, diperkirakan solusi semacam itu mungkin berguna.
Sekarang saya melihat penggunaan pribadi perangkat ini sebagai bel pintu SIP.

Mungkin dengan perubahan kecil, kombinasi telepon VoIP dengan sistem otomasi rumah. Sebagai pilihan untuk digunakan - SIP bel, interkom, sistem komunikasi suara (klien-personel, direktur-sekretaris), dll.



Seluruh keputusan dibuat pada perangkat lunak bebas dan sumber terbuka: sistem operasi - Raspbian Stretch (Debian 9), sistem otomasi rumah - MajorDoMo, server VoIP - Freeswitch, klien perangkat lunak IP-teleponi dengan kemampuan untuk bekerja dalam mode terminal Linphonec.

Di bagian ini, di bawah potongan, kita terutama akan berbicara tentang menginstal klien SIP Linphonec konsol.

Kami akan membutuhkan:

  1. Raspberry Pi - Single Board Computer (Saya punya model Raspberry Pi 3B)
  2. Kartu memori micro SD setidaknya 16 GB, pengisi daya USB, perumahan.
  3. Kartu suara USB (salah satu yang termurah, yang digunakan Gembird), mikrofon, speaker (headphone).
  4. Tombol dan sepasang jumper BBJ untuk pin GPIO.

1. Langkah Pertama - Menginstal Gambar MajorDoMo untuk RPI
Saat ini, versi gambar saat ini untuk Raspberry Pi adalah v. 3.40. Berikut ini deskripsi singkat gambar dan perubahan MajorDoMo:

MajorDoMo Gambar Dasar untuk Raspberry Pi

Setelah instalasi dan saat sistem dinyalakan, sambungkan speaker ke konektor 3.5 - kami akan mendengar pesan sistem dan alamat IP Raspberry.

Nama pengguna default adalah: pi kata sandi: raspberry.

2. Pasang FREESWITCH,
Menginstal Server VoIP FRESWITCH untuk Raspberry

Setelah itu, kami melanjutkan ke pemasangan komponen yang diperlukan. Langkah opsional, tetapi mungkin nanti berguna.

Instal RPi-Monitor


Instal utilitas monitor RPI yang kecil namun bermanfaat yang menunjukkan sumber daya Raspberry PI kami.

RPi-Monitor adalah perangkat lunak pemantauan papan Raspberry Pi berbasis web. Alat ini dapat bermanfaat untuk mengontrol penggunaan ruang disk, beban CPU, memori dan lalu lintas jaringan, suhu. RPI-Monitor cukup mudah dipasang, dan secara visual menampilkan informasi tentang sistem.

Pertama-tama, saya akan memberikan tautan ke sumber:
RPi-Monitor .

Instal kunci publik RPi-Monitor dan tambahkan ke repositori tepercaya:

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 

Selanjutnya, perbarui sistem dan instal monitor RPI itu sendiri:

 sudo apt-get update sudo apt-get install rpimonitor 

Buka IP komputer Anda di browser dengan port: 8888, di mana monitor berjalan, dan lihat status RPI.



Memasang kartu audio USB dan mengatur suara di Raspberry Pi OS


Sayangnya, komputer mini Raspberry kami tidak memiliki mikrofon internal dan input untuknya. Karena itu, untuk menghubungkan mikrofon, Anda harus menggunakan kartu suara USB eksternal. Kami menghubungkan kartu ke port USB Raspberry, dan menjalankan perintah (yang menunjukkan perangkat suara dalam sistem):

 cat /proc/asound/cards 

Kami melihat jawabannya dengan dua kartu, bcm2835 - built-in, eksternal didefinisikan sebagai Perangkat Audio USB:

0 [ALSA]: bcm2835_alsa - bcm2835 ALSA
bcm2835 ALSA
1 [Perangkat]: USB-Audio - Perangkat Audio USB
GeneralPlus USB Audio Device di usb-3f980000.usb-1.4, kecepatan penuh
OS melihat kartu suara kami, tetapi belum terdaftar di sistem.

Buat file:

 sudo nano /etc/modprobe.d/alsa-base.conf 

Kami menulis (menempel) baris berikut:

opsi snd-usb-audio index = 1

Simpan (di editor Ctrl + X).

Buat file lain:

 sudo nano /etc/asound.conf 

Tambahkan konten:

isi file
 pcm.!default { type plug slave { pcm "hw:1,0" } } ctl.!default { type hw card 1 } 


Kami mengedit file konfigurasi berikut:

 sudo nano /usr/share/alsa/alsa.conf 

Ubah kartu suara default dari 0 ke 1 (kartu USB), Jelas, default 0 adalah output suara bawaan komputer mini, tetapkan parameter berikut dalam 2 baris:

 defaults.ctl.card 1 defaults.pcm.card 1 

Perubahan akan berlaku, setelah mem-boot ulang, kami membebani dengan mengetik di konsol:

 sudo reboot 

Kami menghubungkan mikrofon dan speaker (headphone) ke kartu audio eksternal. Setelah reboot, jalankan utilitas konfigurasi suara Alsamixer.

 alsamixer 

Kami melihat perangkat kami yang kami tetapkan dalam sistem secara default:



Gunakan tombol kursor kiri dan kanan, pilih perangkat yang diinginkan, atas dan bawah, sesuaikan, perhatikan simbol di bawah perangkat yang dipilih:

xOOx - perangkat dihidupkan, xMMx - perangkat dimatikan. Seperti yang dapat Anda lihat di tangkapan layar, mikrofon saya dimatikan secara default di sistem.
Untuk menghidupkan / mematikan perangkat, Anda perlu menekan M pada keyboard.
Keluar dari alsamixer (keluar ctr + C).
Memeriksa suara di sistem. Speaker dan mikrofon terhubung ke output USB kartu suara yang sesuai.

Kami memberikan perintah:

 arecord -D plughw:1,0 -f cd /home/pi/test_record.wav 

Dengan perintah ini, file suara direkam melalui mikrofon ke direktori yang sesuai (dalam kasus kami, pi rumah pengguna). Berhenti merekam Ctrl + c .

Periksa file yang direkam:

 aplay /home/pi/test_record.wav 

Kami akan melakukan pemeriksaan yang lebih baik nanti.

Menginstal Klien VoIP Linphonec Console


Tidak banyak program yang dapat bekerja di OS tanpa antarmuka grafis, saya memilih paket Linphone.

Paketnya cukup besar, ia memiliki banyak fitur potensial, tetapi sejauh ini kami hanya memerlukan utilitas kecil Linphonec yang dapat bekerja di terminal dan memiliki fungsi jawab otomatis (pick-up otomatis).

Baginya, tindakan berikut akan dilakukan.

Saya perhatikan bahwa ketika menginstal dari repositori Raspbian, versi 3.6.1 yang lebih lama diinstal, yang tidak berfungsi dengan baik dengan sistem suara ALSA, saya mengalami kehilangan suara, program macet beberapa kali.

Karena itu, saya akan menggunakan versi yang lebih terkini.

Untuk perakitan sendiri paket dari sumber, kami memasang dependensi tambahan:

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

Buka direktori home:

 cd /home/pi/ 

Unduh paket Linphone itu sendiri, unduhannya memakan waktu sekitar 20 menit.

 git clone git://git.linphone.org/linphone-desktop.git --recursive 

Saya tidak bisa mengkompilasi dan mengkompilasi paket Linphone dari pertama atau bahkan kedua kalinya. Karena itu, saya akan memberikan algoritma tindakan saya.

Kami menghentikan hampir semua yang saat ini berjalan, tetapi saat ini layanan yang tidak digunakan, menggunakan sistem manajemen layanan systemctl.

Ada kesalahan selama perakitan, PC mini kami tidak memiliki sumber daya yang cukup. Bebaskan mereka untuk instalasi.

Menghentikan layanan
 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 


Untuk berjaga-jaga, kita dapat membuat file swap sementara (sebelum memulai ulang) (ruang hard disk), yang digunakan sistem operasi jika RAM tidak mencukupi.
Untuk memeriksa apakah file swap termasuk dalam instalasi Raspbian (Debian) kami dengan mengetik:

 sudo swapon --show 

Outputnya kosong, yang berarti bahwa sistem tidak memiliki file swap.
Tambahkan 1G swap dan buat file:

 sudo fallocate -l 1G /swapfile 

Hanya pengguna root yang dapat membaca dan menulis ke file halaman, jadi kami menetapkan izin yang benar:

 sudo chmod 600 /swapfile 

Kami menggunakan alat mkswap untuk mengkonfigurasi area swap Linux dalam file dan mengaktifkannya dengan mengetikkan perintah berikut:

 sudo mkswap /swapfile sudo swapon /swapfile 

Buka direktori yang dibuat saat mengunduh paket:

 cd linphone-desktop 

Kami mempersiapkan instalasi versi tanpa antarmuka grafis:

 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 

Bangun menggunakan atribut –j4 (mis., Buat 4 utas pada saat yang sama.

 sudo make -j4 

Saat memasang, kita dapat melihat status komputer kita di RPI-Monitor:



Waktu membangun untuk saya adalah sekitar 30-40 menit.

File program yang dikompilasi muncul di direktori OUTPUT / no-ui / bin. Untuk menjalankan program, mari kita masuk ke dalamnya:

 cd OUTPUT/no-ui/bin 

Periksa versi program:

 ./linphonec -v 

Kami mendapatkan hasilnya: versi: 3.12.0
Overloading Raspberry kami
Saat memulai ulang, file swap menghilang, semua layanan yang berjalan yang terdaftar di startup dipulihkan.

Pengaturan awal Freeswitch kecil.


Server FREESWITCH diinstal secara default di direktori / usr / local / freeswitch /. Folder conf berisi file konfigurasi. Secara default, konfigurasi uji vanilla terinstal, yang sebagian besar berfungsi untuk membiasakan diri dengan kemungkinan server VoIP dan berisi sejumlah besar contoh yang jelas-jelas berlebihan untuk digunakan di rumah. Pertama, mari kita lihat konfigurasi out of the box dari server VoIP.

Edit file konfigurasi vars.xml

 sudo nano /usr/local/freeswitch/conf/vars.xml 

Pertama-tama, ubah kata sandi default 1234 ke nilai yang berbeda, katakan 1111. Jika Anda tidak melakukan ini, maka sebelum setiap panggilan, jeda ditetapkan sebelum memanggil 10 detik.

Secara default, seperti yang saya tulis di artikel sebelumnya, kami memiliki 20 nomor pelanggan 1001-1020. Dialplan juga diinstal secara default.

Untuk beberapa alasan, kali ini, dibandingkan dengan enam bulan yang lalu, ketika modul mod_xml_rpc dihidupkan, server terus-menerus macet.

Dialplan FreeSWITCH memanfaatkan ekstensif ekspresi reguler. Dialplan default bertanggung jawab untuk memproses panggilan, bagian selanjutnya dari file Local_Extension bertanggung jawab untuk mengirim ke nomor lokal kami. Mengomentari beberapa baris:

 sudo nano /usr/local/freeswitch/conf/dialplan/defaults.xml 

Pengeditan dialog, masukkan simbol komentar di bagian ini:

Pengeditan dialog angka 1001-1019
 <extension name="Local_Extension"> <condition field="destination_number" expression="^(10[01][0-9])$"> <action application="export" data="dialed_extension=$1"/> <!-- <action application="bind_meta_app" data="1 bs execute_extension::dx XML features"/> <action application="bind_meta_app" data="2 bs record_session::$${recordings_dir}/${caller_id_number}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/> <action application="bind_meta_app" data="3 bs execute_extension::cf XML features"/> <action application="bind_meta_app" data="4 bs execute_extension::att_xfer XML features"/> --> 


Penyimpangan kecil, menurut saya, terlepas dari kemampuan FS bekerja, setelah beberapa perubahan kami, lebih baik untuk mengulang file konfigurasi FS untuk Anda sendiri, termasuk berlangganan, dialplan, dll., tetapi Anda tidak dapat memasukkan semuanya dalam satu artikel, jadi kami beralih ke klien terminal kami.

Konfigurasikan dan luncurkan klien terminal Linphonec


Jalankan Linphonec dalam mode jawab otomatis dari pengguna pi saat ini:

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

Pada peluncuran pertama, Linphonec mencoba membuat file database dan file pengaturan. Namun, peluncurannya salah.

kesalahan memulai 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 


Awalnya, kita akan berurusan dengan kesalahan terakhir, membuka file database.

File database dibuat di direktori home di sepanjang jalur berikut: /home/pi/.local/share/linphone
File Linux (atau direktori) dianggap tersembunyi jika namanya dimulai dengan periode β€œ.”. Misalnya, ".file". Biasanya, file tersebut digunakan oleh aplikasi untuk menyimpan pengaturan, konfigurasi, dan informasi lain yang perlu disembunyikan dari pengguna.
Buat direktori dari pengguna saat ini (pi)
 mkdir /home/pi/.local mkdir /home/pi/.local/share mkdir /home/pi/.local/share/linphone 

Kami memulai program, program dimulai, tetapi memberikan kesalahan:
Kesalahan Pembukaan Port
 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 


Kami menemukan masalah pertama dalam membuat basis data, saat peluncuran awal, program menghasilkan file basis data.

Kesalahan yang terkait dengan sistem suara Pulseaudio - tidak mengganggu fungsi program, saya berencana untuk menggunakan ALSA, jika perlu, server suara selalu dapat diinstal sebelumnya.

Yang kedua - port 5060 sedang sibuk. Port-port ini biasanya digunakan oleh aplikasi SIP. Kita dapat keluar dari program dan memberikan perintah:

 sudo netstat -tulpn | grep LISTEN 

Kita akan melihat bahwa port 5060 menggunakan server FREESWITCH VoIP kami. Kami akan menggunakan porta gratis.

Kami kembali ke program linphonec. Dan lakukan sedikit pengaturan.

Pertama-tama, ubah port untuk Linfon, kemudian tunjukkan pendaftaran ke server VoIP, periksa status pendaftaran dan lihat daftar kartu suara, kartu yang digunakan dan konfigurasikan pada USB eksternal (dengan indeks dalam program 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 



Di tim pendaftaran, kami menggunakan format berikut: Sip ID pengguna - secara default, kami memiliki 20 pelanggan dengan angka 1001-1019. Nomor-nomor ini adalah nama pengguna pelanggan. Login Pelanggan @ [Nama domain] - nama domain - alamat IP Raspberry kami. Proksi menyesap - cocok dengan alamat IP RPI, dan pada akhirnya - kata sandi pengguna yang baru saja kami atur 1111.

Keluar dari program (Ctrl + x), pengaturan tidak selalu diterapkan dengan cepat. Setelah keluar di direktori home / home / pi, file konfigurasi klien konsol muncul: .linphonerc.
Kami sudah dapat melakukan perubahan dengan mengedit file konfigurasi klien SIP.
Pada klien SIP konsol peluncuran baru.
Sejalan dengan sesi SSH saat ini, buka yang baru, masuk menggunakan nama pengguna dan kata sandi Anda.
Kami memulai alsamixer. Dalam satu sesi, kami memiliki Linphonec, di sesi kedua, utilitas penyetelan suara.
Kami membuat pengaturan panggilan dari klien SIP pada smartphone atau PC (seperti yang dijelaskan dalam artikel tentang menginstal FREESWITCH) dengan mengubah kata sandi default ke nomor Anda sendiri dan menekan nomor, dalam kasus kami 1001. Kita dapat pergi ke portal freswitch di IP_Raspberry: 8080, melihat registrasi pelanggan, status menelepon, dll.



Menggunakan alsamixer, kami menyesuaikan suara. Perubahan suara diterapkan dengan cepat, tanpa keluar dari program.

Sayangnya, karena penggunaan kartu audio yang murah, saya tidak dapat mencapai suara yang dapat diterima, sebuah gema terdengar di speaker. Ini dapat diminimalkan, tetapi sepenuhnya dihapus - saya tidak berhasil.

Karena itu, karena tidak mungkin menghapusnya dengan satu cara, kami menghilangkannya dengan cara lain.
Tutup Linphonec, edit file konfigurasi:

 sudo nano /home/pi/.linphonerc 

Di bagian suara, kami membawa tiga baris terakhir ke formulir ini:

Bagian Suara 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 


Dengan cara ini, kami memaksa alat pendering dan keluaran suara bekerja pada jack raspberry 3.5 internal, dan alat perekam - mikrofon untuk bekerja melalui kartu suara eksternal - gema menghilang.

Alihkan speaker ke konektor milik raspberry.

Kami memperhitungkan momen berikut: saat memuat dan dalam beberapa kasus, sistem rumah pintar memutar pesan sistemnya melalui output audio ini.

Matikan. Kami meneruskan IP_Rasberry ke halaman utama, membuka sistem otomatisasi rumah MajorDoMo.

Kami memasuki panel kontrol - objek Komputer (perluas perangkat) - Komputer ini pada tab Properti dan atur nilainya:

  ThisComputer.minMsgLevel 100 ThisComputer.volumeLevel 0 



Tambahkan entri ke cron (program daemon yang dirancang untuk melakukan tugas pada waktu tertentu, atau pada interval tertentu. Utilitas crontab digunakan untuk mengedit tugas):

 crontab –e 

Saya perhatikan kami melakukan ini dari bawah pi pengguna.

Masukkan baris di bagian paling akhir:

 @reboot /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec –a 

Saat memulai ulang, menyalakan komputer, baris ini meluncurkan program Linphonec dalam mode jawab otomatis.
Kembali ke MajorDoMo:
Mari kita pergi ke halaman utama, di bagian layanan:
Di menu bagian ini, tombol dibuat untuk me-reboot (mematikan) komputer.
Faktanya adalah bahwa untuk menghemat sumber daya kartu memori SD, perubahan dicatat dalam sistem "rumah pintar" setelah waktu tertentu (15 menit). Karena itu, jika Anda perlu membebani raspberry, maka lebih baik melakukannya dengan benar. Kami me-reboot sistem.



Setelah reboot, pergi ke halaman utama MajorDoMo, pergi ke panel kontrol, dan seperti pada artikel terakhir kami membuat panggilan dari konsol menggunakan format berikut:

 GetURL("http://freeswitch:works@192.168.1.103:8080/webapi/originate?user/1001%201003%20XML%20default") 

Mengikuti perintah, Linphonec secara otomatis mengangkat telepon. Di speaker RPI, file suara sedang diputar, panggilan sedang dikirim ke softphone kedua (PC / smartphone). Setelah mengangkat handset (dengan menekan tombol jawab dalam program), koneksi berhasil dibuat.



Tentang ini, saya menyelesaikan bagian ini. Saya akan mencoba menjelaskan sedikit nanti tentang tombol itu sendiri menggunakan GPIO dan mengatur panggilan di luar jaringan lokal saya.

Source: https://habr.com/ru/post/id464309/


All Articles