Sample code for using Aeris AerCloud with MultiTech Socket Modem

Dependencies:   FXLS8471Q MPL3115A2 MQTT mbed

Dependents:   MultiTech_AerCloud_ST-sensor_Modem

Fork of 2lemetry_Sensor_Example by Multi-Hackers

Committer:
mchowla
Date:
Fri Dec 12 22:26:35 2014 +0000
Revision:
4:81c6b9d73cb1
Parent:
3:9736a8776102
Initial Version of MultiTech Socket Modem Example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vanger 1:76498fdfbecf 1 /* This is an example program which reads in the 3-axis acceleration, pressure, and temperature data from
Vanger 1:76498fdfbecf 2 * a FRDM-FXS-MULTI sensor board. It then uses an MTSAS SocketModem Shield board to send the read data over
mchowla 4:81c6b9d73cb1 3 * a cellular connection to Aeris AerCloud using an MQTT client protocol.
Vanger 1:76498fdfbecf 4 */
Vanger 1:76498fdfbecf 5
mfiore 0:b8d93d878bcb 6 #include "mbed.h"
mfiore 0:b8d93d878bcb 7 #include "mtsas.h"
mfiore 0:b8d93d878bcb 8 #include "PubSubClient.h"
Vanger 1:76498fdfbecf 9 #include "FXLS8471Q.h"
Vanger 1:76498fdfbecf 10 #include "MPL3115A2.h"
mfiore 0:b8d93d878bcb 11
mchowla 4:81c6b9d73cb1 12 //
mchowla 4:81c6b9d73cb1 13 // PLEASE READ THIS!
mchowla 4:81c6b9d73cb1 14 //
mchowla 4:81c6b9d73cb1 15 // Example was created for the following hardware:
mchowla 4:81c6b9d73cb1 16 // ST Nucleo F401RE http://developer.mbed.org/platforms/ST-Nucleo-F401RE/
mchowla 4:81c6b9d73cb1 17 // Freescale Multi-Sensor Shield https://developer.mbed.org/components/Freescale-Multi-Sensor-Shield/
mchowla 4:81c6b9d73cb1 18 // MultiTech Socket Modem Shield: http://developer.mbed.org/components/Multi-Tech-SocketModem-Arduino-Shield-MT/
mchowla 4:81c6b9d73cb1 19 // MultiTech MTSMC-H5 GSM Socket Modem http://www.multitech.com/models/92503252LF#gsc.tab=0
mchowla 4:81c6b9d73cb1 20 //
mchowla 4:81c6b9d73cb1 21 // To get the sample running, you'll need to fill in the following parameters below
mchowla 4:81c6b9d73cb1 22 // Your cellular provider's APN: _APN
mchowla 4:81c6b9d73cb1 23 // AerCloud API Key: _AERCLOUD_API_APIKEY
mchowla 4:81c6b9d73cb1 24 // AerCloud Account ID: _AERCLOUD_ACCOUNT_ID
mchowla 4:81c6b9d73cb1 25 // AerCloud Container: _ACERCLOUD_CONTAINER
mchowla 4:81c6b9d73cb1 26 //
mchowla 4:81c6b9d73cb1 27 // The AerCloud container needa a Data Model with the following schema:
mchowla 4:81c6b9d73cb1 28 // accel_x FLOAT
mchowla 4:81c6b9d73cb1 29 // accel_y FLOAT
mchowla 4:81c6b9d73cb1 30 // accel-Z FLOAT
mchowla 4:81c6b9d73cb1 31 // pressure FLOAT
mchowla 4:81c6b9d73cb1 32 // temperature FLOAT
mchowla 4:81c6b9d73cb1 33 //
mchowla 4:81c6b9d73cb1 34 // To check if data has made it in the container, create a long polling subscription in AerPort and they use the following url in your browswer
mchowla 4:81c6b9d73cb1 35 //
mchowla 4:81c6b9d73cb1 36 // http://longpoll.aercloud.aeris.com/v1/1/containers/subscriptions/<subscrption_name>/notificationChannels/longPoll?apiKey=<api_key>
mchowla 4:81c6b9d73cb1 37 //
mchowla 4:81c6b9d73cb1 38 // You should see the something that looks like this in the browser:
mchowla 4:81c6b9d73cb1 39 // {"sclContentInstances":[{"sclId":"nucleo-0001","containerId":"Nucleo_Test","contentInstance":{"id":"a40c8e60-8248-11e4-8b38-0677f0dfdf5e","contentSize":90,"creationTime":1418420922950,"content":{"contentType":"application/json","contentTypeBinary":"{\"x\":0.005615,\"y\":-0.041260,\"z\":1.015137,\"pressure\":101098.500000,\"temperature\":25.125000}"}}},
mchowla 4:81c6b9d73cb1 40 //
mchowla 4:81c6b9d73cb1 41 //
mfiore 0:b8d93d878bcb 42
mchowla 4:81c6b9d73cb1 43 char _AERCLOUD_API_KEY[] = "SET_YOUR_API_KEY";
mchowla 4:81c6b9d73cb1 44 char _AERCLOUD_ACCOUNT_ID[] = "SET_YOUR_ACCOUNT_NUMBER";
mchowla 4:81c6b9d73cb1 45 char _AERCLOUD_CONTAINER[] = "Nucleo_Test";
mchowla 4:81c6b9d73cb1 46 char _AERCLOUD_DEVICE_ID[] = "nucleo-0001";
mfiore 0:b8d93d878bcb 47
mchowla 4:81c6b9d73cb1 48 char _APN[] = "SET_YOUR_CELLULAR_PROVIDERS_APN" ";
mfiore 0:b8d93d878bcb 49
mchowla 4:81c6b9d73cb1 50 char _host[] = "mqtt.aercloud.aeris.com";
mfiore 0:b8d93d878bcb 51 int _port = 1883;
mfiore 0:b8d93d878bcb 52
Vanger 1:76498fdfbecf 53 #define MPL3115A2_I2C_ADDRESS (0x60<<1)
Vanger 1:76498fdfbecf 54
Vanger 1:76498fdfbecf 55 #define DATA_INTERVAL 30
Vanger 1:76498fdfbecf 56
mfiore 0:b8d93d878bcb 57 void callback(char* topic, char* payload, unsigned int len) {
mfiore 0:b8d93d878bcb 58 logInfo("topic: [%s]\r\npayload: [%s]", topic, payload);
mfiore 0:b8d93d878bcb 59 }
mfiore 0:b8d93d878bcb 60
mfiore 0:b8d93d878bcb 61 int main() {
mchowla 4:81c6b9d73cb1 62 printf("Hello World\r\n");
mfiore 0:b8d93d878bcb 63 MTSLog::setLogLevel(MTSLog::TRACE_LEVEL);
mfiore 0:b8d93d878bcb 64
mfiore 0:b8d93d878bcb 65 // for Nucleo boards
mfiore 0:b8d93d878bcb 66 MTSSerialFlowControl io(D8, D2, D3, D6);
mfiore 0:b8d93d878bcb 67 io.baud(115200);
mfiore 0:b8d93d878bcb 68
mfiore 0:b8d93d878bcb 69 Cellular* radio = CellularFactory::create(&io);
mfiore 0:b8d93d878bcb 70 if (! radio) {
mfiore 0:b8d93d878bcb 71 logFatal("failed to create Cellular object - exiting");
mfiore 0:b8d93d878bcb 72 return 1;
mfiore 0:b8d93d878bcb 73 }
mfiore 0:b8d93d878bcb 74
mfiore 0:b8d93d878bcb 75 radio->configureSignals(D4,D7,RESET);
mfiore 0:b8d93d878bcb 76 Transport::setTransport(radio);
mfiore 0:b8d93d878bcb 77
mfiore 0:b8d93d878bcb 78 while (radio->setApn(_APN) != MTS_SUCCESS) {
mfiore 0:b8d93d878bcb 79 logError("failed to set APN [%s]", _APN);
mfiore 0:b8d93d878bcb 80 wait(2);
mfiore 0:b8d93d878bcb 81 }
mfiore 0:b8d93d878bcb 82
mfiore 0:b8d93d878bcb 83 while (! radio->connect()) {
mfiore 0:b8d93d878bcb 84 logError("failed to bring up PPP link");
mfiore 0:b8d93d878bcb 85 wait(2);
mfiore 0:b8d93d878bcb 86 }
mfiore 0:b8d93d878bcb 87
mchowla 4:81c6b9d73cb1 88 printf("Signal Strength: %d\n\r", radio->getSignalStrength()); //Check the signal strength should be above 8
mchowla 4:81c6b9d73cb1 89
mchowla 4:81c6b9d73cb1 90 // If you suspect a connectivity issue, uncomment the code below and if ping works. If you are not getting a
mchowla 4:81c6b9d73cb1 91 // valid ping, there's a connectivity problem. First step is to verify you've got the right APN set
mchowla 4:81c6b9d73cb1 92 //
mchowla 4:81c6b9d73cb1 93 // Try pinging default server "8.8.8.8" (Google's DNS)
mchowla 4:81c6b9d73cb1 94 //int ping_valid = 0;
mchowla 4:81c6b9d73cb1 95 //while (ping_valid == 0) {
mchowla 4:81c6b9d73cb1 96 // ping_valid = radio->ping();
mchowla 4:81c6b9d73cb1 97 // printf("Ping Valid: %s\n\r", ping_valid ? "true" : "false");
mchowla 4:81c6b9d73cb1 98 //
mchowla 4:81c6b9d73cb1 99 // if (ping_valid == 0) {
mchowla 4:81c6b9d73cb1 100 // wait(3);
mchowla 4:81c6b9d73cb1 101 // }
mchowla 4:81c6b9d73cb1 102 //}
mchowla 4:81c6b9d73cb1 103
mfiore 0:b8d93d878bcb 104 PubSubClient mqtt(_host, _port, callback);
mfiore 0:b8d93d878bcb 105
Vanger 1:76498fdfbecf 106 char buf[128];
mfiore 0:b8d93d878bcb 107
Vanger 1:76498fdfbecf 108 FXLS8471Q acc(D11, D12, D13, D10);
Vanger 1:76498fdfbecf 109 MPL3115A2 alt(D14, D15, MPL3115A2_I2C_ADDRESS, D4, D3);
Vanger 1:76498fdfbecf 110 alt.Barometric_Mode();
Vanger 1:76498fdfbecf 111
Vanger 1:76498fdfbecf 112 float acc_data[3];
Vanger 1:76498fdfbecf 113
mfiore 0:b8d93d878bcb 114 while (true) {
mchowla 4:81c6b9d73cb1 115 if (! mqtt.connect(_AERCLOUD_DEVICE_ID, _AERCLOUD_ACCOUNT_ID, _AERCLOUD_API_KEY)) {
mchowla 4:81c6b9d73cb1 116 logError("failed to connect to AerCloud Server");
mchowla 4:81c6b9d73cb1 117 wait(5);
mfiore 0:b8d93d878bcb 118 continue;
mfiore 0:b8d93d878bcb 119 }
Vanger 1:76498fdfbecf 120
Vanger 1:76498fdfbecf 121 acc.ReadXYZ(acc_data);
Vanger 1:76498fdfbecf 122
Vanger 1:76498fdfbecf 123 snprintf(buf, sizeof(buf), "{\"x\":%f,\"y\":%f,\"z\":%f,\"pressure\":%f,\"temperature\":%f}", acc_data[0],acc_data[1],acc_data[2], alt.getPressure(), alt.getTemperature());
mfiore 0:b8d93d878bcb 124 logInfo("publishing: [%s]", buf);
mchowla 4:81c6b9d73cb1 125 if (! mqtt.publish(_AERCLOUD_CONTAINER, buf)) {
mfiore 0:b8d93d878bcb 126 logError("failed to publish: [%s]", buf);
mfiore 0:b8d93d878bcb 127 }
mfiore 0:b8d93d878bcb 128 wait(1);
mfiore 0:b8d93d878bcb 129 mqtt.loop();
mfiore 0:b8d93d878bcb 130 mqtt.disconnect();
Vanger 1:76498fdfbecf 131 wait(DATA_INTERVAL);
mfiore 0:b8d93d878bcb 132 }
mfiore 0:b8d93d878bcb 133
mfiore 0:b8d93d878bcb 134 }