Мазмуну:
- Жабдуулар
- 1 -кадам: 1. Atecc608a орнотуңуз
- 2 -кадам: 2. Райондун дизайны (Мастер жана Кул)
- 3 -кадам: 3. Кодекс (Кул жана кожоюн)
- 4 -кадам: 4. Андан ары
- 5 -кадам: Жыйынтык
Video: Зымсыз шифрленген байланыш Arduino: 5 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:39
Баарыңарга салам, Бул экинчи макалада мен сизге зымсыз байланышты коргоо үчүн Atecc608a чипин кантип колдонууну түшүндүрөм. Бул үчүн мен Wireless бөлүгү жана Arduino UNO үчүн NRF24L01+ колдоном.
ATECC608A микро чипи MicroChip тарабынан иштелип чыккан жана бир нече коопсуздук куралдарына ээ. Мисалы, бул чип ECC ачкычтарын, AES ачкычтарын (AES 128 үчүн) жана SHA2 Hash сактай алат.
Макала: NRF24L01 + Arduino UNO + ATECC608A
Эки IoT объектинин ортосунда байланыш учурунда, бир нече чабуулдар болушу мүмкүн: жумшак адам, маалыматтын көчүрмөсү жана башкалар.. Ошентип, менин оюм абдан жөнөкөй:
- Эки же андан көп IoT объектинин ортосунда шифрленген маалыматтарды колдонуу.
- Төмөн наркы менен камсыздоо
- Arduino UNO менен иштей алат
Менин учурда, мен колдоном
- Atecc608a менин AES ачкычымды сактоого жана менин маалыматымды шифрлөөгө/чечмелөөгө.
- Arduino Uno микроконтроллер катары
- NRF24L01 менин маалыматтарды жөнөтүү үчүн
Бул долбоор үчүн бул кадамдарды аткарышыңыз керек:
- ATECC608A чипин орнотуңуз
- Районду жасаңыз (Master Node жана Slave Node)
- Код бөлүгү
- Мындан ары!
"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. Чиптин конфигурациясы (Atecc608a)" деп аталган макаланын "4 -кадамын" аткарышыңыз керек.
Шилтеме: ATECC608A кантип орнотулат
Ошондой эле, сиз Atecc608a, мастер жагы жана кул тарабы үчүн бирдей конфигурацияны коюшуңуз керек, антпесе маалыматыңыздын шифрин чече албайсыз
Эскертүү:
Бул чипти орнотуу үчүн, жогорудагы макаланын бардык кадамдарын ирети менен аткарышыңыз керек. Эгерде бир кадам жок болсо же чип кулпуланбаса, анда сиз бул долбоорду жасай албайсыз
Калган:
Бул үчүн ээрчүү кадамы:
- Конфигурация шаблонун түзүңүз
- Бул шаблонду чипке жазыңыз
- Конфигурация зонасын кулпулаңыз
- AES ачкычыңызды (128 бит) оюкчага жазыңыз
- Маалымат зонасын кулпулоо
2 -кадам: 2. Райондун дизайны (Мастер жана Кул)
Бул долбоордо сизде Master Node жана Slave Node болот.
Негизги түйүн кул түйүнү жөнөткөн маалыматтарды ачык түрдө басып чыгарат. Ал кул түйүнүнөн ар бир 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) -> кулдук түйүн үчүн гана, Master режиминде колдонулбайт
Эмне үчүн NRF24L01дин IRQ пинин колдонушат
IRQ пини абдан пайдалуу, бул пин NRF24L01 тарабынан пакетти алганда (LOW) деп айтууга мүмкүндүк берет, андыктан кул түйүнүн ойготуу үчүн бул пинге Interrupt тиркеп койсок болот.
3 -кадам: 3. Кодекс (Кул жана кожоюн)
Кул түйүнү
Мен кул түйүнү үчүн үнөмдөөнү колдоном, анткени ал ар дайым угуунун кажети жок.
Бул кантип иштейт: кул түйүнү угуп, "Wake UP пакетин" алууну күтөт. Бул пакет Мастер түйүнү тарабынан кулдан маалыматтарды сурап жөнөтүлөт.
Менин учурда, мен эки int массивин колдоном:
// Ойготуу пакети
const int wake_packet [2] = {20, 02};
Эгерде түйүнүм пакет алса,
- ал ойгонот, бул пакетти окуңуз, эгерде пакет "Wake UP" болсо,
- ал маалыматтарды жаратат,
- маалыматтарды шифрлөө,
- маалыматтарды кожоюнга жөнөтүү, ACK пакетин күтүү,
- уктоо
AES шифрлөө үчүн мен 9 -уячанын ачкычын колдоном.
Бул Slave түйүнүнүн коду
#кошуу "Arduino.h" #include "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" кошуу
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 (& data, 32); if (data [0] == 20 && data [1] == 02) {float temp = 17.6; float hum = 16,4;
uint8_t маалыматтары [16];
uint8_t cypherdata [16];
// Баардык баалуулуктарымды орнотуу үчүн Стринг куруңуз
// Ар бир маани "|" менен бөлүнөт жана "$" маалыматтын бүтүшүн билдирет // ЭСКЕРТҮҮ: Узундугу 11ден аз болушу керек String tmp_str_data = String (ID_NODE) + "|" + Сап (темп, 1) + "|" + String (hum, 1) + "$"; // көлөмү 11 Serial.println ("tmp_str_data:" + tmp_str_data);
tmp_str_data.getBytes (маалыматтар, өлчөмдөр (маалыматтар));
// Дайындарды шифрлөө
ATCA_STATUS status = aes_basic_encrypt (& cfg, маалыматтар, sizeof (data), cypherdata, AES_KEY); if (status == ATCA_SUCCESS) {long rand = random ((long) 10000, (long) 99999);
// үч биринчи санга негизделген UUID түзүү = ID түйүнү
String uuid = String (ID_NODE) + Сап (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)); // Radio.stopListening () угууну токтотуу;
bool rslt;
// Маалыматтарды жөнөтүү rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Радио угууну баштаңыз.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 дареги (демейки маани) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Ойгонуунун кечигүүсү (1500 мс) 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ди О менен өзгөртүңүз // FALLING MODE = Pin LOW attachInterrupt (1, wakeUpIRQ, FALLING); }
боштук цикл ()
{ // Кереги жок }
Master Node
Мастер түйүнү кул түйүндөн маалыматтарды сурап алуу үчүн ар бир 8 секундда ойгонот
Бул кантип иштейт: Мастер түйүнү кулга "WakeUP" пакетин жөнөтөт жана күтүлгөндөн кийин кулдун маалыматы менен жооп берет.
Менин учурда, мен эки int массивин колдоном:
// Ойготуу пакети
const int wake_packet [2] = {20, 02};
Эгерде кожоюн WakeUp пакетин жөнөткөндөн кийин, кул түйүнү ACK пакетин жөнөтсө:
- Мастер угуу режиминде орнотулган жана байланыш күтүлөт
- Эгерде байланыш
- Биринчи байт 8ди чыгарыңыз, 8 байттын үч биринчи байтын талаңыз, эгер бул ID түйүнү болсо
- 16 байт шифрди бөлүп алыңыз
- Маалыматтарды чечмелөө
- Маалыматтарды сериялык түрдө басып чыгаруу
- Уйку режими
AES шифрлөө үчүн мен 9 -уячанын ачкычын колдоном.
Бул Master түйүнү үчүн менин кодум
#"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 пакети const int wake_packet [2] = {20, 02}; // күзөтчүнүн үзгүлтүгү ISR (WDT_vect) {wdt_disable (); // watchdog өчүрүү} void sleepmode () {// ADC ADCSRA = 0 өчүрүү; // ар кандай "баштапкы абалга келтирүү" желектерин тазалоо MCUSR = 0; // өзгөртүүлөргө уруксат берүү, өчүрүүнү өчүрүү WDTCSR = бит (WDCE) | бит (WDE); // үзгүлтүк режимин жана интервалды коюңуз WDTCSR = бит (WDIE) | бит (WDP3) | бит (WDP0); // WDIE орнотуу жана 8 секундага кечиктирүү wdt_reset (); // күзөтчүнүн set_sleep_mode (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 дареги (демейки маани) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Ойгонуунун кечигүүсү (1500 мс) cfg.rx_retries = 20; radio.begin (); radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5); radio.openWritingPipe (slaveaddresse); radio.openReadingPipe (1, masteraddresse); } void loop () {bool rslt; // Маалыматтарды жөнөтүү rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Укканды башта radio.startListening (); while (radio.available ()) {uint8_t answer [32]; radio.read (& answer, sizeof (answer)); uint8_t node_id [3]; uint8_t cypher [16]; memcpy (node_id, жооп, 3); memcpy (шифр, жооп + 3, 16); if ((int) node_id == ID_NODE) {uint8_t output [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) чыгаруу ); }}}}} else {Serial.println ("Aak not Wakup Packet"); } // Уйку режими 8 секунда уйку режими (); }
Эгер суроолоруңуз болсо, мен жооп берүү үчүн бул жердемин
4 -кадам: 4. Андан ары
Бул мисал жөнөкөй, андыктан сиз бул долбоорду жакшырта аласыз
Жакшыртуулар:
- AES 128 негизги жана сиз коопсуз болуу үчүн AESтин башка алгоритмин AES CBC катары колдоно аласыз.
- Зымсыз модулду өзгөртүү (NRF24L01 23 байт жүктөө менен чектелген)
- …
Эгерде сиз жакшыртууну көрүп жатсаңыз, аны талкуу талаасында түшүндүрүңүз
5 -кадам: Жыйынтык
Бул макала сиз үчүн пайдалуу болот деп ишенем. Кечиресиз, эгер мен текстте ката кетирсем, бирок англис тили менин негизги тилим эмес жана мен жазгандан жакшыраак сүйлөйм.
Баарын окуу үчүн рахмат.
Ырахаттан.
Сунушталууда:
SmartHome Зымсыз Байланыш: MQTTдин Экстремалдык Негиздери: 3 кадам
SmartHome Зымсыз Байланыш: MQTTдин Экстремалдык Негиздери: MQTT Негиздери: ** Мен үйдү автоматташтыруу сериясын жасайм, келечекте кылган нерселеримдин бардыгын үйрөнүү үчүн жасаган кадамдарымдан өтөм. Бул Instructable менин келечектеги Instructables колдонууга MQTT кантип орнотуу боюнча базалык болуп саналат. Кантип
Arduino негизделген долбоорлор үчүн NRF24L01 Transceiver модулун колдонуу менен зымсыз байланыш: 5 кадам (Сүрөттөр менен)
Arduino негизиндеги долбоорлор үчүн NRF24L01 Transceiver модулун колдонуу менен зымсыз байланыш: Бул роботтор жана микро контроллерлер жөнүндө менин экинчи үйрөткүч окуу куралым. Роботуңуздун тирүү жана күтүлгөндөй иштеп жатканын көрүү чынында эле таң калыштуу, эгерде сиз роботту же башка нерселерди зымсыз тез жана көзөмөлдөп турсаңыз, анда мен үчүн кызыктуу болот деп ишенем
Төмөн энергия керектөө доорунда зымсыз байланыш модулдарынын энергия керектөөсүн кантип туура өлчөө керек?: 6 кадам
Төмөн энергия керектөө доорунда зымсыз байланыш модулдарынын энергия керектөөсүн кантип туура өлчөө керек ?: Аз энергия керектөө нерселердин Интернетинде өтө маанилүү түшүнүк. Көпчүлүк IoT түйүндөрү батарейкалар менен иштеши керек. Зымсыз модулдун энергия керектөөсүн туура өлчөө менен гана, мен канча батареяны так эсептей алам
Арзан 433MHz RF модулдарын жана Pic микроконтроллерлерин колдонуу менен зымсыз байланыш. 2 -бөлүк: 4 кадам (Сүрөттөр менен)
Арзан 433MHz RF модулдарын жана Pic микроконтроллерлерин колдонуу менен зымсыз байланыш. 2 -бөлүк: Бул көрсөтмөнүн биринчи бөлүгүндө мен MPLAB IDE жана XC8 компиляторун колдонуп, арзан TX/RX 433MHz модулдарын колдонуп жөнөкөй жипти жөнөтүү үчүн PIC12F1822ди кантип программалоону көрсөттүм. кабелдик жарнама
Bluefruit колдонуу менен зымсыз сериялык байланыш: 4 кадам
Bluefruit аркылуу зымсыз сериялык байланыш: Бул жерде зымдарды bluetooth аз энергия байланышы менен алмаштыруу боюнча этап -этабы менен көрсөтмө бар: Муну түшүнүү үчүн мага бир аз убакыт керек болду, анткени муну блютуздун заманбап энергиясы аз технологиясы менен жүргүзүү мүмкүн эмес. Bluefrui катары