منذ بعض الوقت ، كنت بحاجة إلى التواصل مع شخص ما بعد مرض لم يتمكن من استخدام الهاتف جسديًا. هناك حاجة إلى جهاز اتصال بسيط ، تم إجراء مكالمة صوتية بلمسة زر واحدة. ومع ذلك ، فقد اختفت الحاجة ، بعد زيارة المستشفى بنفسه ، والنظر إلى المرضى ، كان يعتقد أن مثل هذا الحل قد يكون مفيدًا.
الآن أرى الاستخدام الشخصي لهذا الجهاز باعتباره جرس الباب SIP.
ربما مع تعديلات صغيرة ، مزيج من الاتصالات عبر بروتوكول الإنترنت عبر بروتوكول الإنترنت مع نظام التشغيل الآلي للمنزل. كخيارات للاستخدام - SIP جرس الباب ، والاتصال الداخلي ، ونظام الاتصال الصوتي (العميل العملاء ، مدير سكرتير) ، الخ

يتم اتخاذ القرار برمته بشأن البرمجيات الحرة والمفتوحة المصدر: نظام التشغيل - Raspbian Stretch (Debian 9) ، ونظام التشغيل الآلي للمنزل - MajorDoMo ، وخادم VoIP - Freeswitch ، عميل برنامج الاتصال عبر بروتوكول الإنترنت IP مع القدرة على العمل في وضع المحطة الطرفية Linphonec.
في هذا الجزء ، في إطار القطع ، سنتحدث بشكل أساسي عن تثبيت عميل SIP لوحدة التحكم Linphonec.
سنحتاج:
- Raspberry Pi - كمبيوتر لوح فردي (لدي طراز Raspberry Pi 3B)
- بطاقة ذاكرة Micro SD لا تقل عن 16 جيجابايت ، شاحن USB ، مبيت.
- بطاقة صوت USB (واحدة من أرخص ، Gembird المستخدمة) ، وميكروفون ، مكبر صوت (سماعات الرأس).
- زر وزوج من لاعبي BBJ لدبابيس GPIO.
1.
الخطوة الأولى - تثبيت صورة MajorDoMo لـ RPIحاليًا ، الإصدار الحالي من صورة Raspberry Pi هو v. 3.40. فيما يلي وصف موجز لصور وتغييرات MajorDoMo:
MajorDoMo الصور الأساسية ل Raspberry Piبعد التثبيت وعند بدء تشغيل النظام ، قم بتوصيل مكبرات الصوت بالموصل 3.5 - سوف نسمع رسائل النظام وعنوان IP لـ Raspberry.
اسم المستخدم الافتراضي هو: كلمة المرور: التوت.
2. تثبيت فريسويتش ،
تثبيت FRESWITCH VoIP Server for Raspberryبعد ذلك ، ننتقل إلى تثبيت المكونات الضرورية. خطوة اختيارية ، ولكن ربما تكون مفيدة لاحقًا.
تثبيت RPi مونيتور
قم بتثبيت أداة مساعدة صغيرة ولكنها مفيدة لجهاز عرض RPI تُظهر الموارد الخاصة بـ Raspberry PI.
RPi-Monitor هو برنامج مراقبة على شبكة الإنترنت Raspberry Pi. يمكن أن تكون هذه الأداة مفيدة للتحكم في استخدام مساحة القرص وتحميل وحدة المعالجة المركزية والذاكرة وحركة مرور الشبكة ودرجة الحرارة. RPI-Monitor سهل التثبيت ، ويعرض بصريًا معلومات حول النظام.
بادئ ذي بدء ، سأقدم رابطًا للمصدر:
RPi مونيتور .
قم بتثبيت المفتاح العام 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
افتح IP الخاص بجهاز الكمبيوتر في المستعرض باستخدام المنفذ: 8888 ، الذي تعمل عليه الشاشة ، وانظر إلى حالة RPI.

