Example of AWS IoT connection and Web Dashboard thru STM32 Nucleo evaluation board and mbed OS.

Dependencies:   X_NUCLEO_IKS01A1 mbed FP MQTTPacket DnsQuery ATParser

Introduction

The demo is aimed to STM32 Nucleo board with WiFi and sensors expansions. The board is a "thing" for the AWS IoT service. It updates IoT service shadow with sensors data every second and checks subscription messages.

Hardware Configuration

https://github.com/Klika-Tech/nucleo-aws-iot-demo/raw/master/doc/assets/device.jpg

Software Configuration

  • Import this Project to mbed online compiler
  • Find the next part of code in main.cpp file ...

WiFi network credential

#include "mbed.h"
// WiFi network credential
#define SSID   ""  // Network must be visible otherwise it can't connect
#define PASSW  ""
#error "Wifi SSID & password empty"
  • ... And set it to your Network Name and Password. Do not forget to remove "#error" pragma line.

Information

Nucleo WiFi module is not the same as your smartphone or laptope - it is based on demo board. To avoid connection problems:

  1. Place Nucleo as close to WiFi hot spot as possible. Or...
  2. Turn on mobile hot spot in your laptop as close to the device as possible.
  3. Make sure that hot spot permits 2.4 GHz band communications
  • Setup BackEnd and store certificates using this backend setup instruction
  • Find AWS_IOT_MQTT_HOST define and change it to HTTPS point mentioned in your AWS IoT thing properties named "interact"

#define AWS_IOT_MQTT_HOST              "xxxxxxxxxx.iot.us-east-1.amazonaws.com" //Use your own host.
  • Find the certificate defines clientCRT and clientKey in main.cpp file and change it to ones provided by Amazon.

/**********************************************************************************************
***********************************************************************************************
				Device Identity Certificates: Modify for your AWS IoT Thing
***********************************************************************************************
***********************************************************************************************/

/****************************************
(somecode)-certificate.pem.crt - Amazon signed PEM sertificate.
*****************************************/

//This Client cert is example. Use own instead.
const uint8_t clientCRT[] = "\
-----BEGIN CERTIFICATE-----\n\
MIIDBjCCAe6gAwIBAgIUVph856omeIxW3UPioq+UrX1DbwowDQYJKoZIhvcNAQEL\
BQAwTTFLMEkGA1UECwxCQW1hem9uIFdlYiBTZXJ2aWNlcyBPPUFtYXpvbi5jb20g\
SW5jLiBMPVNlYXR0bGUgU1Q9V2FzaGluZ3RvbiBDPVVTMB4XDTE3MDUyNTExNTEy\
OVoXDTQ5MTIzMTIzNTk1OVowgZUxCzAJBgNVBAYTAkJZMQ4wDAYDVQQIDAVNaW5z\
azEOMAwGA1UEBwwFTWluc2sxFzAVBgNVBAoMDktsaWthLVRlY2ggTExDMRcwFQYD\
VQQLDA5LbGlrYS1UZWNoIExMQzEMMAoGA1UEAwwDUm5EMSYwJAYJKoZIhvcNAQkB\
FhdtdmF0YWxldUBrbGlrYS10ZWNoLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEH\
A0IABCJgOQJmoTBJVPfli9Hm/JVixaxkY5rtlgrYO3hSl633A2hg0P/ue0wXDbF3\
aQ0X57IRFE4k4FEbr3UXjT/IczKjYDBeMB8GA1UdIwQYMBaAFK3YzTUPlYB2Li75\
i/z8rEogr1d6MB0GA1UdDgQWBBT18HXBaXFJuAR/0SwegnxJ+pyJ6TAMBgNVHRMB\
Af8EAjAAMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEAb0Ux1aH5\
RLxjrfGqXN6rPVqh8QQRS+AyBfzmaQN8HaPZMkX5WxXLvcn0A3uWlwQxPPkcZ4zf\
51GHtFFQWB4YZ8dx8mUQ0v/j7onHjCJgZ8iDgwOyKMGtnsDZWCakQw+a6cj+NrMZ\
tzhjwCzEEP6ePcbXwErI5OOzLuWns2L/JEr2wWNkokgRuS8ewr/SQ9OLWIWa2rFM\
ahPNTb3y/qBeWdjeJmhI+TOxdqIpsF8roWP25zwo/zkzCHCjXFBrL+0CA4MpxIl9\
x02i7aAhlJ6ys80lDxdeWeeQJXRKkGknP8mcmKn3iEqqJ5s1dQePj2b5d3ldatya\
wsxQBqqZXzIWEw==\
\n\
-----END CERTIFICATE-----\n";



