Mundarija:
- Ta'minotlar
- 1 -qadam: 1. Atecc608a -ni o'rnating
- 2 -qadam: 2. O'chirish sxemasi (usta va qul)
- 3 -qadam: 3. Kodeks (qul va xo'jayin)
- 4 -qadam: 4. Oldinga boring
- 5 -qadam: Xulosa
Video: Simsiz shifrlangan aloqa Arduino: 5 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:24
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:
- Ikki yoki undan ortiq IoT ob'ektlari o'rtasida shifrlangan ma'lumotlardan foydalanish.
- Arzon narxdagi materiallar
- 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:
- ATECC608A chipini o'rnating
- O'chirish (asosiy tugun va qul tugun)
- Kod qismi
- 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
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)
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)
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,
- u uyg'onadi, bu paketni o'qing, agar paket "Uyg'oning" bo'lsa,
- u ma'lumotlarni ishlab chiqaradi,
- ma'lumotlarni shifrlash,
- ma'lumotlarni masterga yuboring, ACK paketini kuting,
- 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:
- Master tinglash rejimida o'rnatiladi va aloqa kutiladi
- Agar aloqa bo'lsa
- Agar birinchi identifikator tugun bo'lsa, 8 birinchi baytni chiqarib oling, 8 baytning uchta birinchi baytini talon -taroj qiling.
- 16 baytli shifrni chiqarib oling
- Ma'lumotni shifrini oching
- Ma'lumotni ketma -ket chop eting
- 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:
Arduino, Esp8266 yoki Esp32 uchun past narxli E32 (sx1278/sx1276) qurilmali LoRa 3 km dan 8 km gacha simsiz aloqa: 15 qadam
Arduino, Esp8266 yoki Esp32 uchun past narxli E32 (sx1278/sx1276) qurilmasi bilan LoRa 3Km dan 8Kmgacha simsiz aloqa: Men LoBa qurilmasining Semtech seriyasiga asoslangan EBYTE E32 ni boshqarish uchun kutubxona yarataman, juda kuchli, sodda va arzon qurilma. Bu erda 3km versiya, bu erda 8km versiya Ular 3000 m dan 8000 m gacha masofani bosib o'tishlari mumkin va ular juda ko'p xususiyatlarga ega
Uzoq masofali, 1,8 km, Arduino-Arduino-HC-12 bilan simsiz aloqa: 6 qadam (rasmlar bilan)
Uzoq masofali, 1,8 km, Arduino-Arduino-HC-12 bilan simsiz aloqa. Bu yo'riqnomada siz Arduino bilan ochiq havoda 1,8 kmgacha uzoq masofada qanday muloqot qilishni o'rganasiz. HC-12-simsiz ketma-ket port. juda foydali, juda kuchli va ishlatish uchun qulay bo'lgan aloqa moduli. Avval siz yugurasiz
ThingSpeak, ESP32 va uzoq masofali simsiz aloqa harorati va namligi: 5 qadam
ThingSpeak, ESP32 va uzoq masofali simsiz aloqa harorati va namligi: Ushbu darsda biz harorat va namlik sensori yordamida har xil harorat va namlik ma'lumotlarini o'lchaymiz. Bundan tashqari, ThingSpeak -ga ushbu ma'lumotlarni qanday yuborishni bilib olasiz. Shunday qilib, siz uni har xil ilovalar uchun istalgan joydan tahlil qilishingiz mumkin
Arduino asosidagi loyihalar uchun NRF24L01 uzatuvchi moduli yordamida simsiz aloqa: 5 qadam (rasmlar bilan)
Arduino asosidagi loyihalar uchun NRF24L01 uzatuvchi moduli yordamida simsiz aloqa: Bu mening robotlar va mikro-kontrollerlar haqidagi ikkinchi ko'rsatma. Robotingizning tirik va kutilganidek ishlayotganini ko'rish juda hayratlanarli, va agar siz robotni yoki boshqa narsalarni simsiz va tez boshqaradigan bo'lsangiz, men uchun yanada qiziqarli bo'ladi
Kam quvvat iste'moli davrida simsiz aloqa modullarining quvvat sarfini qanday to'g'ri o'lchash mumkin?: 6 qadam
Kam quvvat iste'moli davrida simsiz aloqa modullarining quvvat sarfini qanday to'g'ri o'lchash mumkin ?: Kam quvvat iste'moli - narsalar Internetida juda muhim tushuncha. Ko'pgina IoT tugunlari batareyalar bilan quvvatlanishi kerak. Faqat simsiz modulning quvvat sarfini to'g'ri o'lchash orqali biz qancha batareya quvvatini aniq hisoblashimiz mumkin