تثبيت بطاقة صوت USB وإعداد الصوت في Raspberry Pi OS
لسوء الحظ ، لا يحتوي الكمبيوتر المصغر Raspberry الخاص بنا على ميكروفون مدمج ومدخل خاص به. لذلك ، لتوصيل ميكروفون ، يجب عليك استخدام بطاقة صوت 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 index = 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 بشكل افتراضي هو إخراج الصوت المدمج في الكمبيوتر الصغير ، قم بتعيين المعلمات التالية في سطرين:
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
باستخدام هذا الأمر ، يتم تسجيل ملف صوتي عبر الميكروفون في الدليل المناسب (في حالتنا ، الصفحة الرئيسية للمستخدم). توقف عن تسجيل
Ctrl + c .
تحقق من الملف المسجل:
aplay /home/pi/test_record.wav
سنقوم بإجراء فحص أفضل في وقت لاحق.
تثبيت عميل VoIP Linphonec
لا يوجد الكثير من البرامج التي يمكن أن تعمل في نظام التشغيل بدون واجهة رسومية ؛ لقد استقرت على حزمة 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.
حدثت أخطاء أثناء التجميع ، ببساطة لا يحتوي جهاز الكمبيوتر المصغر على موارد كافية. تحريرها للتثبيت.
وقف الخدمات 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
فقط في حالة ، يمكننا أن نجعل ملف تبديل مؤقت (قبل إعادة التشغيل) (مساحة على القرص الصلب) ، والذي يستخدمه نظام التشغيل في حالة عدم كفاية ذاكرة الوصول العشوائي.
لمعرفة ما إذا كان ملف المبادلة مدرجًا في تثبيت Raspbian (Debian) الخاص بنا عن طريق الكتابة:
sudo swapon --show
الإخراج فارغ ، مما يعني أن النظام لا يحتوي على ملف مبادلة.
أضف 1G مبادلة وإنشاء ملف:
sudo fallocate -l 1G /swapfile
يمكن فقط للمستخدم الجذر القراءة والكتابة إلى ملف الصفحة ، لذلك نقوم بتعيين الأذونات الصحيحة:
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 لنفسك ، بما في ذلك الاشتراك ، dialplan ، وما إلى ذلك ، ولكن لا يمكنك احتواء كل شيء في مقال واحد ، لذلك ننتقل إلى عميلنا الطرفي.تكوين وإطلاق عميل Linphonec الطرفي
قم بتشغيل Linphonec في وضع الرد التلقائي من مستخدم pi الحالي:
/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 user - افتراضيًا ، لدينا 20 مشتركًا بالأرقام 1001-1019. هذه الأرقام هي أسماء المستخدمين للمشتركين تسجيل دخول المشترك [اسم النطاق] - اسم المجال - عنوان IP الخاص بتوت العليق. رشفة الوكيل - تتطابق مع عنوان IP لـ RPI ، وفي النهاية - كلمة مرور المستخدم التي أنشأناها مؤخرًا 1111.
الخروج من البرنامج (Ctrl + x) ، لا يتم تطبيق الإعدادات دائمًا على الطاير. بعد الخروج من الدليل الرئيسي / home / pi ، ظهر ملف تكوين عميل وحدة التحكم: .linphonerc.
يمكننا بالفعل إجراء تغييرات من خلال تحرير ملف التكوين لعميل SIP.
على إطلاق وحدة جديدة SIP العميل.
بالتوازي مع جلسة SSH الحالية ، افتح واحدة جديدة ، قم بتسجيل الدخول باستخدام اسم المستخدم وكلمة المرور الخاصة بك.
نبدأ alsamixer. في جلسة واحدة ، لدينا Linphonec ، في الثانية ، أداة لضبط الصوت.
نقوم بإجراء إعداد الاتصال من عميل 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
ألاحظ أننا نفعل هذا من تحت المستخدم بي.
أدخل السطر في النهاية:
@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 ، يتم تشغيل ملف صوت ، ويتم إرسال مكالمة إلى الهاتف الرقمي الثاني (الكمبيوتر / الهاتف الذكي). بعد التقاط سماعة الهاتف (عن طريق الضغط على زر الإجابة في البرنامج) ، تم تأسيس الاتصال.

على هذا ، انتهيت من هذا الجزء. سأحاول بعد قليل وصف الزر نفسه باستخدام GPIO وإعداد مكالمات خارج شبكتي المحلية.