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 /* SPWFInterface Example
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 #ifndef SPWFSA01_H
PavelSavyhin 0:4cdaf9b1e7d0 18 #define SPWFSA01_H
PavelSavyhin 0:4cdaf9b1e7d0 19
PavelSavyhin 0:4cdaf9b1e7d0 20 #include "ATParser.h"
PavelSavyhin 0:4cdaf9b1e7d0 21
PavelSavyhin 0:4cdaf9b1e7d0 22 /** SPWFSA01Interface class.
PavelSavyhin 0:4cdaf9b1e7d0 23 This is an interface to a SPWFSA01 module.
PavelSavyhin 0:4cdaf9b1e7d0 24 */
PavelSavyhin 0:4cdaf9b1e7d0 25 class SPWFSA01
PavelSavyhin 0:4cdaf9b1e7d0 26 {
PavelSavyhin 0:4cdaf9b1e7d0 27 public:
PavelSavyhin 0:4cdaf9b1e7d0 28
PavelSavyhin 0:4cdaf9b1e7d0 29 SPWFSA01(PinName tx, PinName rx, PinName reset=NC, PinName wakeup=NC, bool debug=false);
PavelSavyhin 0:4cdaf9b1e7d0 30
PavelSavyhin 0:4cdaf9b1e7d0 31 /**
PavelSavyhin 0:4cdaf9b1e7d0 32 * Init the SPWFSA01
PavelSavyhin 0:4cdaf9b1e7d0 33 *
PavelSavyhin 0:4cdaf9b1e7d0 34 * @param mode mode in which to startup
PavelSavyhin 0:4cdaf9b1e7d0 35 * @return true only if SPWFSA01 has started up correctly
PavelSavyhin 0:4cdaf9b1e7d0 36 */
PavelSavyhin 0:4cdaf9b1e7d0 37 bool startup(int mode);
PavelSavyhin 0:4cdaf9b1e7d0 38
PavelSavyhin 0:4cdaf9b1e7d0 39 void waitSPWFReady(void);
PavelSavyhin 0:4cdaf9b1e7d0 40 /**
PavelSavyhin 0:4cdaf9b1e7d0 41 * Reset SPWFSA01
PavelSavyhin 0:4cdaf9b1e7d0 42 *
PavelSavyhin 0:4cdaf9b1e7d0 43 * @return true only if SPWFSA01 resets successfully
PavelSavyhin 0:4cdaf9b1e7d0 44 */
PavelSavyhin 0:4cdaf9b1e7d0 45 bool reset(void);
PavelSavyhin 0:4cdaf9b1e7d0 46
PavelSavyhin 0:4cdaf9b1e7d0 47 bool hw_reset(void);
PavelSavyhin 0:4cdaf9b1e7d0 48
PavelSavyhin 0:4cdaf9b1e7d0 49 /**
PavelSavyhin 0:4cdaf9b1e7d0 50 * Enable/Disable DHCP
PavelSavyhin 0:4cdaf9b1e7d0 51 *
PavelSavyhin 0:4cdaf9b1e7d0 52 * @param mode mode of DHCP 2-softAP, 1-on, 0-off
PavelSavyhin 0:4cdaf9b1e7d0 53 * @return true only if SPWFSA01 enables/disables DHCP successfully
PavelSavyhin 0:4cdaf9b1e7d0 54 */
PavelSavyhin 0:4cdaf9b1e7d0 55 bool dhcp(int mode);
PavelSavyhin 0:4cdaf9b1e7d0 56
PavelSavyhin 0:4cdaf9b1e7d0 57 /**
PavelSavyhin 0:4cdaf9b1e7d0 58 * Connect SPWFSA01 to AP
PavelSavyhin 0:4cdaf9b1e7d0 59 *
PavelSavyhin 0:4cdaf9b1e7d0 60 * @param ap the name of the AP
PavelSavyhin 0:4cdaf9b1e7d0 61 * @param passPhrase the password of AP
PavelSavyhin 0:4cdaf9b1e7d0 62 * @param securityMode the security mode of AP (WPA/WPA2, WEP, Open)
PavelSavyhin 0:4cdaf9b1e7d0 63 * @return true only if SPWFSA01 is connected successfully
PavelSavyhin 0:4cdaf9b1e7d0 64 */
PavelSavyhin 0:4cdaf9b1e7d0 65 bool connect(const char *ap, const char *passPhrase, int securityMode);
PavelSavyhin 0:4cdaf9b1e7d0 66
PavelSavyhin 0:4cdaf9b1e7d0 67 /**
PavelSavyhin 0:4cdaf9b1e7d0 68 * Disconnect SPWFSA01 from AP
PavelSavyhin 0:4cdaf9b1e7d0 69 *
PavelSavyhin 0:4cdaf9b1e7d0 70 * @return true only if SPWFSA01 is disconnected successfully
PavelSavyhin 0:4cdaf9b1e7d0 71 */
PavelSavyhin 0:4cdaf9b1e7d0 72 bool disconnect(void);
PavelSavyhin 0:4cdaf9b1e7d0 73
PavelSavyhin 0:4cdaf9b1e7d0 74 /**
PavelSavyhin 0:4cdaf9b1e7d0 75 * Get the IP address of SPWFSA01
PavelSavyhin 0:4cdaf9b1e7d0 76 *
PavelSavyhin 0:4cdaf9b1e7d0 77 * @return null-teriminated IP address or null if no IP address is assigned
PavelSavyhin 0:4cdaf9b1e7d0 78 */
PavelSavyhin 0:4cdaf9b1e7d0 79 const char *getIPAddress(void);
PavelSavyhin 0:4cdaf9b1e7d0 80
PavelSavyhin 0:4cdaf9b1e7d0 81 /**
PavelSavyhin 0:4cdaf9b1e7d0 82 * Get the MAC address of SPWFSA01
PavelSavyhin 0:4cdaf9b1e7d0 83 *
PavelSavyhin 0:4cdaf9b1e7d0 84 * @return null-terminated MAC address or null if no MAC address is assigned
PavelSavyhin 0:4cdaf9b1e7d0 85 */
PavelSavyhin 0:4cdaf9b1e7d0 86 const char *getMACAddress(void);
PavelSavyhin 0:4cdaf9b1e7d0 87
PavelSavyhin 0:4cdaf9b1e7d0 88 /**
PavelSavyhin 0:4cdaf9b1e7d0 89 * Check if SPWFSA01 is conenected
PavelSavyhin 0:4cdaf9b1e7d0 90 *
PavelSavyhin 0:4cdaf9b1e7d0 91 * @return true only if the chip has an IP address
PavelSavyhin 0:4cdaf9b1e7d0 92 */
PavelSavyhin 0:4cdaf9b1e7d0 93 bool isConnected(void);
PavelSavyhin 0:4cdaf9b1e7d0 94
PavelSavyhin 0:4cdaf9b1e7d0 95 /**
PavelSavyhin 0:4cdaf9b1e7d0 96 * @brief wifi_socket_client_security
PavelSavyhin 0:4cdaf9b1e7d0 97 * Set the security certificates and key for secure socket (TLS)
PavelSavyhin 0:4cdaf9b1e7d0 98 * @param None
PavelSavyhin 0:4cdaf9b1e7d0 99 * @retval return nonzero in case of error
PavelSavyhin 0:4cdaf9b1e7d0 100 */
PavelSavyhin 0:4cdaf9b1e7d0 101 int setSocketClientSecurity(uint8_t* tls_mode, uint8_t* root_ca_server, uint8_t* client_cert, uint8_t* client_key, uint8_t* client_domain, uint32_t tls_epoch_time);
PavelSavyhin 0:4cdaf9b1e7d0 102
PavelSavyhin 0:4cdaf9b1e7d0 103 /**
PavelSavyhin 0:4cdaf9b1e7d0 104 * Open a socketed connection
PavelSavyhin 0:4cdaf9b1e7d0 105 *
PavelSavyhin 0:4cdaf9b1e7d0 106 * @param type the type of socket to open "u" (UDP) or "t" (TCP)
PavelSavyhin 0:4cdaf9b1e7d0 107 * @param id id to get the new socket number, valid 0-7
PavelSavyhin 0:4cdaf9b1e7d0 108 * @param port port to open connection with
PavelSavyhin 0:4cdaf9b1e7d0 109 * @param addr the IP address of the destination
PavelSavyhin 0:4cdaf9b1e7d0 110 * @return true only if socket opened successfully
PavelSavyhin 0:4cdaf9b1e7d0 111 */
PavelSavyhin 0:4cdaf9b1e7d0 112 bool open(const char *type, int* id, const char* addr, int port);
PavelSavyhin 0:4cdaf9b1e7d0 113
PavelSavyhin 0:4cdaf9b1e7d0 114 /**
PavelSavyhin 0:4cdaf9b1e7d0 115 * Sends data to an open socket
PavelSavyhin 0:4cdaf9b1e7d0 116 *
PavelSavyhin 0:4cdaf9b1e7d0 117 * @param id id of socket to send to
PavelSavyhin 0:4cdaf9b1e7d0 118 * @param data data to be sent
PavelSavyhin 0:4cdaf9b1e7d0 119 * @param amount amount of data to be sent - max 1024
PavelSavyhin 0:4cdaf9b1e7d0 120 * @return true only if data sent successfully
PavelSavyhin 0:4cdaf9b1e7d0 121 */
PavelSavyhin 0:4cdaf9b1e7d0 122 bool send(int id, const void *data, uint32_t amount);
PavelSavyhin 0:4cdaf9b1e7d0 123
PavelSavyhin 0:4cdaf9b1e7d0 124 /**
PavelSavyhin 0:4cdaf9b1e7d0 125 * Receives data from an open socket
PavelSavyhin 0:4cdaf9b1e7d0 126 *
PavelSavyhin 0:4cdaf9b1e7d0 127 * @param id id to receive from
PavelSavyhin 0:4cdaf9b1e7d0 128 * @param data placeholder for returned information
PavelSavyhin 0:4cdaf9b1e7d0 129 * @param amount number of bytes to be received
PavelSavyhin 0:4cdaf9b1e7d0 130 * @return the number of bytes received
PavelSavyhin 0:4cdaf9b1e7d0 131 */
PavelSavyhin 0:4cdaf9b1e7d0 132 int32_t recv(int id, void *data, uint32_t amount);
PavelSavyhin 0:4cdaf9b1e7d0 133
PavelSavyhin 0:4cdaf9b1e7d0 134 /**
PavelSavyhin 0:4cdaf9b1e7d0 135 * Closes a socket
PavelSavyhin 0:4cdaf9b1e7d0 136 *
PavelSavyhin 0:4cdaf9b1e7d0 137 * @param id id of socket to close, valid only 0-4
PavelSavyhin 0:4cdaf9b1e7d0 138 * @return true only if socket is closed successfully
PavelSavyhin 0:4cdaf9b1e7d0 139 */
PavelSavyhin 0:4cdaf9b1e7d0 140 bool close(int id);
PavelSavyhin 0:4cdaf9b1e7d0 141
PavelSavyhin 0:4cdaf9b1e7d0 142
PavelSavyhin 0:4cdaf9b1e7d0 143 /**
PavelSavyhin 0:4cdaf9b1e7d0 144 * Checks if data is available
PavelSavyhin 0:4cdaf9b1e7d0 145 */
PavelSavyhin 0:4cdaf9b1e7d0 146 bool readable();
PavelSavyhin 0:4cdaf9b1e7d0 147
PavelSavyhin 0:4cdaf9b1e7d0 148 /**
PavelSavyhin 0:4cdaf9b1e7d0 149 * Checks if data can be written
PavelSavyhin 0:4cdaf9b1e7d0 150 */
PavelSavyhin 0:4cdaf9b1e7d0 151 bool writeable();
PavelSavyhin 1:042ca9148926 152
PavelSavyhin 1:042ca9148926 153 /** Sets debug mode */
PavelSavyhin 1:042ca9148926 154 inline void set_debug(bool state) { dbg_on = state;_parser.debugOn(state);};
PavelSavyhin 0:4cdaf9b1e7d0 155
PavelSavyhin 0:4cdaf9b1e7d0 156 private:
PavelSavyhin 0:4cdaf9b1e7d0 157 BufferedSerial _serial;
PavelSavyhin 0:4cdaf9b1e7d0 158 ATParser _parser;
PavelSavyhin 0:4cdaf9b1e7d0 159 DigitalInOut _wakeup;
PavelSavyhin 0:4cdaf9b1e7d0 160 DigitalInOut _reset;
PavelSavyhin 0:4cdaf9b1e7d0 161 char _ip_buffer[16];
PavelSavyhin 0:4cdaf9b1e7d0 162 char _mac_buffer[18];
PavelSavyhin 0:4cdaf9b1e7d0 163 bool dbg_on;
PavelSavyhin 0:4cdaf9b1e7d0 164 // int _timeout; // FIXME LICIO we have "virtual" socket tmo, module socket tmo,
PavelSavyhin 0:4cdaf9b1e7d0 165 // AT parser tmo, recv/send tmo, actually used the NetworksocketAPI socket tmo
PavelSavyhin 0:4cdaf9b1e7d0 166 unsigned int _recv_timeout; // see SO_RCVTIMEO setsockopt
PavelSavyhin 0:4cdaf9b1e7d0 167 unsigned int _send_timeout; // see SO_SNDTIMEO setsockopt
PavelSavyhin 0:4cdaf9b1e7d0 168 unsigned int socket_closed;
PavelSavyhin 0:4cdaf9b1e7d0 169 };
PavelSavyhin 0:4cdaf9b1e7d0 170
PavelSavyhin 0:4cdaf9b1e7d0 171 #endif //SPWFSA01_H