SmartREST client reference implementation for the u-blox C027 mbed compatible device.

Dependencies:   C027 C027_Support mbed mbed-rtos MbedSmartRest LM75B MMA7660 C12832

Fork of MbedSmartRestTest by Vincent Wochnik

Committer:
vwochnik
Date:
Wed Feb 05 16:22:22 2014 +0000
Revision:
5:dee05a7c70f9
Parent:
4:363b4cc49445
Child:
6:642e7c233e83
fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vwochnik 0:ed4d6fd405ea 1 #include "mbed.h"
vwochnik 0:ed4d6fd405ea 2 #include "C027.h"
vwochnik 0:ed4d6fd405ea 3 #include "UbloxUSBGSMModem.h"
vwochnik 0:ed4d6fd405ea 4 #include "UbloxUSBCDMAModem.h"
vwochnik 0:ed4d6fd405ea 5
vwochnik 4:363b4cc49445 6 #include "MbedSmartRest.h"
vwochnik 4:363b4cc49445 7 #include "StaticData.h"
vwochnik 4:363b4cc49445 8 #include "ComposedRecord.h"
vwochnik 4:363b4cc49445 9 #include "CharValue.h"
vwochnik 4:363b4cc49445 10 #include "IntegerValue.h"
vwochnik 5:dee05a7c70f9 11 #include "FloatValue.h"
vwochnik 4:363b4cc49445 12
vwochnik 5:dee05a7c70f9 13 const char * const serialNumber = "ublox-123456789";
vwochnik 4:363b4cc49445 14 StaticData srtpl(
vwochnik 4:363b4cc49445 15 // get device by identity
vwochnik 4:363b4cc49445 16 // Usage: 100,<SERIAL/NR>
vwochnik 4:363b4cc49445 17 "10,100,GET,/identity/externalIds/c8y_Serial/%%,,application/vnd.com.nsn.cumulocity.externalId+json,%%,STRING,\r\n"
vwochnik 4:363b4cc49445 18 // get device id from identity
vwochnik 4:363b4cc49445 19 // Response: 200,<DEVICE/ID>
vwochnik 4:363b4cc49445 20 "11,200,\"$.managedObject\",,\"$.id\"\r\n"
vwochnik 4:363b4cc49445 21 // Create device
vwochnik 4:363b4cc49445 22 // Usage: 101,<SERIAL/NR>
vwochnik 5:dee05a7c70f9 23 "10,101,POST,/inventory/managedObjects,application/vnd.com.nsn.cumulocity.managedObject+json,application/vnd.com.nsn.cumulocity.managedObject+json,%%,STRING,\"{\"\"name\"\":\"\"Curl Test Device\"\",\"\"type\"\":\"\"com_yourcompany?CurlDevice_1.0\"\",\"\"c8y_Hardware\"\":{\"\"revision\"\":\"\"1\"\",\"\"model\"\":\"\"Curl Test Device\"\",\"\"serialNumber\"\":\"\"%%\"\"},\"\"c8y_SupportedMeasurements\"\":[\"\"c8y_SignalStrength\"\"],\"\"c8y_IsDevice\"\":{}}\"\r\n"
vwochnik 4:363b4cc49445 24 // Get device id
vwochnik 4:363b4cc49445 25 // Response: 201,<DEVICE/ID>
vwochnik 4:363b4cc49445 26 "11,201,,\"$.c8y_IsDevice\",\"$.id\"\r\n"
vwochnik 4:363b4cc49445 27 // Insert global ID
vwochnik 4:363b4cc49445 28 // Usage: 102,<DEVICE/ID>,<SERIAL/NR>
vwochnik 4:363b4cc49445 29 "10,102,POST,/identity/globalIds/%%/externalIds,application/vnd.com.nsn.cumulocity.externalId+json,application/vnd.com.nsn.cumulocity.externalId+json,%%,UNSIGNED STRING,\"{\"\"type\"\":\"\"c8y_Serial\"\",\"\"externalId\"\":\"\"%%\"\"}\"\r\n"
vwochnik 5:dee05a7c70f9 30 // Insert measurement
vwochnik 5:dee05a7c70f9 31 // USAGE: 103,<DEVICE/ID>,<RSSI>,<BER>
vwochnik 5:dee05a7c70f9 32 "10,103,POST,/measurement/measurements,application/vnd.com.nsn.cumulocity.measurement+json,application/vnd.com.nsn.cumulocity.measurement+json,%%,NOW UNSIGNED NUMBER UNSIGNED,\"{\"\"time\"\":\"\"%%\"\",\"\"source\"\":{\"\"id\"\":\"\"%%\"\"},\"\"type\"\":\"\"c8y_SignalStrength\"\",\"\"c8y_SignalStrength\"\":{\"\"rssi\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"dBm\"\"},\"\"ber\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"%\"\"}}}\"\r\n"
vwochnik 4:363b4cc49445 33 );
vwochnik 4:363b4cc49445 34
vwochnik 4:363b4cc49445 35 long existing();
vwochnik 4:363b4cc49445 36 long create();
vwochnik 4:363b4cc49445 37 bool identify(long deviceId);
vwochnik 5:dee05a7c70f9 38 bool measurement(long deviceId, double rssi, int ber);
vwochnik 0:ed4d6fd405ea 39
vwochnik 0:ed4d6fd405ea 40 C027 c027;
vwochnik 5:dee05a7c70f9 41 MbedSmartRest client("http://developer.cumulocity.com/s", "vaillant/admin", "klanpi", "com_u-blox_C027_REV-A_0.3");
vwochnik 5:dee05a7c70f9 42 //MbedSmartRest client("http://nocore.info:8888/", "vaillant/admin", "klanpi", "com_cumulocity_MbedTestDevice_2.0");
vwochnik 0:ed4d6fd405ea 43
vwochnik 0:ed4d6fd405ea 44 int main()
vwochnik 0:ed4d6fd405ea 45 {
vwochnik 5:dee05a7c70f9 46 long deviceId; double rssi; int ber;
vwochnik 5:dee05a7c70f9 47
vwochnik 5:dee05a7c70f9 48 puts("Hello!");
vwochnik 4:363b4cc49445 49
vwochnik 5:dee05a7c70f9 50 c027.mdmWakeup();
vwochnik 5:dee05a7c70f9 51 c027.mdmReset();
vwochnik 5:dee05a7c70f9 52 c027.mdmPower(true);
vwochnik 5:dee05a7c70f9 53 UbloxUSBGSMModem modem;
vwochnik 4:363b4cc49445 54
vwochnik 4:363b4cc49445 55 if (modem.connect("public4.m2minternet.com")) {
vwochnik 4:363b4cc49445 56 puts("GPRS connection failure.");
vwochnik 4:363b4cc49445 57 return 2;
vwochnik 4:363b4cc49445 58 }
vwochnik 5:dee05a7c70f9 59
vwochnik 4:363b4cc49445 60 puts("Bootstrapping");
vwochnik 4:363b4cc49445 61 if (client.bootstrap(srtpl) != SMARTREST_SUCCESS) {
vwochnik 4:363b4cc49445 62 puts("Bootstrapping failed.");
vwochnik 4:363b4cc49445 63 return 2;
vwochnik 4:363b4cc49445 64 }
vwochnik 5:dee05a7c70f9 65
vwochnik 5:dee05a7c70f9 66 puts("Starting action...");
vwochnik 5:dee05a7c70f9 67
vwochnik 4:363b4cc49445 68 if ((deviceId = existing()) == 0) {
vwochnik 4:363b4cc49445 69 deviceId = create();
vwochnik 4:363b4cc49445 70 if (deviceId != 0)
vwochnik 4:363b4cc49445 71 identify(deviceId);
vwochnik 4:363b4cc49445 72 }
vwochnik 4:363b4cc49445 73
vwochnik 4:363b4cc49445 74 printf("Device ID: %ld\r\n", deviceId);
vwochnik 5:dee05a7c70f9 75
vwochnik 5:dee05a7c70f9 76 if (deviceId != 0) {
vwochnik 5:dee05a7c70f9 77 rssi = -50;
vwochnik 5:dee05a7c70f9 78 ber = 50;
vwochnik 5:dee05a7c70f9 79
vwochnik 5:dee05a7c70f9 80 while (true) {
vwochnik 5:dee05a7c70f9 81 printf("[MEASUREMENT] RSSI: %lf, BER: %d %%\n", rssi, ber);
vwochnik 5:dee05a7c70f9 82 measurement(deviceId, rssi, ber);
vwochnik 5:dee05a7c70f9 83 wait(60000);
vwochnik 5:dee05a7c70f9 84 }
vwochnik 5:dee05a7c70f9 85 }
vwochnik 4:363b4cc49445 86
vwochnik 4:363b4cc49445 87 modem.disconnect();
vwochnik 4:363b4cc49445 88 c027.mdmPower(false);
vwochnik 4:363b4cc49445 89 return 0;
vwochnik 4:363b4cc49445 90 }
vwochnik 4:363b4cc49445 91
vwochnik 4:363b4cc49445 92 long existing()
vwochnik 4:363b4cc49445 93 {
vwochnik 4:363b4cc49445 94 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 4:363b4cc49445 95 ParsedRecord received;
vwochnik 4:363b4cc49445 96
vwochnik 4:363b4cc49445 97 puts("Checking for device existance...");
vwochnik 4:363b4cc49445 98
vwochnik 4:363b4cc49445 99 newMoRec.add(IntegerValue(100)).add(CharValue(serialNumber));
vwochnik 4:363b4cc49445 100
vwochnik 4:363b4cc49445 101 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 4:363b4cc49445 102 puts("Send failed.");
vwochnik 4:363b4cc49445 103 return 0;
vwochnik 4:363b4cc49445 104 }
vwochnik 4:363b4cc49445 105
vwochnik 4:363b4cc49445 106 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 4:363b4cc49445 107 puts("No device found.");
vwochnik 4:363b4cc49445 108 return 0;
vwochnik 4:363b4cc49445 109 }
vwochnik 4:363b4cc49445 110
vwochnik 4:363b4cc49445 111 if (received.values() == 0) {
vwochnik 4:363b4cc49445 112 puts("Received no values.");
vwochnik 4:363b4cc49445 113 return 0;
vwochnik 4:363b4cc49445 114 }
vwochnik 4:363b4cc49445 115 if (received.value(0).integerValue() == 50) {
vwochnik 4:363b4cc49445 116 client.stop();
vwochnik 4:363b4cc49445 117 return 0;
vwochnik 4:363b4cc49445 118 }
vwochnik 4:363b4cc49445 119
vwochnik 4:363b4cc49445 120 if (received.value(0).integerValue() != 200) {
vwochnik 4:363b4cc49445 121 puts("Bad response.");
vwochnik 4:363b4cc49445 122 return 0;
vwochnik 0:ed4d6fd405ea 123 }
vwochnik 0:ed4d6fd405ea 124
vwochnik 4:363b4cc49445 125 client.stop();
vwochnik 4:363b4cc49445 126 return received.value(2).integerValue();
vwochnik 0:ed4d6fd405ea 127 }
vwochnik 4:363b4cc49445 128
vwochnik 4:363b4cc49445 129 long create()
vwochnik 4:363b4cc49445 130 {
vwochnik 4:363b4cc49445 131 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 4:363b4cc49445 132 ParsedRecord received;
vwochnik 4:363b4cc49445 133
vwochnik 4:363b4cc49445 134 puts("Creating device...");
vwochnik 4:363b4cc49445 135
vwochnik 4:363b4cc49445 136 newMoRec.add(IntegerValue(101)).add(CharValue(serialNumber));
vwochnik 4:363b4cc49445 137
vwochnik 4:363b4cc49445 138 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 4:363b4cc49445 139 puts("Send failed.");
vwochnik 4:363b4cc49445 140 return 0;
vwochnik 4:363b4cc49445 141 }
vwochnik 4:363b4cc49445 142
vwochnik 4:363b4cc49445 143 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 4:363b4cc49445 144 puts("No device found.");
vwochnik 4:363b4cc49445 145 return 0;
vwochnik 4:363b4cc49445 146 }
vwochnik 4:363b4cc49445 147
vwochnik 4:363b4cc49445 148 if (received.values() != 3) {
vwochnik 4:363b4cc49445 149 puts("Bad received data.");
vwochnik 4:363b4cc49445 150 return 0;
vwochnik 4:363b4cc49445 151 }
vwochnik 4:363b4cc49445 152
vwochnik 4:363b4cc49445 153 if (received.value(0).integerValue() != 201) {
vwochnik 4:363b4cc49445 154 puts("Bad received data.");
vwochnik 4:363b4cc49445 155 return 0;
vwochnik 4:363b4cc49445 156 }
vwochnik 4:363b4cc49445 157
vwochnik 4:363b4cc49445 158 client.stop();
vwochnik 4:363b4cc49445 159 return received.value(2).integerValue();
vwochnik 4:363b4cc49445 160 }
vwochnik 4:363b4cc49445 161
vwochnik 4:363b4cc49445 162 bool identify(long deviceId)
vwochnik 4:363b4cc49445 163 {
vwochnik 4:363b4cc49445 164 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 4:363b4cc49445 165 ParsedRecord received;
vwochnik 4:363b4cc49445 166
vwochnik 4:363b4cc49445 167 puts("Adding global identifier...");
vwochnik 4:363b4cc49445 168
vwochnik 4:363b4cc49445 169 newMoRec.add(IntegerValue(102)).add(IntegerValue(deviceId)).add(CharValue(serialNumber));
vwochnik 4:363b4cc49445 170
vwochnik 4:363b4cc49445 171 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 4:363b4cc49445 172 puts("Sending failed.");
vwochnik 4:363b4cc49445 173 return false;
vwochnik 4:363b4cc49445 174 }
vwochnik 4:363b4cc49445 175
vwochnik 4:363b4cc49445 176 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 4:363b4cc49445 177 puts("Failed.");
vwochnik 4:363b4cc49445 178 return false;
vwochnik 4:363b4cc49445 179 }
vwochnik 4:363b4cc49445 180
vwochnik 4:363b4cc49445 181 if (received.values() != 3) {
vwochnik 4:363b4cc49445 182 puts("Received bad data.");
vwochnik 4:363b4cc49445 183 return false;
vwochnik 4:363b4cc49445 184 }
vwochnik 4:363b4cc49445 185
vwochnik 4:363b4cc49445 186 if (received.value(0).integerValue() != 200) {
vwochnik 4:363b4cc49445 187 puts("Received bad data.");
vwochnik 4:363b4cc49445 188 return false;
vwochnik 4:363b4cc49445 189 }
vwochnik 4:363b4cc49445 190
vwochnik 4:363b4cc49445 191 client.stop();
vwochnik 4:363b4cc49445 192 return true;
vwochnik 4:363b4cc49445 193 }
vwochnik 5:dee05a7c70f9 194
vwochnik 5:dee05a7c70f9 195 bool measurement(long deviceId, double rssi, int ber)
vwochnik 5:dee05a7c70f9 196 {
vwochnik 5:dee05a7c70f9 197 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 5:dee05a7c70f9 198
vwochnik 5:dee05a7c70f9 199 puts("Creating measurement...");
vwochnik 5:dee05a7c70f9 200
vwochnik 5:dee05a7c70f9 201 newMoRec.add(IntegerValue(103)).add(IntegerValue(deviceId)).add(FloatValue(rssi, 0)).add(IntegerValue(ber));
vwochnik 5:dee05a7c70f9 202
vwochnik 5:dee05a7c70f9 203 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 5:dee05a7c70f9 204 puts("Send failed.");
vwochnik 5:dee05a7c70f9 205 return false;
vwochnik 5:dee05a7c70f9 206 }
vwochnik 5:dee05a7c70f9 207
vwochnik 5:dee05a7c70f9 208 client.stop();
vwochnik 5:dee05a7c70f9 209 return true;
vwochnik 5:dee05a7c70f9 210 }