最近有个需求就是需要使用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读写相关推荐

  1. ESP32 连接到免费的公共 MQTT 服务器

    MQTT 是轻量级的.灵活的物联网消息交换和数据传递协议,致力于为 IoT 开发人员实现灵活性与硬件/网络资源的平衡. ESP32 是 ESP8266 的升级版本,除了Wi-Fi模块,该模块还包含蓝牙 ...

  2. ESP32 使用 MicroPython 实现温度数据上报MQTT服务器

    硬件:ESP32,DS18B20测温模块 软件:MicroPython,Thonny,EMQX 软件环境搭建和硬件接线可直接参考 王铭东 老师的教程 Thonny+MicroPython+ESP32开 ...

  3. ESP32的MQTT AT固件烧录+STM32以ESP32的MQTT AT固件的AT指令连接EMQX下mqtt服务器实现消息订阅和发布

    目录 写在前面 三种方案(利用ESP32连接EMQX下的MQTT) 步骤 ESP32烧录固件并AT指令进行测试. 下载固件 烧录工具下载 烧录固件(选择ESP32) 关于AT 指令与MQTT服务器断开 ...

  4. 提供最全面最详细的ESP32从零开始搭建一个物联网平台教程(从最基本的配网和内建WEB服务器开始到自已搭建一个MQTT服务器)

    目录 教程大纲 硬件需求 教程说明 教程章节链接 ESP32搭建WEB服务器一(AP配网) ESP32搭建WEB服务器二(STA模式) ESP32搭建WEB服务器三(AP模式与STA模式共存) ESP ...

  5. 基于ESP32搭建物联网服务器十三(自已搭建一个MQTT服务器)

    在之前的文章中:ESP32搭建WEB服务器十二(使用MQTT协议与ESP32互动)_你的幻境的博客-CSDN博客 我们已经实现了ESP32通过MQTT协议连接到公共MQTT服务器上,但是公共服务器在稳 ...

  6. 使用WIFI模块与MQTT服务器进行透传数据通讯(M0E1系列)

    使用WIFI模块与百度天工进行透传数据通讯(M0E1系列) 前言 具体步骤 进入AT指令模式 配置相应的AT指令 使用MQTT.fx进行测试 MQTT控制模块引脚功能 说明 前言 M0E1系列模组,是 ...

  7. ESP32 使用 ESP-AT 测试 MQTT WSS 连接和数据传输的流程

    此博客记录使用 ESP32-WROOM-32D 模组下载 release/v2.1.0.0 版本的 AT 固件进行测试的流程. 1. 连接 MQTT 服务器需要连接 Wi-Fi . 2. 请使用如下 ...

  8. 开源一个安信可A9g小项目微信小程序定位器项目②GPS模块如何定位经纬度并且上报到MQTT服务器,实现远程查看模块的经纬度;

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 如何在windows10上环境搭建,编译烧录代码固件,查看运行 ...

  9. Esp8266进阶之路10 【小实战下篇】Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。(带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  10. ESP32运行MicroPython通过MQTT上报温湿度到中移OneNET物联网平台(附源码)

    前言:MQTT是当下物联网用的比较多的协议,本篇聊一聊用esp32通过MQTT连接到中移OneNET物联网平台. OneNET平台创建产品和设备 1.​创建产品:开发者中心->全部产品-> ...

最新文章

  1. 获取所有栈的信息,只有最上面的和最下面的,但是不能获取栈中间的activity信息...
  2. 程序员快来看!经典代码替你省去多少时间?
  3. 微信地图 leaflet 腾讯地图
  4. 社会达尔文主义 盛行时间_新达尔文主义的心理理论
  5. 脉冲宽度调制pdm_脉冲宽度调制,脉宽调制
  6. 数据结构目录树(严蔚敏王道)版
  7. 市场调研—全球及中国活化部分凝血活酶时间测试(APTT测试)行业研究及十四五规划分析报告
  8. Lazada(来赞达):就三个步骤!搞定Lazada店铺装修
  9. 计算机网络的拓扑结构三种基本型,计算机。。。
  10. 英特尔宣布推出新的“ Compute Stick”-一种笔式驱动器大小的PC
  11. 关于链表的逆序排列!
  12. GateWay的介绍与使用
  13. GL Studio学习
  14. 开源(Open source)是什么?为什么要开源
  15. [RISC-V MCU 应用开发]基于CH32V307和TtencentOS Tiny的物联网心率监测
  16. 有效沟通-非暴力沟通
  17. nodejs实现批量裁剪图片功能
  18. 笔记本显示网络电缆被拔出怎么解决_如何解决系统显示网络电缆被拔出的问题...
  19. 嘟!数字三角形 W WW WWW集合!
  20. python批量评论_python批量爬取京东手机评论信息及星级

热门文章

  1. APP设计~切图那些事儿
  2. LVGL学习记录:Roller滚轮
  3. Linux无盘工作站
  4. mysql数据库原理及应用实训报告_《数据库原理及应用》实验报告.doc
  5. Integrity数据库简介
  6. 分享一个外泌体数据库
  7. 基于JSP的旅游网站论文
  8. 系泊系统悬链线matlab,系泊系统的设计.docx
  9. 【软件介绍】GWAS meta分析软件:METAL
  10. 基于创芯CAN分析仪ControlCAN.dll的C#二次开发库