IM920地温観測システム CQ 2017ARMセミナー用サンプルプログラム

Dependencies:   C027_Support_ForIM920

Fork of C027_SupportTest by u-blox

Committer:
ntaka206
Date:
Sun Jul 09 11:35:56 2017 +0000
Revision:
34:1cbf923d4ca7
Parent:
33:e27f40fada64
Child:
35:7838543282c2
Initial IM920????M2X?PUT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lawliet 0:4e3cb26f6019 1 #include "mbed.h"
mazgch 9:26f694bc31b4 2
mazgch 19:f022ff746eb8 3 //------------------------------------------------------------------------------------
mazgch 11:b8505cbbd55c 4 /* This example was tested on C027-U20 and C027-G35 with the on board modem.
mazgch 11:b8505cbbd55c 5
mazgch 18:50e6c4ed8a4a 6 Additionally it was tested with a shield where the SARA-G350/U260/U270 RX/TX/PWRON
mazgch 11:b8505cbbd55c 7 is connected to D0/D1/D4 and the GPS SCL/SDA is connected D15/D15. In this
mazgch 11:b8505cbbd55c 8 configuration the following platforms were tested (it is likely that others
mazgch 11:b8505cbbd55c 9 will work as well)
mazgch 19:f022ff746eb8 10 - U-BLOX: C027-G35, C027-U20, C027-C20 (for shield set define C027_FORCE_SHIELD)
mazgch 18:50e6c4ed8a4a 11 - NXP: LPC1549v2, LPC4088qsb
mazgch 18:50e6c4ed8a4a 12 - Freescale: FRDM-KL05Z, FRDM-KL25Z, FRDM-KL46Z, FRDM-K64F
mazgch 12:96c7b62c7aaf 13 - STM: NUCLEO-F401RE, NUCLEO-F030R8
mazgch 18:50e6c4ed8a4a 14 mount resistors SB13/14 1k, SB62/63 0R
mazgch 11:b8505cbbd55c 15 */
mazgch 19:f022ff746eb8 16 #include "GPS.h"
mazgch 19:f022ff746eb8 17 #include "MDM.h"
ntaka206 34:1cbf923d4ca7 18 #include "DebugPrint.h"
ntaka206 34:1cbf923d4ca7 19
mazgch 19:f022ff746eb8 20 //------------------------------------------------------------------------------------
mazgch 19:f022ff746eb8 21 // You need to configure these cellular modem / SIM parameters.
mazgch 19:f022ff746eb8 22 // These parameters are ignored for LISA-C200 variants and can be left NULL.
mazgch 19:f022ff746eb8 23 //------------------------------------------------------------------------------------
mazgch 19:f022ff746eb8 24 //! Set your secret SIM pin here (e.g. "1234"). Check your SIM manual.
ntaka206 34:1cbf923d4ca7 25 #define SIMPIN "0000"
mazgch 19:f022ff746eb8 26 /*! The APN of your network operator SIM, sometimes it is "internet" check your
mazgch 19:f022ff746eb8 27 contract with the network operator. You can also try to look-up your settings in
mazgch 19:f022ff746eb8 28 google: https://www.google.de/search?q=APN+list */
ntaka206 34:1cbf923d4ca7 29 #define APN "soracom.io"
mazgch 19:f022ff746eb8 30 //! Set the user name for your APN, or NULL if not needed
ntaka206 34:1cbf923d4ca7 31 #define USERNAME "sora"
mazgch 19:f022ff746eb8 32 //! Set the password for your APN, or NULL if not needed
ntaka206 34:1cbf923d4ca7 33 #define PASSWORD "sora"
mazgch 19:f022ff746eb8 34 //------------------------------------------------------------------------------------
lawliet 0:4e3cb26f6019 35
msinig 29:16f1037626e3 36 //#define CELLOCATE
msinig 29:16f1037626e3 37
ntaka206 34:1cbf923d4ca7 38 #define IM920_TX P4_28
ntaka206 34:1cbf923d4ca7 39 #define IM920_RX P4_29
ntaka206 34:1cbf923d4ca7 40 Serial im920(IM920_TX, IM920_RX);
ntaka206 34:1cbf923d4ca7 41
ntaka206 34:1cbf923d4ca7 42 #define AD_NUM 3
ntaka206 34:1cbf923d4ca7 43 #define MV_LSB (1500/1024.)
ntaka206 34:1cbf923d4ca7 44 #define DEGC_MV (1/10.)
ntaka206 34:1cbf923d4ca7 45 #define PV_LSB (2*1.5/1024)
ntaka206 34:1cbf923d4ca7 46
ntaka206 34:1cbf923d4ca7 47 #define M2X_SERVER "api-m2x.att.com"
ntaka206 34:1cbf923d4ca7 48 #define M2X_DEVICE_ID "964d05b1a6f4a8bb02c2a5aaf6e7e268"
ntaka206 34:1cbf923d4ca7 49 #define M2X_API_KEY "602d38e9e8dfcf62e7f87a59c80784ec"
ntaka206 34:1cbf923d4ca7 50 #define M2X_CHID_TEMP0 "temp0"
ntaka206 34:1cbf923d4ca7 51
ntaka206 34:1cbf923d4ca7 52
ntaka206 34:1cbf923d4ca7 53 /*
ntaka206 34:1cbf923d4ca7 54 IM920から受信したADデータをデコードする
ntaka206 34:1cbf923d4ca7 55 sn: IM920 SN
ntaka206 34:1cbf923d4ca7 56 *ad: ADデータ配列 LSB
ntaka206 34:1cbf923d4ca7 57 ret: 0=OK -1=ERR
ntaka206 34:1cbf923d4ca7 58 */
ntaka206 34:1cbf923d4ca7 59 int im920_conv(char *in, int *sn, int *ad)
ntaka206 34:1cbf923d4ca7 60 {
ntaka206 34:1cbf923d4ca7 61 char *p;
ntaka206 34:1cbf923d4ca7 62 char *endptr;
ntaka206 34:1cbf923d4ca7 63 int l, h;
ntaka206 34:1cbf923d4ca7 64 int i;
ntaka206 34:1cbf923d4ca7 65
ntaka206 34:1cbf923d4ca7 66 p = strtok(in, ",");
ntaka206 34:1cbf923d4ca7 67 // SN
ntaka206 34:1cbf923d4ca7 68 p = strtok(NULL, ",");
ntaka206 34:1cbf923d4ca7 69 *sn = strtol(p, &endptr, 16);
ntaka206 34:1cbf923d4ca7 70 // SUM
ntaka206 34:1cbf923d4ca7 71 p = strtok(NULL, ":");
ntaka206 34:1cbf923d4ca7 72 // printf("%s ", p);
ntaka206 34:1cbf923d4ca7 73 // AD0-2
ntaka206 34:1cbf923d4ca7 74 for(i = 0; i < AD_NUM; i++) {
ntaka206 34:1cbf923d4ca7 75 p = strtok(NULL, ",");
ntaka206 34:1cbf923d4ca7 76 // printf("%s ", p);
ntaka206 34:1cbf923d4ca7 77 l = strtol(p, &endptr, 16);
ntaka206 34:1cbf923d4ca7 78 p = strtok(NULL, ",");
ntaka206 34:1cbf923d4ca7 79 // printf("%s ", p);
ntaka206 34:1cbf923d4ca7 80 h = strtol(p, &endptr, 16);
ntaka206 34:1cbf923d4ca7 81 ad[i] = l + h*256;
ntaka206 34:1cbf923d4ca7 82 }
ntaka206 34:1cbf923d4ca7 83
ntaka206 34:1cbf923d4ca7 84 return 0;
ntaka206 34:1cbf923d4ca7 85 }
ntaka206 34:1cbf923d4ca7 86
ntaka206 34:1cbf923d4ca7 87 /**
ntaka206 34:1cbf923d4ca7 88 * M2X HTTP送信
ntaka206 34:1cbf923d4ca7 89 * @param http HTTP送信する文字列
ntaka206 34:1cbf923d4ca7 90 * @param hostname
ntaka206 34:1cbf923d4ca7 91 * @return 0=OK -1=ERR
ntaka206 34:1cbf923d4ca7 92 */
ntaka206 34:1cbf923d4ca7 93 int cloud_http_socket_send(MDMSerial *mdm, char *http, const char *hostname)
ntaka206 34:1cbf923d4ca7 94 {
ntaka206 34:1cbf923d4ca7 95 int socket;
ntaka206 34:1cbf923d4ca7 96 char data[512]; // receive
ntaka206 34:1cbf923d4ca7 97 char *strtokptr;
ntaka206 34:1cbf923d4ca7 98 char *ptr;
ntaka206 34:1cbf923d4ca7 99
ntaka206 34:1cbf923d4ca7 100 socket = mdm->socketSocket(MDMParser::IPPROTO_TCP);
ntaka206 34:1cbf923d4ca7 101 if (socket >= 0) {
ntaka206 34:1cbf923d4ca7 102 mdm->socketSetBlocking(socket, 60*1000); // timeout im msec
ntaka206 34:1cbf923d4ca7 103 // 指定されたhostにSocket Connect
ntaka206 34:1cbf923d4ca7 104 if (!mdm->socketConnect(socket, hostname, 80)) {
ntaka206 34:1cbf923d4ca7 105 ERROR("ERROR socket connect\r\n");
ntaka206 34:1cbf923d4ca7 106 ERROR("hostname=%s\r\n", hostname);
ntaka206 34:1cbf923d4ca7 107 return -1;
ntaka206 34:1cbf923d4ca7 108 }
ntaka206 34:1cbf923d4ca7 109 TRACE("socketConnect() OK\r\n");
ntaka206 34:1cbf923d4ca7 110 } else {
ntaka206 34:1cbf923d4ca7 111 ERROR("sockeSocket() < 0\r\n");
ntaka206 34:1cbf923d4ca7 112 ERROR("hostname=%s\r\n", hostname);
ntaka206 34:1cbf923d4ca7 113 return -1;
ntaka206 34:1cbf923d4ca7 114 }
ntaka206 34:1cbf923d4ca7 115 int ret = mdm->socketSend(socket, http, strlen(http));
ntaka206 34:1cbf923d4ca7 116 TRACE("socketSend()=%d\r\n", ret);
ntaka206 34:1cbf923d4ca7 117 // Recv responce 十分な大きさの変数を渡す必要あり
ntaka206 34:1cbf923d4ca7 118 ret = mdm->socketRecv(socket, data, sizeof(data)-1);
ntaka206 34:1cbf923d4ca7 119 TRACE("socketRecv()=%d\r\n", ret);
ntaka206 34:1cbf923d4ca7 120 // 毎回Socket Closeが必要みたい
ntaka206 34:1cbf923d4ca7 121 mdm->socketClose(socket);
ntaka206 34:1cbf923d4ca7 122 mdm->socketFree(socket);
ntaka206 34:1cbf923d4ca7 123 // HTTPレスポンス受信出来た
ntaka206 34:1cbf923d4ca7 124 if (ret > 0) {
ntaka206 34:1cbf923d4ca7 125 TRACE("Socket Recv \"%s\"\r\n", data);
ntaka206 34:1cbf923d4ca7 126 // HTTPレスポンスcheck
ntaka206 34:1cbf923d4ca7 127 // ERR retryは呼び出し元でしている
ntaka206 34:1cbf923d4ca7 128 // 1行目抽出
ntaka206 34:1cbf923d4ca7 129 ptr = strtok_r(data, "\r\n", &strtokptr);
ntaka206 34:1cbf923d4ca7 130 // Status Code抽出
ntaka206 34:1cbf923d4ca7 131 ptr = strtok_r(ptr, " ", &strtokptr);
ntaka206 34:1cbf923d4ca7 132 ptr = strtok_r(NULL, " ", &strtokptr);
ntaka206 34:1cbf923d4ca7 133 int code = atoi(ptr);
ntaka206 34:1cbf923d4ca7 134 // ログにレスポンスコードout
ntaka206 34:1cbf923d4ca7 135 INFO("HTTP Res=%d\r\n", code);
ntaka206 34:1cbf923d4ca7 136 // Code=200番台以外ならばエラー
ntaka206 34:1cbf923d4ca7 137 // m2x 202(Accepted)
ntaka206 34:1cbf923d4ca7 138 if (code < 200 || code >= 300) {
ntaka206 34:1cbf923d4ca7 139 ERROR("HTTP Response ERR code=%d\r\n", code);
ntaka206 34:1cbf923d4ca7 140 return -1;
ntaka206 34:1cbf923d4ca7 141 }
ntaka206 34:1cbf923d4ca7 142 } else {
ntaka206 34:1cbf923d4ca7 143 // レスポンス受信できず
ntaka206 34:1cbf923d4ca7 144 ERROR("HTTP Response rcv ERR ret=%d\r\n", ret);
ntaka206 34:1cbf923d4ca7 145 return -1;
ntaka206 34:1cbf923d4ca7 146 }
ntaka206 34:1cbf923d4ca7 147 return 0;
ntaka206 34:1cbf923d4ca7 148 }
ntaka206 34:1cbf923d4ca7 149 /**
ntaka206 34:1cbf923d4ca7 150 * M2X にHTTP PUT送信する
ntaka206 34:1cbf923d4ca7 151 * HTTPデータを作って送信する
ntaka206 34:1cbf923d4ca7 152 * API V2 POST
ntaka206 34:1cbf923d4ca7 153 * @param *data JSONデータ (mag+powerv data)
ntaka206 34:1cbf923d4ca7 154 * @return 0=OK -1=ERR
ntaka206 34:1cbf923d4ca7 155 */
ntaka206 34:1cbf923d4ca7 156 static char m2x_http_send(MDMSerial *mdm, int sn, int *ad)
ntaka206 34:1cbf923d4ca7 157 {
ntaka206 34:1cbf923d4ca7 158 char http_data[512];
ntaka206 34:1cbf923d4ca7 159 char data[128];
ntaka206 34:1cbf923d4ca7 160 // char buf[128];
ntaka206 34:1cbf923d4ca7 161
ntaka206 34:1cbf923d4ca7 162 #if 0
ntaka206 34:1cbf923d4ca7 163 data[0] = 0;
ntaka206 34:1cbf923d4ca7 164 strncat(data, "{\"values\": {\r\n", sizeof(data));
ntaka206 34:1cbf923d4ca7 165 sprintf(buf, "\"%s\": [\r\n", M2X_CHID_TEMP0);
ntaka206 34:1cbf923d4ca7 166 strncat(data, buf, sizeof(data));
ntaka206 34:1cbf923d4ca7 167
ntaka206 34:1cbf923d4ca7 168 sprintf(buf, "{ \"value\":%6.1f}", (ad[0]*MV_LSB-500)*DEGC_MV);
ntaka206 34:1cbf923d4ca7 169 strncat(data, buf, sizeof(data));
ntaka206 34:1cbf923d4ca7 170 strncat(data, "],\r\n", sizeof(data));
ntaka206 34:1cbf923d4ca7 171 strncat(data, "}}", sizeof(data));
ntaka206 34:1cbf923d4ca7 172 #endif
ntaka206 34:1cbf923d4ca7 173 sprintf(data, "{ \"value\": \"%6.1f\" }", (ad[0]*MV_LSB-500)*DEGC_MV);
ntaka206 34:1cbf923d4ca7 174
ntaka206 34:1cbf923d4ca7 175 // HTTP PUTデータ作る
ntaka206 34:1cbf923d4ca7 176 snprintf(http_data, sizeof(http_data), "PUT /v2/devices/%s/streams/%04d-temp0/value HTTP/1.0\r\n"
ntaka206 34:1cbf923d4ca7 177 "X-M2X-KEY: %s\r\n"
ntaka206 34:1cbf923d4ca7 178 "Host: %s\r\n"
ntaka206 34:1cbf923d4ca7 179 "Content-Type: application/json\r\n"
ntaka206 34:1cbf923d4ca7 180 "Content-Length: %d\r\n\r\n%s\r\n",
ntaka206 34:1cbf923d4ca7 181 M2X_DEVICE_ID, sn, M2X_API_KEY, M2X_SERVER,
ntaka206 34:1cbf923d4ca7 182 strlen(data), data);
ntaka206 34:1cbf923d4ca7 183 TRACE(http_data);
ntaka206 34:1cbf923d4ca7 184 // HTTP PUTする
ntaka206 34:1cbf923d4ca7 185 return cloud_http_socket_send(mdm, http_data, M2X_SERVER);
ntaka206 34:1cbf923d4ca7 186 }
ntaka206 34:1cbf923d4ca7 187
lawliet 0:4e3cb26f6019 188 int main(void)
lawliet 0:4e3cb26f6019 189 {
mazgch 2:b77151f111a9 190 int ret;
mazgch 19:f022ff746eb8 191 #ifdef LARGE_DATA
mazgch 16:43f6de7bc38b 192 char buf[2048] = "";
mazgch 17:c293780a40ac 193 #else
mazgch 17:c293780a40ac 194 char buf[512] = "";
mazgch 17:c293780a40ac 195 #endif
ntaka206 34:1cbf923d4ca7 196 const int wait = 100;
ntaka206 34:1cbf923d4ca7 197 int ad[AD_NUM];
ntaka206 34:1cbf923d4ca7 198 int sn;
ntaka206 34:1cbf923d4ca7 199
ntaka206 34:1cbf923d4ca7 200 im920.baud(19200);
ntaka206 34:1cbf923d4ca7 201 im920.format(8, Serial::None, 1);
lawliet 0:4e3cb26f6019 202
mazgch 19:f022ff746eb8 203 // Create the GPS object
mazgch 19:f022ff746eb8 204 #if 1 // use GPSI2C class
ntaka206 34:1cbf923d4ca7 205 // GPSI2C gps;
mazgch 19:f022ff746eb8 206 #else // or GPSSerial class
ntaka206 34:1cbf923d4ca7 207 // GPSSerial gps;
mazgch 10:d2da2028a233 208 #endif
mazgch 10:d2da2028a233 209 // Create the modem object
mazgch 32:b838fcaba45e 210 MDMSerial mdm; // use mdm(D1,D0) if you connect the cellular shield to a C027
mazgch 28:334263983fcd 211 //mdm.setDebug(4); // enable this for debugging issues
mazgch 2:b77151f111a9 212 // initialize the modem
mazgch 19:f022ff746eb8 213 MDMParser::DevStatus devStatus = {};
mazgch 19:f022ff746eb8 214 MDMParser::NetStatus netStatus = {};
mazgch 10:d2da2028a233 215 bool mdmOk = mdm.init(SIMPIN, &devStatus);
mazgch 19:f022ff746eb8 216 mdm.dumpDevStatus(&devStatus);
mazgch 19:f022ff746eb8 217 if (mdmOk) {
mazgch 20:52f0e5de8c3d 218 // wait until we are connected
mazgch 20:52f0e5de8c3d 219 mdmOk = mdm.registerNet(&netStatus);
mazgch 20:52f0e5de8c3d 220 mdm.dumpNetStatus(&netStatus);
mazgch 20:52f0e5de8c3d 221 }
mazgch 20:52f0e5de8c3d 222 if (mdmOk)
mazgch 20:52f0e5de8c3d 223 {
mazgch 4:90ab1ec64b0e 224 // join the internet connection
mazgch 19:f022ff746eb8 225 MDMParser::IP ip = mdm.join(APN,USERNAME,PASSWORD);
mazgch 32:b838fcaba45e 226 if (ip == NOIP)
mazgch 32:b838fcaba45e 227 printf("Not able to join network");
mazgch 32:b838fcaba45e 228 else
mazgch 2:b77151f111a9 229 {
mazgch 19:f022ff746eb8 230 mdm.dumpIp(ip);
mazgch 2:b77151f111a9 231 }
ntaka206 34:1cbf923d4ca7 232 } else {
ntaka206 34:1cbf923d4ca7 233 goto ErrOut;
mazgch 10:d2da2028a233 234 }
ntaka206 34:1cbf923d4ca7 235 /*
ntaka206 34:1cbf923d4ca7 236 MAIN LOOP
ntaka206 34:1cbf923d4ca7 237 */
ntaka206 34:1cbf923d4ca7 238 printf("LOOP START\r\n");
ntaka206 34:1cbf923d4ca7 239 while(true) {
ntaka206 34:1cbf923d4ca7 240 if (im920.gets(buf, 128) > 0) {
ntaka206 34:1cbf923d4ca7 241 printf("%s", buf);
ntaka206 34:1cbf923d4ca7 242 if (!im920_conv(buf, &sn, ad)) {
ntaka206 34:1cbf923d4ca7 243 printf ("IM920: %06d, %04d, %04d, %04d\r\n", sn, ad[0], ad[1], ad[2]);
ntaka206 34:1cbf923d4ca7 244 printf ("IM920: %06d, %f, %f, %f\r\n", sn, (ad[0]*MV_LSB-500)*DEGC_MV, (ad[1]*MV_LSB-500)*DEGC_MV, ad[2]*PV_LSB);
ntaka206 34:1cbf923d4ca7 245 m2x_http_send(&mdm, sn, ad);
mazgch 4:90ab1ec64b0e 246 }
mazgch 9:26f694bc31b4 247 }
mazgch 31:a07d0f76dc81 248 #ifdef RTOS_H
mazgch 31:a07d0f76dc81 249 Thread::wait(wait);
mazgch 31:a07d0f76dc81 250 #else
mazgch 31:a07d0f76dc81 251 ::wait_ms(wait);
mazgch 31:a07d0f76dc81 252 #endif
lawliet 0:4e3cb26f6019 253 }
ntaka206 34:1cbf923d4ca7 254 ErrOut:
ntaka206 34:1cbf923d4ca7 255 // gps.powerOff();
mazgch 10:d2da2028a233 256 mdm.powerOff();
lawliet 0:4e3cb26f6019 257 return 0;
lawliet 0:4e3cb26f6019 258 }