/**********************************************************************************************
***********************************************************************************************
						Private Key: Modify for your AWS IoT Thing
***********************************************************************************************
***********************************************************************************************/

/********************************************************************8****************************************
nucleo.key.pem - client key generated according to readme.
**************************************************************************************************************/

//This Client Key is example. Use own instead.
const uint8_t clientKey[] ="\
-----BEGIN EC PARAMETERS-----\n\
BggqhkjOPQMBBw==\
-----END EC PARAMETERS-----\n\
-----BEGIN EC PRIVATE KEY-----\n\
MHcCAQEEIHPRfWSC8/k/BsqDWKuP15dXsI9fGwpkTIsLZe6mIrAAoAoGCCqGSM49\
AwEHoUQDQgAEImA5AmahMElU9+WL0eb8lWLFrGRjmu2WCtg7eFKXrfcDaGDQ/+57\
TBcNsXdpDRfnshEUTiTgURuvdReNP8hzMg==\
-----END EC PRIVATE KEY-----\n";

Build and Check

  1. Plugin your board to USB of your PC. USB Disk Drive and USB COM Port should appear in your system.
  2. Open any Serial Console, connect it to your USB Serial Port and setup speed equal to 115200.
  3. Compile this Project and save .bin file to USB Disk Drive
  4. After board reset you should see next log in serial console:

X-NUCLEO-IDW01M1 mbed Application

connecting to AP
LOG:   int main() L#361 Connected to WiFI.
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#186 =====================================
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#187 Connecting WiFi.
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#188 Nucleo IP ADDRESS: X.X.X.X
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#189 Nucleo MAC ADDRESS: 00:11:22:33:44:55
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#190 Server Hostname: xxxxxxxx.iot.us-east-1.amazonaws.com port: 8883
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#191 Client ID: Nucleo
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#194 =====================================
LOG:   int MQTTSocket::getNTPtime(int) L#58 Success receiving time from ntp server. Tick from 1 Jan 1970 is equal to 1505399292.
--->TCP Connected
--->MQTT Connected
--->>>MQTT subscribed to: Nucleo/test
Length - 245, Publishing {"state": {"reported": {"temperature": 23.690001, "humidity": 98.190002, "pressure": 982.869141, "accelerometer": [-0.009000, 0.030000, 0.971000], "gyroscope": [0.420000, -2.660000, 1.750000], "magnetometer": [-3.600000, -7.100000, 53.300000]}}}
Length - 245, Publishing {"state": {"reported": {"temperature": 23.660000, "humidity": 98.010002, "pressure": 982.770264, "accelerometer": [-0.009000, 0.030000, 0.971000], "gyroscope": [0.770000, -2.310000, 1.470000], "magnetometer": [-3.100000, -8.300000, 54.200000]}}}
Length - 245, Publishing {"state": {"reported": {"temperature": 23.670000, "humidity": 98.129997, "pressure": 982.724121, "accelerometer": [-0.008000, 0.029000, 0.971000], "gyroscope": [0.630000, -2.380000, 1.400000], "magnetometer": [-3.100000, -7.900000, 53.400000]}}}
Length - 245, Publishing {"state": {"reported": {"temperature": 23.690001, "humidity": 98.019997, "pressure": 982.840088, "accelerometer": [-0.009000, 0.030000, 0.972000], "gyroscope": [0.700000, -2.450000, 1.540000], "magnetometer": [-3.700000, -7.900000, 53.400000]}}}
Length - 245, Publishing {"state": {"reported": {"temperature": 23.709999, "humidity": 98.040001, "pressure": 982.828613, "accelerometer": [-0.009000, 0.030000, 0.971000], "gyroscope": [0.630000, -2.520000, 1.470000], "magnetometer": [-2.900000, -7.400000, 52.400000]}}}
Length - 245, Publishing {"state": {"reported": {"temperature": 23.719999, "humidity": 97.860001, "pressure": 982.917236, "accelerometer": [-0.026000, 0.103000, 0.891000], "gyroscope": [1.050000, -2.310000, 1.260000], "magnetometer": [-3.300000, -7.100000, 53.500000]}}}

