Mundarija:

Simsiz shifrlangan aloqa Arduino: 5 qadam
Simsiz shifrlangan aloqa Arduino: 5 qadam

Video: Simsiz shifrlangan aloqa Arduino: 5 qadam

Video: Simsiz shifrlangan aloqa Arduino: 5 qadam
Video: Зудлик билан бу параметрни ўчиринг | Wi-Fi ни тезлаштириш | wifini tezlashtirish 2024, Noyabr
Anonim
Simsiz shifrlangan aloqa Arduino
Simsiz shifrlangan aloqa Arduino

Hammaga salom, Ushbu ikkinchi maqolada men sizga simsiz aloqani ta'minlash uchun Atecc608a chipidan qanday foydalanishni tushuntiraman. Buning uchun men Simsiz qism va Arduino UNO uchun NRF24L01+ dan foydalanaman.

ATECC608A mikro chipi MicroChip tomonidan ishlab chiqilgan va bir nechta xavfsizlik vositalariga ega. Masalan, bu chipda ECC kalitlari, AES kalitlari (AES 128 uchun) va SHA2 Hash saqlanishi mumkin.

Maqola: NRF24L01 + Arduino UNO + ATECC608A

Ikkita IoT ob'ekti o'rtasida aloqa paytida bir nechta hujumlar bo'lishi mumkin: Oddiy odam, ma'lumotlarning nusxasi va boshqalar. Shunday qilib, mening fikrim juda oddiy:

  1. Ikki yoki undan ortiq IoT ob'ektlari o'rtasida shifrlangan ma'lumotlardan foydalanish.
  2. Arzon narxdagi materiallar
  3. Arduino UNO bilan ishlashi mumkin

Mening vaziyatimda men foydalanaman

  • Atecc608a mening AES kalitimni saqlash va ma'lumotlarni shifrlash/shifrini ochish uchun.
  • Arduino Uno mikrokontroller sifatida
  • Mening ma'lumotlarimni yuborish uchun NRF24L01

Ushbu loyiha uchun siz quyidagi bosqichlarni bajarishingiz kerak:

  1. ATECC608A chipini o'rnating
  2. O'chirish (asosiy tugun va qul tugun)
  3. Kod qismi
  4. Oldinga borish !

"ATECC608A chipini sozlash" birinchi qadamlari uchun men har bir qadamni tartibda tushuntirib beradigan boshqa maqola yozdim. Havola bu erda:

Endi boshlang!

Ta'minotlar

Ushbu loyiha uchun sizga kerak:

  • 2 Arduino UNO yoki Arduino NANO yoki Arduino Mega
  • Bir oz sim
  • 2 Atecc608a (har birining narxi 0,60 dollardan past)
  • 2 NRF24L01+
  • 2 kondansatör (10 mF)
  • Non paneli

ATECC608A -> Atecc608a -ni qanday o'rnatishni tushuntirib beradigan maqolamga havola.

1 -qadam: 1. Atecc608a -ni o'rnating

1. Atecc608a -ni o'rnating
1. Atecc608a -ni o'rnating
1. Atecc608a -ni o'rnating
1. Atecc608a -ni o'rnating

Men ATECC608A -ni o'rnatish uchun har bir qadamni batafsil bayon qilmayman, chunki men har bir qadamni tushuntirib beradigan to'liq maqola yozdim. Uni sozlash uchun siz ushbu maqolaning "2. Chip konfiguratsiyasi (Atecc608a)" deb nomlangan "4 -qadam" ga amal qilishingiz kerak.

Havola: ATECC608A ni qanday sozlash kerak

Bundan tashqari, siz Atecc608a, master va slave tomonlari uchun bir xil konfiguratsiyani qo'yishingiz kerak, aks holda siz ma'lumotlarni shifrini ocholmaysiz

Ogohlantirish:

Ushbu chipni o'rnatish uchun siz yuqoridagi maqolaning har bir bosqichini tartibda bajarishingiz kerak. Agar bitta qadam etishmasa yoki chip qulflanmagan bo'lsa, siz bu loyihani bajara olmaysiz

