معرفی
جدیدا شرکت آردوینو یکیدیگر از شاهکارهای خود را در زمینه ارتباطات رونمایی کرد که طبق گفته خودش این تکنولوژی میتواند جلوی بخشی از ناامنیها را در زمینه ارتباطات بگیرد اگر خاطرتان باشد یکیاز بحثهایی که باعث میشد خیلیاز افراد از IOT استفاده نکنند و اصطلاحا به سمت هوشمندشدن نروند چیزی جز امنیت نبود که خیلیاز مهندسین علاوهبر ساخت محصول IOT موردنظر دغدغه امنیت محصول را هم داشتند که چطور باید این کار را انجام دهند که از هکرها در امان باشند؟ این سوال مطمئنا هنوز هم ذهن خیلی از افراد را به خود درگیر کردهاست که چطور باید این کار را انجامداد؟ در این مقاله میخواهیم به راهکاری که جدیدا آردوینو ارائهدادهاست بپردازیم. با ماهمراه باشید.
انتقال دیتا توسط صوت
قبلاز هرچیزی اجازهدهید که ابتدا با چند تعریف آشناشویم. صوت چیست؟ صوت، از انواع انرژی است که از تحرک ذرات ماده بهوجود میآید؛ به اینگونه که یک ذره با برخورد خود به ذرهای دیگر، ذرهٔ دیگر را به حرکت درمیآورد، و بههمینترتیب است که صوت نشر مییابد. صدا چیست؟ صدا، ارتعاشیاست که توسط حس شنوایی انسان درک میشود. ما معمولاً اصواتی را که در هوا حرکت میکنند میشنویم، ولی صدا میتواند در گاز، مایع، و حتی جامدات نیز حرکتکند. خب تا اینجا به یک درککلی از صوت و صدا رسیدیم، که ماهیت ایجادشدن صوت و صدا چگونه است؟ حال آردوینو راهکاری را که بیانکردهاست، این است که بهجای استفادهاز پروتکلهای ارتباطی که تاکنون استفاده میکردیم از دستورات صوتی استفادهکنیم(یعنیچی؟) اجازهدهید با یک مثال توضیحدهیم. فرضکنید یک گوشی را توسط ماژول بلوتوث به آردوینو متصلکردیم حال برای اینکه بخواهیم یک دستور از سمت گوشی به سمت آردوینو ارسالکنیم کاری که درحالحاضر باید انجامدهیم این است که، یک کاراکتر و یا یک رشته را باید انتقالدهیم و سمت آردوینو هم اگر رشته مربوطه را دریافتکردیم کار موردنظر را میتوانیم انجامدهیم حال روش جدیدی که آردوینو پیشنهاد داده است این است که شما قادر هستید، بهجای حالتی که ذکر شد از یک فایل صوتی استفادهکنید. یعنی یک صدای خاص از پیش تعیینشده و تنظیمشده را فقط پخشکنید(بهطورمثال همانطوریکه در گوشیهای خود آهنگ موردنظر را پخش میکنید این فایل هم دقیقا به همان صورت قابلپخش میباشد و نکته مهم این است که دیگر نه نیازی به ماژول بلوتوثی است نه ماژول وایفایی و نه… فقط تنها چیزی که مدنظر است یک فرستنده و یک گیرنده است) که طبق گفته خود آردوینو این کار باعث امنیت بیشتر میشود. توصیه میکنیم برای اطلاعات بیشتر و همینطور نحوه دیکد و انکد دیتا اینجا کلیک کنید. نکته جالب این است که تقریبا تمام کارهایی را که تابهحال با آردوینو انجام دادهاید هم میتوان بااستفادهاز این تکنولوژی راهاندازی کنید که در ادامه برای درک بهتر موضوع مثالی را برای شما قرار خواهیمداد. سوالی که شاید برای خیلیاز دوستان پیش آید این است که، آیا فقط میتوان از فایل صوتی استفادهکرد؟ خیر بلکه برای کارکردن با این پروتکل فقط کافیاست که شرطهای زیر را مهیا کنید. فرستنده میتواند وسیلهای باشد که مجهز به بلندگو است که دادهها را ازطریق صدا ارسال میکند. گیرنده دستگاهی است که مجهزبه میکروفون است.(قابلیت ارسال صوت مستقیما به Chirp SDK را داشتهباشد) سوالی دیگری که شاید در ذهن شما باشد این است که، آیا در محیطهای پرنویز هم این پروتکل جواب میدهد؟ بله، طبق منبعی که در ادامه قرار خواهیم داد، به این نتیجه رسیدهاند که در محیطهای پرنویز هم بهدرستی پاسخ میدهد.( از این بابت خیالتون راحت)
معرفی ماژول آردوینو (ماژول پیشنهادی آردوینو)
ماژولی که آردوینو برای استفادهاز این پروتکل پیشنهادکردهاست، ماژولی است که درادامه قرار میدهیم.
پروژه راهاندازی RGB LED بااستفادهاز Chirp
خب پساز اینکه یک دیدکلی نسبتبه موضوع پیداکردیم نیازاست که برای درک بهتر موضوع با نحوه برنامهنویسی آن هم آشنا شویم برای همینمنظور یک کد را در ادامه برای شما قرار میدهیم که تجزیه و تحلیل آن را به خود شما میسپاریم (فکر نمیکنیم خالیاز لطف باشد). نحوه عملکرد کد به اینگونه است که سه صوت با فرکانسهای مختلف توسط یک گوشی همراه پخش میشود و درنهایت اگر صوتی که پخش میشود مربوط به یکیاز سه رنگ قرمز، آبی و سبز بود LED روی برد به آن رنگی که اشارهشدهبود، تغیر رنگ میدهد.
#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” در آن استفادهشدهاست.
امیدوارم که این مطلب هم برای شما مفید واقعشدهباشد.
منبع:سیسوگ