Skip to content

Instantly share code, notes, and snippets.

@BobBurns
Created July 22, 2015 12:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BobBurns/6a8d1c86b9d759070fae to your computer and use it in GitHub Desktop.
Save BobBurns/6a8d1c86b9d759070fae to your computer and use it in GitHub Desktop.
nfc server for particle web ide
// 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