Агуулгын хүснэгт:

Утасгүй шифрлэгдсэн харилцаа холбоо Arduino: 5 алхам
Утасгүй шифрлэгдсэн харилцаа холбоо Arduino: 5 алхам

Видео: Утасгүй шифрлэгдсэн харилцаа холбоо Arduino: 5 алхам

Видео: Утасгүй шифрлэгдсэн харилцаа холбоо Arduino: 5 алхам
Видео: BTT GTR v1.0/M5 v1.0 - Basics 2024, Арваннэгдүгээр
Anonim
Утасгүй шифрлэгдсэн харилцаа холбоо Arduino
Утасгүй шифрлэгдсэн харилцаа холбоо Arduino

Бүгдээрээ сайн уу, Энэхүү хоёр дахь нийтлэлд би утасгүй холболтоо аюулгүй болгохын тулд Atecc608a чипийг хэрхэн ашиглах талаар тайлбарлах болно. Үүний тулд би NRF24L01+ -ийг Wireless хэсэг болон Arduino UNO -д ашиглах болно.

ATECC608A бичил чипийг MicroChip зохион бүтээсэн бөгөөд олон хамгаалалтын хэрэгслүүдтэй. Жишээлбэл, энэ чип нь ECC түлхүүрүүд, AES түлхүүрүүд (AES 128 -ийн хувьд) болон SHA2 хэшүүдийг хадгалах боломжтой.

Нийтлэл: NRF24L01 + Arduino UNO + ATECC608A

Хоёр IoT объект хоорондын харилцааны явцад олон халдлага гарч болзошгүй: Зөөлөн хүн, мэдээллийн хуулбар гэх мэт.. Тиймээс миний санаа маш энгийн:

  1. Хоёр ба түүнээс дээш IoT объектын хооронд шифрлэгдсэн өгөгдлийг ашиглах.
  2. Бага өртөгтэй хангамж
  3. Arduino UNO -тэй ажиллах боломжтой

Миний хувьд би ашигладаг

  • Atecc608a нь миний AES түлхүүрийг хадгалах, миний өгөгдлийг шифрлэх/тайлах.
  • Arduino Uno нь микроконтроллероор ажилладаг
  • NRF24L01 миний өгөгдлийг илгээх

Энэ төслийн хувьд та дараах алхмуудыг дагаж мөрдөх ёстой.

  1. ATECC608A чипийг тохируулна уу
  2. Хэлхээ хийх (Мастер зангилаа ба боол зангилаа)
  3. Кодын хэсэг
  4. Улам цааш явах, лавшруулах !

"ATECC608A чипийг тохируулах" эхний алхамуудын хувьд би алхам бүрийг дарааллаар нь тайлбарласан өөр нийтлэл бичсэн. Холбоос энд байна:

Одоо эхэл!

Хангамж

Энэ төслийн хувьд танд хэрэгтэй болно:

  • 2 Arduino UNO эсвэл Arduino NANO эсвэл Arduino Mega
  • Зарим утас
  • 2 Atecc608a (тус бүр нь 0.60 доллараас бага үнэтэй)
  • 2 NRF24L01+
  • 2 конденсатор (10 μF)
  • Breadboards

ATECC608A -> Atecc608a чипийг хэрхэн тохируулах талаар тайлбарласан миний өгүүллийн линк.

Алхам 1: 1. Atecc608a -г тохируулна уу

1. Atecc608a -г тохируулна уу
1. Atecc608a -г тохируулна уу
1. Atecc608a -г тохируулна уу
1. Atecc608a -г тохируулна уу

Би ATECC608A -ийг тохируулах алхам бүрийг нарийвчлан тайлбарлахгүй, учир нь би үүнийг хийх алхам бүрийг тайлбарласан бүрэн нийтлэл бичсэн. Үүнийг тохируулахын тулд та энэ өгүүллийн "2. Chip -ийн тохиргоо (Atecc608a)" гэсэн 4 -р алхамыг дагах хэрэгтэй.

Холбоос нь: ATECC608A -ийг хэрхэн тохируулах талаар

