
सर्वररहित, पीयर-टू-पीयर, ध्वनि के माध्यम से स्थानीय फ़ाइल साझाकरण
WebRTC सिग्नलिंग के लिए ध्वनि का उपयोग करने वाला एक अवधारणा प्रमाण। यह माइक्रोफोन और स्पीकर वाले सभी उपकरणों पर काम करता है। ब्राउज़र में चलता है।
पास के उपकरण ऑडियो टोन के एक अनुक्रम के माध्यम से आवश्यक सत्र विवरण प्रोटोकॉल (SDP) डेटा का आदान-प्रदान करके WebRTC कनेक्शन के लिए बातचीत करते हैं। सफल वार्ता पर, ब्राउज़रों के बीच एक स्थानीय WebRTC कनेक्शन स्थापित होता है जो LAN के माध्यम से डेटा के आदान-प्रदान की अनुमति देता है।
इसे क्रियाशील देखें (2 मिनट का वीडियो):
इसे स्वयं आज़माएं: ggerganov.github.io/wave-share
नवीनतम समाचार:
मैंने डेटा-ओवर-साउंड एल्गोरिदम को ggwave नामक एक स्टैंडअलोन लाइब्रेरी में निकाल लिया है।
इसे आसानी से अन्य परियोजनाओं में एम्बेड किया जा सकता है।
WebRTC तकनीक विभिन्न उपकरणों पर चलने वाले दो ब्राउज़रों को एक-दूसरे से जुड़ने और डेटा का आदान-प्रदान करने की अनुमति देती है। प्लगइन्स स्थापित करने या एप्लिकेशन डाउनलोड करने की कोई आवश्यकता नहीं है। कनेक्शन शुरू करने के लिए, पीयर संपर्क जानकारी (आईपी पता, नेटवर्क पोर्ट, सत्र आईडी, आदि) का आदान-प्रदान करते हैं। इस प्रक्रिया को "सिग्नलिंग" कहा जाता है। WebRTC विनिर्देश सिग्नलिंग के लिए कोई मानक परिभाषित नहीं करता है - संपर्क आदान-प्रदान किसी भी प्रोटोकॉल या तकनीक द्वारा प्राप्त किया जा सकता है।
इस परियोजना में सिग्नलिंग ध्वनि के माध्यम से की जाती है। सिग्नलिंग अनुक्रम इस प्रकार है:

वर्णित सिग्नलिंग अनुक्रम में सिग्नलिंग सर्वर शामिल नहीं है। इसलिए, ध्वनि के माध्यम से सिग्नलिंग का उपयोग करने वाला एक एप्लिकेशन, उदाहरण के लिए, एक स्थिर वेब पेज द्वारा प्रदान किया जा सकता है। एकमात्र आवश्यकता ऑडियो आउटपुट/कैप्चर उपकरणों पर नियंत्रण रखना है।
वर्तमान दृष्टिकोण की एक स्पष्ट सीमा (विशेषता) यह है कि केवल पास के उपकरण (जैसे एक ही कमरे में) एक-दूसरे के साथ कनेक्शन स्थापित कर सकते हैं। इसके अलावा, उपकरणों को एक ही स्थानीय नेटवर्क से जुड़ा होना चाहिए, क्योंकि NAT उपलब्ध नहीं है।
ध्वनि के माध्यम से संचारित डेटा में WebRTC कनेक्शन को आरंभ करने के लिए आवश्यक संपर्क जानकारी होती है। यह डेटा सत्र विवरण प्रोटोकॉल (SDP) प्रारूप में संग्रहीत किया जाता है। चूंकि डेटा-ओवर-साउंड की बैंडविड्थ और मजबूती के मामले में महत्वपूर्ण सीमाएं हैं, इसलिए जितना संभव हो उतना कम डेटा संचारित करना वांछनीय है। इसलिए, SDP से सभी अप्रासंगिक जानकारी हटा दी जाती है और केवल कनेक्शन स्थापित करने के लिए आवश्यक आवश्यक डेटा ही प्रेषित किया जाता है। वर्तमान में, न्यूनतम आवश्यक SDP डेटा वाले ध्वनि पैकेट का निम्नलिखित प्रारूप है:
ऑडियो पैकेट का कुल आकार 112 बाइट्स है। वर्तमान ऑडियो एन्कोडिंग एल्गोरिदम के साथ, SDP पैकेट को 5-10 सेकंड में प्रेषित किया जा सकता है (उपयोग किए गए Tx प्रोटोकॉल पर निर्भर करता है)। धीमे प्रोटोकॉल का उपयोग करना शोर वाले वातावरण में या यदि संचार करने वाले उपकरण एक-दूसरे से दूर हैं तो अधिक विश्वसनीय संचरण प्रदान करता है।
वर्तमान दृष्टिकोण एक बहु-आवृत्ति फ़्रीक्वेंसी-शिफ्ट कीइंग (FSK) मॉड्यूलेशन योजना का उपयोग करता है। प्रेषित किए जाने वाले डेटा को पहले 4-बिट के टुकड़ों में विभाजित किया जाता है। समय के प्रत्येक क्षण में, 3 बाइट्स को 6 टोन का उपयोग करके प्रेषित किया जाता है - प्रत्येक 4-बिट टुकड़े के लिए एक टोन। ये 6 टोन 4.5kHz रेंज में उत्सर्जित होते हैं जो 96 समान रूप से दूरी वाली आवृत्तियों में विभाजित है:
सभी प्रोटोकॉल के लिए: dF = 46.875 Hz। गैर-अल्ट्रासोनिक प्रोटोकॉल के लिए: F0 = 1875.000 Hz। अल्ट्रासोनिक प्रोटोकॉल के लिए: F0 = 15000.000 Hz।
सुविधा के लिए, आपकी मशीन का स्थानीय IP पता स्वचालित रूप से पता लगाने के लिए एक सरल WebRTC हैक का उपयोग किया जाता है, ताकि आपको इसे मैन्युअल रूप से प्रदान न करना पड़े। हालांकि, नवीनतम WebRTC विनिर्देश सुरक्षा कारणों से ऐसा होने से रोकता है, इसलिए किसी बिंदु पर यह "सुविधा" सभी ब्राउज़रों में काम करना बंद कर देगी। उदाहरण के लिए, यह अब Safari पर काम नहीं करता है।
wave.wasmआपको एक Emscripten कंपाइलर की आवश्यकता होगी। compile.sh स्क्रिप्ट चलाएं।
wave-shareमहत्वपूर्ण: यह CLI टूल अब स्टैंडअलोन लाइब्रेरी ggwave का प्रोटोटाइप था। इसे जरूर देखें, क्योंकि इसमें इस डेटा-ओवर-साउंड प्रकार के संचार के अनुप्रयोग के लिए अधिक अद्यतन उदाहरण हैं।
यह एक सरल उपकरण है जो समझाए गए wave-share ध्वनि tx/rx प्रोटोकॉल का उपयोग करके डेटा प्राप्त और भेजता है। मानक इनपुट पर कुछ टेक्स्ट टाइप करें और संचारित करने के लिए Enter दबाएं।
# build
git clone https://github.com/ggerganov/wave-share
cd wave-share && mkdir build && cd build
cmake ..
make
# running
./wave-share
यहाँ CLI टूल का उपयोग करने का तरीका दर्शाने वाला एक छोटा वीडियो है:
| आकार, [B] | विवरण |
|---|
| 1 | SDP का प्रकार - प्रस्ताव या उत्तर |
| 1 | पैकेट का आकार बाइट्स में (ECC बाइट्स को शामिल नहीं करते हुए) |
| 4 | प्रेषित करने वाले पीयर का IP पता |
| 2 | नेटवर्क पोर्ट जो संचार के लिए उपयोग किया जाएगा |
| 32 | सत्र डेटा की SHA-256 फिंगरप्रिंट |
| 40 | ICE क्रेडेंशियल्स - 16 बाइट्स उपयोगकर्ता नाम + 24 बाइट्स पासवर्ड |
| 32 | Tx के दौरान त्रुटियों को सुधारने के लिए उपयोग किए जाने वाले ECC सुधार बाइट्स |
| आवृत्ति, [Hz] | मान, [bits] | आवृत्ति, [Hz] | मान, [bits] | ... | आवृत्ति, [Hz] | मान, [bits] |
|---|
F0 + 00*dF | चंक 0: 0000 | F0 + 16*dF | चंक 1: 0000 | ... | F0 + 80*dF | चंक 5: 0000 |
F0 + 01*dF | चंक 0: 0001 | F0 + 17*dF | चंक 1: 0001 | ... | F0 + 81*dF | चंक 5: 0001 |
F0 + 02*dF | चंक 0: 0010 | F0 + 18*dF | चंक 1: 0010 | ... | F0 + 82*dF | चंक 5: 0010 |
| ... | ... | ... | ... | ... | ... | ... |
F0 + 14*dF | चंक 0: 1110 | F0 + 30*dF | चंक 1: 1110 | ... | F0 + 94*dF | चंक 5: 1110 |
F0 + 15*dF | चंक 0: 1111 | F0 + 31*dF | चंक 1: 1111 | ... | F0 + 95*dF | चंक 5: 1111 |