
مشاركة الملفات المحلية من نظير إلى نظير بدون خادم عبر الصوت
إثبات مفهوم للإشارة عبر WebRTC باستخدام الصوت. يعمل مع جميع الأجهزة التي تحتوي على ميكروفون ومكبرات صوت. يعمل في المتصفح.
تتفاوض الأجهزة القريبة على اتصال WebRTC عن طريق تبادل بيانات بروتوكول وصف الجلسة (SDP) الضرورية عبر سلسلة من النغمات الصوتية. بعد نجاح التفاوض، يتم إنشاء اتصال WebRTC محلي بين المتصفحات مما يسمح بتبادل البيانات عبر الشبكة المحلية (LAN).
شاهده أثناء العمل (فيديو مدته دقيقتان):
جرّبها بنفسك: ggerganov.github.io/wave-share
آخر الأخبار:
لقد قمت باستخراج خوارزمية نقل البيانات عبر الصوت إلى مكتبة مستقلة تُسمى ggwave.
يمكن تضمينها بسهولة في مشاريع أخرى.
تتيح تقنية WebRTC لمتصفحين يعملان على أجهزة مختلفة الاتصال ببعضهما البعض وتبادل البيانات. ليست هناك حاجة لتثبيت إضافات أو تنزيل تطبيقات. لبدء الاتصال، يتبادل الأقران معلومات الاتصال (عنوان IP، منافذ الشبكة، معرف الجلسة، إلخ). تُسمى هذه العملية "الإشارة" (signaling). لا يحدد مواصفات WebRTC أي معيار للإشارة - يمكن تحقيق تبادل الاتصال بأي بروتوكول أو تقنية.
في هذا المشروع، يتم تنفيذ الإشارة عبر الصوت. يبدو تسلسل الإشارة كالتالي:

تسلسل الإشارة الموصوف لا يتضمن خادم إشارة. لذلك، يمكن تقديم تطبيق يستخدم الإشارة عبر الصوت، على سبيل المثال، عبر صفحة ويب ثابتة. الشرط الوحيد هو التحكم في أجهزة إخراج/التقاط الصوت.
من القيود الواضحة (ميزة) للنهج الحالي أن الأجهزة القريبة فقط (مثل الموجودة في نفس الغرفة) يمكنها إنشاء اتصال مع بعضها البعض. علاوة على ذلك، يجب أن تكون الأجهزة متصلة بنفس الشبكة المحلية، لأن NAT غير متاح.
البيانات المنقولة عبر الصوت تحتوي على معلومات الاتصال المطلوبة لتهيئة اتصال WebRTC. يتم تخزين هذه البيانات بتنسيق بروتوكول وصف الجلسة (SDP). نظرًا لأن نقل البيانات عبر الصوت له قيود كبيرة من حيث عرض النطاق الترددي والمتانة، فمن المستحسن نقل أقل قدر ممكن من البيانات. لذلك، يتم تجريد SDP من جميع المعلومات غير ذات الصلة ولا يتم نقل سوى البيانات الأساسية اللازمة لإنشاء الاتصال. حاليًا، تحتوي حزمة الصوت التي تحتوي على الحد الأدنى من بيانات SDP المطلوبة على التنسيق التالي:
الحجم الإجمالي للحزمة الصوتية هو 112 بايت. باستخدام خوارزمية تشفير الصوت الحالية، يمكن إرسال حزمة SDP في 5-10 ثوانٍ (اعتمادًا على بروتوكول الإرسال المستخدم). استخدام بروتوكولات أبطأ يوفر نقلًا أكثر موثوقية في البيئات المزعجة أو إذا كانت الأجهزة المتصلة بعيدة عن بعضها البعض.
يستخدم النهج الحالي مخطط تعديل مفتاح تحويل التردد (FSK) متعدد الترددات. يتم أولاً تقسيم البيانات المراد إرسالها إلى أجزاء 4 بت. في كل لحظة زمنية، يتم إرسال 3 بايت باستخدام 6 نغمات - نغمة واحدة لكل جزء 4 بت. تنبعث النغمات الست في نطاق 4.5 كيلوهرتز مقسم إلى 96 ترددًا متباعدة بشكل متساوٍ:
لجميع البروتوكولات: dF = 46.875 هرتز. للبروتوكولات غير فوق الصوتية: F0 = 1875.000 هرتز. للبروتوكولات فوق الصوتية: F0 = 15000.000 هرتز.
للتسهيل، يتم استخدام اختراق WebRTC بسيط للكشف تلقائيًا عن عنوان IP المحلي لجهازك، حتى لا تضطر إلى توفيره يدويًا. ومع ذلك، يمنع أحدث مواصفات WebRTC هذا الأمر لأسباب أمنية، لذا في مرحلة ما ستتوقف هذه "الميزة" عن العمل في جميع المتصفحات. على سبيل المثال، لم تعد تعمل على Safari.
wave.wasmستحتاج إلى مترجم Emscripten. قم بتشغيل النص البرمجي compile.sh.
wave-shareهام: كانت أداة سطر الأوامر هذه نموذجًا أوليًا للمكتبة المستقلة الآن ggwave. تأكد من الاطلاع عليها، حيث تحتوي على أمثلة أكثر حداثة لتطبيق هذا النوع من الاتصال عبر الصوت.
هذه أداة بسيطة تستقبل وترسل البيانات باستخدام بروتوكول إرسال/استقبال الصوت wave-share الموضح. اكتب بعض النصوص في الإدخال القياسي واضغط Enter للإرسال.
# build
git clone https://github.com/ggerganov/wave-share
cd wave-share && mkdir build && cd build
cmake ..
make
# running
./wave-share
إليك فيديو قصير يوضح كيفية استخدام أداة سطر الأوامر:
| Size, [B] | الوصف |
|---|
| 1 | نوع SDP - عرض أو إجابة |
| 1 | حجم الحزمة بالبايت (بدون تضمين بايتات ECC) |
| 4 | عنوان IP للنظير المرسل |
| 2 | منفذ الشبكة الذي سيُستخدم للاتصال |
| 32 | بصمة SHA-256 لبيانات الجلسة |
| 40 | بيانات اعتماد ICE - اسم مستخدم 16 بايت + كلمة مرور 24 بايت |
| 32 | بايتات تصحيح ECC المستخدمة لتصحيح الأخطاء أثناء الإرسال |
| التردد، [هرتز] | القيمة، [بت] | التردد، [هرتز] | القيمة، [بت] | ... | التردد، [هرتز] | القيمة، [بت] |
|---|
F0 + 00*dF | Chunk 0: 0000 | F0 + 16*dF | Chunk 1: 0000 | ... | F0 + 80*dF | Chunk 5: 0000 |
F0 + 01*dF | Chunk 0: 0001 | F0 + 17*dF | Chunk 1: 0001 | ... | F0 + 81*dF | Chunk 5: 0001 |
F0 + 02*dF | Chunk 0: 0010 | F0 + 18*dF | Chunk 1: 0010 | ... | F0 + 82*dF | Chunk 5: 0010 |
| ... | ... | ... | ... | ... | ... | ... |
F0 + 14*dF | Chunk 0: 1110 | F0 + 30*dF | Chunk 1: 1110 | ... | F0 + 94*dF | Chunk 5: 1110 |
F0 + 15*dF | Chunk 0: 1111 | F0 + 31*dF | Chunk 1: 1111 | ... | F0 + 95*dF | Chunk 5: 1111 |