Түүнчлэн, та Atecc608a, мастер ба боолын талд ижил тохиргоог хийх хэрэгтэй, эс тэгвээс та өгөгдлөө шифрлэх боломжгүй болно

Анхааруулга:

Энэхүү чипийг тохируулахын тулд та дээрх нийтлэлийн алхам бүрийг дарааллаар нь дагаж мөрдөх хэрэгтэй. Хэрэв нэг алхам дутуу эсвэл чип түгжигдээгүй бол та энэ төслийг хийх боломжгүй болно

Үлдсэн:

Үүнийг дагах алхам:

  • Тохиргооны загвар үүсгэх
  • Энэ загварыг чип дээр бичээрэй
  • Тохиргооны бүсийг түгжих
  • AES түлхүүрээ (128 бит) үүрэнд бичнэ үү
  • Өгөгдлийн бүсийг түгжих

Алхам 2: 2. Хэлхээний дизайн (Мастер ба боол)

2. Хэлхээний дизайн (Мастер ба боол)
2. Хэлхээний дизайн (Мастер ба боол)
2. Хэлхээний дизайн (Мастер ба боол)
2. Хэлхээний дизайн (Мастер ба боол)

Энэ төсөлд та мастер зангилаа ба боолын зангилаатай болно.

Мастер зангилаа нь боолын зангилаанаас илгээсэн өгөгдлийг тодорхой хэвлэх болно. Энэ нь X тутамд боолын зангилаанаас өгөгдөл хүсэх болно.

Боолын зангилаа нь "сүлжээ" -ийг сонсох бөгөөд "Мэдээлэл хүсэх" хүлээн авахдаа үүнийг үүсгэж, шифрлэж, мастер зангилаа руу илгээх болно.

Хоёр талын хувьд хэлхээний эзэн ба боол нь ижил байна.

  • Нэг ардуино нано
  • Нэг ATECC608A
  • Нэг NRF24L01

Би хэлхээг энэ алхамд хавсаргасан (дээрх зургийг үзнэ үү).

ATECC608A -ийн Arduino UNO -ийн хувьд энэ бол 8 зүү юм. Би дээрх "дээд харах" -ыг нэмсэн:

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

Arduino -д зориулсан NRF24L01 -ийн хувьд:

  • 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) -> зөвхөн Мастер горимд ашиглагддаггүй Slave node -д зориулагдсан

NRF24L01 -ийн IRQ зүүг яагаад ашиглах ёстой вэ?

IRQ зүү нь маш хэрэгтэй бөгөөд энэ зүү нь NRF24L01 пакетийг хүлээн авахад (LOW) гэж хэлэх боломжийг олгодог тул бид боолтын зангилааг сэрээхийн тулд таслагчийг энэ зүү дээр хавсаргаж болно.

Алхам 3: 3. Код (Боол ба эзэн)

3. Код (Боол ба эзэн)
3. Код (Боол ба эзэн)

Боол зангилаа

Би боол зангилаанд цахилгаан хэмнэлтийг ашигладаг, учир нь энэ нь үргэлж сонсох шаардлагагүй байдаг.

Энэ нь хэрхэн ажилладаг вэ: боолын зангилаа сонсож, "Wake UP пакет" хүлээн авахыг хүлээнэ. Энэ пакетийг боолоос өгөгдөл авахын тулд Мастер зангилаагаар илгээдэг.

Миний хувьд би хоёр int массивыг ашигладаг:

// Пакетийг сэрээ

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

Хэрэв миний зангилаа пакет хүлээн авбал

  1. Энэ нь сэрээд энэ пакетийг уншаарай, хэрэв пакет нь "СЭРЭХ" бол,
  2. энэ нь өгөгдлийг бий болгодог,
  3. өгөгдлийг шифрлэх,
  4. өгөгдлийг мастер руу илгээх, ACK пакет хүлээх,
  5. унтах

AES шифрлэлтийн хувьд би 9 -р үүрэнд түлхүүр ашигладаг.

Энэ бол Боол зангилааны миний код юм

#"Arduino.h" оруулах #"avr/sleep.h" #include "avr/wdt.h"

#"SPI.h" -ийг оруулна уу

