Агуулгын хүснэгт:
- Хангамж
- Алхам 1: 1. Atecc608a -г тохируулна уу
- Алхам 2: 2. Хэлхээний дизайн (Мастер ба боол)
- Алхам 3: 3. Код (Боол ба эзэн)
- Алхам 4: 4. Цааш үргэлжлүүлээрэй
- Алхам 5: Дүгнэлт
Видео: Утасгүй шифрлэгдсэн харилцаа холбоо Arduino: 5 алхам
2024 Зохиолч: John Day | [email protected]. Хамгийн сүүлд өөрчлөгдсөн: 2024-01-30 11:01
Бүгдээрээ сайн уу, Энэхүү хоёр дахь нийтлэлд би утасгүй холболтоо аюулгүй болгохын тулд Atecc608a чипийг хэрхэн ашиглах талаар тайлбарлах болно. Үүний тулд би NRF24L01+ -ийг Wireless хэсэг болон Arduino UNO -д ашиглах болно.
ATECC608A бичил чипийг MicroChip зохион бүтээсэн бөгөөд олон хамгаалалтын хэрэгслүүдтэй. Жишээлбэл, энэ чип нь ECC түлхүүрүүд, AES түлхүүрүүд (AES 128 -ийн хувьд) болон SHA2 хэшүүдийг хадгалах боломжтой.
Нийтлэл: NRF24L01 + Arduino UNO + ATECC608A
Хоёр IoT объект хоорондын харилцааны явцад олон халдлага гарч болзошгүй: Зөөлөн хүн, мэдээллийн хуулбар гэх мэт.. Тиймээс миний санаа маш энгийн:
- Хоёр ба түүнээс дээш IoT объектын хооронд шифрлэгдсэн өгөгдлийг ашиглах.
- Бага өртөгтэй хангамж
- Arduino UNO -тэй ажиллах боломжтой
Миний хувьд би ашигладаг
- Atecc608a нь миний AES түлхүүрийг хадгалах, миний өгөгдлийг шифрлэх/тайлах.
- Arduino Uno нь микроконтроллероор ажилладаг
- NRF24L01 миний өгөгдлийг илгээх
Энэ төслийн хувьд та дараах алхмуудыг дагаж мөрдөх ёстой.
- ATECC608A чипийг тохируулна уу
- Хэлхээ хийх (Мастер зангилаа ба боол зангилаа)
- Кодын хэсэг
- Улам цааш явах, лавшруулах !
"ATECC608A чипийг тохируулах" эхний алхамуудын хувьд би алхам бүрийг дарааллаар нь тайлбарласан өөр нийтлэл бичсэн. Холбоос энд байна:
Одоо эхэл!
Хангамж
Энэ төслийн хувьд танд хэрэгтэй болно:
- 2 Arduino UNO эсвэл Arduino NANO эсвэл Arduino Mega
- Зарим утас
- 2 Atecc608a (тус бүр нь 0.60 доллараас бага үнэтэй)
- 2 NRF24L01+
- 2 конденсатор (10 μF)
- Breadboards
ATECC608A -> Atecc608a чипийг хэрхэн тохируулах талаар тайлбарласан миний өгүүллийн линк.
Алхам 1: 1. Atecc608a -г тохируулна уу
Би ATECC608A -ийг тохируулах алхам бүрийг нарийвчлан тайлбарлахгүй, учир нь би үүнийг хийх алхам бүрийг тайлбарласан бүрэн нийтлэл бичсэн. Үүнийг тохируулахын тулд та энэ өгүүллийн "2. Chip -ийн тохиргоо (Atecc608a)" гэсэн 4 -р алхамыг дагах хэрэгтэй.
Холбоос нь: ATECC608A -ийг хэрхэн тохируулах талаар
Түүнчлэн, та Atecc608a, мастер ба боолын талд ижил тохиргоог хийх хэрэгтэй, эс тэгвээс та өгөгдлөө шифрлэх боломжгүй болно
Анхааруулга:
Энэхүү чипийг тохируулахын тулд та дээрх нийтлэлийн алхам бүрийг дарааллаар нь дагаж мөрдөх хэрэгтэй. Хэрэв нэг алхам дутуу эсвэл чип түгжигдээгүй бол та энэ төслийг хийх боломжгүй болно
Үлдсэн:
Үүнийг дагах алхам:
- Тохиргооны загвар үүсгэх
- Энэ загварыг чип дээр бичээрэй
- Тохиргооны бүсийг түгжих
- AES түлхүүрээ (128 бит) үүрэнд бичнэ үү
- Өгөгдлийн бүсийг түгжих
Алхам 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. Код (Боол ба эзэн)
Боол зангилаа
Би боол зангилаанд цахилгаан хэмнэлтийг ашигладаг, учир нь энэ нь үргэлж сонсох шаардлагагүй байдаг.
Энэ нь хэрхэн ажилладаг вэ: боолын зангилаа сонсож, "Wake UP пакет" хүлээн авахыг хүлээнэ. Энэ пакетийг боолоос өгөгдөл авахын тулд Мастер зангилаагаар илгээдэг.
Миний хувьд би хоёр int массивыг ашигладаг:
// Пакетийг сэрээ
const int wake_packet [2] = {20, 02};
Хэрэв миний зангилаа пакет хүлээн авбал
- Энэ нь сэрээд энэ пакетийг уншаарай, хэрэв пакет нь "СЭРЭХ" бол,
- энэ нь өгөгдлийг бий болгодог,
- өгөгдлийг шифрлэх,
- өгөгдлийг мастер руу илгээх, ACK пакет хүлээх,
- унтах
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 пакет илгээдэг бол:
- Мастер Сонсох горимд тохируулаад харилцаа холбоо хүлээнэ үү
- Хэрэв харилцаа холбоо
- 8 -ийн эхний байтыг задалж, 8 байтын эхний гурван байтыг хулгайлна уу, хэрэв энэ нь ID цэг юм.
- 16 байт шифрийг задлах
- Өгөгдлийг шифрлэх
- Өгөгдлийг цувралаар хэвлэх
- Унтах горим
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: Дүгнэлт
Энэ нийтлэл танд хэрэгтэй болно гэж найдаж байна. Би текст дээрээ алдаа гаргасан бол уучлаарай, гэхдээ англи хэл бол миний үндсэн хэл биш, би бичихээсээ илүү сайн ярьдаг.
Бүгдийг уншсанд баярлалаа.
Таашаал аваарай.
Зөвлөмж болгож буй:
EasyTalk: Хялбар харилцаа холбоо, хажууд байгаа хуанли: 6 алхам
EasyTalk: Хялбар харилцаа холбоо ба хуанли Таны хажууд: Намайг Коби Марчал гэдэг, би Бельги улсын Howest хотод сурдаг, би мультимедиа, харилцаа холбооны технологийн (MCT) оюутан. Эхний жилийнхээ эцсийн даалгаврыг биелүүлэхийн тулд би IoT-төхөөрөмж хийх ёстой байсан. Гэртээ манай ах ийм асуудалтай тулгардаг
ESP -ээс ESP -ийн харилцаа холбоо: 4 алхам
ESP to ESP Communication -аас ESP: Энэхүү заавар нь утасгүй холболтыг багтаасан бусад төслийн бусад дамжуулагч модулиудыг солиход туслах болно. Бид ESP8266 дээр суурилсан самбарыг ашиглах болно, нэг нь WiFi -STA горимд, нөгөө нь WiFi -AP горимд, NodeMCU V3 бол энэ төслийн хувьд миний сонголт
Python3 ба Arduino харилцаа холбоо: 5 алхам
Python3 ба Arduino Харилцаа холбоо: Төслийн тайлбар Энэ төсөлд бид Python3 -аас Arduino самбар руу тушаалуудыг илгээх бөгөөд энэ нь Python3 болон Arduino хооронд харилцах үед ойлгоход хялбар болгоно. Бид " Сайн уу ертөнц " Arduino платформын
MKR1000 IoT клиент/серверийн харилцаа холбоо: 4 алхам
MKR1000 IoT Client/server харилцаа холбоо: Энэхүү төсөл нь Arduino/Genuino MKR1000 гэсэн хоёр төхөөрөмжийг сервер ба үйлчлүүлэгч болгон хэрхэн тохируулах талаар тайлбарласан болно. MKR1000 клиент нь таны дотоод wifi -д холбогдох бөгөөд үйлчлүүлэгчтэй биечлэн холбогдсон хоёр оролтыг сонсох болно. нэг нь товчлуураас, нөгөө нь чичиргээнээс
Харилцаа холбоо LoRa ESP8266 ба радио RFM95: 9 алхам
Харилцаа холбоо LoRa ESP8266 ба радио RFM95: Алсын зайн харилцаа холбоо, хүч багатай хэрэглээ багатай LoRa "Lo ng - Ra nge" гэсэн зүйлсийн интернэтэд ашиглах хамгийн нэрд гарсан технологийн нэг юм. модуляцийн төрөл