Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Arduino.h>
- #include <SerialCommands.h>
- #include <SoftwareSerial.h>
- SoftwareSerial mySerial(10, 11);
- char chrIMEI[16];
- char serialdata[256]; //Array to store the chars before parsing, size???
- char serial_command_buffer_[32];
- SerialCommands serial_commands_(&Serial, serial_command_buffer_, sizeof(serial_command_buffer_), "\r\n", " ");
- int readline(int readch, char *buffer, int len) {
- static int pos = 0;
- int rpos;
- if (readch > 0) {
- switch (readch) {
- case '\r': // Ignore CR
- break;
- case '\n': // Return on new-line
- rpos = pos;
- pos = 0; // Reset position index ready for next time
- return rpos;
- default:
- if (pos < len - 1) {
- buffer[pos++] = readch;
- buffer[pos] = 0;
- }
- break;
- }
- }
- return 0;
- }
- //This is the default handler, and gets called when no other command matches.
- void cmd_unrecognized(SerialCommands* sender, const char* cmd) {
- sender->GetSerial()->print("Unrecognized command [");
- sender->GetSerial()->print(cmd);
- sender->GetSerial()->println("]");
- }
- //called for IMEI command
- void cmd_imei(SerialCommands* sender) {
- sender->GetSerial()->println("command: IMEI");
- mySerial.write("AT+CGSN=1\r\n");
- }
- //called for SETSOCKET command
- void cmd_setsocket(SerialCommands* sender) {
- sender->GetSerial()->println("setting socket");
- mySerial.write("AT+NSOCR=DGRAM,17,7000,1\r\n");
- }
- //called for DOWNLOAD command
- void cmd_download(SerialCommands* sender) {
- sender->GetSerial()->println("downloading");
- mySerial.write("AT+NSORF=0,5\r"); //ALLEEN /R??????????? //0,172.27.131.100,15683,5,48656C6C6F,0
- }
- void sendMessage(String payload) {
- payload.concat("0");
- char buf[512];
- int payloadLen = payload.length();
- payload.toCharArray(buf, payloadLen);
- String myString = "AT+NSOST=0,172.27.131.100,15683,";
- myString.concat(String(payloadLen - 1));
- myString.concat(",");
- for (int i = 0; i<payloadLen - 1; i++) {
- myString.concat(String(buf[i], HEX));
- }
- myString.concat("\r\n");
- myString.toCharArray(buf, 512);
- mySerial.write(buf);
- }
- //called for ALIVE command
- void cmd_alive(SerialCommands* sender) {
- String payload = "i am alive";
- sendMessage(payload);
- sender->GetSerial()->println("I am alive");
- }
- //Note: Commands are case sensitive
- SerialCommand cmd_imei_("IMEI", cmd_imei);
- SerialCommand cmd_setsocket_("SETSOCKET", cmd_setsocket);
- SerialCommand cmd_download_("DOWNLOAD", cmd_download);
- SerialCommand cmd_alive_("ALIVE", cmd_alive);
- void setup() {
- Serial.begin(9600);
- serial_commands_.SetDefaultHandler(cmd_unrecognized);
- serial_commands_.AddCommand(&cmd_imei_);
- serial_commands_.AddCommand(&cmd_setsocket_);
- serial_commands_.AddCommand(&cmd_download_);
- serial_commands_.AddCommand(&cmd_alive_);
- Serial.println("Testing up- and downlink");
- mySerial.begin(9600);
- }
- void loop() {
- serial_commands_.ReadSerial();
- if (mySerial.available()) {
- if (readline(mySerial.read(), serialdata, 512)) {
- Serial.println("response: " + String(serialdata));
- //Serial.println(String(serialdata));
- if (strncmp(serialdata, "+CGSN:", 6) == 0) {
- for (int i = 0; i < 16; i++) {
- chrIMEI[i] = serialdata[6 + i];
- }
- chrIMEI[15] = '\0';
- }
- // +NSONMI Indicator of Arrived Socket Messages (Response Only)
- // Response: +NSONMI:0,5 (<socket>,<length>)
- // Command to download: AT+NSORF=0,5 <socket>,<req_length>
- // Response <socket>,<ip_addr>,<port>,<length>,<data>,<remaining_ length>
- // Example: 0,999.99.999.999,99999,5,48656C6C6F,0
- if (strncmp(serialdata, "+NSONMI:", 8) == 0) {
- Serial.println("Message available for download");
- char *csocket = strtok(serialdata + 8, ":");
- char *cbytes = strtok(NULL, ",");
- // Check the last slicing worked
- if (cbytes != NULL) {
- int socket = atoi(csocket);
- int bytes = atoi(cbytes);
- }
- // Proceed and download messages here?
- mySerial.write("AT+NSORF=0,5\r");
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment