![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Example of using the Dragonfly HTTP library with the m2x http api
Dependencies: MbedJSONValue X_NUCLEO_IKS01A1 mbed mtsas_lat3
Fork of VVV_MultiTech_Dragonfly_ATT_Dallas by
main.cpp
- Committer:
- pferland
- Date:
- 2017-09-26
- Revision:
- 12:493eba0c12c7
- Parent:
- 10:65b7d33f18d9
File content as of revision 12:493eba0c12c7:
/************************************************************************* * Dragonfly Example program of SMS on Freescale sensor board */ #include "mbed.h" #include "mtsas.h" #include "MbedJSONValue.h" #include "HTTPJson.h" #include <string> #include <sstream> #include "x_nucleo_iks01a1.h" #define HTTP_RX_BUFFER_SIZE 1024 char http_rx_buf[HTTP_RX_BUFFER_SIZE]; // Debug serial port static Serial debug(USBTX, USBRX); // MTSSerialFlowControl - serial link between processor and radio static MTSSerialFlowControl* io; // Cellular - radio object for cellular operations (SMS, TCP, etc) Cellular* radio; // APN associated with SIM card // this APN should work for the AT&T SIM that came with your Dragonfly static const std::string apn = "broadband"; // Phone number to send SMS messages to // just change the x digits - the 1 needs to stay! static const std::string phone_number = " NEED A NUMBER with a 1"; // Keys needed by the m2x API // see more details here: https://m2x.att.com/developer/documentation/v2/overview // m2x device ID static const std::string m2x_device_id = ""; // M2X primary API key static const std::string m2x_api_key = ""; /* Instantiate the expansion board */ static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(I2C_SDA, I2C_SCL); /* Retrieve the composing elements of the expansion board */ static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope(); static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer(); static MagneticSensor *magnetometer = mems_expansion_board->magnetometer; static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor; static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor; static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor; static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor; // variables for sensor data char streamAcc[] = "acc_rms"; char streamMag[] = "mag_rms"; char streamGyr[] = "gyr_rms"; char streamTemp[] = "temp_c"; char streamPres[] = "pressure"; char streamHum[] = "humidity"; char streamAccel[] = "accel"; // misc variables static int sms_interval_ms = 60000; static int read_interval_ms = 5000; static int print_interval_ms = 1500; int debug_baud = 115200; bool radio_ok = false; /**************************************************************************************************** // function prototypes ****************************************************************************************************/ bool init_mtsas(); char* httpResToStr(HTTPResult res); /**************************************************************************************************** // main ****************************************************************************************************/ int main() { mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL); debug.baud(debug_baud); logInfo("starting..."); /**************************************************************************************************** Initialize I2C Devices ************ ****************************************************************************************************/ int32_t accel_data[3]; float accel_sensitivity; //float mag_data[3]; //float gyro_data[3]; float dataX = 0.0f; float dataY = 0.0f; float dataZ = 1.0f; float humidity = 0.0f; float temperature = 0.0f; float pressure = 0.0f; // Initialization Radio Section ********************************************************** radio_ok = init_mtsas(); if (! radio_ok) logError("MTSAS init failed"); else logInfo("MTSAS is ok"); //End Radio Initialization Section ********************************************************** Timer sms_timer; sms_timer.start(); Timer read_timer; read_timer.start(); // Timer data is set in the Variable seciton see misc variables Timer motion_timer; Timer print_timer; print_timer.start(); Timer motion_timer; motion_timer.start(); // http object initialization // HTTPClient object used for HTTP requests. HTTPClient http; // Enable strict certificate validation. // http.setPeerVerification(VERIFY_PEER); // Load certificates defined in ssl_certificates.h. // See comments in ssl_certificates.h for information on how to get and format root certificates. // if (http.addRootCACertificate(ssl_certificates) != HTTP_OK) // logError("loading SSL certificates failed"); while (true) { if (read_timer.read_ms() > read_interval_ms) { accelerometer->get_x_axes(accel_data); accelerometer->get_x_sensitivity(&accel_sensitivity); dataX = accel_data[0] * accel_sensitivity; dataY = accel_data[1] * accel_sensitivity; dataZ = accel_data[2] * accel_sensitivity; humidity_sensor->get_humidity(&humidity); temp_sensor1->get_temperature(&temperature); pressure_sensor->get_pressure(&pressure); read_timer.reset(); } // send to m2x on same interval as printing if (print_timer.read_ms() > print_interval_ms) { logDebug("SENSOR DATA"); logDebug("DataZ %0.3f", dataZ); logDebug("DataY %0.3f", dataY); logDebug("DataX %0.3f", dataX); logDebug("Humidity: %0.2f", humidity); logDebug("Temperature: %0.1f", temperature); logDebug("Presure: %f", pressure); HTTPResult res; // IHTTPDataIn object - will contain data received from server. HTTPText http_rx(http_rx_buf, HTTP_RX_BUFFER_SIZE); std::ostringstream json_packet; json_packet << "{\"values\": {\"value\" : " \ << temperature << "}}"; // IHTTPDataOut object - contains data to be posted to server. // HTTPJson automatically adds the JSON content-type header to the request. char *tx_string = new char[json_packet.str().length()]; sprintf(tx_string, json_packet.str().c_str()); HTTPJson http_tx(tx_string, json_packet.str().length()); std::string m2x_header = "X-M2X-KEY: " + m2x_api_key + "\r\n"; std::string url = "https://api-m2x.att.com/v2/devices/" + \ m2x_device_id + \ "/streams/temperature/values"; http.setHeader(m2x_header.c_str()); http.post(url.c_str(), http_tx, &http_rx); delete tx_string; if (res != HTTP_OK) logError("HTTPS POST failed [%d][%s]", res, httpResToStr(res)); else logInfo("HTTPS POST succeeded [%d]\r\n%s", http.getHTTPResponseCode(), http_rx_buf); print_timer.reset(); } // SMS if (sms_timer.read_ms() > sms_interval_ms) { sms_timer.reset(); logInfo("SMS Send Routine"); printf(" In sms routine \r\n"); if (radio_ok) { MbedJSONValue sms_json; string sms_str; sms_json[" edge Gravity: "] = dataY; sms_json[" level Gravity: "] = dataZ; sms_str = "SENSOR DATA:\n"; sms_str += sms_json.serialize(); logDebug("sending SMS to %s:\r\n%s", phone_number.c_str(), sms_str.c_str()); if (dataZ<0.6f) { //added Code ret = radio->sendSMS(phone_number, sms_str); if (ret != MTS_SUCCESS) logError("sending SMS failed"); } //added } } } } // init functions bool init_mtsas() { io = new MTSSerialFlowControl(RADIO_TX, RADIO_RX, RADIO_RTS, RADIO_CTS); if (! io) return false; io->baud(115200); radio = CellularFactory::create(io); if (! radio) return false; Code ret = radio->setApn(apn); if (ret != MTS_SUCCESS) return false; Transport::setTransport(radio); return true; } char* httpResToStr(HTTPResult res) { switch(res) { case HTTP_PROCESSING: return "HTTP_PROCESSING"; case HTTP_PARSE: return "HTTP_PARSE"; case HTTP_DNS: return "HTTP_DNS"; case HTTP_PRTCL: return "HTTP_PRTCL"; case HTTP_NOTFOUND: return "HTTP_NOTFOUND"; case HTTP_REFUSED: return "HTTP_REFUSED"; case HTTP_ERROR: return "HTTP_ERROR"; case HTTP_TIMEOUT: return "HTTP_TIMEOUT"; case HTTP_CONN: return "HTTP_CONN"; case HTTP_CLOSED: return "HTTP_CLOSED"; case HTTP_REDIRECT: return "HTTP_REDIRECT"; case HTTP_OK: return "HTTP_OK"; default: return "HTTP Result unknown"; } }