ESP32使用DFROBOT通过MQTT服务器进行NFC读写
最近有個需求就是需要使用esp32來進行NFC卡的讀取,但是無奈網上類似的文章太少,所以摸索了很久,解決后發布出來希望可以幫助到有需要的人。
目錄
esp32連線圖:
下載庫文件:
導包 :
演示:
1.我們把NFC卡放到檢測區域,串口中會顯示已經讀取到卡的數據:
2.我們使用mqttx軟件來給esp32發布消息:
?3.發布后串口中會顯示寫入數據:
?4.然后把order改為0讀取數據:
?5.串口就會發送讀取數據:
?6.然后mqtt服務器上就會接收到卡中的數據:
注釋:?
源碼:?
esp32連線圖:
?
D/T? 連接? 21號引腳
C/R? 連接? 22號引腳
GND? 接地
VCC? 連接? 3V3
下載庫文件:
本項目需要一個DFRobot_PN532頭文件和pubsubclient頭文件,下載地址如下:
DFRobot/DFRobot_PN532 - 碼云 - 開源中國 (gitee.com)
pubsubclient: A client library for the Arduino Ethernet Shield that provides support for MQTT. (gitee.com)
導包 :
導包之后又可能會產生庫文件報錯的情況,這個時候需要按照下面的方式修改一下:
1.打開庫文件中的DFRobot_PN532-master\src\DFRobot_PN532.cpp文件
2.找到第315行:
?標紅的位置改為:
下面附上這部分代碼:
改之前:
void DFRobot_PN532::writeData(int block, uint8_t index, uint8_t data) {if(!this->nfcEnable)return;index = max(min(index,16),1);this->readData(block);this->blockData[index - 1] = data;this->writeData(block, this->blockData); }改之后:?
void DFRobot_PN532::writeData(int block, uint8_t index, uint8_t data) {if(!this->nfcEnable)return;if(!this->scan())return;if(!this->passWordCheck(block,nfcUid,nfcPassword))return;this->readData(block);this->blockData[index - 1] = data;this->writeData(block, this->blockData); }演示:
1.我們把NFC卡放到檢測區域,串口中會顯示已經讀取到卡的數據:
2.我們使用mqttx軟件來給esp32發布消息:
下面的四個字段可以在代碼中修改,第一個order字段為1是代表寫入,會寫入當前數據,為0是為讀取,讀取卡中數據
{"order":"1","num": "2","name": "張三","money": "200","department": "2" }? ? ? ? ?通過軟件來發布數據:
?3.發布后串口中會顯示寫入數據:
?4.然后把order改為0讀取數據:
?5.串口就會發送讀取數據:
?6.然后mqtt服務器上就會接收到卡中的數據:
?這樣就可以全部完成了
注釋:?
????????1.mqtt服務器的搭建由于網上的方法很多,本文章就不詳細說明
? ? ? ? 2.代碼中mqtt發送用的topic為rfid/1,接收的為rfid/2
源碼:?
下面給大家附上源碼:
#include <WiFi.h> #include <PubSubClient.h> #include <Arduino.h> #include <SPI.h> #include <Wire.h> #include <DFRobot_PN532.h> #define BLOCK_SIZE 16 #define PN532_IRQ 2 #define INTERRUPT 1 #define POLLING 0 const char *ssid = "你的WiFi名稱"; const char *password = "你的WiFi密碼"; const char *mqttServer = "你的mqtt服務器IP地址"; const int mqttPort = 1883; const char *mqttUser = "mqtt服務器用戶名"; const char *mqttPassword = "mqtt服務器密碼";WiFiClient espClient; PubSubClient client(espClient);// The block to be writtenDFRobot_PN532_IIC nfc(PN532_IRQ, POLLING);//讓char轉換為字符串 String char2String(char *c) {String s = "";for (int i = 0; i < 16; i++){s += c[i];}return s; }//把字符串轉為json格式 String stringToJson(String key,String value){String json = "{\"" + key + "\":\"" + value + "\"}";return json; }//在json格式的數據中再加入一條數據 String addJson(String json,String key,String value){String str = json.substring(0,json.length()-1);str += ",\"" + key + "\":\"" + value + "\"}";return str; } String json_data="{";void write(uint8_t block, uint8_t dataWrite[BLOCK_SIZE]) {if (nfc.scan()){if (nfc.writeData(block, dataWrite) != 1){Serial.print("Block ");Serial.print(block);Serial.println(" write failure!");}else{Serial.print("Block ");Serial.print(block);Serial.println(" write success!");Serial.print("Data written(string):");Serial.println((char *)dataWrite);Serial.print("Data written(HEX):");for (int i = 0; i < BLOCK_SIZE; i++){Serial.print(dataWrite[i], HEX);Serial.print(" ");}}} }String read(uint8_t block,String key) {uint8_t dataRead[16] = {0};if (nfc.scan()){if (nfc.readData(dataRead, block) != 1){Serial.print("Block ");Serial.print(block);Serial.println(" read failure!");}else{Serial.print("Block ");Serial.print(block);Serial.println(" read success!");Serial.print("Data read(string):");Serial.println((char *)dataRead);String data = char2String((char *)dataRead);Serial.println(data);Serial.println(data.length());//判斷第一個字符是否為數字,如果是則去掉除數字以外的所有字符if (data[0] >= '0' && data[0] <= '9'){int i = 0;while (data[i] >= '0' && data[i] <= '9'){i++;}data = data.substring(0, i);}// 如果第一位不為數字,則只保留前6個字符else{data = data.substring(0, 6);}if(key=="num"){json_data=stringToJson(key,data);}else{json_data=addJson(json_data,key,data);}Serial.println(key+":"+json_data);return json_data;}} }//提取json格式中特定的值,雙引號也去掉 String getJsonString(String json, String key) {int index = json.indexOf(key);if (index == -1){return "";}int start = json.indexOf(":", index);if (start == -1){return "";}int end = json.indexOf(",", start);if (end == -1){end = json.indexOf("}", start);}if (end == -1){return "";}String value = json.substring(start + 1, end);value.trim();if (value.startsWith("\"")){value = value.substring(1);}if (value.endsWith("\"")){value = value.substring(0, value.length() - 1);}return value; }//將String轉換為uint8_t數組 uint8_t *stringToUint8(String str) {uint8_t *data = new uint8_t[str.length()];for (int i = 0; i < str.length(); i++){data[i] = str[i];}return data; }String order(String str) {String order1 = getJsonString(str, "order");if (order1 == "1"){Serial.println("\n---------------------------------存儲數據-------------------------------------\n");uint8_t *num = stringToUint8(getJsonString(str, "num"));uint8_t *name = stringToUint8(getJsonString(str, "name"));uint8_t *money = stringToUint8(getJsonString(str, "money"));uint8_t *department = stringToUint8(getJsonString(str, "department"));write(2, num);write(4, name);write(6, money);write(8, department);return "寫入成功";}else if (order1 == "0"){Serial.println("\n----------------------------------讀取數據--------------------------------------\n");read(2,"num");read(4,"name");read(6,"money");String temp= read(8,"department");Serial.println(temp);return temp;} }//把字節流轉為json格式 String byteToJson(byte *payload, unsigned int length) {String json = "";for (int i = 0; i < length; i++){json += (char)payload[i];}return json; }//把字節流轉為字符串 String byteToString(byte *payload, unsigned int length) {String str = "";for (int i = 0; i < length; i++){str += (char)payload[i];}return str; }//將Json格式的字符串轉為Json格式對象提取其中的Value值 String getJsonValue(String json, String key) {int index = json.indexOf(key);if (index == -1){return "";}int start = json.indexOf(":", index);if (start == -1){return "";}int end = json.indexOf(",", start);if (end == -1){end = json.indexOf("}", start);}String value = json.substring(start + 2, end - 1);return value; }void callback(char *topic, byte *payload, unsigned int length) {// Serial.print("Message arrived in topic: ");// Serial.println(topic);// Serial.print("Message:");for (int i = 0; i < length; i++){Serial.print((char)payload[i]);}String str = byteToJson(payload, length);String json_data=order(str);client.publish("rfid/2", json_data.c_str());Serial.println(json_data); }void setup() {Serial.begin(9600);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED){delay(500);Serial.println("Connecting to WiFi..");}Serial.println("Connected to the WiFi network");client.setServer(mqttServer, mqttPort);client.setCallback(callback);while (!client.connected()){Serial.println("Connecting to MQTT...");if (client.connect("ESP32Client", mqttUser, mqttPassword)){Serial.println("connected");}else{Serial.print("failed with state ");Serial.print(client.state());delay(2000);}}client.subscribe("rfid/1");Serial.print("Initializing");while (!nfc.begin()){Serial.print(".");delay(1000);}Serial.println();Serial.println("Waiting for a card......"); }void loop() {client.loop();if (nfc.scan()){Serial.println("Card detected!");}delay(500); }總結
以上是生活随笔為你收集整理的ESP32使用DFROBOT通过MQTT服务器进行NFC读写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux如何全局搜索目录,Linux
- 下一篇: slqite3库查询数据处理方式_SQL