Qolganlari:

Buning uchun amal qiling:

  • Konfiguratsiya shablonini yarating
  • Ushbu shablonni chipga yozing
  • Konfiguratsiya zonasini qulflang
  • AES kalitini (128 bit) uyaga yozing
  • Ma'lumotlar zonasini qulflang

2 -qadam: 2. O'chirish sxemasi (usta va qul)

2. O'chirish dizayni (usta va qul)
2. O'chirish dizayni (usta va qul)
2. O'chirish dizayni (usta va qul)
2. O'chirish dizayni (usta va qul)

Ushbu loyihada sizda asosiy tugun va qulli tugun bo'ladi.

Asosiy tugun qul tugun tomonidan yuborilgan ma'lumotlarni aniq qilib chop etadi. U har safar qul tugunidan ma'lumotlarni so'raydi.

Qul tugun "tarmoq" ni tinglaydi va "Ma'lumot so'rovi" ni olganida, uni yaratadi, shifrlaydi va asosiy tugunga yuboradi.

Ikkala tomon uchun ham sxema ustasi va quli bir xil:

  • Bitta arduino Nano
  • Bitta ATECC608A
  • Bitta NRF24L01

Men ushbu bosqichga sxemani biriktirdim (yuqoridagi rasmga qarang).

ATECC608A Arduino UNO uchun bu 8 pinli soik. Men yuqoridagi "yuqori ko'rinish" ni qo'shdim:

  • ARDUINO 3.3V -> PIN 8 (Atecc608a)
  • ARDUINO GND -> PIN 4 (Atecc608a)
  • ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
  • ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)

Arduino uchun NRF24L01 uchun:

  • ARDUINO 3.3V -> VCC (nrf24l01)
  • ARDUINO GND -> GND (nrf24l01)
  • ARDUINO 9 -> Idoralar (nrf24l01)
  • ARDUINO 10 -> CSN (nrf24l01)
  • ARDUINO 11 -> MOSI (nrf24L01)
  • ARDUINO 12 -> MISO (nrf24l01)
  • ARDUINO 13 -> SCK (nrf24l01)
  • ARDUINO 3 -> IRQ (nrf24l01) -> faqat asosiy tugun uchun, asosiy rejimda ishlatilmaydi

NRF24L01 ning IRQ pinidan nima uchun foydalanish kerak

IRQ pin juda foydali, bu pin NRF24L01 tomonidan paket qabul qilinganida (LOW) deb aytishga imkon beradi, shuning uchun qul tugunini uyg'otish uchun biz bu pinga uzilish ulashimiz mumkin.

