Isi kandungan:
- Bekalan
- Langkah 1: 1. Sediakan Atecc608a
- Langkah 2: 2. Reka Bentuk Litar (Tuan dan Budak)
- Langkah 3: 3. Kod (Budak dan Tuan)
- Langkah 4: 4. Pergi Lebih Lanjut
- Langkah 5: Kesimpulannya
Video: Komunikasi Disulitkan Tanpa Wayar Arduino: 5 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:08
Hai semua, Dalam artikel kedua ini, saya akan menerangkan cara menggunakan cip Atecc608a untuk mendapatkan komunikasi tanpa wayar anda. Untuk ini, saya akan menggunakan NRF24L01 + untuk bahagian Tanpa Wayar dan Arduino UNO.
Cip mikro ATECC608A telah dirancang oleh MicroChip dan mendapat pelbagai alat keselamatan. Sebagai contoh, cip ini boleh menyimpan Kekunci ECC, Kekunci AES (untuk AES 128) dan Hash SHA2.
Artikel: NRF24L01 + Arduino UNO + ATECC608A
Semasa komunikasi antara dua Objek IoT, terdapat banyak serangan: Man Of the ringan, Salinan maklumat dan banyak lagi.. Jadi idea saya sangat mudah:
- Penggunaan data yang dienkripsi antara dua atau lebih objek IoT.
- Bekalan kos rendah
- Boleh bekerjasama dengan Arduino UNO
Dalam kes saya, saya menggunakan
- Atecc608a untuk menyimpan Kunci AES saya dan untuk menyulitkan / menyahsulitkan data saya.
- Arduino Uno sebagai Pengawal Mikro
- NRF24L01 untuk menghantar data saya
Anda perlu mengikuti langkah-langkah untuk projek ini:
- Sediakan cip ATECC608A
- Lakukan litar (Master Node dan Slave Node)
- Bahagian kod
- Pergi lebih jauh !
Untuk langkah pertama "Siapkan cip ATECC608A", saya menulis artikel lain yang menerangkan setiap langkah mengikut urutan. Pautan ada di sini:
Sekarang mulakan!
Bekalan
Untuk projek ini, anda memerlukan:
- 2 Arduino UNO atau Arduino NANO atau Arduino Mega
- Sebilangan wayar
- 2 Atecc608a (masing-masing berharga kurang dari 0.60 $)
- 2 NRF24L01 +
- 2 kapasitor (10 μF)
- Papan roti
Pautan ke artikel saya yang menerangkan bagaimana mengatur cip ATECC608A -> Cara menyiapkan Atecc608a
Langkah 1: 1. Sediakan Atecc608a
Saya tidak akan memperincikan setiap langkah yang harus diikuti untuk menyediakan ATECC608A kerana saya menulis artikel lengkap yang menerangkan setiap langkah untuk melakukannya. Untuk menyiapkannya, anda perlu mengikuti "Langkah 4" artikel ini yang disebut "2. Konfigurasi Chip (Atecc608a)"
Pautan adalah: Cara menyediakan ATECC608A
Anda juga perlu meletakkan konfigurasi yang sama untuk sisi Atecc608a, sisi induk dan hamba, jika tidak, anda tidak dapat menyahsulitkan data anda
Amaran:
Untuk menyiapkan cip ini, anda perlu mengikuti setiap langkah artikel di atas dengan teratur. Sekiranya satu langkah hilang atau cip tidak terkunci, anda tidak dapat melakukan projek ini
Baki:
Langkah untuk mengikuti ini:
- Buat templat konfigurasi
- Tulis templat ini ke cip
- Kunci Zon Konfigurasi
- Tuliskan Kunci AES anda (128 Bits) dalam slot
- Kunci Zon Data
Langkah 2: 2. Reka Bentuk Litar (Tuan dan Budak)
Dalam projek ini, anda akan mempunyai Master Node dan Slave Node.
Node induk akan mencetak data yang dihantar oleh nod hamba dengan jelas. Ia akan meminta data dari node hamba setiap X kali.
Node hamba akan mendengar "rangkaian" dan apabila menerima "Permintaan data", ia akan menghasilkannya, mengenkripsi dan menghantarnya ke nod induk.
Untuk kedua-dua belah pihak, tuan dan hamba litar adalah sama:
- Satu arduino Nano
- Satu ATECC608A
- Satu NRF24L01
Saya melekatkan litar ke langkah ini (rujuk gambar di atas).
Untuk ATECC608A ke Arduino UNO, ini adalah 8 pin soic. Saya menambah "paparan 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 nod Slave, tidak digunakan dalam mod Master
Mengapa menggunakan pin IRQ NRF24L01
Pin IRQ sangat berguna, pin ini memungkinkan untuk mengatakan (RENDAH) apabila paket diterima oleh NRF24L01, jadi kami dapat melampirkan Interrupt ke pin ini untuk membangunkan simpul hamba.
Langkah 3: 3. Kod (Budak dan Tuan)
Node Hamba
Saya menggunakan penjimatan kuasa untuk hamba Node kerana tidak perlu mendengar sepanjang masa.
Cara kerjanya: node hamba mendengar dan menunggu untuk menerima "Bangunkan paket". Paket ini dihantar oleh nod Master untuk meminta data dari hamba.
Dalam kes saya, saya menggunakan susunan dua int:
// Bangunkan paket
const int wake_packet [2] = {20, 02};
Sekiranya nod saya menerima sebungkus,
- ia bangun, baca paket ini, jika paket itu adalah "Bangunkan",
- ia menghasilkan data,
- menyulitkan data,
- hantar data ke master, tunggu paket ACK,
- tidur.
Untuk Penyulitan AES, saya menggunakan kunci pada nombor slot 9.
Ini adalah kod saya untuk nod Slave
#include "Arduino.h" #include "avr / sleep.h" #include "avr / wdt.h"
#sertakan "SPI.h"
#sertakan "nRF24L01.h" #masuk "RF24.h"
#sertakan "Wire.h"
// Perpustakaan ATECC608A
#include "ATECCX08A_Arduino / cryptoauthlib.h" #include "AES BASIC / aes_basic.h"
#tentukan ID_NODE 255
#tentukan AES_KEY (uint8_t) 9
ATCAIfaceCfg cfg;
Status ATCA_STATUS;
Radio RF24 (9, 10);
const uint64_t masteraddresse = 0x1111111111;
const uint64_t slaveaddresse = 0x1111111100;
/**
* / Fungsi ringkas dilaksanakan apabila gangguan ditetapkan (IRQ LOW) * * * / batal wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& data, 32); jika (data [0] == 20 && data [1] == 02) {tempuh apungan = 17.6; float hum = 16.4;
uint8_t data [16];
uint8_t cypherdata [16];
// Bina Rentetan untuk menetapkan semua Nilai saya
// Setiap nilai dipisahkan dengan "|" dan "$" bermaksud akhir data // PERINGATAN: Mesti kurang dari 11 panjang String tmp_str_data = String (ID_NODE) + "|" + Rentetan (temp, 1) + "|" + Rentetan (hum, 1) + "$"; // saiz 11 Serial.println ("tmp_str_data:" + tmp_str_data);
tmp_str_data.getBytes (data, sizeof (data));
// Enkripsi data
Status ATCA_STATUS = aes_basic_encrypt (& cfg, data, sizeof (data), cypherdata, AES_KEY); jika (status == ATCA_SUCCESS) {panjang rand = rawak ((panjang) 10000, (panjang) 99999);
// buat UUID berdasarkan tiga nombor pertama = simpul ID
String uuid = String (ID_NODE) + String (rand); // Saiz 8
uint8_t tmp_uuid [8];
uint8_t data_to_send [32];
uuid.getBytes (tmp_uuid, sizeof (tmp_uuid) + 1);
memcpy (data_to_send, tmp_uuid, sizeof (tmp_uuid));
memcpy (data_to_send + sizeof (tmp_uuid), cypherdata, sizeof (cypherdata)); // Berhenti mendengar radio.stopListening ();
bool rslt;
// Hantar Data rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Mula Mendengarkan radio.startListening (); if (rslt) {// Mod tamat dan tidur Serial.println (F ("Selesai")); }}}}}
persediaan tidak sah ()
{Serial.begin (9600);
// Masukkan konduktor untuk perpustakaan
cfg.iface_type = ATCA_I2C_IFACE; // Jenis komunikasi -> Mod I2C cfg.devtype = ATECC608A; // Jenis cip cfg.atcai2c.slave_address = 0XC0; // Alamat I2C (nilai lalai) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Kelewatan bangun (1500 ms) cfg.rx_retries = 20;
radio.begin ();
radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5);
radio.openWritingPipe (masteraddresse);
radio.openReadingPipe (1, slaveaddresse); // Lampirkan gangguan ke pin 3 // Ubah suai 1 oleh O jika anda mahukan gangguan ke pin 2 // MODE JATUH = Pin di LANGKAH pemasanganInterrupt (1, bangunUpIRQ, JATUH); }
gelung kosong ()
{ // Tidak perlu }
Nod Induk
Node induk bangun setiap 8 saat untuk meminta data dari Node hamba
Cara kerjanya: Node induk mengirim paket "WakeUP" kepada hamba dan setelah menunggu jawapan hamba dengan data.
Dalam kes saya, saya menggunakan susunan dua int:
// Bangunkan paket
const int wake_packet [2] = {20, 02};
Sekiranya nod hamba menghantar paket ACK setelah tuan menghantar paket WakeUp:
- Master mengatur dalam mod Dengar dan tunggu komunikasi
- Sekiranya komunikasi
- Ekstrak 8 bait pertama, rampas tiga bait pertama dari 8 bait, jika ini adalah simpul ID
- Ekstrak 16 byte cypher
- Nyahsulitkan data
- Cetak data dalam Siri
- Mod tidur
Untuk Penyulitan AES, saya menggunakan kunci pada slot nombor 9.
Ini adalah kod saya untuk nod Master
#sertakan "Arduino.h"
#include "avr / sleep.h" #include "avr / wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // Perpustakaan ATECC608A #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 = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Bangunkan paket const int wake_packet [2] = {20, 02}; // pengawas mengganggu ISR (WDT_vect) {wdt_disable (); // lumpuhkan pengawas} void sleepmode () {// lumpuhkan ADC ADCSRA = 0; // hapus pelbagai "reset" bendera MCUSR = 0; // izinkan perubahan, matikan semula WDTCSR = bit (WDCE) | bit (WDE); // tetapkan mod gangguan dan selang WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // tetapkan WDIE, dan kelewatan 8 saat wdt_reset (); // tetapkan semula set_sleep_mode pengawas (SLEEP_MODE_PWR_DOWN); noInterrupts (); // urutan masa mengikut sleep_enable (); // matikan coklat keluar aktif dalam perisian MCUCR = bit (BODS) | bit (BODSE); MCUCR = bit (BODS); mengganggu (); // menjamin arahan seterusnya dijalankan sleep_cpu (); // batalkan tidur sebagai langkah berjaga-jaga sleep_disable (); } batal persediaan () {Serial.begin (9600); // Masukkan pemalar untuk perpustakaan cfg.iface_type = ATCA_I2C_IFACE; // Jenis komunikasi -> Mod I2C cfg.devtype = ATECC608A; // Jenis cip cfg.atcai2c.slave_address = 0XC0; // Alamat I2C (nilai lalai) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Kelewatan bangun (1500 ms) cfg.rx_retries = 20; radio.begin (); radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5); radio.openWritingPipe (slaveaddresse); radio.openReadingPipe (1, masteraddresse); } gelung void () {bool rslt; // Hantar Data rslt = radio.write (& wake_packet, sizeof (wake_packet)); jika (rslt) {// Mula Mendengarkan radio.startListening (); sementara (radio.available ()) {uint8_t jawapan [32]; radio.read (& jawapan, sizeof (jawapan)); uint8_t node_id [3]; uint8_t cypher [16]; memcpy (node_id, jawapan, 3); memcpy (cypher, jawapan + 3, 16); jika ((int) node_id == ID_NODE) {uint8_t output [16]; Status ATCA_STATUS = aes_basic_decrypt (& cfg, cypher, 16, output, AES_KEY); if (status == ATCA_SUCCESS) {Serial.println ("Data Disulitkan:"); untuk (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} yang lain {Serial.println ("Ack tidak menerima untuk Wakup Packet"); } // Mod tidur 8 saat mod tidur (); }
Sekiranya anda mempunyai pertanyaan, saya di sini untuk menjawabnya
Langkah 4: 4. Pergi Lebih Lanjut
Contoh ini mudah sehingga anda dapat memperbaik projek ini
Penambahbaikan:
- AES 128 adalah asas dan anda boleh menggunakan algoritma lain AES sebagai AES CBC agar lebih selamat.
- Tukar modul tanpa wayar (NRF24L01 dibatasi oleh muatan 23 Bytes)
- …
Sekiranya anda melihat peningkatan yang perlu dilakukan, jelaskan di bahagian perbincangan
Langkah 5: Kesimpulannya
Saya harap artikel ini berguna untuk anda. Maaf sekiranya saya melakukan kesalahan dalam teks saya tetapi bahasa Inggeris bukan bahasa utama saya dan saya bercakap lebih baik daripada saya menulis.
Terima kasih kerana membaca semuanya.
Nikmatinya.
Disyorkan:
Komunikasi Tanpa Wayar LoRa 3Km hingga 8Km Dengan Peranti E32 Kos Rendah (sx1278 / sx1276) untuk Arduino, Esp8266 atau Esp32: 15 Langkah
LoRa 3Km hingga 8Km Komunikasi Tanpa Wayar Dengan E32 Kos Rendah (sx1278 / sx1276) Peranti untuk Arduino, Esp8266 atau Esp32: Saya membuat perpustakaan untuk menguruskan EBYTE E32 berdasarkan siri Semtech peranti LoRa, peranti yang sangat kuat, sederhana dan murah. Anda boleh menjumpai Versi 3Km di sini, versi 8Km di siniMereka boleh bekerja pada jarak 3000m hingga 8000m, dan mereka mempunyai banyak ciri dan
Robot Arduino Tanpa Wayar Menggunakan Modul Tanpa Wayar HC12: 7 Langkah
Robot Arduino Tanpa Wayar Menggunakan Modul Tanpa Wayar HC12: Hai kawan-kawan, selamat datang kembali. Dalam catatan sebelumnya, saya telah menjelaskan apa itu H Bridge Circuit, IC pemandu motor L293D, IC pemandu L293D piggybacking untuk memandu pemandu motor semasa yang tinggi dan bagaimana anda boleh merancang dan membuat Papan Pemandu motor L293D anda sendiri
Komunikasi Tanpa Wayar Menggunakan Modul Transceiver NRF24L01 untuk Projek Berasaskan Arduino: 5 Langkah (dengan Gambar)
Komunikasi Tanpa Wayar Menggunakan Modul Transceiver NRF24L01 untuk Projek Berasaskan Arduino: Ini adalah tutorial kedua saya mengenai robot dan pengawal mikro. Sangat mengagumkan apabila melihat robot anda hidup dan berfungsi seperti yang diharapkan dan percayalah akan lebih menggembirakan jika anda mengawal robot anda atau perkara lain tanpa wayar dengan pantas dan
Peretas Pintu Tanpa Wayar ke Suis Penggera Tanpa Wayar atau Suis Hidup / Mati: 4 Langkah
Peretas Pintu Tanpa Wayar ke Suis Penggera Tanpa Wayar atau Suis Hidup / Mati: Saya baru-baru ini membina sistem penggera dan memasangnya di rumah saya. Saya menggunakan suis magnet di pintu dan memasang kabel melalui loteng. Tingkap adalah kisah lain dan pendawaian keras bukan pilihan. Saya memerlukan penyelesaian tanpa wayar dan ini
Tukar Penghala Tanpa Wayar ke Jalur Akses 2x Ekstensi Tanpa Wayar: 5 Langkah
Tukar Penghala Tanpa Wayar ke Jalur Akses 2x Ekstensi Tanpa Wayar: Saya mempunyai sambungan internet tanpa wayar yang lemah di rumah saya disebabkan oleh RSJ (rasuk sokongan logam di siling) dan ingin meningkatkan isyarat atau menambah pemanjang tambahan untuk seluruh rumah. Saya telah melihat pemanjangan sekitar & £ 50 dalam sebuah elektro