-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient side
More file actions
214 lines (187 loc) · 5.96 KB
/
client side
File metadata and controls
214 lines (187 loc) · 5.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#include <SPI.h>
#include <MFRC522.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <ESP32Servo.h>
#include <ArduinoJson.h>
#define SS_PIN 5
#define RST_PIN 22
#define TOGGLE_PIN 33
#define PUSH_BUTTON_PIN 32
#define SERVO_PIN 15
#define GREEN_LED 2
#define RED_LED_GATE 4
#define RED_LED_MODE 21
#define BLOCK_ADDR 4
MFRC522 mfrc522(SS_PIN, RST_PIN);
Servo gateServo;
WiFiClient client;
const char* ssid = "oho";
const char* password = "123234345";
const char* server_ip = "192.168.186.221";
const uint16_t server_port = 5000;
String mode = "write";
bool gateOpen = false;
String rfidFromServer = "";
void setup() {
Serial.begin(115200);
SPI.begin();
mfrc522.PCD_Init();
pinMode(TOGGLE_PIN, INPUT_PULLUP);
pinMode(PUSH_BUTTON_PIN, INPUT_PULLUP);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED_GATE, OUTPUT);
pinMode(RED_LED_MODE, OUTPUT);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED_GATE, LOW);
digitalWrite(RED_LED_MODE, LOW);
gateServo.attach(SERVO_PIN);
gateServo.write(0);
Serial.print("Connecting to Wi-Fi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi connected.");
if (client.connect(server_ip, server_port)) {
Serial.println("Connected to the server");
}
sendModeToServer();
}
void loop() {
static int lastState = HIGH;
int currentState = digitalRead(TOGGLE_PIN);
if (currentState == LOW && lastState == HIGH) {
mode = (mode == "write") ? "read" : "write";
Serial.println("Mode changed to: " + mode);
sendModeToServer();
delay(500);
}
lastState = currentState;
if (digitalRead(PUSH_BUTTON_PIN) == LOW) {
delay(200);
toggleGate();
}
if (client.available()) {
String response = "";
while (client.available()) {
char c = client.read();
response += c;
}
parseServerResponse(response);
}
if (mode == "write") {
if (rfidFromServer.isEmpty()) return;
digitalWrite(RED_LED_MODE, HIGH);
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
writeToCard();
digitalWrite(RED_LED_MODE, LOW);
}
} else if (mode == "read") {
digitalWrite(RED_LED_MODE, LOW);
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
sendRFIDToServer(readFromCard());
}
}
}
void toggleGate() {
gateServo.write(gateOpen ? 0 : 90);
gateOpen = !gateOpen;
Serial.println(gateOpen ? "Gate opened." : "Gate closed.");
delay(200);
}
void ensureConnection() {
Serial.println("Reconnecting to server...");
if (!client.connect(server_ip, server_port)) {
Serial.println("Failed to reconnect to the server.");
}
}
void sendModeToServer() {
if (!client.connected()) ensureConnection();
String message = "{\"mode\":\"" + mode + "\"}";
Serial.println("Sending mode to server: " + message);
client.println(message);
}
void parseServerResponse(String response) {
Serial.println("Server response: " + response);
StaticJsonDocument<512> doc;
if (deserializeJson(doc, response)) {
Serial.println("JSON deserialization failed.");
return;
}
if (doc.containsKey("gate") && doc["gate"]) {
Serial.println("Gate value is true, opening the gate...");
if (!gateOpen) {
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED_GATE, LOW);
toggleGate();
delay(5000);
toggleGate();
digitalWrite(GREEN_LED, LOW);
}
} else if(doc.containsKey("gate") && !doc["gate"]) {
Serial.println("Gate value is false, keeping the gate closed.");
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED_GATE, HIGH);
delay(5000);
digitalWrite(RED_LED_GATE, LOW);
}
if (mode == "write" && doc["documents"].size() > 0) {
rfidFromServer = doc["documents"][0]["rfid"].as<String>();
Serial.println("RFID value from server: " + rfidFromServer);
} else {
rfidFromServer = "";
}
}
void sendRFIDToServer(String rfid) {
if (rfid.isEmpty()) return;
if (!client.connected()) ensureConnection();
String message = "{\"mode\":\"" + mode + "\",\"rfid\":\"" + rfid + "\"}";
Serial.println("Sending RFID to server: " + message);
client.println(message);
}
void writeToCard() {
if (rfidFromServer.isEmpty()) return;
MFRC522::MIFARE_Key key;
memset(key.keyByte, 0xFF, 6);
byte dataToWrite[16] = {0};
for (int i = 0; i < rfidFromServer.length() && i < 16; i++) {
dataToWrite[i] = rfidFromServer[i];
}
if (mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, BLOCK_ADDR, &key, &(mfrc522.uid)) == MFRC522::STATUS_OK) {
if (mfrc522.MIFARE_Write(BLOCK_ADDR, dataToWrite, 16) == MFRC522::STATUS_OK) {
Serial.println("RFID write successful.");
mode = "written";
sendModeToServer();
mode = "read";
sendModeToServer();
} else {
Serial.println("Write failed.");
}
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
} else {
Serial.println("Authentication failed.");
}
}
String readFromCard() {
byte buffer[18], size = sizeof(buffer);
MFRC522::MIFARE_Key key;
memset(key.keyByte, 0xFF, 6);
if (mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, BLOCK_ADDR, &key, &(mfrc522.uid)) == MFRC522::STATUS_OK) {
if (mfrc522.MIFARE_Read(BLOCK_ADDR, buffer, &size) == MFRC522::STATUS_OK) {
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
String rfidData = "";
for (byte i = 0; i < 16 && buffer[i] != 0; i++) {
rfidData += (char)buffer[i];
}
return rfidData;
}
Serial.println("Read failed.");
} else {
Serial.println("Authentication failed.");
}
return "";
}