Created
July 22, 2015 12:10
-
-
Save BobBurns/6a8d1c86b9d759070fae to your computer and use it in GitHub Desktop.
nfc server for particle web ide
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// firmware to receive bytes from atmega186 over USART and send over Wifi | |
// The atmega168 is programmed to talk to the pn532 nfc card reader and then send the card info | |
// over USART. | |
#define debug 0 | |
#define MAXLEN 256 | |
TCPServer server = TCPServer(2342); | |
TCPClient client; | |
bool unlocked = false; | |
void setup() { | |
Serial1.begin(9600); | |
Serial1.setTimeout(0); | |
if (debug) { | |
Serial.begin(9600); | |
while(!Serial.available()) SPARK_WLAN_Loop(); | |
Serial.println("Listening for connection..."); | |
if (WiFi.ready()) { | |
Serial.println(WiFi.localIP()); | |
} else { | |
Serial.println("wifi not ready"); | |
} | |
} | |
server.begin(); | |
Serial1.flush(); | |
} | |
int pollSerial() { | |
bool on = false; | |
bool found = false; | |
if (debug) { | |
Serial.println("connected"); | |
} | |
client.setTimeout(0); | |
int i, success; | |
unsigned long scantime; | |
char cmd, valL, valH; | |
//char *rec_buf; | |
uint8_t dataframe[32]; | |
int intvalL, intvalH; | |
client.flush(); | |
while (true) { | |
char s_buff[MAXLEN] = {0}; | |
if (on) { | |
Serial1.flush(); | |
scantime = 0; // use for timeout | |
while (scantime++ < 10000000) { | |
if (Serial1.available()) { | |
Serial1.readBytes(s_buff, 64); | |
if (debug) { | |
for (i=0;i<32;i++) { | |
Serial.print(s_buff[i]); | |
} | |
} | |
if (s_buff[0] == 2) { | |
break; | |
} | |
} | |
} | |
if (scantime >= 10000000) { | |
dataframe[0] = 0x82; | |
dataframe[1] = 0xF2; | |
dataframe[2] = 0xFF; | |
success = server.write((uint8_t *)dataframe, 3); | |
on = false; | |
continue; | |
} | |
dataframe[0] = 0x81; | |
for (i = 1;i < 15;i++) { | |
dataframe[i] = s_buff[i]; | |
} | |
dataframe[i] = '\0'; | |
success = server.write((uint8_t *)dataframe, 16); | |
if (!success) { | |
Serial.println("dataframe name failed"); | |
} | |
cmd = 0xA1; | |
valL = ((s_buff[19] - 0x30) * 10) + (s_buff[20] - 0x30); | |
valH = ((s_buff[21] - 0x30) * 10) + (s_buff[22] - 0x30); | |
Serial.println(valL); | |
Serial.println(valH); | |
dataframe[0] = 0x82; | |
dataframe[1] = cmd; | |
dataframe[2] = valL; | |
dataframe[3] = valH; | |
success = server.write(dataframe, 4); | |
if (debug) { | |
for (i=0;i<5;i++) { | |
Serial.print(dataframe[i]); | |
} | |
if (!success) | |
Serial.println("dataframe value failed"); | |
} | |
on = false; | |
} | |
/* check for incomming */ | |
char rec_buf[MAXLEN] = {0}; | |
if (client.available()) { | |
if (debug) { | |
Serial.println("data to recieve"); | |
} | |
char count[1]; | |
int bytes; | |
bytes = client.readBytes(count, 1); //returns ascii rep of value | |
if (bytes < 0) { | |
rec_buf[0] = '\0'; | |
} | |
bytes = client.readBytes((char *)rec_buf, count[0]); | |
rec_buf[count[0]] = '\0'; | |
if (unlocked) { | |
/*first byte: opcode | |
*seconde byte: cmd | |
*3-paylen bytes: data | |
*/ | |
if (debug) { | |
for (i = 0;i < 16;i++) { | |
Serial.print(rec_buf[i]); | |
} | |
} | |
if (rec_buf[2] == 0x80) { | |
if (debug) { | |
Serial.println("Bye!"); | |
} | |
cmd = 0xF1; | |
valL = 0xFF; | |
valH = 0xFF; | |
dataframe[0] = 0x82; | |
dataframe[1] = cmd; | |
dataframe[2] = valL; | |
dataframe[3] = valH; | |
success = server.write(dataframe, 4); | |
if (!success) { | |
if (debug) { | |
Serial.println("couldn't send no pass"); | |
} | |
client.stop(); | |
break; | |
} | |
} | |
if (rec_buf[2] == 0x20) { | |
on = true; | |
if (debug) { | |
Serial.println("scanning.."); | |
} | |
} | |
} | |
} | |
} | |
return 0; | |
} | |
int verifyPass() { | |
char rec_buf[MAXLEN] = {0}; | |
char count[1]; | |
int bytes; | |
bytes = client.readBytes(count, 1); //returns ascii rep of value | |
if (bytes < 0) { | |
rec_buf[0] = '\0'; | |
} | |
bytes = client.readBytes((char *)rec_buf, count[0]); | |
rec_buf[count[0]] = '\0'; | |
if (strcmp((char *)rec_buf, "yousuck") != 0) { | |
if (debug) { | |
Serial.println("incorrect password"); | |
Serial.println(rec_buf); | |
} | |
return 0; | |
} | |
unlocked = true; | |
return 1; | |
} | |
void loop() { | |
if (client.connected()) { | |
client.flush(); | |
if (!verifyPass()) { | |
if (debug) | |
Serial.println("exiting"); | |
client.stop(); | |
while (true) {}; | |
} | |
pollSerial(); | |
} else { | |
client = server.available(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment