This is a SLIP interface for the STM32F446RE Nucleo Board. It is designed to work specifically with the esp-link software for the ESP8266. The program is an example of a rest command.

Dependencies:   mbed DHT Matrix

main.cpp

Committer:
ShaneKirkbride
Date:
2016-08-04
Revision:
2:20ea1be14e4b
Parent:
1:99c58a942425
Child:
3:8ed85d940c4c

File content as of revision 2:20ea1be14e4b:

/**
 * Simple example to demo the STM-Client REST calls
 */
#include "mbed.h"
#include <STMClient.h>
#include <STMClientRest.h>

/*-------- Check if platform compatible ----------*/
#if DEVICE_SERIAL_ASYNCH
Serial debugSerial(SERIAL_TX, SERIAL_RX);
Serial espSerial(PA_0, PA_1);
#else
    #warning "Platform not compatible with Low Power APIs for Serial"
    Serial debugSerial(SERIAL_TX, SERIAL_RX);
    Serial espSerial(PA_0, PA_1);
#endif


DigitalOut led1(LED1);             

// Initialize a connection to esp-link using the normal hardware serial port both for
// SLIP and for debug messages.
STMClient esp(&espSerial, &debugSerial);


// Initialize a REST client on the connection to esp-link
STMClientRest rest(&esp);

bool wifiConnected = false;

// Callback made from esp-link to notify of wifi status changes
// Here we print something out and set a global flag
void wifiCb(void *response) {
  debugSerial.printf("waiting for wifi status...\n\r"); //debug
  STMClientResponse *res = (STMClientResponse*)response;
  if (res->argc() == 1) {
    uint8_t status;
    res->popArg(&status, 1);
    debugSerial.printf("waiting for wifi status...\n\r");
    if(status == STATION_GOT_IP) {
      debugSerial.printf("WIFI CONNECTED");
      wifiConnected = true;
    } else {
      debugSerial.printf("WIFI NOT READY: %i",status);
      //Serial.printf(status);
      wifiConnected = false;
    }
  }
}

#define BUFLEN 512
    char response[BUFLEN];

char *loop_get() {
  //debugSerial.printf("begin main loop \n\r");
  // process any callbacks coming from esp_link
  esp.Process();
  debugSerial.printf("Wifi Connected: %i \n\r",wifiConnected);
  // if we're connected make an HTTP request
  while(wifiConnected) {
    // Request /utc/now from the previously set-up server
    rest.get("/utc/now");

    //char response[BUFLEN];
    memset(response, 0, BUFLEN);
    uint16_t code = rest.waitResponse(response, BUFLEN);
    if(code == HTTP_STATUS_OK){
      debugSerial.printf("STM: GET successful: %s\n\r", response);
      wait(60);
      return response;
    } else {
      debugSerial.printf("STM: GET failed: %i\n\r",code);
      wait(60);
      return (char *)code;
    }    
  }
  return "0";   
}

int loop_post() {
  //debugSerial.printf("begin main loop \n\r");
  // process any callbacks coming from esp_link
  int postCount = 0;
  esp.Process();
  debugSerial.printf("Wifi Connected: %i \n\r",wifiConnected);
  // if we're connected make an HTTP request
  while(wifiConnected) {
    postCount++; //don't post more than 3 times...
    // Post to cloud

    //const char* header = "{Host: vivaplanetbusservicedev.servicebus.windows.net Authorization: SharedAccessSignature sr=https%3a%2f%2fvivaplanetbusservicedev.servicebus.windows.net%2fhummingbirdqueue%2fmessages&sig=QIGJfPSsortI9tZpoJ6ZUzfMdtvEaaIHA2pnmKZxNVg%3d&se=1470210743&skn=DevicePolicy Content-Length: 440 Expect: 100-continue Connection: Keep-Alive}";
    //rest.setHeader(header);
    
    //const char* body = "{\"id\":\"17564321\",\"Address\":\"$28591\",\"PhotoUrl\":\"http://vivaplanetstoragedev.blob.core.windows.net:80/devicephotoscontainer/1457a68157e446c2bc4d0af58a0ccc63.jpg?st=2016-08-02T21%3A50%3A31Z&se=2016-08-02T22%3A05%3A31Z&sr=b&sp=w&sig=rf6ovBuFXKC937b3TMY3qVSf%2F3QOYXjqJBYcwj2MUv4%3D\",\"HasPhoto\":true,\"PhotoId\":\"1457a68157e446c2bc4d0af58a0ccc63.jpg\",\"DeviceSensors\":[{\"SensorType\":\"0\",\"Reading\":\"00:03:52.7656140\",\"Value\":\"921\"},null,null,null]}";
    //rest.post("hummingbirdqueue/messages", body); //cloud post test
    
    const char* body = "{sunleaf: test1}";
    rest.post("/post.php", body); //basic post test
    
    char response[BUFLEN];
    memset(response, 0, BUFLEN);
    uint16_t code = rest.waitResponse(response, BUFLEN);
    if(code == HTTP_STATUS_OK){
      debugSerial.printf("STM: POST successful: %s\n\r", response);
    }else if(postCount > 3){
      debugSerial.printf("STM: POST 3 times exiting...\n\r");
      return code;   
    }else {
      debugSerial.printf("STM: POST failed: %i\n\r",code);
      return code;
    }
    
    wait(60);
  }
  return 0;   
}


int main() {
  led1=0;
  debugSerial.baud(115200);   // the baud rate here needs to match the esp-link config
  espSerial.baud(115200);
  
  debugSerial.printf("STM-Client starting!\n\r");
  wait(0.5);
  
  espSerial.printf("STM-Client starting!\n\r");
  wait(0.5);

  // Sync-up with esp-link, this is required at the start of any sketch and initializes the
  // callbacks to the wifi status change callback. The callback gets called with the initial
  // status right after Sync() below completes.
  esp.wifiCb.attach(wifiCb); // wifi status change callback, optional (delete if not desired)
  bool ok;
  do {
      //debugSerial.printf("main syncing..\n\r");
      wait(0.5);
    ok = esp.Sync();      // sync up with esp-link, blocks for up to 2 seconds
    if (!ok){ 
        debugSerial.printf("STM-Client sync failed!\n\r");
        wait(0.5);
        }
  } while(!ok);
  
  debugSerial.printf("STM-Client synced!\n\r");

  // Get immediate wifi status info for demo purposes. This is not normally used because the
  // wifi status callback registered above gets called immediately. 
  esp.GetWifiStatus();
  STMClientPacket *packet;
  if ((packet=esp.WaitReturn()) != NULL) 
  {
    //debugSerial.printf("Wifi status: %i\n\r", packet->value);
    //debugSerial.printf("waiting for wifi status...\n\r");
    if(packet->value >= 1) { ///ideally this would coincide with STATION_GOT_IP... 
      debugSerial.printf("WIFI CONNECTED\n\r");
      wifiConnected = true;
    } else {
      debugSerial.printf("WIFI NOT READY: %i\n\r",packet->value);
      //Serial.printf(status);
      wifiConnected = false;
    }
  }
  

  // Set up the REST client to talk to www.timeapi.org, this doesn't connect to that server,
  // it just sets-up stuff on the esp-link side
  //int err = rest.begin("www.timeapi.org"); //for basic example of get
  int err = rest.begin("posttestserver.com"); //for basic example of post
  
  //const char* host = "vivaplanetbusservicedev.servicebus.windows.net";
  //uint16_t port = 443;
  //bool security = true;
  //int err = rest.begin(host,port,security);
 
  if (err != 0) {
    debugSerial.printf("REST begin failed: %i\n\r",err);
    while(1) ;
  }
  debugSerial.printf("STM-REST ready\n\r");
  while(response != "0"){
      debugSerial.printf("status: %x\n\r",response);
      //loop_get();
      loop_post();      
      wait(60);
    } 
}