3 -qadam: 3. Kodeks (qul va xo'jayin)

3. Kodeks (qul va xo'jayin)
3. Kodeks (qul va xo'jayin)

Qul tugun

Men quvvat tugunidan quvvat tejashdan foydalanaman, chunki u doimo tinglashi shart emas.

Bu qanday ishlaydi: qul tugunlari "Wake UP paketi" ni eshitishni kutadi. Bu paket master tugun orqali quldan ma'lumotlarni so'rash uchun yuboriladi.

Mening vaziyatimda ikkita int qatorini ishlataman:

// Uyg'otish paketi

const int wake_packet [2] = {20, 02};

Agar mening tugunim paketni qabul qilsa,

  1. u uyg'onadi, bu paketni o'qing, agar paket "Uyg'oning" bo'lsa,
  2. u ma'lumotlarni ishlab chiqaradi,
  3. ma'lumotlarni shifrlash,
  4. ma'lumotlarni masterga yuboring, ACK paketini kuting,
  5. uxlash

AES shifrlash uchun men 9 -uyadagi kalitdan foydalanaman.

Bu Slave tugunining kodi

#"Arduino.h" qo'shish #"avr/uxlash.h" qo'shish " #avr/wdt.h"

#"SPI.h" ni qo'shing

#"nRF24L01.h" qo'shish #"RF24.h" qo'shish

#"Wire.h" ni qo'shing

// ATECC608A kutubxonasi

#"ATECCX08A_Arduino/cryptoauthlib.h" ni kiriting #"AES BASIC/aes_basic.h" ni qo'shing

#identifikatsiya qilish ID_NODE 255

#AES_KEY ni belgilang (uint8_t) 9

ATCAIfaceCfg cfg;

ATCA_STATUS holati;

RF24 radiosi (9, 10);

const uint64_t masteraddresse = 0x1111111111;

const uint64_t slaveaddresse = 0x1111111100;

/**

* / qisqacha Funktsiya uzilish o'rnatilganda bajariladi (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& ma'lumotlar, 32); if (ma'lumotlar [0] == 20 && ma'lumotlar [1] == 02) {float temp = 17,6; float hum = 16.4;

uint8_t ma'lumotlari [16];

uint8_t shifrlangan ma'lumotlar [16];

// Barcha qiymatimni o'rnatish uchun satr yarating

// Har bir qiymat "|" belgisi bilan ajratilgan. va "$" ma'lumotlarning oxirini bildiradi // OGOHLANTIRISH: uzunligi 11 dan kam bo'lishi kerak String tmp_str_data = String (ID_NODE) + "|" + String (temp, 1) + "|" + String (xum, 1) + "$"; // hajmi 11 Serial.println ("tmp_str_data:" + tmp_str_data);

tmp_str_data.getBytes (ma'lumotlar, hajmi (ma'lumotlar));

// Ma'lumotlarni shifrlash

ATCA_STATUS holati = aes_basic_encrypt (& cfg, ma'lumotlar, hajm (ma'lumotlar), shifr ma'lumotlar, AES_KEY); if (status == ATCA_SUCCESS) {long rand = random ((long) 10000, (long) 99999);

// uchta birinchi raqam = ID tuguniga asoslangan UUID yaratish

String uuid = String (ID_NODE) + String (rand); // hajmi 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)); // Radio.stopListening () tinglashni to'xtating;

bool rslt;

// Ma'lumot yuborish rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Radio.startListening () ni tinglashni boshlang; if (rslt) {// Oxirgi va uyqu rejimi Serial.println (F ("Bajarildi")); }}}}}

bo'sh o'rnatish ()

{Serial.begin (9600);

// Kutubxona uchun konstruktorni ishga tushiring

cfg.iface_type = ATCA_I2C_IFACE; // Aloqa turi -> I2C rejimi cfg.devtype = ATECC608A; // chip turi cfg.atcai2c.slave_address = 0XC0; // I2C manzil (standart qiymat) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Uyg'oning kechikishi (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 (master manzil);

radio.openReadingPipe (1, slaveaddresse); // 3 -pinli uzilishni biriktiring // Agar siz 2 -pinli uzilishni xohlasangiz, 1 -ni O -ga o'zgartiring // FALLING MODE = Pin in LOW attachInterrupt (1, wakeUpIRQ, FALLING); }

bo'sh halqa ()

{ // Kerak emas }

Asosiy tugun

Asosiy tugun har 8 soniyada uyg'onadi va tugunlardan ma'lumotlarni so'raydi

Bu qanday ishlaydi: Asosiy tugun qulga "WakeUP" paketini yuboradi va kutgandan so'ng, xizmatchi ma'lumot bilan javob beradi.

Mening holimda ikkita int qatorini ishlataman:

// Uyg'otish paketi

const int wake_packet [2] = {20, 02};

Agar xo'jayin WakeUp paketini yuborganidan keyin qul tugun ACK paketini yuborsa:

  1. Master tinglash rejimida o'rnatiladi va aloqa kutiladi
  2. Agar aloqa bo'lsa
  3. Agar birinchi identifikator tugun bo'lsa, 8 birinchi baytni chiqarib oling, 8 baytning uchta birinchi baytini talon -taroj qiling.
  4. 16 baytli shifrni chiqarib oling
  5. Ma'lumotni shifrini oching
  6. Ma'lumotni ketma -ket chop eting
  7. Uyqu rejimi

AES shifrlash uchun men 9 -uyadagi kalitdan foydalanaman.

Bu mening asosiy tugun uchun kodim

#"Arduino.h" ni qo'shing

#include "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A kutubxonasi #include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h" #define ID_NODE 255 #define AES_KEY (uint8_t) 9 ATCAIfaceCfg cfg; ATCA_STATUS holati; RF24 radiosi (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Uyg'oning UP paketi const int wake_packet [2] = {20, 02}; // qo'riqchi ISR (WDT_vect) {wdt_disable (); // watchdogni o'chirish} bo'sh uyqu rejimi () {// ADC ADCSRA = 0 ni o'chirish; // har xil "reset" bayroqlarini tozalash MCUSR = 0; // o'zgarishlarga ruxsat berish, qayta o'rnatishni o'chirish WDTCSR = bit (WDCE) | bit (WDE); // uzilish rejimini va intervalni o'rnatish WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // WDIE -ni o'rnating va 8 soniya kechikish wdt_reset (); // qo'riqchi set_sleep_mode (SLEEP_MODE_PWR_DOWN) sozlamalarini tiklash; noInterrupts (); // vaqt ketma -ketligi sleep_enable () ga to'g'ri keladi; // MCUCR = bit (BODS) dasturida jigarrang o'chirishni yoqish | bit (BODSE); MCUCR = bit (BODS); uzilishlar (); // keyingi buyruq bajarilishini kafolatlaydi sleep_cpu (); // ehtiyot chorasi sifatida uyquni bekor qilish sleep_disable (); } void setup () {Serial.begin (9600); // kutubxona uchun konstruktorni ishga tushiring cfg.iface_type = ATCA_I2C_IFACE; // Aloqa turi -> I2C rejimi cfg.devtype = ATECC608A; // chip turi cfg.atcai2c.slave_address = 0XC0; // I2C manzil (standart qiymat) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Uyg'oning kechikishi (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 (qulli manzil); radio.openReadingPipe (1, masteraddresse); } void loop () {bool rslt; // Ma'lumot yuborish rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Radio.startListening () ni tinglashni boshlang; while (radio.available ()) {uint8_t javob [32]; radio.read (& javob, sizeof (javob)); uint8_t node_id [3]; uint8_t shifr [16]; memcpy (node_id, javob, 3); memcpy (shifr, javob + 3, 16); if ((int) node_id == ID_NODE) {uint8_t chiqish [16]; ATCA_STATUS holati = aes_basic_decrypt (& cfg, shifr, 16, chiqish, AES_KEY); if (status == ATCA_SUCCESS) {Serial.println ("Shifrlangan ma'lumotlar:"); for (size_t i = 0; i <16; i ++) {Serial.print ((char) chiqish ); }}}}} boshqa {Serial.println ("Wakup paketi uchun qabul qilinmaydi"); } // Kutish rejimi 8 soniya uyqu rejimi (); }

Agar sizda savol bo'lsa, men javob berish uchun shu erdaman

4 -qadam: 4. Oldinga boring

Bu misol oddiy, shuning uchun siz loyihani yaxshilashingiz mumkin

Yaxshilanishlar:

  • AES 128 asosiy hisoblanadi va xavfsizroq bo'lish uchun siz AESning boshqa algoritmini AES CBC sifatida ishlatishingiz mumkin.
  • Simsiz modulni o'zgartiring (NRF24L01 23 bayt yuk bilan cheklangan)

Agar yaxshilanishni ko'rsangiz, uni munozara maydonida tushuntiring

5 -qadam: Xulosa

Umid qilamanki, bu maqola siz uchun foydali bo'ladi. Kechirasiz, agar men matnda xato qilgan bo'lsam, lekin ingliz tili mening asosiy tilim emas va men yozganimdan yaxshiroq gapiraman.

Hamma narsani o'qiganingiz uchun tashakkur.

Bundan bahra oling.

Tavsiya: