Sample program for communicating with Fujitsuu IoT Platform using HTTP

Dependencies:   AsciiFont GR-PEACH_video GraphicsFramework LCD_shield_config R_BSP USBHost_custom easy-connect-gr-peach mbed-http picojson BM1383GLV KX022 rohm-sensor-hal rohm-bh1745

Overview

This sample program shows how to send the cognitive data and sensing data gathered by Omron HVC-P2 and Rohm Sensor Shield respectively to IoT Platform managed by FUJITSU ( http://jp.fujitsu.com/solutions/cloud/k5/function/paas/iot-platform/ ).

Required Hardware

Application Setup

  1. Configure the connection type. For details, please refer to the following link:
    https://developer.mbed.org/teams/Renesas/code/GR-PEACH_IoT_Platform_HTTP_sample/wiki/Connection-Type
  2. Configure Ethernet settings. For details, please refer to the following link:
    https://developer.mbed.org/teams/Renesas/code/GR-PEACH_IoT_Platform_HTTP_sample/wiki/Ethernet-settings
  3. Set up the Access Code of resource where the gathered data would be stored. For details on Access Code, please refer to the following links:
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/userguide_en.pdf
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/apireference_en.pdf
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/portalmanual_en.pdf
  4. Set up URI for the resource where the gathered data would be stored. For details, please refer to the following link:
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/userguide_en.pdf
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/apireference_en.pdf

Building Example

  1. Import this sample program onto mbed Compiler
  2. Configure the program in accordance with the description of Application Setup above
  3. Compile the sample program
  4. Plug the Ethernet cable into GR-PEACH if you would like Ethernet mode
  5. Plug micro-USB cable into the OpenSDA port which lies on the next to the RESET button
  6. Copy the binary previously downloaded to your PC to GR-PEACH in order to flash this program. When the copy is successfully completed, the drive named MBED should be re-mounted automatically
  7. Press the RESET button on the board to run the sample application

Data Format sent to IoT Platform

In this sample program, the cognitive data and sensing data are serialized into the following JSON format using picojson (https://developer.mbed.org/users/mimil/code/picojson/):

  • Face detection data

{
    "RecordType": "HVC-P2(face)",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "Age": xxx,
    "FaceRectangle": {
        "Height": xxx,
        "Left": xxx,
        "Top": xxx,
        "Width": xxx
    },
    "Gender": xxx,
    "Scores": {
        "Anger": xxx,
        "Happiness": xxx,
        "Neutral": xxx,
        "Sadness": xxx,
        "Surprise": xxx
    }
}
  • Body detection data

{
    "RecodeType": "HVC-P2(body)",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "BodyRectangle": {
        "Height": xxx,
        "Left": xxx,
        "Top": xxx,
        "Width": xxx
    }
}
  • Accelerometer data

{
    "RecodeType": "Accelerometer",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ acceleratoin(x-direction), acceleration(y-direction), acceleration(z-direction), null, null, null ]
}

Note that data[0], data[1] and data[2] are filled with the acceleration data in x, y and z direction respectively, and the remaining elements are filled with null.

  • Atmosphere data

{
    "RecodeType": "Atmosphere",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ atmosphere data, null, null, null, null, null ]
}

Note that data[0] is filled with atmosphere data, and the remaining elements are filled with null.

  • Color sensor data

{
    "RecodeType": "Color",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ Red, Green, Blue, Alpha, null, null]
}

Note that data[0], data[1], data[2] and data[3] are filled with Red, Green, Blue and Alpha elements of color respectively, and the remaining elements are filled with null.

  • Temperature data

{
    "RecodeType": "Temperature",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ Temperature, null, null, null, null, null ]
}

Note that data[0] is filled with temperature data, the remaining elements are filled with null.

  • Geomagnetism

{
    "RecodeType": "Geomagnetism",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ geomagnetism(x-direction), geomagnetism(y-direction), geomagnetism(z-direction), null, null, null]
}

Note that data[0], data[1] and data[2] are filled with the geomagnetism data in x, y and z direction respectively, and the remaining elements are filled with null.

Committer:
Osamu Nakamura
Date:
Thu Apr 12 19:04:23 2018 +0900
Revision:
7:9ae73f85dc04
Parent:
0:8373b6833bde
Update BM1422AGMV driver so that it can be compiled by ARMCC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Osamu Nakamura 0:8373b6833bde 1 /* NTPClient.cpp */
Osamu Nakamura 0:8373b6833bde 2 /* Copyright (C) 2012 mbed.org, MIT License
Osamu Nakamura 0:8373b6833bde 3 *
Osamu Nakamura 0:8373b6833bde 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Osamu Nakamura 0:8373b6833bde 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
Osamu Nakamura 0:8373b6833bde 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
Osamu Nakamura 0:8373b6833bde 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
Osamu Nakamura 0:8373b6833bde 8 * furnished to do so, subject to the following conditions:
Osamu Nakamura 0:8373b6833bde 9 *
Osamu Nakamura 0:8373b6833bde 10 * The above copyright notice and this permission notice shall be included in all copies or
Osamu Nakamura 0:8373b6833bde 11 * substantial portions of the Software.
Osamu Nakamura 0:8373b6833bde 12 *
Osamu Nakamura 0:8373b6833bde 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
Osamu Nakamura 0:8373b6833bde 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Osamu Nakamura 0:8373b6833bde 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
Osamu Nakamura 0:8373b6833bde 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Osamu Nakamura 0:8373b6833bde 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Osamu Nakamura 0:8373b6833bde 18 */
Osamu Nakamura 0:8373b6833bde 19
Osamu Nakamura 0:8373b6833bde 20 //Debug is disabled by default
Osamu Nakamura 0:8373b6833bde 21 #if 0
Osamu Nakamura 0:8373b6833bde 22 //Enable debug
Osamu Nakamura 0:8373b6833bde 23 #define __DEBUG__
Osamu Nakamura 0:8373b6833bde 24 #include <cstdio>
Osamu Nakamura 0:8373b6833bde 25 #define DBG(x, ...) std::printf("[NTPClient : DBG]"x"\r\n", ##__VA_ARGS__);
Osamu Nakamura 0:8373b6833bde 26 #define WARN(x, ...) std::printf("[NTPClient : WARN]"x"\r\n", ##__VA_ARGS__);
Osamu Nakamura 0:8373b6833bde 27 #define ERR(x, ...) std::printf("[NTPClient : ERR]"x"\r\n", ##__VA_ARGS__);
Osamu Nakamura 0:8373b6833bde 28
Osamu Nakamura 0:8373b6833bde 29 #else
Osamu Nakamura 0:8373b6833bde 30 //Disable debug
Osamu Nakamura 0:8373b6833bde 31 #define DBG(x, ...)
Osamu Nakamura 0:8373b6833bde 32 #define WARN(x, ...)
Osamu Nakamura 0:8373b6833bde 33 #define ERR(x, ...)
Osamu Nakamura 0:8373b6833bde 34
Osamu Nakamura 0:8373b6833bde 35 #endif
Osamu Nakamura 0:8373b6833bde 36
Osamu Nakamura 0:8373b6833bde 37 #include "NTPClient.h"
Osamu Nakamura 0:8373b6833bde 38
Osamu Nakamura 0:8373b6833bde 39 #include "UDPSocket.h"
Osamu Nakamura 0:8373b6833bde 40
Osamu Nakamura 0:8373b6833bde 41 #include "mbed.h" //time() and set_time()
Osamu Nakamura 0:8373b6833bde 42
Osamu Nakamura 0:8373b6833bde 43 #define NTP_PORT 123
Osamu Nakamura 0:8373b6833bde 44 #define NTP_CLIENT_PORT 0 //Random port
Osamu Nakamura 0:8373b6833bde 45 #define NTP_TIMESTAMP_DELTA 2208988800ull //Diff btw a UNIX timestamp (Starting Jan, 1st 1970) and a NTP timestamp (Starting Jan, 1st 1900)
Osamu Nakamura 0:8373b6833bde 46
Osamu Nakamura 0:8373b6833bde 47 NTPClient::NTPClient() : m_sock()
Osamu Nakamura 0:8373b6833bde 48 {
Osamu Nakamura 0:8373b6833bde 49
Osamu Nakamura 0:8373b6833bde 50
Osamu Nakamura 0:8373b6833bde 51 }
Osamu Nakamura 0:8373b6833bde 52
Osamu Nakamura 0:8373b6833bde 53 #if MBED_MAJOR_VERSION >= 5
Osamu Nakamura 0:8373b6833bde 54
Osamu Nakamura 0:8373b6833bde 55 #include <SocketAddress.h>
Osamu Nakamura 0:8373b6833bde 56 #include <EthernetInterface.h>
Osamu Nakamura 0:8373b6833bde 57 //extern EthernetInterface ei_;
Osamu Nakamura 0:8373b6833bde 58 EthernetInterface ei_;
Osamu Nakamura 0:8373b6833bde 59
Osamu Nakamura 0:8373b6833bde 60 class Endpoint {
Osamu Nakamura 0:8373b6833bde 61 SocketAddress sa_;
Osamu Nakamura 0:8373b6833bde 62 public:
Osamu Nakamura 0:8373b6833bde 63 Endpoint() : sa_() {}
Osamu Nakamura 0:8373b6833bde 64 int set_address(const char* host, uint16_t port)
Osamu Nakamura 0:8373b6833bde 65 {
Osamu Nakamura 0:8373b6833bde 66 sa_.set_port(port);
Osamu Nakamura 0:8373b6833bde 67 return nsapi_create_stack(&ei_)->gethostbyname(host, &sa_);
Osamu Nakamura 0:8373b6833bde 68 }
Osamu Nakamura 0:8373b6833bde 69 const char* get_address() const { return sa_.get_ip_address(); }
Osamu Nakamura 0:8373b6833bde 70 operator const SocketAddress&() { return sa_; }
Osamu Nakamura 0:8373b6833bde 71 operator SocketAddress*() { return &sa_; }
Osamu Nakamura 0:8373b6833bde 72 };
Osamu Nakamura 0:8373b6833bde 73
Osamu Nakamura 0:8373b6833bde 74 class LegacyUS {
Osamu Nakamura 0:8373b6833bde 75 UDPSocket us_;
Osamu Nakamura 0:8373b6833bde 76 public:
Osamu Nakamura 0:8373b6833bde 77 LegacyUS() : us_() {}
Osamu Nakamura 0:8373b6833bde 78 int bind(int port)
Osamu Nakamura 0:8373b6833bde 79 {
Osamu Nakamura 0:8373b6833bde 80 us_.open(&ei_);
Osamu Nakamura 0:8373b6833bde 81 return us_.bind(port);
Osamu Nakamura 0:8373b6833bde 82 }
Osamu Nakamura 0:8373b6833bde 83 void set_blocking(bool blocking, unsigned int)
Osamu Nakamura 0:8373b6833bde 84 {
Osamu Nakamura 0:8373b6833bde 85 us_.set_blocking(blocking);
Osamu Nakamura 0:8373b6833bde 86 }
Osamu Nakamura 0:8373b6833bde 87 int close() { return us_.close(); }
Osamu Nakamura 0:8373b6833bde 88 int sendTo(Endpoint& remote, char* packet, int length)
Osamu Nakamura 0:8373b6833bde 89 {
Osamu Nakamura 0:8373b6833bde 90 return us_.sendto(remote, packet, length);
Osamu Nakamura 0:8373b6833bde 91 }
Osamu Nakamura 0:8373b6833bde 92 int receiveFrom(Endpoint& remote, char* buffer, int length)
Osamu Nakamura 0:8373b6833bde 93 {
Osamu Nakamura 0:8373b6833bde 94 int ret = us_.recvfrom(remote, buffer, length);
Osamu Nakamura 0:8373b6833bde 95 if( ret == NSAPI_ERROR_WOULD_BLOCK )
Osamu Nakamura 0:8373b6833bde 96 {
Osamu Nakamura 0:8373b6833bde 97 wait(0.1);
Osamu Nakamura 0:8373b6833bde 98 ret = 0;
Osamu Nakamura 0:8373b6833bde 99 }
Osamu Nakamura 0:8373b6833bde 100 return ret;
Osamu Nakamura 0:8373b6833bde 101 }
Osamu Nakamura 0:8373b6833bde 102 };
Osamu Nakamura 0:8373b6833bde 103 #define m_sock (*((LegacyUS*)&m_sock))
Osamu Nakamura 0:8373b6833bde 104
Osamu Nakamura 0:8373b6833bde 105 #endif // MBED_MAJOR_VERSION >= 5
Osamu Nakamura 0:8373b6833bde 106
Osamu Nakamura 0:8373b6833bde 107 NTPResult NTPClient::setTime(const char* host, uint16_t port, uint32_t timeout)
Osamu Nakamura 0:8373b6833bde 108 {
Osamu Nakamura 0:8373b6833bde 109 #ifdef __DEBUG__
Osamu Nakamura 0:8373b6833bde 110 time_t ctTime;
Osamu Nakamura 0:8373b6833bde 111 ctTime = time(NULL);
Osamu Nakamura 0:8373b6833bde 112 DBG("Time is set to (UTC): %s", ctime(&ctTime));
Osamu Nakamura 0:8373b6833bde 113 #endif
Osamu Nakamura 0:8373b6833bde 114
Osamu Nakamura 0:8373b6833bde 115 //Create & bind socket
Osamu Nakamura 0:8373b6833bde 116 DBG("Binding socket");
Osamu Nakamura 0:8373b6833bde 117 m_sock.bind(0); //Bind to a random port
Osamu Nakamura 0:8373b6833bde 118
Osamu Nakamura 0:8373b6833bde 119 m_sock.set_blocking(false, timeout); //Set not blocking
Osamu Nakamura 0:8373b6833bde 120
Osamu Nakamura 0:8373b6833bde 121 struct NTPPacket pkt;
Osamu Nakamura 0:8373b6833bde 122
Osamu Nakamura 0:8373b6833bde 123 //Now ping the server and wait for response
Osamu Nakamura 0:8373b6833bde 124 DBG("Ping");
Osamu Nakamura 0:8373b6833bde 125 //Prepare NTP Packet:
Osamu Nakamura 0:8373b6833bde 126 pkt.li = 0; //Leap Indicator : No warning
Osamu Nakamura 0:8373b6833bde 127 pkt.vn = 4; //Version Number : 4
Osamu Nakamura 0:8373b6833bde 128 pkt.mode = 3; //Client mode
Osamu Nakamura 0:8373b6833bde 129 pkt.stratum = 0; //Not relevant here
Osamu Nakamura 0:8373b6833bde 130 pkt.poll = 0; //Not significant as well
Osamu Nakamura 0:8373b6833bde 131 pkt.precision = 0; //Neither this one is
Osamu Nakamura 0:8373b6833bde 132
Osamu Nakamura 0:8373b6833bde 133 pkt.rootDelay = 0; //Or this one
Osamu Nakamura 0:8373b6833bde 134 pkt.rootDispersion = 0; //Or that one
Osamu Nakamura 0:8373b6833bde 135 pkt.refId = 0; //...
Osamu Nakamura 0:8373b6833bde 136
Osamu Nakamura 0:8373b6833bde 137 pkt.refTm_s = 0;
Osamu Nakamura 0:8373b6833bde 138 pkt.origTm_s = 0;
Osamu Nakamura 0:8373b6833bde 139 pkt.rxTm_s = 0;
Osamu Nakamura 0:8373b6833bde 140 pkt.txTm_s = htonl( NTP_TIMESTAMP_DELTA + time(NULL) ); //WARN: We are in LE format, network byte order is BE
Osamu Nakamura 0:8373b6833bde 141
Osamu Nakamura 0:8373b6833bde 142 pkt.refTm_f = pkt.origTm_f = pkt.rxTm_f = pkt.txTm_f = 0;
Osamu Nakamura 0:8373b6833bde 143
Osamu Nakamura 0:8373b6833bde 144 Endpoint outEndpoint;
Osamu Nakamura 0:8373b6833bde 145
Osamu Nakamura 0:8373b6833bde 146 if( outEndpoint.set_address(host, port) < 0)
Osamu Nakamura 0:8373b6833bde 147 {
Osamu Nakamura 0:8373b6833bde 148 m_sock.close();
Osamu Nakamura 0:8373b6833bde 149 return NTP_DNS;
Osamu Nakamura 0:8373b6833bde 150 }
Osamu Nakamura 0:8373b6833bde 151
Osamu Nakamura 0:8373b6833bde 152 //Set timeout, non-blocking and wait using select
Osamu Nakamura 0:8373b6833bde 153 int ret = m_sock.sendTo( outEndpoint, (char*)&pkt, sizeof(NTPPacket) );
Osamu Nakamura 0:8373b6833bde 154 if (ret < 0 )
Osamu Nakamura 0:8373b6833bde 155 {
Osamu Nakamura 0:8373b6833bde 156 ERR("Could not send packet");
Osamu Nakamura 0:8373b6833bde 157 m_sock.close();
Osamu Nakamura 0:8373b6833bde 158 return NTP_CONN;
Osamu Nakamura 0:8373b6833bde 159 }
Osamu Nakamura 0:8373b6833bde 160
Osamu Nakamura 0:8373b6833bde 161 //Read response
Osamu Nakamura 0:8373b6833bde 162 Endpoint inEndpoint;
Osamu Nakamura 0:8373b6833bde 163 // Set the inEndpoint address property
Osamu Nakamura 0:8373b6833bde 164 inEndpoint.set_address(outEndpoint.get_address(), 0);
Osamu Nakamura 0:8373b6833bde 165 DBG("Pong");
Osamu Nakamura 0:8373b6833bde 166 do
Osamu Nakamura 0:8373b6833bde 167 {
Osamu Nakamura 0:8373b6833bde 168 ret = m_sock.receiveFrom( inEndpoint, (char*)&pkt, sizeof(NTPPacket) ); //FIXME need a DNS Resolver to actually compare the incoming address with the DNS name
Osamu Nakamura 0:8373b6833bde 169 if(ret < 0)
Osamu Nakamura 0:8373b6833bde 170 {
Osamu Nakamura 0:8373b6833bde 171 ERR("Could not receive packet");
Osamu Nakamura 0:8373b6833bde 172 m_sock.close();
Osamu Nakamura 0:8373b6833bde 173 return NTP_CONN;
Osamu Nakamura 0:8373b6833bde 174 }
Osamu Nakamura 0:8373b6833bde 175 } while( strcmp(outEndpoint.get_address(), inEndpoint.get_address()) != 0 );
Osamu Nakamura 0:8373b6833bde 176
Osamu Nakamura 0:8373b6833bde 177 if(ret < sizeof(NTPPacket)) //TODO: Accept chunks
Osamu Nakamura 0:8373b6833bde 178 {
Osamu Nakamura 0:8373b6833bde 179 ERR("Receive packet size does not match");
Osamu Nakamura 0:8373b6833bde 180 m_sock.close();
Osamu Nakamura 0:8373b6833bde 181 return NTP_PRTCL;
Osamu Nakamura 0:8373b6833bde 182 }
Osamu Nakamura 0:8373b6833bde 183
Osamu Nakamura 0:8373b6833bde 184 if( pkt.stratum == 0) //Kiss of death message : Not good !
Osamu Nakamura 0:8373b6833bde 185 {
Osamu Nakamura 0:8373b6833bde 186 ERR("Kissed to death!");
Osamu Nakamura 0:8373b6833bde 187 m_sock.close();
Osamu Nakamura 0:8373b6833bde 188 return NTP_PRTCL;
Osamu Nakamura 0:8373b6833bde 189 }
Osamu Nakamura 0:8373b6833bde 190
Osamu Nakamura 0:8373b6833bde 191 //Correct Endianness
Osamu Nakamura 0:8373b6833bde 192 pkt.refTm_s = ntohl( pkt.refTm_s );
Osamu Nakamura 0:8373b6833bde 193 pkt.refTm_f = ntohl( pkt.refTm_f );
Osamu Nakamura 0:8373b6833bde 194 pkt.origTm_s = ntohl( pkt.origTm_s );
Osamu Nakamura 0:8373b6833bde 195 pkt.origTm_f = ntohl( pkt.origTm_f );
Osamu Nakamura 0:8373b6833bde 196 pkt.rxTm_s = ntohl( pkt.rxTm_s );
Osamu Nakamura 0:8373b6833bde 197 pkt.rxTm_f = ntohl( pkt.rxTm_f );
Osamu Nakamura 0:8373b6833bde 198 pkt.txTm_s = ntohl( pkt.txTm_s );
Osamu Nakamura 0:8373b6833bde 199 pkt.txTm_f = ntohl( pkt.txTm_f );
Osamu Nakamura 0:8373b6833bde 200
Osamu Nakamura 0:8373b6833bde 201 //Compute offset, see RFC 4330 p.13
Osamu Nakamura 0:8373b6833bde 202 uint32_t destTm_s = (NTP_TIMESTAMP_DELTA + time(NULL));
Osamu Nakamura 0:8373b6833bde 203 int64_t offset = ( (int64_t)( pkt.rxTm_s - pkt.origTm_s ) + (int64_t) ( pkt.txTm_s - destTm_s ) ) / 2; //Avoid overflow
Osamu Nakamura 0:8373b6833bde 204 DBG("Sent @%ul", pkt.txTm_s);
Osamu Nakamura 0:8373b6833bde 205 DBG("Offset: %lld", offset);
Osamu Nakamura 0:8373b6833bde 206 //Set time accordingly
Osamu Nakamura 0:8373b6833bde 207 set_time( time(NULL) + offset );
Osamu Nakamura 0:8373b6833bde 208
Osamu Nakamura 0:8373b6833bde 209 #ifdef __DEBUG__
Osamu Nakamura 0:8373b6833bde 210 ctTime = time(NULL);
Osamu Nakamura 0:8373b6833bde 211 DBG("Time is now (UTC): %s", ctime(&ctTime));
Osamu Nakamura 0:8373b6833bde 212 #endif
Osamu Nakamura 0:8373b6833bde 213
Osamu Nakamura 0:8373b6833bde 214 m_sock.close();
Osamu Nakamura 0:8373b6833bde 215
Osamu Nakamura 0:8373b6833bde 216 return NTP_OK;
Osamu Nakamura 0:8373b6833bde 217 }
Osamu Nakamura 0:8373b6833bde 218
Osamu Nakamura 0:8373b6833bde 219