#"nRF24L01.h" -ийг оруулах " #RF24.h" -ийг оруулах

#"Wire.h" -ийг оруулна уу

// ATECC608A номын сан

#"ATECCX08A_Arduino/cryptoauthlib.h" #оруулах "AES BASIC/aes_basic.h"

#тодорхойлох ID_NODE 255

#тодорхойлох AES_KEY (uint8_t) 9

ATCAIfaceCfg cfg;

ATCA_STATUS төлөв;

RF24 радио (9, 10);

const uint64_t masteraddresse = 0x1111111111;

const uint64_t slaveaddresse = 0x1111111100;

/**

* / товч Тасалдлыг тохируулах үед гүйцэтгэсэн функц (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& өгөгдөл, 32); if (data [0] == 20 && data [1] == 02) {float temp = 17.6; хөвөх чимээ = 16.4;

uint8_t өгөгдөл [16];

uint8_t шифр өгөгдөл [16];

// Миний бүх утгыг тохируулахын тулд мөр үүсгэх

// Утга бүрийг "|" тэмдгээр тусгаарласан болно. ба "$" гэдэг нь өгөгдлийн төгсгөлийг хэлнэ // АНХААРУУЛГА: 11 -ээс бага урттай байх ёстой String tmp_str_data = String (ID_NODE) + "|" + Мөр (температур, 1) + "|" + Мөр (хум, 1) + "$"; // хэмжээ 11 Serial.println ("tmp_str_data:" + tmp_str_data);

tmp_str_data.getBytes (өгөгдөл, хэмжээ (өгөгдөл));

// Өгөгдлийг шифрлэх

ATCA_STATUS төлөв = aes_basic_encrypt (& cfg, өгөгдөл, хэмжээ (өгөгдөл), шифр өгөгдөл, AES_KEY); if (status == ATCA_SUCCESS) {long rand = random ((long) 10000, (long) 99999);

// эхний гурван тоо = ID зангилаан дээр үндэслэн UUID үүсгэнэ

String uuid = String (ID_NODE) + String (rand); // 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)); // радио сонсохоо боль.stopListening ();

bool rslt;

// Өгөгдөл илгээх rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Radio Listing эхлэх.startListening (); if (rslt) {// Төгсгөл ба унтах горим Serial.println (F ("Дууссан")); }}}}}

хүчингүй тохиргоо ()

{Serial.begin (9600);

// Номын сангийн барилга байгуулагчийг эхлүүлнэ үү

cfg.iface_type = ATCA_I2C_IFACE; // Харилцааны төрөл -> I2C горим cfg.devtype = ATECC608A; // Чипийн төрөл cfg.atcai2c.slave_address = 0XC0; // I2C addresse (анхдагч утга) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Сэрэх хугацаа (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); // Таслах таслуурыг 3 -р зүү рүү залгаарай // Хэрэв та 2 -р зүүг таслахыг хүсч байвал 1 -ээр O -г өөрчилнө үү // FALLING MODE = Pin in LOW attachInterrupt (1, wakeUpIRQ, FALLING); }

хоосон давталт ()

{ // Хэрэггүй }

Мастер зангилаа

Мастер зангилаа боол зангилаанаас мэдээлэл авахын тулд 8 секунд тутамд сэрдэг

Энэ нь хэрхэн ажилладаг вэ: Мастер зангилаа нь "WakeUP" пакетийг боол руу илгээдэг бөгөөд өгөгдөлтэй боолын хариуг хүлээсний дараа.

Миний хувьд би хоёр int массивыг ашигладаг:

// Пакетийг сэрээ

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

Хэрэв эзэн нь WakeUp пакет илгээсэний дараа боолын зангилаа ACK пакет илгээдэг бол:

  1. Мастер Сонсох горимд тохируулаад харилцаа холбоо хүлээнэ үү
  2. Хэрэв харилцаа холбоо
  3. 8 -ийн эхний байтыг задалж, 8 байтын эхний гурван байтыг хулгайлна уу, хэрэв энэ нь ID цэг юм.
  4. 16 байт шифрийг задлах
  5. Өгөгдлийг шифрлэх
  6. Өгөгдлийг цувралаар хэвлэх
  7. Унтах горим

AES шифрлэлтийн хувьд би 9 -р үүрэнд түлхүүр ашигладаг.

Энэ бол Мастер зангилааны код юм

#"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; ATCA_STATUS төлөв; RF24 радио (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP packet const int wake_packet [2] = {20, 02}; // ажиглагч нохой ISR (WDT_vect) {wdt_disable (); // watchdog -ийг идэвхгүй болгох} void sleepmode () {// ADC ADCSRA -ийг идэвхгүй болгох = 0; // янз бүрийн "дахин тохируулах" тугуудыг цэвэрлэх MCUSR = 0; // өөрчлөлтийг зөвшөөрөх, дахин тохируулахыг идэвхгүй болгох WDTCSR = bit (WDCE) | бит (WDE); // тасалдлын горим ба интервалыг тохируулах WDTCSR = bit (WDIE) | бит (WDP3) | бит (WDP0); // WDIE -ийг тохируулж, 8 секундын саатал wdt_reset (); // харуулын нохойны унтлагын горимыг дахин тохируулах (SLEEP_MODE_PWR_DOWN); noInterrupts (); // цаг хугацааны дараалал нь sleep_enable (); // MCUCR = bit (BODS) програм дээр хүрэн асаахыг идэвхгүй болгох | бит (BODSE); MCUCR = бит (BODS); тасалдах (); // sleep_cpu () -ийг гүйцэтгэх дараагийн зааврыг баталгаажуулдаг; // урьдчилан сэргийлэх зорилгоор нойрыг цуцлах sleep_disable (); } void setup () {Serial.begin (9600); // Номын сангийн бүтээгчийг эхлүүлнэ cfg.iface_type = ATCA_I2C_IFACE; // Харилцааны төрөл -> I2C горим cfg.devtype = ATECC608A; // Чипийн төрөл cfg.atcai2c.slave_address = 0XC0; // I2C addresse (анхдагч утга) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Сэрэх хугацаа (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 (боолын хаяг); radio.openReadingPipe (1, masteraddresse); } void loop () {bool rslt; // Өгөгдөл илгээх rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Радио сонсохыг эхлүүлэх.startListening (); while (radio.available ()) {uint8_t хариулт [32]; radio.read (& answer, sizeof (answer)); uint8_t node_id [3]; uint8_t шифр [16]; memcpy (node_id, хариулт, 3); memcpy (шифр, хариулт + 3, 16); if ((int) node_id == ID_NODE) {uint8_t гаралт [16]; ATCA_STATUS төлөв = aes_basic_decrypt (& cfg, шифр, 16, гаралт, AES_KEY); if (status == ATCA_SUCCESS) {Serial.println ("Шифрлэгдсэн өгөгдөл:"); for (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} өөр {Serial.println ("Wakup Packet -ийг хүлээж аваагүй"); } // Унтах горим 8 секунд унтлагын горим (); }

Хэрэв танд асуулт байвал би энд хариулах болно

Алхам 4: 4. Цааш үргэлжлүүлээрэй

Энэ жишээ нь энгийн тул та энэ төслийг сайжруулах боломжтой

Сайжруулалт:

  • AES 128 нь үндсэн бөгөөд та AES -ийн бусад алгоритмыг аюулгүй болгохын тулд AES CBC болгон ашиглаж болно.
  • Утасгүй модулийг өөрчлөх (NRF24L01 нь 23 байтын даацаар хязгаарлагддаг)

Хэрэв та сайжруулах шаардлагатай гэж үзвэл үүнийг хэлэлцүүлгийн талбар дээр тайлбарлана уу

Алхам 5: Дүгнэлт

Энэ нийтлэл танд хэрэгтэй болно гэж найдаж байна. Би текст дээрээ алдаа гаргасан бол уучлаарай, гэхдээ англи хэл бол миний үндсэн хэл биш, би бичихээсээ илүү сайн ярьдаг.

Бүгдийг уншсанд баярлалаа.

Таашаал аваарай.

Зөвлөмж болгож буй: