diff --git a/src/FabReader_v2/README.txt b/src/FabReader_v2/README.txt index e10ed76..144730a 100644 --- a/src/FabReader_v2/README.txt +++ b/src/FabReader_v2/README.txt @@ -5,7 +5,7 @@ READERID is 5 Digits 1. Request: Topic="fabreader/READERID/requestOTA", Payload=256 Bytes APDU Command 1. Response: Topic="fabreader/READERID/responseOTA", Payload=256 Bytes APDU Response 1. Stop: Topic="fabreader/READERID/stopOTA", Payload=NULL -1. Cancel: Topic="fabreader/READERID/cancelOTA", Payload=NULL +1. Cancel: Topic="fabreader/READERID/cancelOTA", Payload=UID of Card 1. Restart: Topic="fabreader/READERID/restartOTA", Payload=NULL ## Procedure: diff --git a/src/FabReader_v2/src/NFC.cpp b/src/FabReader_v2/src/NFC.cpp index 0fa3c13..0932783 100644 --- a/src/FabReader_v2/src/NFC.cpp +++ b/src/FabReader_v2/src/NFC.cpp @@ -13,12 +13,12 @@ NFC::NFC(int pin_ss, int pin_rst) bool NFC::hasNewCard() { - if(rfid->PICC_IsNewCardPresent() && rfid->PICC_ReadCardSerial() && rfid->uid.sak == 0x20) + if(rfid->PICC_IsNewCardPresent() && rfid->PICC_ReadCardSerial()) { byte atqaLen = sizeof(atqa); MFRC522::StatusCode status = rfid->PICC_RequestA(atqa, &atqaLen); Serial.printf("PICC_RequestA: 0x%02x\n", status); - if(atqa[0] == 0x44) + if(status == MFRC522::STATUS_OK && atqa[0] == 0x44) { return true; } @@ -26,27 +26,56 @@ bool NFC::hasNewCard() return false; } -void NFC::selectCard() +bool NFC::selectCard() { MFRC522::StatusCode status = rfid->PICC_Select(&(rfid->uid)); Serial.printf("PICC_Select: 0x%02x\n", status); - uid = rfid->uid; + if(status != MFRC522::STATUS_OK) + { + return false; + } + cardSelected = true; + uid = rfid->uid; Serial.println("Card Selected"); + return true; } -void NFC::deselectCard() + +bool NFC::deselectCard() { MFRC522::StatusCode status = rfid->PICC_HaltA(); Serial.printf("PICC_HaltA: 0x%02x\n", status); + if(status != MFRC522::STATUS_OK) + { + return false; + } + cardSelected = false; + Serial.println("Card Deselected"); + + return true; } bool NFC::isCardLost() { - MFRC522::StatusCode status = rfid->PICC_Select(&(uid)); - Serial.printf("PICC_Select: 0x%02x\n", status); - - return status != MFRC522::STATUS_OK; + uint8_t control = 0x00; + for(int i=0; i<3; i++) + { + if(!rfid->PICC_IsNewCardPresent()) + { + if(rfid->PICC_ReadCardSerial()) + { + control |= 0x16; + } + if(rfid->PICC_ReadCardSerial()) + { + control |= 0x16; + } + control += 0x1; + } + control += 0x4; + } + return !(control == 13 || control == 14); } MFRC522::StatusCode NFC::Transceive(byte* command, byte command_len, byte* response, byte response_len) diff --git a/src/FabReader_v2/src/NFC.h b/src/FabReader_v2/src/NFC.h index 226c0b7..df0fc02 100644 --- a/src/FabReader_v2/src/NFC.h +++ b/src/FabReader_v2/src/NFC.h @@ -16,8 +16,8 @@ class NFC MFRC522* rfid; NFC(int pin_ss, int pin_rst); bool hasNewCard(); - void selectCard(); - void deselectCard(); + bool selectCard(); + bool deselectCard(); bool isCardLost(); MFRC522::Uid getUID(); diff --git a/src/FabReader_v2/src/OTAProxy.cpp b/src/FabReader_v2/src/OTAProxy.cpp index 7397220..e2ae680 100644 --- a/src/FabReader_v2/src/OTAProxy.cpp +++ b/src/FabReader_v2/src/OTAProxy.cpp @@ -16,13 +16,18 @@ bool OTAProxy::hasActiveOTA() void OTAProxy::startOTA() { - nfc->selectCard(); + if(!(nfc->selectCard())) + { + return; + } activeOTA = true; char topic[] = "fabreader/00000/startOTA"; sprintf(topic, "fabreader/%05d/startOTA", id); MFRC522::Uid uid = nfc->getUID(); - mqtt->publish(topic, uid.uidByte, int(uid.size)); + mqtt->publish(topic, uid.uidByte, uid.size); + + Serial.println("Start OTA"); } void OTAProxy::continueOTA(char* topic, byte* payload, unsigned int length) @@ -41,22 +46,25 @@ void OTAProxy::continueOTA(char* topic, byte* payload, unsigned int length) if(strcmp(topic, topic_requestOTA)) { + Serial.println("Request OTA"); byte response[APDU_BUFFER_SIZE] = {0}; nfc->Transceive(payload, length, response, APDU_BUFFER_SIZE); mqtt->publish(topic_responseOTA, response, APDU_BUFFER_SIZE); + Serial.println("Response OTA"); } else if(strcmp(topic, topic_stopOTA)) { - nfc->deselectCard(); + Serial.println("Stop OTA"); + while(!(nfc->deselectCard())); activeOTA = false; } else if(strcmp(topic, topic_restartOTA)) { - nfc->deselectCard(); + Serial.println("Restart OTA"); + while(!(nfc->deselectCard())); if(nfc->hasNewCard()) { - nfc->selectCard(); startOTA(); } } @@ -66,8 +74,11 @@ void OTAProxy::cancelOTA() { char topic_cancelOTA[] = "fabreader/00000/cancelOTA"; sprintf(topic_cancelOTA, "fabreader/%05d/cancelOTA", id); - mqtt->publish(topic_cancelOTA, ""); + MFRC522::Uid uid = nfc->getUID(); + mqtt->publish(topic_cancelOTA, uid.uidByte, uid.size); - nfc->deselectCard(); + while(!(nfc->deselectCard())); activeOTA = false; + + Serial.println("Cancel OTA"); } \ No newline at end of file diff --git a/src/FabReader_v2/src/main.cpp b/src/FabReader_v2/src/main.cpp index c4d7272..b3b304f 100644 --- a/src/FabReader_v2/src/main.cpp +++ b/src/FabReader_v2/src/main.cpp @@ -75,7 +75,6 @@ void callback(char* topic, byte* payload, unsigned int length) Serial.println("Recive Message"); if(ota->hasActiveOTA()) { - Serial.println("Continue OTA"); ota->continueOTA(topic, payload, length); } } @@ -83,9 +82,9 @@ void callback(char* topic, byte* payload, unsigned int length) void setup() { config.ID = 1; - strcpy(config.WLAN_SSID, "SSID"); - strcpy(config.WLAN_Password, "dodahV3eePeiducaicae"); - strcpy(config.MQTT_Broker, "10.7.255.233"); + strcpy(config.WLAN_SSID, ""); + strcpy(config.WLAN_Password, ""); + strcpy(config.MQTT_Broker, ""); Serial.begin(115200); Serial.print("\n\n\n"); @@ -98,6 +97,11 @@ void setup() Serial.println("Connecting NFC ..."); nfc = new NFC(PIN_RFID_SPI_SS, PIN_RFID_RST); + if(!(nfc->rfid->PCD_PerformSelfTest())) + { + Serial.println("NFC Test failed"); + } + //nfc->rfid->PCD_SetAntennaGain(MFRC522::RxGain_max); Serial.println("NFC connected"); setup_wifi(); @@ -119,12 +123,10 @@ void loop() if(!ota->hasActiveOTA() && nfc->hasNewCard()) { - Serial.println("Start OTA"); ota->startOTA(); } if(ota->hasActiveOTA() && nfc->isCardLost()) { - Serial.println("Cancel OTA"); ota->cancelOTA(); } } \ No newline at end of file