Isi kandungan:

Komunikasi Disulitkan Tanpa Wayar Arduino: 5 Langkah
Komunikasi Disulitkan Tanpa Wayar Arduino: 5 Langkah

Video: Komunikasi Disulitkan Tanpa Wayar Arduino: 5 Langkah

Video: Komunikasi Disulitkan Tanpa Wayar Arduino: 5 Langkah
Video: ARDUINO RS485 TANPA LIBRARY 2024, November
Anonim
Komunikasi Disulitkan Tanpa Wayar Arduino
Komunikasi Disulitkan Tanpa Wayar Arduino

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:

  1. Penggunaan data yang dienkripsi antara dua atau lebih objek IoT.
  2. Bekalan kos rendah
  3. 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:

  1. Sediakan cip ATECC608A
  2. Lakukan litar (Master Node dan Slave Node)
  3. Bahagian kod
  4. 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

1. Sediakan Atecc608a
1. Sediakan Atecc608a
1. Sediakan Atecc608a
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)

2. Reka Bentuk Litar (Tuan dan Budak)
2. Reka Bentuk Litar (Tuan dan Budak)
2. Reka Bentuk Litar (Tuan dan Budak)
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)

3. Kod (Hamba dan Tuan)
3. Kod (Hamba 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,

  1. ia bangun, baca paket ini, jika paket itu adalah "Bangunkan",
  2. ia menghasilkan data,
  3. menyulitkan data,
  4. hantar data ke master, tunggu paket ACK,
  5. 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:

  1. Master mengatur dalam mod Dengar dan tunggu komunikasi
  2. Sekiranya komunikasi
  3. Ekstrak 8 bait pertama, rampas tiga bait pertama dari 8 bait, jika ini adalah simpul ID
  4. Ekstrak 16 byte cypher
  5. Nyahsulitkan data
  6. Cetak data dalam Siri
  7. 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: