![Bezvadu šifrēta komunikācija Arduino: 5 soļi Bezvadu šifrēta komunikācija Arduino: 5 soļi](https://i.howwhatproduce.com/images/006/image-17809-j.webp)
Satura rādītājs:
2025 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2025-01-23 14:59
![Bezvadu šifrēta komunikācija Arduino Bezvadu šifrēta komunikācija Arduino](https://i.howwhatproduce.com/images/006/image-17809-1-j.webp)
Sveiki visiem, Šajā otrajā rakstā es jums paskaidrošu, kā izmantot mikroshēmu Atecc608a, lai nodrošinātu bezvadu sakarus. Šim nolūkam es izmantošu NRF24L01+ bezvadu daļai un Arduino UNO.
Mikročipu ATECC608A ir izstrādājis MicroChip, un tam ir vairāki drošības rīki. Piemēram, šajā mikroshēmā var saglabāt ECC atslēgas, AES atslēgas (AES 128) un SHA2 hash.
Raksts: NRF24L01 + Arduino UNO + ATECC608A
Sazinoties starp diviem IoT objektiem, var būt vairāki uzbrukumi: Man Of the mild, Informācijas kopija un daudz kas cits.. Tātad mana ideja ir ļoti vienkārša:
- Šifrētu datu izmantošana starp diviem vai vairākiem IoT objektiem.
- Piegādes par zemām izmaksām
- Var strādāt ar Arduino UNO
Manā gadījumā es izmantoju
- Atecc608a, lai uzglabātu manu AES atslēgu un šifrētu/atšifrētu manus datus.
- Arduino Uno kā mikrokontrolleris
- NRF24L01, lai nosūtītu manus datus
Šim projektam ir jāveic šādas darbības:
- Iestatiet mikroshēmu ATECC608A
- Veiciet ķēdi (galvenais mezgls un vergu mezgls)
- Koda daļa
- Iet tālāk !
Pirmajiem soļiem "Iestatiet mikroshēmu ATECC608A" es uzrakstīju citu rakstu, kurā paskaidrots katrs solis. Saite ir šeit:
Tagad sāc!
Piegādes
Šim projektam jums ir nepieciešams:
- 2 Arduino UNO vai Arduino NANO vai Arduino Mega
- Kāds vads
- 2 Atecc608a (katra maksā mazāk par 0,60 USD)
- 2 NRF24L01+
- 2 kondensators (10 μF)
- Maizes dēļi
Saite uz manu rakstu, kurā paskaidrots, kā iestatīt mikroshēmu ATECC608A -> Kā iestatīt Atecc608a
1. darbība: 1. Iestatiet Atecc608a
![1. Iestatiet Atecc608a 1. Iestatiet Atecc608a](https://i.howwhatproduce.com/images/006/image-17809-2-j.webp)
![1. Iestatiet Atecc608a 1. Iestatiet Atecc608a](https://i.howwhatproduce.com/images/006/image-17809-3-j.webp)
Es neaprakstīšu katru soli, kas jāievēro, lai iestatītu ATECC608A, jo es uzrakstīju pilnu rakstu, kurā paskaidroti visi soļi, kā to izdarīt. Lai to iestatītu, jums jāievēro šī raksta 4. darbība ar nosaukumu "2. mikroshēmas konfigurācija (Atecc608a)"
Saite ir šāda: Kā iestatīt ATECC608A
Tāpat jums ir jāievada tāda pati konfigurācija Atecc608a, galvenajai un palīgpusei, pretējā gadījumā jūs nevarēsit atšifrēt savus datus
Brīdinājums:
Lai iestatītu šo mikroshēmu, jums ir jāveic visas iepriekšējā raksta darbības secībā. Ja trūkst viena soļa vai mikroshēma nav bloķēta, jūs nevarētu veikt šo projektu
Atlikums:
Lai to izdarītu, veiciet tālāk norādītās darbības
- Izveidojiet konfigurācijas veidni
- Uzrakstiet šo veidni mikroshēmā
- Bloķējiet konfigurācijas zonu
- Ierakstiet AES atslēgu (128 biti) slotā
- Datu zonas bloķēšana
2. solis: 2. Ķēdes dizains (meistars un vergs)
![2. Ķēdes dizains (meistars un vergs) 2. Ķēdes dizains (meistars un vergs)](https://i.howwhatproduce.com/images/006/image-17809-4-j.webp)
![2. Ķēdes dizains (meistars un vergs) 2. Ķēdes dizains (meistars un vergs)](https://i.howwhatproduce.com/images/006/image-17809-5-j.webp)
Šajā projektā jums būs galvenais mezgls un vergu mezgls.
Galvenais mezgls skaidri izdrukās vergu mezgla nosūtītos datus. Tā pieprasīs datus no vergu mezgla katru X reizi.
Vergu mezgls uzklausīs "tīklu" un, saņemot "pieprasījuma datus", to ģenerēs, šifrēs un nosūtīs uz galveno mezglu.
Abās pusēs ķēde un meistars ir vienādi:
- Viens arduino Nano
- Viens ATECC608A
- Viens NRF24L01
Es pievienoju shēmu šim solim (sk. Attēlu iepriekš).
Attiecībā uz ATECC608A uz Arduino UNO tas ir 8 pin kontakts. Iepriekš pievienoju "skatu no augšas":
- ARDUINO 3.3V -> PIN 8 (Atecc608a)
- ARDUINO GND -> PIN 4 (Atecc608a)
- ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
- ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)
Attiecībā uz NRF24L01 uz 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) -> tikai vergu mezglam, netiek izmantots galvenajā režīmā
Kāpēc izmantot NRF24L01 IRQ tapu?
IRQ tapa ir ļoti noderīga, šī tapa ļauj pateikt (LOW), kad NRF24L01 saņem paketi, tāpēc mēs varam piespraust šo tapu, lai pamodinātu vergu mezglu.
3. solis: 3. kods (vergs un meistars)
![3. kodekss (vergs un meistars) 3. kodekss (vergs un meistars)](https://i.howwhatproduce.com/images/006/image-17809-6-j.webp)
Vergu mezgls
Es izmantoju enerģijas taupīšanu vergu mezglam, jo tam nav nepieciešams visu laiku klausīties.
Kā tas darbojas: vergu mezgls klausās un gaida, kad saņems modināšanas paketi. Šo paketi nosūta galvenais mezgls, lai lūgtu datus no verga.
Manā gadījumā es izmantoju divu masīvu:
// Wake UP pakete
const int wake_packet [2] = {20, 02};
Ja mans mezgls saņem paketi,
- tas pamostas, izlasiet šo paketi, ja pakete ir "Wake UP",
- tas ģenerē datus,
- šifrēt datus,
- nosūtiet datus galvenajam, pagaidiet ACK paketi,
- Gulēt.
AES šifrēšanai es izmantoju atslēgu slota numurā 9.
Šis ir mans Slave mezgla kods
#iekļaut "Arduino.h" #iekļaut "avr/sleep.h" #iekļaut "avr/wdt.h"
#ietver "SPI.h"
#include "nRF24L01.h" #include "RF24.h"
#ietver "Wire.h"
// ATECC608A bibliotēka
#include "ATECCX08A_Arduino/cryptoauthlib.h" #include "AES BASIC/aes_basic.h"
#definēt ID_NODE 255
#define AES_KEY (uint8_t) 9
ATCAIfaceCfg cfg;
ATCA_STATUS statuss;
Radio RF24 (9, 10);
const uint64_t masteraddresse = 0x1111111111;
const uint64_t slaveaddresse = 0x1111111100;
/**
* / īss Funkcija tiek izpildīta, ja ir iestatīts pārtraukums (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& dati, 32); ja (dati [0] == 20 && dati [1] == 02) {pludiņa temp = 17,6; pludiņš hum = 16,4;
uint8_t dati [16];
uint8_t cypherdata [16];
// Izveidojiet virkni, lai iestatītu visu manu vērtību
// Katra vērtība ir atdalīta ar "|" un "$" nozīmē datu beigas // BRĪDINĀJUMS. Jābūt mazākam par 11 garuma virknēm tmp_str_data = String (ID_NODE) + "|" + Virkne (temp, 1) + "|" + Stīga (hum, 1) + "$"; // izmērs 11 Serial.println ("tmp_str_data:" + tmp_str_data);
tmp_str_data.getBytes (dati, lielums (dati));
// Šifrēt datus
ATCA_STATUS statuss = aes_basic_encrypt (& cfg, data, sizeof (data), cypherdata, AES_KEY); ja (statuss == ATCA_SUCCESS) {long rand = random ((long) 10000, (long) 99999);
// ģenerēt UUID, pamatojoties uz trim pirmajiem skaitļiem = ID mezgliem
String uuid = String (ID_NODE) + String (rand); // Izmērs 8
uint8_t tmp_uuid [8];
uint8_t dati_sūtīt [32];
uuid.getBytes (tmp_uuid, sizeof (tmp_uuid) + 1);
memcpy (dati_sūtīt, tmp_uuid, sizeof (tmp_uuid));
memcpy (data_to_send + sizeof (tmp_uuid), cypherdata, sizeof (cypherdata)); // Beidz klausīties radio.stopListening ();
bool rslt;
// Sūtīt datus rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Sākt klausīties radio.startListening (); if (rslt) {// Beigu un miega režīms Serial.println (F ("Gatavs")); }}}}}
anulēts iestatījums ()
{Sērijas sākums (9600);
// Iniciatē bibliotēkas padomdevēju
cfg.iface_type = ATCA_I2C_IFACE; // Komunikācijas veids -> I2C režīms cfg.devtype = ATECC608A; // Mikroshēmas veids cfg.atcai2c.slave_address = 0XC0; // I2C adrese (noklusējuma vērtība) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Modināšanas aizkavēšanās (1500 ms) cfg.rx_retries = 20;
radio.begin ();
radio.setDataRate (RF24_250KBPS); radio.maskaIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5);
radio.openWritingPipe (masteraddresse);
radio.openReadingPipe (1, slaveaddresse); // Piestipriniet pārtraukumu pie tapas 3 // Modificējiet 1 ar O, ja vēlaties pārtraukt tapu 2 // FALLING MODE = Pin pie LOW attachInterrupt (1, wakeUpIRQ, FALLING); }
tukša cilpa ()
{ // Nav vajadzības }
Galvenais mezgls
Galvenais mezgls pamostas ik pēc 8 sekundēm, lai lūgtu datus no vergu mezgla
Kā tas darbojas: galvenais mezgls nosūta vergam paketi "WakeUP" un pēc gaidīšanas verga atbildi ar datiem.
Manā gadījumā es izmantoju divu masīvu:
// Wake UP pakete
const int wake_packet [2] = {20, 02};
Ja vergu mezgls nosūta ACK paketi pēc tam, kad galvenais ir nosūtījis WakeUp paketi:
- Galvenais iestatiet klausīšanās režīmā un gaidiet saziņu
- Ja komunikācija
- Izvelciet 8 pirmo baitu, izlaupiet trīs pirmos baitus no 8 baitiem, ja tas ir ID mezgls
- Izvelciet 16 baitu šifra
- Atšifrējiet datus
- Drukājiet datus sērijveidā
- Miega režīms
AES šifrēšanai es izmantoju atslēgu slota numurā 9.
Šis ir mans galvenā mezgla kods
#ietver "Arduino.h"
#include "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A bibliotēka #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 statuss; Radio RF24 (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP packet const int wake_packet [2] = {20, 02}; // sargsuņa pārtraukšanas ISR (WDT_vect) {wdt_disable (); // disable watchdog} void sleepmode () {// atspējot ADC ADCSRA = 0; // notīrīt dažādus "atiestatīšanas" karodziņus MCUSR = 0; // atļaut izmaiņas, atspējot atiestatīšanu WDTCSR = bit (WDCE) | bits (WDE); // iestatīt pārtraukuma režīmu un intervālu WDTCSR = bits (WDIE) | bits (WDP3) | bits (WDP0); // iestatīt WDIE, un 8 sekundes aizkavēt wdt_reset (); // atiestatīt sargsuņa set_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // laika secība seko sleep_enable (); // programmatūrā izslēgt brūnās izslēgšanas iespējošanu MCUCR = bit (BODS) | bits (BODSE); MCUCR = bits (BODS); pārtrauc (); // garantē nākamo norādījumu izpildi sleep_cpu (); // atcelt miegu kā piesardzību sleep_disable (); } void setup () {Serial.begin (9600); // Uzsāciet bibliotēkas izstrādātāju cfg.iface_type = ATCA_I2C_IFACE; // Komunikācijas veids -> I2C režīms cfg.devtype = ATECC608A; // Mikroshēmas veids cfg.atcai2c.slave_address = 0XC0; // I2C adrese (noklusējuma vērtība) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Modināšanas aizkavēšanās (1500 ms) cfg.rx_retries = 20; radio.begin (); radio.setDataRate (RF24_250KBPS); radio.maskaIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5); radio.openWritingPipe (slaveaddresse); radio.openReadingPipe (1, masteraddresse); } void loop () {bool rslt; // Sūtīt datus rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Sāk klausīties radio.startListening (); while (radio.available ()) {uint8_t atbilde [32]; radio.read (& atbilde, sizeof (atbilde)); uint8_t node_id [3]; uint8_t cipars [16]; memcpy (mezgla ID, atbilde, 3); memcpy (cipars, atbilde + 3, 16); if ((int) node_id == ID_NODE) {uint8_t output [16]; ATCA_STATUS statuss = aes_basic_decrypt (& cfg, cypher, 16, output, AES_KEY); if (statuss == ATCA_SUCCESS) {Serial.println ("Atšifrēti dati:"); par (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} else {Serial.println ("Ack not get for Wakup Packet"); } // Miega režīms 8 sekunžu miega režīms (); }
Ja jums ir jautājums, es esmu šeit, lai atbildētu
4. solis: 4. Iet tālāk
Šis piemērs ir vienkāršs, lai jūs varētu uzlabot šo projektu
Uzlabojumi:
- AES 128 ir pamata, un jūs varat izmantot citu AES algoritmu kā AES CBC, lai būtu drošāk.
- Nomainiet bezvadu moduli (NRF24L01 ir ierobežota ar 23 baitu lietderīgo slodzi)
- …
Ja redzat uzlabojumus, paskaidrojiet tos diskusiju jomā
5. darbība. Secinājums
Es ceru, ka šis raksts jums būs noderīgs. Atvainojiet, ja kļūdījos tekstā, bet angļu valoda nav mana galvenā valoda, un es runāju labāk nekā rakstu.
Paldies, ka izlasījāt visu.
Izbaudi to.
Ieteicams:
Bezvadu Arduino robots, izmantojot bezvadu moduli HC12: 7 soļi
![Bezvadu Arduino robots, izmantojot bezvadu moduli HC12: 7 soļi Bezvadu Arduino robots, izmantojot bezvadu moduli HC12: 7 soļi](https://i.howwhatproduce.com/images/011/image-32306-j.webp)
Bezvadu Arduino robots, izmantojot HC12 bezvadu moduli: Sveiki, puiši, laipni lūdzam atpakaļ. Iepriekšējā ziņojumā es paskaidroju, kas ir H tilta ķēde, L293D motora vadītāja IC, cūciņa L293D motora vadītāja IC, lai vadītu lielas strāvas motoru vadītājus, un kā jūs varat izveidot un izveidot savu L293D motora draivera paneli
Bezvadu seriālā komunikācija, izmantojot Bluefruit: 4 soļi
![Bezvadu seriālā komunikācija, izmantojot Bluefruit: 4 soļi Bezvadu seriālā komunikācija, izmantojot Bluefruit: 4 soļi](https://i.howwhatproduce.com/images/003/image-7327-12-j.webp)
Bezvadu seriālā komunikācija, izmantojot Bluefruit: Šeit ir vienkāršs soli pa solim, lai nomainītu vadus ar Bluetooth zema enerģijas patēriņa savienojumu: man vajadzēja kādu laiku, lai to noskaidrotu, jo gandrīz nav dokumentācijas par to, kā to izdarīt ar modernām Bluetooth zema enerģijas patēriņa tehnoloģijām. kā Bluefrui
Piecdesmit metru diapazona bezvadu piekļuves punkts ar TP Link WN7200ND USB bezvadu adapteri Raspbian Stretch: 6 soļi
![Piecdesmit metru diapazona bezvadu piekļuves punkts ar TP Link WN7200ND USB bezvadu adapteri Raspbian Stretch: 6 soļi Piecdesmit metru diapazona bezvadu piekļuves punkts ar TP Link WN7200ND USB bezvadu adapteri Raspbian Stretch: 6 soļi](https://i.howwhatproduce.com/images/002/image-3141-80-j.webp)
Piecdesmit metru diapazona bezvadu piekļuves punkts ar TP Link WN7200ND USB bezvadu adapteri Raspbian Stretch: Raspberry Pi ir lieliski piemērots, lai izveidotu drošus bezvadu piekļuves punktus, taču tam nav laba diapazona, es to izmantoju, izmantojot TP Link WN7200ND USB bezvadu adapteri. Kāpēc es vēlos maršrutētāja vietā izmantot aveņu pi? T
DIY bezvadu mikrofons uz bezvadu ģitāras sistēmu: 4 soļi
![DIY bezvadu mikrofons uz bezvadu ģitāras sistēmu: 4 soļi DIY bezvadu mikrofons uz bezvadu ģitāras sistēmu: 4 soļi](https://i.howwhatproduce.com/preview/how-and-what-to-produce/10965369-diy-wireless-mic-to-wireless-guitar-system-4-steps-j.webp)
DIY bezvadu mikrofons uz bezvadu ģitāras sistēmu: esmu skatījies dažus video un dažas grupas, un gandrīz no tām ģitārā tiek izmantota bezvadu sistēma. Eju traks, kustos, staigāju un daru visu, ko vēlas, bez auklas, tāpēc es sapņoju, ka man tāds būs .. Bet .. man tas tagad ir pārāk dārgi, tāpēc es nonācu pie šī
Uzlauzt bezvadu durvju zvanu bezvadu trauksmes slēdzī vai ieslēgšanas/izslēgšanas slēdzī: 4 soļi
![Uzlauzt bezvadu durvju zvanu bezvadu trauksmes slēdzī vai ieslēgšanas/izslēgšanas slēdzī: 4 soļi Uzlauzt bezvadu durvju zvanu bezvadu trauksmes slēdzī vai ieslēgšanas/izslēgšanas slēdzī: 4 soļi](https://i.howwhatproduce.com/preview/how-and-what-to-produce/11133018-hack-a-wireless-doorbell-into-a-wireless-alarm-switch-or-onoff-switch-4-steps-j.webp)
Uzlauzt bezvadu durvju zvanu bezvadu trauksmes slēdzī vai ieslēgšanas/izslēgšanas slēdzī: es nesen izveidoju signalizācijas sistēmu un uzstādīju to savā mājā. Es izmantoju magnētiskos slēdžus uz durvīm un vadu tos caur bēniņiem. Logi bija cits stāsts, un cieta elektroinstalācija nebija risinājums. Man vajadzēja bezvadu risinājumu, un tas ir