جدیدا شرکت آردوینو یکی دیگر از شاهکارهای خود را در زمینه ارتباطات رونمایی کرد که طبق گفته خودش این تکنولوژی میتواند جلوی بخشی از ناامنیها را در زمینه ارتباطات بگیرد اگر خاطرتان باشد یکی از بحثهایی که باعث میشد خیلی از افراد از IOT استفاده نکنند و اصطلاحا به سمت هوشمند شدن نروند چیزی جز امنیت نبود که خیلی از مهندسین علاوه بر ساخت محصول IOT موردنظر دغدغه امنیت محصول را هم داشتند که چطور باید این کار را انجام دهند که از هکرها در امان باشند؟ این سوال مطمئنا هنوز هم ذهن خیلی از افراد را به خود درگیر کرده است که چطور باید این کار را انجام داد؟
در این مقاله از سری پروژه های آردوینو میخواهیم به راهکاری که جدیدا آردوینو ارائه داده است بپردازیم. با سیسوگ همراه باشید.
انتقال دیتا توسط صوت
قبل از هر چیزی اجازه دهید که ابتدا با چند تعریف آشنا شویم.
صوت چیست؟
صوت، از انواع انرژی است که از تحرک ذرات ماده بهوجود میآید؛ به این گونه که یک ذره با برخورد خود به ذرهای دیگر، ذرهٔ دیگر را به حرکت درمیآورد، و به همین ترتیب است که صوت نشر مییابد.
صدا چیست؟
صدا، ارتعاشیاست که توسط حس شنوایی انسان درک میشود. ما معمولاً اصواتی را که در هوا حرکت میکنند میشنویم، ولی صدا میتواند در گاز، مایع، و حتیجامدات نیز حرکت کند.
خب تا اینجا به یک درک کلی از صوت و صدا رسیدیم، که ماهیت ایجاد شدن صوت و صدا چگونه است. حال آردوینو راهکاری را که بیان کرده است، این است که به جای استفاده از پروتکل های ارتباطی که تا کنون استفاده میکردیم از دستورات صوتی استفاده کنیم (یعنی چی؟)
اجازه دهید با یک مثال توضیح دهیم. فرض کنید یک گوشی را توسط ماژول بلوتوث به آردوینو متصل کردیم حال برای اینکه بخواهیم یک دستور از سمت گوشی به سمت آردوینو ارسال کنیم کاری که در حال حاضر باید انجام دهیم این است که، یک کاراکتر و یا یک رشته را باید انتقال دهیم و سمت آردوینو هم اگر رشته مربوطه را دریافت کردیم کار موردنظر را میتوانیم انجام دهیم حال روش جدیدی که آردوینو پیشنهاد داده است این است که شما قادر هستید، به جای حالتی که ذکر شد از یک فایل صوتی استفاده کنید. یعنی یک صدای خاص از پیش تعیین شده و تنظیم شده را فقط پخش کنید( به طور مثال همانطوری که در گوشیهای خود آهنگ موردنظر را پخش میکنید این فایل هم دقیقا به همان صورت قابل پخش میباشد و نکته مهم این است که دیگر نه نیازی به ماژول بلوتوثی است نه ماژول وایفایی و نه … فقط تنها چیزی که مدنظر است یک فرستنده و یک گیرنده است) که طبق گفته خود آردوینو این کار باعث امنیت بیشتر میشود.
توصیه میکنیم برای اطلاعات بیشتر و همینطور نحوه دیکد و انکد دیتا اینجا کلیک کنید.
نکته جالب این است که تقریبا تمام کارهایی را که تا به حال با آردوینو انجام دادهاید هم میتوان با استفاده از این تکنولوژی راهاندازی کنید که در ادامه برای درک بهتر موضوع مثالی را برای شما قرار خواهیم داد.
سوالی که شاید برای خیلی از دوستان پیش آید این است که، آیا فقط میتوان از فایل صوتی استفاده کرد؟ خیر بلکه برای کار کردن با این پروتکل فقط کافی است که شرطهای زیر را مهیا کنید.
فرستنده می تواند وسیله ای باشد که مجهز به بلندگو است که داده ها را از طریق صدا ارسال می کند.
گیرنده دستگاهی است که مجهز به میکروفون است.(قابلیت ارسال صوت مستقیما به Chirp SDK را داشته باشد.)
سوالی دیگری که شاید در ذهن شما باشد این است که، آیا در محیطهای پرنویز هم این پروتکل جواب میدهد؟
بله، طبق منبعی که در ادامه قرار خواهیم داد، به این نتیجه رسیدهاند که در محیطهای پرنویز هم به درستی پاسخ میدهد.( از این بابت خیالتون راحت)
معرفی ماژول آردوینو (ماژول پیشنهادی آردوینو)
ماژولی که آردوینو برای استفاده از این پروتکل پیشنهاد کرده است، ماژولی است که در ادامه قرار میدهیم.
پروژه راهاندازی RGB LED با استفاده از Chirp
خب پس از اینکه یک دید کلی نسبت به موضوع پیدا کردیم نیاز است که برای درک بهتر موضوع با نحوه برنامهنویسی آن هم آشنا شویم برای همین منظور یک کد را در ادامه برای شما قرار میدهیم که تجزیه و تحلیل آن را به خود شما میسپاریم (فکر نمیکنیم خالی از لطف باشد).
نحوه عملکرد کد به اینگونه است که سه صوت با فرکانسهای مختلف توسط یک گوشی همراه پخش میشود و در نهایت اگر صوتی که پخش میشود مربوط به یکی از سه رنگ قرمز، آبی و سبز بود LED روی برد به آن رنگی که اشاره شده بود، تغیر رنگ میدهد. برای درک بهتر حتما کلیپی را که در ادامه قرار میدهیم با دقت مشاهده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | #include <PDM.h> #include "chirp_connect.h" #define CHIRP_APP_KEY "YOUR_APP_KEY" #define CHIRP_APP_SECRET "YOUR_APP_SECRET" #define CHIRP_APP_CONFIG "YOUR_APP_CONFIG" #define SAMPLE_RATE 16000 #define BUFFER_SIZE 256 #define R_LED_PIN 22 #define G_LED_PIN 23 #define B_LED_PIN 24 // Global variables --------------------------------------------------- static chirp_connect_t *chirp = NULL; short sampleBuffer[BUFFER_SIZE]; volatile int samplesRead; // Function definitions ----------------------------------------------- void setupChirp(void); void chirpErrorHandler(chirp_connect_error_code_t code); void onPDMdata(void); // Main --------------------------------------------------------------- void setup() { Serial.begin(115200); // while (!Serial); pinMode(R_LED_PIN, OUTPUT); pinMode(G_LED_PIN, OUTPUT); pinMode(B_LED_PIN, OUTPUT); setupChirp(); PDM.onReceive(onPDMdata); PDM.setGain(30); if (!PDM.begin(1, SAMPLE_RATE)) { Serial.println("Failed to start PDM!"); while (1); } analogWrite(R_LED_PIN, UINT8_MAX); analogWrite(G_LED_PIN, UINT8_MAX); analogWrite(B_LED_PIN, UINT8_MAX); } void loop() { if (samplesRead) { chirp_connect_error_code_t err = chirp_connect_process_shorts_input(chirp, sampleBuffer, samplesRead); chirpErrorHandler(err); samplesRead = 0; } } void onPDMdata() { int bytesAvailable = PDM.available(); PDM.read(sampleBuffer, bytesAvailable); samplesRead = bytesAvailable / sizeof(short); } // Chirp -------------------------------------------------------------- void onReceivingCallback(void *chirp, uint8_t *payload, size_t length, uint8_t channel) { Serial.println("Receiving data..."); analogWrite(R_LED_PIN, UINT8_MAX); analogWrite(G_LED_PIN, UINT8_MAX); analogWrite(B_LED_PIN, UINT8_MAX); } void onReceivedCallback(void *chirp, uint8_t *payload, size_t length, uint8_t channel) { if (length) { // High values mean lower brightness, so we // subtract from UINT8_MAX analogWrite(R_LED_PIN, UINT8_MAX - payload[0]); analogWrite(G_LED_PIN, UINT8_MAX - payload[1]); analogWrite(B_LED_PIN, UINT8_MAX - payload[2]); } else { analogWrite(R_LED_PIN, 0); analogWrite(G_LED_PIN, UINT8_MAX); analogWrite(B_LED_PIN, UINT8_MAX); delay(500); analogWrite(R_LED_PIN, UINT8_MAX); delay(500); analogWrite(R_LED_PIN, 0); Serial.println("Decode failed"); } } void chirpErrorHandler(chirp_connect_error_code_t code) { if (code != CHIRP_CONNECT_OK) { const char *error_string = chirp_connect_error_code_to_string(code); Serial.println(error_string); exit(42); } } void setupChirp(void) { chirp = new_chirp_connect(CHIRP_APP_KEY, CHIRP_APP_SECRET); if (chirp == NULL) { Serial.println("Chirp initialisation failed."); return; } chirp_connect_error_code_t err = chirp_connect_set_config(chirp, CHIRP_APP_CONFIG); chirpErrorHandler(err); char *info = chirp_connect_get_info(chirp); Serial.println(info); chirp_connect_free(info); chirp_connect_callback_set_t callback_set = { .on_state_changed = NULL, .on_sending = NULL, .on_sent = NULL, .on_receiving = onReceivingCallback, .on_received = onReceivedCallback }; err = chirp_connect_set_callbacks(chirp, callback_set); chirpErrorHandler(err); err = chirp_connect_set_input_sample_rate(chirp, SAMPLE_RATE); chirpErrorHandler(err); err = chirp_connect_set_frequency_correction(chirp, 1.0096); chirpErrorHandler(err); err = chirp_connect_start(chirp); chirpErrorHandler(err); Serial.println("Chirp SDK initialised."); Serial.flush(); } |
دقت کنید که کد دقیقا مثل دیگرکدهای آردوینویی است که بارها دیدهاید و کار کردهاید فقط تنها تفاوتی که در این کد وجود دارد این است که از کتابخانه “chirp_connect.h” در آن استفاده شده است.
امیدوارم که این مطلب هم برای شما مفید واقع شده باشد.
بیشتر بدرد هک میخوره ولی خوب بنظرم توی جاهای پرنویز اصلا نمیتونه کار کنه البته مهم اینه از نظر شما جای پر نویز کجاست
داشتم نظرات رو میخوندم.
با زئوس موافقم به نظر من هم اصلا فناوری و متد جدیدی نیست. مخابرات زیرآب(مثلا زیردریایی) به همین شکل انجام میشه. منتهی پهنای باند و سرعت انتقال دیتا با توجه به فرکانس و سرعت انتقال کمتر موج صوتی نسبت به امواج الکترومغناطیس محدودتر هست.
اما برای محیط هایی مثل دریا که امواج الکترومغناطیس کارساز نیستن و سریع تضعیف میشن این روش استفاده میشه. همچنین سرعت انتقال موج صوتی در آب تقریبا پنج برابر هواست.
شاید جالب باشه، من در یک مستند دیدم که فیل ها با استفاده از پا روی زمین ارتعاش ایجاد میکنن و به فیلهای دیگه که چند کیلومتر باهاشون فاصله دارن سیگنال میدن و اطلاعات رد و بدل میکنن. فیل طرف مقابل هم از طریق پاهاش سیگنال رو دریافت میکنه. فکر میکنم از دود دادن سرخپوست ها خیلی موثرتر باشه 🙂
امنیت اطلاعات هم که تماما بستگی به الگوریتم رمزنگاری و نحوه انکود کردن دیتا در موج صوتی داره ولی یک مشکلی که فکر میکنم برای آردویینو وجود داشته باشه اینه که فایل های صوتی اگر با فرمت wav باشن حجیم هستن و اگر هم با فرمت های فشرده مثل mp3 باشن نیاز به پردازش دارن از طرف دیگه حتی اگر رمزنگاری هم در کار نباشه خود انکود و دکود کردن دیتا روی فایل صوتی بار پردازشی داره و همزمان آردویینو علاوه بر رمزنگاری/برداری باید نقش سینتی سایزر (در حالی که در rf میکسر یک واحد مجزاست) را هم ایفا کنه.
بنابراین آردویینو هم باید پردازش لازم برای پخش فایل رو انجام بده هم دیتا رو رمزنگاری/برداری کنه و هم دیتا رو روی فایل صوتی انکود/دکود کنه و عملا تبدیل به dds میشه. بعید میدونم که در توانش باشه.
در مورد مسئله نویز پذیری هم فکر میکنم با توجه به ماهیت صوتی این موج ها، نویز روی گیرنده ها زیاد باشه.
سلام دوست من.
Chirp را می توان با ادرینیو استفاده کرد ولی فکر نمی کنم فن اوری ادرینیو باشه.
Chirp sdk را قبل از قطع نت درحال بررسش بودم. ولی از حالات روحانی سایتشون ترسیدم چندوقت دیگه پولی بشه.
یا تحریم بشیم.
به هرحال
Chirp فراتر از یک ماژول سخت افزاری هستش و فقط بر روی هسته ارم قابل اجراست.
نه بحث امنیت بلکه بسیار ارزان قیمته.البته از لحاظ سخت افزاری.تا نت وصل بشه ببینیم کدش هم اوپن سورس هست یا نه.
ممنون از مطلبتون.
بیاید فکر کنیم هدف امن تر کردن اینترنت اشیاست به نظرم بجای بلنگو و میکروفن از سونار های فرستنده و گیرنده التراسونیک استفاده کنیم البته این یه نظر هست اما من که توانایی مالی انجام این پروژه رو ندارم اگه کسی این کامنت رو میخونه و توانایی مالی هم داره یک ماژول با فرستنده و گیرنده التراسونیک طراحی کنه مثل همین اینطوری با کیت شنود / هک تلفن همراه از طریق اکسپلویت و… ارتباط شنود نمیشه. و بعد مثل یه ماژول رو اردوینو بشینه. حالا سرعتمون بالاست و الودگی صوتی هم نداریم و … تو ساخت هم از محدوده فرکانس مناسب استفاده کنید تا موجب اسیب دیدن خردسال ها و یا جذب بعضی حشرات نشه
بدرود و موفق باشید.
من فکر میکردم یکی از دلایل استقبال از این تکنولوژی شاید ارزان بودنش باشه
اینطوری که ارزونم در نمیآد :/
به نظرم یه چیز صرفا فنی است و بی کاربرد ! شاید برای برد هایی که در نزدیکی هم قرار دارند و میخواهند چند بایت داده را منقل کنند با توجه به هزینه پایین سخت افزار مورد استفاده گزینه بدی نباشه ولی باید دید کتابخونه مورد استفاده قابل استفاده در میکروهایی ضعیف هم هست یا نه !!
صحیح فرمودید برای برد کم به صرفه نیست اما برنامه اش خیلی ساده در میاد شبیه یه پروتکل ساده که نیاز به دو سیم داشته باشه مانند یوزارت و این دو خط به سونار ها وصل بشن. از نظر ایده درکش اسونه ولی تو ساخت باید وقت گذاشت با اینحال بخاطر پاسخ به کامنت و توجه شما سپاسگذارم
خواهش میکنم دوست عزیز
موفق باشید
من فکر میکنم که هکر ها هنوز وارد این پروتکل ارتباطی نشدن وگرنه اصلا امن به نظر نمیرسه و فقط بازار کار میکروفن های شنود رو پر رونق میکنه امیدوارم این تکنولوژی هیچوقت وارد اینترنت اشیا در ابعاد گسترده نشه چو اینطوری فقط با هک یکی از نودهای داخل شبکه / یا یه نرم افزار جاسوسی / یا یه کیت شنود FM اسباب بازی همه چیز برباد میره… ولی این ایده که ارتباط جز بستر رادیویی باشه ایده بسیار عالی بود و تحت تاسیر قرارگرفتم
سلام منم واقعا دلیل امن بودنش رو نمی فهمم ؛ تنها نکته ای که به ذهنم میرسه در این خصوص اینه برد محدودش شاید دسترسی برای هکش رو کاهش بده اگر نه هکش که خیلی ساده است ؛ واقعا ساده است و پیچیدگی های سیستم رادیویی رو نداره
مهمترین نکته این روش ارسال همزمان دیتا به چند گیرنده بر خلاف بلوتوث
البته فکر کنم بلوتوث هم برادکست داشته باشه ! مطمئن نیستم البته