Daftar Isi:
- Perlengkapan
- Langkah 1: 1. Siapkan Atecc608a
- Langkah 2: 2. Desain Sirkuit (Master dan Slave)
- Langkah 3: 3. Kode (Budak dan Tuan)
- Langkah 4: 4. Pergi Lebih Jauh
- Langkah 5: Kesimpulan
Video: Komunikasi Terenkripsi Nirkabel Arduino: 5 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:54
Halo semuanya, Pada artikel kedua ini, saya akan menjelaskan cara menggunakan chip Atecc608a untuk mengamankan komunikasi nirkabel Anda. Untuk ini, saya akan menggunakan NRF24L01+ untuk bagian Wireless dan Arduino UNO.
Chip mikro ATECC608A telah dirancang oleh MicroChip dan memiliki beberapa alat keamanan. Misalnya, chip ini dapat menyimpan Kunci ECC, Kunci AES (untuk AES 128) dan SHA2 Hash.
Artikel: NRF24L01 + Arduino UNO + ATECC608A
Selama komunikasi antara dua Obyek IoT, beberapa serangan dapat terjadi: Man Of the mild, Salinan informasi dan banyak lagi.. Jadi ide saya sangat sederhana:
- Pemanfaatan data terenkripsi antara dua atau lebih objek IoT.
- Persediaan berbiaya rendah
- Dapat bekerja dengan Arduino UNO
Dalam kasus saya, saya menggunakan
- Atecc608a untuk menyimpan Kunci AES saya dan untuk mengenkripsi/mendekripsi data saya.
- Arduino Uno sebagai Mikrokontroler
- NRF24L01 untuk mengirim data saya
Anda harus mengikuti langkah-langkah untuk proyek ini:
- Siapkan chip ATECC608A
- Lakukan rangkaian (Master Node dan Slave Node)
- Bagian kode
- Pergi lebih jauh !
Untuk langkah pertama "Mengatur chip ATECC608A", saya menulis artikel lain yang menjelaskan setiap langkah secara berurutan. Tautannya ada di sini:
Sekarang mulai!
Perlengkapan
Untuk proyek ini Anda perlu:
- 2 Arduino UNO atau Arduino NANO atau Arduino Mega
- Beberapa kawat
- 2 Atecc608a (masing-masing harganya kurang dari $0,60)
- 2 NRF24L01+
- 2 kapasitor (10 F)
- Papan tempat memotong roti
Tautan ke artikel saya yang menjelaskan cara mengatur chip ATECC608A -> Cara mengatur Atecc608a
Langkah 1: 1. Siapkan Atecc608a
Saya tidak akan merinci setiap langkah yang harus diikuti untuk menyiapkan ATECC608A karena saya menulis artikel lengkap yang menjelaskan setiap langkah untuk melakukannya. Untuk mengaturnya, Anda harus mengikuti "Langkah 4" dari artikel ini yang disebut " 2. Konfigurasi Chip (Atecc608a)"
Tautannya adalah: Cara mengatur ATECC608A
Juga, Anda harus meletakkan konfigurasi yang sama untuk Atecc608a, sisi master dan sisi slave, jika tidak, Anda tidak akan dapat mendekripsi data Anda
Peringatan:
Untuk mengatur chip ini, Anda harus mengikuti setiap langkah dari artikel di atas secara berurutan. Jika satu langkah hilang atau chip tidak terkunci, Anda tidak akan dapat melakukan proyek ini
Sisa:
Langkah yang harus diikuti untuk ini:
- Buat template konfigurasi
- Tulis templat ini ke chip
- Kunci Zona Konfigurasi
- Tulis Kunci AES Anda (128 Bit) di slot
- Kunci Zona Data
Langkah 2: 2. Desain Sirkuit (Master dan Slave)
Dalam proyek ini, Anda akan memiliki Master Node dan Slave Node.
Node master akan mencetak data yang dikirim oleh node slave secara jelas. Ini akan meminta data dari node budak setiap kali X.
Node budak akan mendengarkan "jaringan" dan ketika menerima "Permintaan data", itu akan menghasilkannya, mengenkripsi dan mengirimkannya ke node master.
Untuk kedua sisi, master dan slave rangkaiannya sama:
- satu arduino nano
- Satu ATECC608A
- Satu NRF24L01
Saya memasang sirkuit ke langkah ini (lihat gambar di atas).
Untuk ATECC608A ke Arduino UNO, ini adalah soic 8 pin. Saya menambahkan "tampilan atas" di atas:
- ARDUINO 3.3V -> PIN 8 (Atecc608a)
- ARDUINO GND -> PIN 4 (Atecc608a)
- ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
- ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)
Untuk NRF24L01 ke Arduino:
- ARDUINO 3.3V -> VCC (nrf24l01)
- ARDUINO GND -> GND (nrf24l01)
- ARDUINO 9 -> CE (nrf24l01)
- ARDUINO 10 -> CSN (nrf24l01)
- ARDUINO 11 -> MOSI (nrf24L01)
- ARDUINO 12 -> MISO (nrf24l01)
- ARDUINO 13 -> SCK (nrf24l01)
- ARDUINO 3 -> IRQ (nrf24l01) -> hanya untuk node Slave, tidak digunakan dalam mode Master
Mengapa menggunakan pin IRQ dari NRF24L01
Pin IRQ sangat berguna, pin ini memungkinkan untuk mengatakan (LOW) ketika sebuah paket diterima oleh NRF24L01, sehingga kita dapat memasang Interrupt ke pin ini untuk membangunkan node slave.
Langkah 3: 3. Kode (Budak dan Tuan)
Node Budak
Saya menggunakan hemat daya untuk Node budak karena tidak perlu mendengarkan sepanjang waktu.
Cara kerjanya: node slave mendengarkan dan menunggu untuk menerima "Paket Wake UP". Paket ini dikirim oleh node Master untuk meminta data dari slave.
Dalam kasus saya, saya menggunakan array dua int:
// Paket bangun
const int wake_packet[2] = {20, 02};
Jika node saya menerima sebuah paket,
- itu bangun, baca paket ini, jika paket itu "Bangun",
- itu menghasilkan data,
- mengenkripsi data,
- kirim data ke master, tunggu paket ACK,
- tidur.
Untuk Enkripsi AES, saya menggunakan kunci di slot nomor 9.
Ini adalah kode saya untuk simpul Budak
#sertakan "Arduino.h"#sertakan "avr/sleep.h" #sertakan "avr/wdt.h"
#sertakan "SPI.h"
#sertakan "nRF24L01.h" #sertakan "RF24.h"
#sertakan "Wire.h"
// perpustakaan ATECC608A
#sertakan "ATECCX08A_Arduino/cryptoauthlib.h" #sertakan "AES BASIC/aes_basic.h"
#tentukan ID_NODE 255
#define AES_KEY (uint8_t)9
ATCAIfaceCfg cfg;
status ATCA_STATUS;
radio RF24 (9, 10);
const uint64_t masteraddresse = 0x11111111111;
const uint64_t slaveaddresse = 0x11111111100;
/**
* \brief Fungsi dijalankan saat interupsi diset (IRQ LOW) * * */ void wakeUpIRQ() { while (radio.available()) { int data[32]; radio.read(&data, 32); if (data[0] == 20 && data[1] == 02) { float temp = 17.6; dengung mengambang = 16,4;
data uint8_t[16];
uint8_t cypherdata[16];
// Bangun String untuk mengatur semua Nilai saya
// Setiap nilai dipisahkan dengan tanda "|" dan "$" berarti akhir data // PERINGATAN: Harus kurang dari 11 panjang String tmp_str_data = String(ID_NODE) + "|" + String(suhu, 1) + "|" + String(hum, 1) + "$"; //ukuran 11 Serial.println("tmp_str_data: " + tmp_str_data);
tmp_str_data.getBytes(data, ukuran(data));
// Enkripsi data
ATCA_STATUS status = aes_basic_encrypt(&cfg, data, sizeof(data), cypherdata, AES_KEY); if (status == ATCA_SUCCESS) { long rand = acak((panjang)10000, (panjang)99999);
// menghasilkan UUID berdasarkan tiga nomor pertama = simpul ID
String uuid = String(ID_NODE) + String(Rand); // Ukuran 8
uint8_t tmp_uuid[8];
uint8_t data_to_send[32];
uuid.getBytes(tmp_uuid, sizeof(tmp_uuid) + 1);
memcpy(data_ke_kirim, tmp_uuid, ukuran(tmp_uuid));
memcpy(data_ke_kirim + sizeof(tmp_uuid), cypherdata, sizeof(cypherdata)); // Berhenti mendengarkan radio.stopListening();
bool rslt;
// Kirim Data rslt = radio.write(&data_to_send, sizeof(data_to_send)); // Mulai Mendengarkan radio.startListening(); if (rslt) { // Akhiri dan mode tidur Serial.println(F("Selesai")); } } } } }
batalkan pengaturan()
{ Serial.begin(9600);
// Init konstruktor untuk perpustakaan
cfg.iface_type = ATCA_I2C_IFACE; // Jenis komunikasi -> mode I2C cfg.devtype = ATECC608A; // Jenis chip cfg.atcai2c.slave_address = 0XC0; // Alamat I2C (nilai default) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Keterlambatan bangun (1500 md) cfg.rx_retries = 20;
radio.mulai();
radio.setDataRate(RF24_250KBPS); radio.maskIRQ(1, 1, 0); radio.enableAckPayload(); radio.setRetries(5, 5);
radio.openWritingPipe(alamat master);
radio.openReadingPipe(1, alamat budak); // Pasang interupsi ke pin 3 // Ubah 1 dengan O jika Anda ingin interupsi ke pin 2 // FALLING MODE = Pin di LOW attachInterrupt(1, wakeUpIRQ, FALLING); }
lingkaran kosong()
{ // Tidak dibutuhkan }
Node Utama
Node master bangun setiap 8 detik untuk meminta data dari Node budak
Cara kerjanya: Node master mengirim paket "WakeUP" ke slave dan setelah menunggu jawaban dari slave dengan data.
Dalam kasus saya, saya menggunakan array dua int:
// Paket bangun
const int wake_packet[2] = {20, 02};
Jika node slave mengirimkan paket ACK setelah master mengirimkan paket WakeUp:
- Master diatur dalam mode Dengarkan dan tunggu komunikasi
- Jika komunikasi
- Ekstrak 8 byte pertama, jarah tiga byte pertama dari 8 byte, jika ini adalah simpul ID
- Ekstrak 16 byte cypher
- Mendekripsi data
- Cetak data dalam Serial
- Mode tidur
Untuk Enkripsi AES, saya menggunakan kunci di slot nomor 9.
Ini adalah kode saya untuk node Master
#sertakan "Arduino.h"
#include "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A library #include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h" #define ID_NODE 255 #define AES_KEY (uint8_t)9 ATCAIfaceCfg cfg; status ATCA_STATUS; radio RF24 (9, 10); const uint64_t masteraddresse = 0x11111111111; const uint64_t slaveaddresse = 0x11111111100; // Bangun paket const int wake_packet[2] = {20, 02}; // pengawas interupsi ISR(WDT_vect) { wdt_disable(); // nonaktifkan pengawas } void sleepmode() { // nonaktifkan ADC ADCSRA = 0; // hapus berbagai flag "reset" MCUSR = 0; // izinkan perubahan, nonaktifkan reset WDTCSR = bit(WDCE) | bit(WDE); // setel mode interupsi dan interval WDTCSR = bit(WDIE) | bit(WDP3) | bit(WDP0); // setel WDIE, dan tunda 8 detik wdt_reset(); // reset set_sleep_mode pengawas(SLEEP_MODE_PWR_DOWN); tidak ada interupsi(); // urutan waktunya mengikuti sleep_enable(); // matikan aktifkan brown-out di perangkat lunak MCUCR = bit(BODS) | bit(BODSE); MCUCR = bit(BODS); interupsi(); // menjamin instruksi berikutnya dieksekusi sleep_cpu(); // batalkan tidur sebagai tindakan pencegahan sleep_disable(); } batalkan pengaturan() { Serial.begin(9600); // Inisi konstruktor untuk perpustakaan cfg.iface_type = ATCA_I2C_IFACE; // Jenis komunikasi -> mode I2C cfg.devtype = ATECC608A; // Jenis chip cfg.atcai2c.slave_address = 0XC0; // Alamat I2C (nilai default) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Keterlambatan bangun (1500 md) cfg.rx_retries = 20; radio.mulai(); radio.setDataRate(RF24_250KBPS); radio.maskIRQ(1, 1, 0); radio.enableAckPayload(); radio.setRetries(5, 5); radio.openWritingPipe(alamat budak); radio.openReadingPipe(1, alamat master); } void loop() { bool rslt; // Kirim Data rslt = radio.write(&wake_packet, sizeof(wake_packet)); if (rslt) { // Mulai Mendengarkan radio.startListening(); while (radio.available()) { uint8_t jawab[32]; radio.read(&jawaban, ukuran(jawaban)); uint8_t node_id[3]; sandi uint8_t[16]; memcpy(node_id, jawaban, 3); memcpy(sandi, jawab + 3, 16); if ((int)node_id == ID_NODE) { uint8_t keluaran[16]; ATCA_STATUS status = aes_basic_decrypt(&cfg, cypher, 16, output, AES_KEY); if (status == ATCA_SUCCESS) { Serial.println("Data Terdekripsi: "); for (size_t i = 0; i < 16; i++) { Serial.print((char)output); } } } } } else{ Serial.println("Ack tidak menerima Paket Wakup"); } // Mode tidur 8 detik mode tidur(); }
Jika Anda memiliki pertanyaan, saya di sini untuk menjawabnya
Langkah 4: 4. Pergi Lebih Jauh
Contoh ini sederhana sehingga Anda dapat meningkatkan proyek ini
Perbaikan:
- AES 128 adalah dasar dan Anda dapat menggunakan algoritme AES lainnya sebagai AES CBC agar lebih aman.
- Ubah modul nirkabel (NRF24L01 dibatasi oleh muatan 23 Bytes)
- …
Jika Anda melihat peningkatan yang harus dilakukan, jelaskan di area diskusi
Langkah 5: Kesimpulan
Saya harap artikel ini akan bermanfaat bagi Anda. Maaf jika saya melakukan kesalahan dalam teks saya tetapi bahasa Inggris bukan bahasa utama saya dan saya berbicara lebih baik daripada saya menulis.
Terima kasih telah membaca semuanya.
Bersenang senang lah.
Direkomendasikan:
Komunikasi Nirkabel SmartHome: Dasar-dasar Ekstrim MQTT: 3 Langkah
Komunikasi Nirkabel SmartHome: Dasar-dasar Ekstrim MQTT: Dasar-dasar MQTT: **Saya akan melakukan seri Otomasi Rumah, saya akan melalui langkah-langkah yang saya ambil untuk mempelajari semua yang telah saya lakukan di masa mendatang. Instructable ini adalah dasar tentang cara mengatur MQTT untuk digunakan di Instructables saya di masa mendatang. Namun
Komunikasi Nirkabel LoRa 3Km hingga 8Km Dengan Perangkat E32 (sx1278/sx1276) Berbiaya Rendah untuk Arduino, Esp8266 atau Esp32: 15 Langkah
Komunikasi Nirkabel LoRa 3Km hingga 8Km Dengan Perangkat E32 (sx1278/sx1276) Berbiaya Rendah untuk Arduino, Esp8266 atau Esp32: Saya membuat perpustakaan untuk mengelola EBYTE E32 berdasarkan rangkaian perangkat LoRa Semtech, perangkat yang sangat kuat, sederhana dan murah.Anda dapat menemukan Versi 3Km di sini, versi 8Km di siniMereka dapat bekerja pada jarak 3000m hingga 8000m, dan mereka memiliki banyak fitur dan
Jarak Jauh, 1,8km, Komunikasi Nirkabel Arduino ke Arduino Dengan HC-12.: 6 Langkah (dengan Gambar)
Jarak Jauh, 1,8km, Komunikasi Nirkabel Arduino ke Arduino Dengan HC-12.: Dalam instruksi ini Anda akan belajar bagaimana berkomunikasi antara Arduino melalui jarak jauh hingga 1,8km di udara terbuka. HC-12 adalah port serial nirkabel modul komunikasi yang sangat berguna, sangat kuat dan mudah digunakan. Pertama Anda akan meninggalkan
Komunikasi Nirkabel Menggunakan Modul Transceiver NRF24L01 untuk Proyek Berbasis Arduino: 5 Langkah (dengan Gambar)
Komunikasi Nirkabel Menggunakan Modul Transceiver NRF24L01 untuk Proyek Berbasis Arduino: Ini adalah tutorial kedua saya tentang robot dan mikrokontroler. Sungguh menakjubkan melihat robot Anda hidup dan bekerja seperti yang diharapkan dan percayalah akan lebih menyenangkan jika Anda mengendalikan robot Anda atau hal-hal lain secara nirkabel dengan cepat dan
Bagaimana Mengukur Konsumsi Daya Modul Komunikasi Nirkabel dengan Benar di Era Konsumsi Daya Rendah?: 6 Langkah
Bagaimana Mengukur Konsumsi Daya Modul Komunikasi Nirkabel dengan Benar di Era Konsumsi Daya Rendah?: Konsumsi daya rendah merupakan konsep yang sangat penting dalam Internet of Things. Sebagian besar node IoT perlu ditenagai oleh baterai. Hanya dengan mengukur konsumsi daya modul nirkabel dengan benar, kami dapat memperkirakan secara akurat berapa banyak baterai yang