Information

Device connection state might be checked by Green Led on the board. Green light means that device is connected and transferring data to cloud.

  1. Configure and start your dashboard using instruction and corresponding sources from github
  2. Use Blue button to set up markers to charts.
  3. Use AWS IoT console MQTT Client to test device subscription to "Nucleo/test". Just publish any message to this topic and serial port output.
  4. PROFIT!
Committer:
PavelSavyhin
Date:
Thu Oct 19 11:36:41 2017 +0000
Revision:
1:042ca9148926
Parent:
0:4cdaf9b1e7d0
Connection times are optimized and logging is extended.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
PavelSavyhin 0:4cdaf9b1e7d0 1 /* Socket
PavelSavyhin 0:4cdaf9b1e7d0 2 * Copyright (c) 2015 ARM Limited
PavelSavyhin 0:4cdaf9b1e7d0 3 *
PavelSavyhin 0:4cdaf9b1e7d0 4 * Licensed under the Apache License, Version 2.0 (the "License");
PavelSavyhin 0:4cdaf9b1e7d0 5 * you may not use this file except in compliance with the License.
PavelSavyhin 0:4cdaf9b1e7d0 6 * You may obtain a copy of the License at
PavelSavyhin 0:4cdaf9b1e7d0 7 *
PavelSavyhin 0:4cdaf9b1e7d0 8 * http://www.apache.org/licenses/LICENSE-2.0
PavelSavyhin 0:4cdaf9b1e7d0 9 *
PavelSavyhin 0:4cdaf9b1e7d0 10 * Unless required by applicable law or agreed to in writing, software
PavelSavyhin 0:4cdaf9b1e7d0 11 * distributed under the License is distributed on an "AS IS" BASIS,
PavelSavyhin 0:4cdaf9b1e7d0 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
PavelSavyhin 0:4cdaf9b1e7d0 13 * See the License for the specific language governing permissions and
PavelSavyhin 0:4cdaf9b1e7d0 14 * limitations under the License.
PavelSavyhin 0:4cdaf9b1e7d0 15 */
PavelSavyhin 0:4cdaf9b1e7d0 16
PavelSavyhin 0:4cdaf9b1e7d0 17 #include "SocketAddress.h"
PavelSavyhin 0:4cdaf9b1e7d0 18 #include "NetworkStack.h"
PavelSavyhin 0:4cdaf9b1e7d0 19 #include <string.h>
PavelSavyhin 0:4cdaf9b1e7d0 20 #include "mbed.h"
PavelSavyhin 0:4cdaf9b1e7d0 21
PavelSavyhin 0:4cdaf9b1e7d0 22
PavelSavyhin 0:4cdaf9b1e7d0 23 static bool ipv4_is_valid(const char *addr)
PavelSavyhin 0:4cdaf9b1e7d0 24 {
PavelSavyhin 0:4cdaf9b1e7d0 25 int i = 0;
PavelSavyhin 0:4cdaf9b1e7d0 26
PavelSavyhin 0:4cdaf9b1e7d0 27 // Check each digit for [0-9.]
PavelSavyhin 0:4cdaf9b1e7d0 28 for (; addr[i]; i++) {
PavelSavyhin 0:4cdaf9b1e7d0 29 if (!(addr[i] >= '0' && addr[i] <= '9') && addr[i] != '.') {
PavelSavyhin 0:4cdaf9b1e7d0 30 return false;
PavelSavyhin 0:4cdaf9b1e7d0 31 }
PavelSavyhin 0:4cdaf9b1e7d0 32 }
PavelSavyhin 0:4cdaf9b1e7d0 33
PavelSavyhin 0:4cdaf9b1e7d0 34 // Ending with '.' garuntees host
PavelSavyhin 0:4cdaf9b1e7d0 35 if (i > 0 && addr[i-1] == '.') {
PavelSavyhin 0:4cdaf9b1e7d0 36 return false;
PavelSavyhin 0:4cdaf9b1e7d0 37 }
PavelSavyhin 0:4cdaf9b1e7d0 38
PavelSavyhin 0:4cdaf9b1e7d0 39 return true;
PavelSavyhin 0:4cdaf9b1e7d0 40 }
PavelSavyhin 0:4cdaf9b1e7d0 41
PavelSavyhin 0:4cdaf9b1e7d0 42 static bool ipv6_is_valid(const char *addr)
PavelSavyhin 0:4cdaf9b1e7d0 43 {
PavelSavyhin 0:4cdaf9b1e7d0 44 // Check each digit for [0-9a-fA-F:]
PavelSavyhin 0:4cdaf9b1e7d0 45 for (int i = 0; addr[i]; i++) {
PavelSavyhin 0:4cdaf9b1e7d0 46 if (!(addr[i] >= '0' && addr[i] <= '9') &&
PavelSavyhin 0:4cdaf9b1e7d0 47 !(addr[i] >= 'a' && addr[i] <= 'f') &&
PavelSavyhin 0:4cdaf9b1e7d0 48 !(addr[i] >= 'A' && addr[i] <= 'F') &&
PavelSavyhin 0:4cdaf9b1e7d0 49 addr[i] != ':') {
PavelSavyhin 0:4cdaf9b1e7d0 50 return false;
PavelSavyhin 0:4cdaf9b1e7d0 51 }
PavelSavyhin 0:4cdaf9b1e7d0 52 }
PavelSavyhin 0:4cdaf9b1e7d0 53
PavelSavyhin 0:4cdaf9b1e7d0 54 return true;
PavelSavyhin 0:4cdaf9b1e7d0 55 }
PavelSavyhin 0:4cdaf9b1e7d0 56
PavelSavyhin 0:4cdaf9b1e7d0 57 static void ipv4_from_address(uint8_t *bytes, const char *addr)
PavelSavyhin 0:4cdaf9b1e7d0 58 {
PavelSavyhin 0:4cdaf9b1e7d0 59 int count = 0;
PavelSavyhin 0:4cdaf9b1e7d0 60 int i = 0;
PavelSavyhin 0:4cdaf9b1e7d0 61
PavelSavyhin 0:4cdaf9b1e7d0 62 for (; count < NSAPI_IPv4_BYTES; count++) {
PavelSavyhin 0:4cdaf9b1e7d0 63 int scanned = sscanf(&addr[i], "%hhu", &bytes[count]);
PavelSavyhin 0:4cdaf9b1e7d0 64 if (scanned < 1) {
PavelSavyhin 0:4cdaf9b1e7d0 65 return;
PavelSavyhin 0:4cdaf9b1e7d0 66 }
PavelSavyhin 0:4cdaf9b1e7d0 67
PavelSavyhin 0:4cdaf9b1e7d0 68 for (; addr[i] != '.'; i++) {
PavelSavyhin 0:4cdaf9b1e7d0 69 if (!addr[i]) {
PavelSavyhin 0:4cdaf9b1e7d0 70 return;
PavelSavyhin 0:4cdaf9b1e7d0 71 }
PavelSavyhin 0:4cdaf9b1e7d0 72 }
PavelSavyhin 0:4cdaf9b1e7d0 73
PavelSavyhin 0:4cdaf9b1e7d0 74 i++;
PavelSavyhin 0:4cdaf9b1e7d0 75 }
PavelSavyhin 0:4cdaf9b1e7d0 76 }
PavelSavyhin 0:4cdaf9b1e7d0 77
PavelSavyhin 0:4cdaf9b1e7d0 78 static int ipv6_scan_chunk(uint16_t *shorts, const char *chunk) {
PavelSavyhin 0:4cdaf9b1e7d0 79 int count = 0;
PavelSavyhin 0:4cdaf9b1e7d0 80 int i = 0;
PavelSavyhin 0:4cdaf9b1e7d0 81
PavelSavyhin 0:4cdaf9b1e7d0 82 for (; count < NSAPI_IPv6_BYTES/2; count++) {
PavelSavyhin 0:4cdaf9b1e7d0 83 int scanned = sscanf(&chunk[i], "%hx", &shorts[count]);
PavelSavyhin 0:4cdaf9b1e7d0 84 if (scanned < 1) {
PavelSavyhin 0:4cdaf9b1e7d0 85 return count;
PavelSavyhin 0:4cdaf9b1e7d0 86 }
PavelSavyhin 0:4cdaf9b1e7d0 87
PavelSavyhin 0:4cdaf9b1e7d0 88 for (; chunk[i] != ':'; i++) {
PavelSavyhin 0:4cdaf9b1e7d0 89 if (!chunk[i]) {
PavelSavyhin 0:4cdaf9b1e7d0 90 return count+1;
PavelSavyhin 0:4cdaf9b1e7d0 91 }
PavelSavyhin 0:4cdaf9b1e7d0 92 }
PavelSavyhin 0:4cdaf9b1e7d0 93
PavelSavyhin 0:4cdaf9b1e7d0 94 i++;
PavelSavyhin 0:4cdaf9b1e7d0 95 }
PavelSavyhin 0:4cdaf9b1e7d0 96
PavelSavyhin 0:4cdaf9b1e7d0 97 return count;
PavelSavyhin 0:4cdaf9b1e7d0 98 }
PavelSavyhin 0:4cdaf9b1e7d0 99
PavelSavyhin 0:4cdaf9b1e7d0 100 static void ipv6_from_address(uint8_t *bytes, const char *addr)
PavelSavyhin 0:4cdaf9b1e7d0 101 {
PavelSavyhin 0:4cdaf9b1e7d0 102 // Start with zeroed address
PavelSavyhin 0:4cdaf9b1e7d0 103 uint16_t shorts[NSAPI_IPv6_BYTES/2];
PavelSavyhin 0:4cdaf9b1e7d0 104 memset(shorts, 0, sizeof shorts);
PavelSavyhin 0:4cdaf9b1e7d0 105
PavelSavyhin 0:4cdaf9b1e7d0 106 int suffix = 0;
PavelSavyhin 0:4cdaf9b1e7d0 107
PavelSavyhin 0:4cdaf9b1e7d0 108 // Find double colons and scan suffix
PavelSavyhin 0:4cdaf9b1e7d0 109 for (int i = 0; addr[i]; i++) {
PavelSavyhin 0:4cdaf9b1e7d0 110 if (addr[i] == ':' && addr[i+1] == ':') {
PavelSavyhin 0:4cdaf9b1e7d0 111 suffix = ipv6_scan_chunk(shorts, &addr[i+2]);
PavelSavyhin 0:4cdaf9b1e7d0 112 break;
PavelSavyhin 0:4cdaf9b1e7d0 113 }
PavelSavyhin 0:4cdaf9b1e7d0 114 }
PavelSavyhin 0:4cdaf9b1e7d0 115
PavelSavyhin 0:4cdaf9b1e7d0 116 // Move suffix to end
PavelSavyhin 0:4cdaf9b1e7d0 117 memmove(&shorts[NSAPI_IPv6_BYTES/2-suffix], &shorts[0],
PavelSavyhin 0:4cdaf9b1e7d0 118 suffix*sizeof(uint16_t));
PavelSavyhin 0:4cdaf9b1e7d0 119
PavelSavyhin 0:4cdaf9b1e7d0 120 // Scan prefix
PavelSavyhin 0:4cdaf9b1e7d0 121 ipv6_scan_chunk(shorts, &addr[0]);
PavelSavyhin 0:4cdaf9b1e7d0 122
PavelSavyhin 0:4cdaf9b1e7d0 123 // Flip bytes
PavelSavyhin 0:4cdaf9b1e7d0 124 for (int i = 0; i < NSAPI_IPv6_BYTES/2; i++) {
PavelSavyhin 0:4cdaf9b1e7d0 125 bytes[2*i+0] = (uint8_t)(shorts[i] >> 8);
PavelSavyhin 0:4cdaf9b1e7d0 126 bytes[2*i+1] = (uint8_t)(shorts[i] >> 0);
PavelSavyhin 0:4cdaf9b1e7d0 127 }
PavelSavyhin 0:4cdaf9b1e7d0 128 }
PavelSavyhin 0:4cdaf9b1e7d0 129
PavelSavyhin 0:4cdaf9b1e7d0 130 static void ipv4_to_address(char *addr, const uint8_t *bytes)
PavelSavyhin 0:4cdaf9b1e7d0 131 {
PavelSavyhin 0:4cdaf9b1e7d0 132 sprintf(addr, "%d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3]);
PavelSavyhin 0:4cdaf9b1e7d0 133 }
PavelSavyhin 0:4cdaf9b1e7d0 134
PavelSavyhin 0:4cdaf9b1e7d0 135 static void ipv6_to_address(char *addr, const uint8_t *bytes)
PavelSavyhin 0:4cdaf9b1e7d0 136 {
PavelSavyhin 0:4cdaf9b1e7d0 137 for (int i = 0; i < NSAPI_IPv6_BYTES/2; i++) {
PavelSavyhin 0:4cdaf9b1e7d0 138 sprintf(&addr[5*i], "%02x%02x", bytes[2*i], bytes[2*i+1]);
PavelSavyhin 0:4cdaf9b1e7d0 139 addr[5*i+4] = ':';
PavelSavyhin 0:4cdaf9b1e7d0 140 }
PavelSavyhin 0:4cdaf9b1e7d0 141 addr[NSAPI_IPv6_SIZE-1] = '\0';
PavelSavyhin 0:4cdaf9b1e7d0 142 }
PavelSavyhin 0:4cdaf9b1e7d0 143
PavelSavyhin 0:4cdaf9b1e7d0 144
PavelSavyhin 0:4cdaf9b1e7d0 145 SocketAddress::SocketAddress(NetworkStack *iface, const char *host, uint16_t port)
PavelSavyhin 0:4cdaf9b1e7d0 146 {
PavelSavyhin 0:4cdaf9b1e7d0 147 memset(&_ip_address, 0, sizeof _ip_address);
PavelSavyhin 0:4cdaf9b1e7d0 148
PavelSavyhin 0:4cdaf9b1e7d0 149 // Check for valid IP addresses
PavelSavyhin 0:4cdaf9b1e7d0 150 if (host && ipv4_is_valid(host)) {
PavelSavyhin 0:4cdaf9b1e7d0 151 _ip_version = NSAPI_IPv4;
PavelSavyhin 0:4cdaf9b1e7d0 152 ipv4_from_address(_ip_bytes, host);
PavelSavyhin 0:4cdaf9b1e7d0 153 set_port(port);
PavelSavyhin 0:4cdaf9b1e7d0 154 } else if (host && ipv6_is_valid(host)) {
PavelSavyhin 0:4cdaf9b1e7d0 155 _ip_version = NSAPI_IPv6;
PavelSavyhin 0:4cdaf9b1e7d0 156 ipv6_from_address(_ip_bytes, host);
PavelSavyhin 0:4cdaf9b1e7d0 157 set_port(port);
PavelSavyhin 0:4cdaf9b1e7d0 158 } else {
PavelSavyhin 0:4cdaf9b1e7d0 159 // DNS lookup
PavelSavyhin 0:4cdaf9b1e7d0 160 int err = iface->gethostbyname(this, host);
PavelSavyhin 0:4cdaf9b1e7d0 161 if (!err) {
PavelSavyhin 0:4cdaf9b1e7d0 162 set_port(port);
PavelSavyhin 0:4cdaf9b1e7d0 163 } else {
PavelSavyhin 0:4cdaf9b1e7d0 164 _ip_version = NSAPI_IPv4;
PavelSavyhin 0:4cdaf9b1e7d0 165 memset(_ip_bytes, 0, NSAPI_IPv4_BYTES);
PavelSavyhin 0:4cdaf9b1e7d0 166 set_port(0);
PavelSavyhin 0:4cdaf9b1e7d0 167 }
PavelSavyhin 0:4cdaf9b1e7d0 168 }
PavelSavyhin 0:4cdaf9b1e7d0 169 }
PavelSavyhin 0:4cdaf9b1e7d0 170
PavelSavyhin 0:4cdaf9b1e7d0 171 SocketAddress::SocketAddress(const char *addr, uint16_t port)
PavelSavyhin 0:4cdaf9b1e7d0 172 {
PavelSavyhin 0:4cdaf9b1e7d0 173 memset(&_ip_address, 0, sizeof _ip_address);
PavelSavyhin 0:4cdaf9b1e7d0 174 set_ip_address(addr);
PavelSavyhin 0:4cdaf9b1e7d0 175 set_port(port);
PavelSavyhin 0:4cdaf9b1e7d0 176 }
PavelSavyhin 0:4cdaf9b1e7d0 177
PavelSavyhin 0:4cdaf9b1e7d0 178 SocketAddress::SocketAddress(const void *bytes, nsapi_version_t version, uint16_t port)
PavelSavyhin 0:4cdaf9b1e7d0 179 {
PavelSavyhin 0:4cdaf9b1e7d0 180 memset(&_ip_address, 0, sizeof _ip_address);
PavelSavyhin 0:4cdaf9b1e7d0 181 set_ip_bytes(bytes, version);
PavelSavyhin 0:4cdaf9b1e7d0 182 set_port(port);
PavelSavyhin 0:4cdaf9b1e7d0 183 }
PavelSavyhin 0:4cdaf9b1e7d0 184
PavelSavyhin 0:4cdaf9b1e7d0 185 SocketAddress::SocketAddress(const SocketAddress &addr)
PavelSavyhin 0:4cdaf9b1e7d0 186 {
PavelSavyhin 0:4cdaf9b1e7d0 187 memset(&_ip_address, 0, sizeof _ip_address);
PavelSavyhin 0:4cdaf9b1e7d0 188 set_ip_bytes(addr.get_ip_bytes(), addr.get_ip_version());
PavelSavyhin 0:4cdaf9b1e7d0 189 set_port(addr.get_port());
PavelSavyhin 0:4cdaf9b1e7d0 190 }
PavelSavyhin 0:4cdaf9b1e7d0 191
PavelSavyhin 0:4cdaf9b1e7d0 192 void SocketAddress::set_ip_address(const char *addr)
PavelSavyhin 0:4cdaf9b1e7d0 193 {
PavelSavyhin 0:4cdaf9b1e7d0 194 _ip_address[0] = '\0';
PavelSavyhin 0:4cdaf9b1e7d0 195
PavelSavyhin 0:4cdaf9b1e7d0 196 if (addr && ipv4_is_valid(addr)) {
PavelSavyhin 0:4cdaf9b1e7d0 197 _ip_version = NSAPI_IPv4;
PavelSavyhin 0:4cdaf9b1e7d0 198 ipv4_from_address(_ip_bytes, addr);
PavelSavyhin 0:4cdaf9b1e7d0 199 } else if (addr && ipv6_is_valid(addr)) {
PavelSavyhin 0:4cdaf9b1e7d0 200 _ip_version = NSAPI_IPv6;
PavelSavyhin 0:4cdaf9b1e7d0 201 ipv6_from_address(_ip_bytes, addr);
PavelSavyhin 0:4cdaf9b1e7d0 202 } else {
PavelSavyhin 0:4cdaf9b1e7d0 203 _ip_version = NSAPI_IPv4;
PavelSavyhin 0:4cdaf9b1e7d0 204 memset(_ip_bytes, 0, NSAPI_IPv4_BYTES);
PavelSavyhin 0:4cdaf9b1e7d0 205 }
PavelSavyhin 0:4cdaf9b1e7d0 206 }
PavelSavyhin 0:4cdaf9b1e7d0 207
PavelSavyhin 0:4cdaf9b1e7d0 208 void SocketAddress::set_ip_bytes(const void *bytes, nsapi_version_t version)
PavelSavyhin 0:4cdaf9b1e7d0 209 {
PavelSavyhin 0:4cdaf9b1e7d0 210 _ip_address[0] = '\0';
PavelSavyhin 0:4cdaf9b1e7d0 211
PavelSavyhin 0:4cdaf9b1e7d0 212 if (version == NSAPI_IPv4) {
PavelSavyhin 0:4cdaf9b1e7d0 213 _ip_version = NSAPI_IPv4;
PavelSavyhin 0:4cdaf9b1e7d0 214 memcpy(_ip_bytes, bytes, NSAPI_IPv4_BYTES);
PavelSavyhin 0:4cdaf9b1e7d0 215 } else if (version == NSAPI_IPv6) {
PavelSavyhin 0:4cdaf9b1e7d0 216 _ip_version = NSAPI_IPv6;
PavelSavyhin 0:4cdaf9b1e7d0 217 memcpy(_ip_bytes, bytes, NSAPI_IPv6_BYTES);
PavelSavyhin 0:4cdaf9b1e7d0 218 } else {
PavelSavyhin 0:4cdaf9b1e7d0 219 _ip_version = NSAPI_IPv4;
PavelSavyhin 0:4cdaf9b1e7d0 220 memset(_ip_bytes, 0, NSAPI_IPv4_BYTES);
PavelSavyhin 0:4cdaf9b1e7d0 221 }
PavelSavyhin 0:4cdaf9b1e7d0 222 }
PavelSavyhin 0:4cdaf9b1e7d0 223
PavelSavyhin 0:4cdaf9b1e7d0 224 void SocketAddress::set_port(uint16_t port)
PavelSavyhin 0:4cdaf9b1e7d0 225 {
PavelSavyhin 0:4cdaf9b1e7d0 226 _port = port;
PavelSavyhin 0:4cdaf9b1e7d0 227 }
PavelSavyhin 0:4cdaf9b1e7d0 228
PavelSavyhin 0:4cdaf9b1e7d0 229 const char *SocketAddress::get_ip_address() const
PavelSavyhin 0:4cdaf9b1e7d0 230 {
PavelSavyhin 0:4cdaf9b1e7d0 231 char *ip_address = (char *)_ip_address;
PavelSavyhin 0:4cdaf9b1e7d0 232
PavelSavyhin 0:4cdaf9b1e7d0 233 if (!ip_address[0]) {
PavelSavyhin 0:4cdaf9b1e7d0 234 if (_ip_version == NSAPI_IPv4) {
PavelSavyhin 0:4cdaf9b1e7d0 235 ipv4_to_address(ip_address, _ip_bytes);
PavelSavyhin 0:4cdaf9b1e7d0 236 } else if (_ip_version == NSAPI_IPv6) {
PavelSavyhin 0:4cdaf9b1e7d0 237 ipv6_to_address(ip_address, _ip_bytes);
PavelSavyhin 0:4cdaf9b1e7d0 238 }
PavelSavyhin 0:4cdaf9b1e7d0 239 }
PavelSavyhin 0:4cdaf9b1e7d0 240
PavelSavyhin 0:4cdaf9b1e7d0 241 return ip_address;
PavelSavyhin 0:4cdaf9b1e7d0 242 }
PavelSavyhin 0:4cdaf9b1e7d0 243
PavelSavyhin 0:4cdaf9b1e7d0 244 const void *SocketAddress::get_ip_bytes() const
PavelSavyhin 0:4cdaf9b1e7d0 245 {
PavelSavyhin 0:4cdaf9b1e7d0 246 return _ip_bytes;
PavelSavyhin 0:4cdaf9b1e7d0 247 }
PavelSavyhin 0:4cdaf9b1e7d0 248
PavelSavyhin 0:4cdaf9b1e7d0 249 nsapi_version_t SocketAddress::get_ip_version() const
PavelSavyhin 0:4cdaf9b1e7d0 250 {
PavelSavyhin 0:4cdaf9b1e7d0 251 return _ip_version;
PavelSavyhin 0:4cdaf9b1e7d0 252 }
PavelSavyhin 0:4cdaf9b1e7d0 253
PavelSavyhin 0:4cdaf9b1e7d0 254 uint16_t SocketAddress::get_port() const
PavelSavyhin 0:4cdaf9b1e7d0 255 {
PavelSavyhin 0:4cdaf9b1e7d0 256 return _port;
PavelSavyhin 0:4cdaf9b1e7d0 257 }
PavelSavyhin 0:4cdaf9b1e7d0 258
PavelSavyhin 0:4cdaf9b1e7d0 259 SocketAddress::operator bool() const
PavelSavyhin 0:4cdaf9b1e7d0 260 {
PavelSavyhin 0:4cdaf9b1e7d0 261 int count = 0;
PavelSavyhin 0:4cdaf9b1e7d0 262 if (_ip_version == NSAPI_IPv4) {
PavelSavyhin 0:4cdaf9b1e7d0 263 count = NSAPI_IPv4_BYTES;
PavelSavyhin 0:4cdaf9b1e7d0 264 } else if (_ip_version == NSAPI_IPv6) {
PavelSavyhin 0:4cdaf9b1e7d0 265 count = NSAPI_IPv6_BYTES;
PavelSavyhin 0:4cdaf9b1e7d0 266 }
PavelSavyhin 0:4cdaf9b1e7d0 267
PavelSavyhin 0:4cdaf9b1e7d0 268 for (int i = 0; i < count; i++) {
PavelSavyhin 0:4cdaf9b1e7d0 269 if (_ip_bytes[i]) {
PavelSavyhin 0:4cdaf9b1e7d0 270 return true;
PavelSavyhin 0:4cdaf9b1e7d0 271 }
PavelSavyhin 0:4cdaf9b1e7d0 272 }
PavelSavyhin 0:4cdaf9b1e7d0 273
PavelSavyhin 0:4cdaf9b1e7d0 274 return false;
PavelSavyhin 0:4cdaf9b1e7d0 275 }