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:
Wed Sep 27 14:40:52 2017 +0300
Revision:
0:4cdaf9b1e7d0
Initial commit

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 #ifndef SOCKET_H
PavelSavyhin 0:4cdaf9b1e7d0 18 #define SOCKET_H
PavelSavyhin 0:4cdaf9b1e7d0 19
PavelSavyhin 0:4cdaf9b1e7d0 20 #include "SocketAddress.h"
PavelSavyhin 0:4cdaf9b1e7d0 21 #include "NetworkStack.h"
PavelSavyhin 0:4cdaf9b1e7d0 22
PavelSavyhin 0:4cdaf9b1e7d0 23 /** Abstract socket class
PavelSavyhin 0:4cdaf9b1e7d0 24 */
PavelSavyhin 0:4cdaf9b1e7d0 25 class Socket {
PavelSavyhin 0:4cdaf9b1e7d0 26 public:
PavelSavyhin 0:4cdaf9b1e7d0 27 /** Destroy a socket
PavelSavyhin 0:4cdaf9b1e7d0 28 *
PavelSavyhin 0:4cdaf9b1e7d0 29 * Closes socket if the socket is still open
PavelSavyhin 0:4cdaf9b1e7d0 30 */
PavelSavyhin 0:4cdaf9b1e7d0 31 virtual ~Socket();
PavelSavyhin 0:4cdaf9b1e7d0 32
PavelSavyhin 0:4cdaf9b1e7d0 33 /** Opens a socket
PavelSavyhin 0:4cdaf9b1e7d0 34 *
PavelSavyhin 0:4cdaf9b1e7d0 35 * Creates a network socket on the specified network stack.
PavelSavyhin 0:4cdaf9b1e7d0 36 * Not needed if stack is passed to the socket's constructor.
PavelSavyhin 0:4cdaf9b1e7d0 37 *
PavelSavyhin 0:4cdaf9b1e7d0 38 * @param iface Network stack as target for socket
PavelSavyhin 0:4cdaf9b1e7d0 39 * @return 0 on success, negative error code on failure
PavelSavyhin 0:4cdaf9b1e7d0 40 */
PavelSavyhin 0:4cdaf9b1e7d0 41 virtual int open(NetworkStack *iface) = 0;
PavelSavyhin 0:4cdaf9b1e7d0 42
PavelSavyhin 0:4cdaf9b1e7d0 43 /** Close the socket
PavelSavyhin 0:4cdaf9b1e7d0 44 *
PavelSavyhin 0:4cdaf9b1e7d0 45 * Closes any open connection and deallocates any memory associated
PavelSavyhin 0:4cdaf9b1e7d0 46 * with the socket. Called from destructor if socket is not closed.
PavelSavyhin 0:4cdaf9b1e7d0 47 *
PavelSavyhin 0:4cdaf9b1e7d0 48 * @return 0 on success, negative error code on failure
PavelSavyhin 0:4cdaf9b1e7d0 49 */
PavelSavyhin 0:4cdaf9b1e7d0 50 int close();
PavelSavyhin 0:4cdaf9b1e7d0 51
PavelSavyhin 0:4cdaf9b1e7d0 52 /** Bind a specific address to a socket
PavelSavyhin 0:4cdaf9b1e7d0 53 *
PavelSavyhin 0:4cdaf9b1e7d0 54 * Binding a socket specifies the address and port on which to recieve
PavelSavyhin 0:4cdaf9b1e7d0 55 * data.
PavelSavyhin 0:4cdaf9b1e7d0 56 *
PavelSavyhin 0:4cdaf9b1e7d0 57 * @param port Local port to bind
PavelSavyhin 0:4cdaf9b1e7d0 58 * @return 0 on success, negative error code on failure.
PavelSavyhin 0:4cdaf9b1e7d0 59 */
PavelSavyhin 0:4cdaf9b1e7d0 60 int bind(uint16_t port);
PavelSavyhin 0:4cdaf9b1e7d0 61
PavelSavyhin 0:4cdaf9b1e7d0 62 /** Bind a specific address to a socket
PavelSavyhin 0:4cdaf9b1e7d0 63 *
PavelSavyhin 0:4cdaf9b1e7d0 64 * Binding a socket specifies the address and port on which to recieve
PavelSavyhin 0:4cdaf9b1e7d0 65 * data. If the IP address is zeroed, only the port is bound.
PavelSavyhin 0:4cdaf9b1e7d0 66 *
PavelSavyhin 0:4cdaf9b1e7d0 67 * @param address Null-terminated local address to bind
PavelSavyhin 0:4cdaf9b1e7d0 68 * @param port Local port to bind
PavelSavyhin 0:4cdaf9b1e7d0 69 * @return 0 on success, negative error code on failure.
PavelSavyhin 0:4cdaf9b1e7d0 70 */
PavelSavyhin 0:4cdaf9b1e7d0 71 int bind(const char *address, uint16_t port);
PavelSavyhin 0:4cdaf9b1e7d0 72
PavelSavyhin 0:4cdaf9b1e7d0 73 /** Bind a specific address to a socket
PavelSavyhin 0:4cdaf9b1e7d0 74 *
PavelSavyhin 0:4cdaf9b1e7d0 75 * Binding a socket specifies the address and port on which to recieve
PavelSavyhin 0:4cdaf9b1e7d0 76 * data. If the IP address is zeroed, only the port is bound.
PavelSavyhin 0:4cdaf9b1e7d0 77 *
PavelSavyhin 0:4cdaf9b1e7d0 78 * @param address Local address to bind
PavelSavyhin 0:4cdaf9b1e7d0 79 * @return 0 on success, negative error code on failure.
PavelSavyhin 0:4cdaf9b1e7d0 80 */
PavelSavyhin 0:4cdaf9b1e7d0 81 int bind(const SocketAddress &address);
PavelSavyhin 0:4cdaf9b1e7d0 82
PavelSavyhin 0:4cdaf9b1e7d0 83 /** Set blocking or non-blocking mode of the socket
PavelSavyhin 0:4cdaf9b1e7d0 84 *
PavelSavyhin 0:4cdaf9b1e7d0 85 * Initially all sockets are in blocking mode. In non-blocking mode
PavelSavyhin 0:4cdaf9b1e7d0 86 * blocking operations such as send/recv/accept return
PavelSavyhin 0:4cdaf9b1e7d0 87 * NSAPI_ERROR_WOULD_BLOCK if they can not continue.
PavelSavyhin 0:4cdaf9b1e7d0 88 *
PavelSavyhin 0:4cdaf9b1e7d0 89 * set_blocking(false) is equivalent to set_timeout(-1)
PavelSavyhin 0:4cdaf9b1e7d0 90 * set_blocking(true) is equivalent to set_timeout(0)
PavelSavyhin 0:4cdaf9b1e7d0 91 *
PavelSavyhin 0:4cdaf9b1e7d0 92 * @param blocking true for blocking mode, false for non-blocking mode.
PavelSavyhin 0:4cdaf9b1e7d0 93 */
PavelSavyhin 0:4cdaf9b1e7d0 94 void set_blocking(bool blocking);
PavelSavyhin 0:4cdaf9b1e7d0 95
PavelSavyhin 0:4cdaf9b1e7d0 96 /** Set timeout on blocking socket operations
PavelSavyhin 0:4cdaf9b1e7d0 97 *
PavelSavyhin 0:4cdaf9b1e7d0 98 * Initially all sockets have unbounded timeouts. NSAPI_ERROR_WOULD_BLOCK
PavelSavyhin 0:4cdaf9b1e7d0 99 * is returned if a blocking operation takes longer than the specified
PavelSavyhin 0:4cdaf9b1e7d0 100 * timeout. A timeout of -1 removes the timeout from the socket.
PavelSavyhin 0:4cdaf9b1e7d0 101 *
PavelSavyhin 0:4cdaf9b1e7d0 102 * set_timeout(-1) is equivalent to set_blocking(false)
PavelSavyhin 0:4cdaf9b1e7d0 103 * set_timeout(0) is equivalent to set_blocking(true)
PavelSavyhin 0:4cdaf9b1e7d0 104 *
PavelSavyhin 0:4cdaf9b1e7d0 105 * @param timeout Timeout in milliseconds
PavelSavyhin 0:4cdaf9b1e7d0 106 */
PavelSavyhin 0:4cdaf9b1e7d0 107 void set_timeout(int timeout);
PavelSavyhin 0:4cdaf9b1e7d0 108
PavelSavyhin 0:4cdaf9b1e7d0 109 /* Set stack-specific socket options
PavelSavyhin 0:4cdaf9b1e7d0 110 *
PavelSavyhin 0:4cdaf9b1e7d0 111 * The setsockopt allow an application to pass stack-specific hints
PavelSavyhin 0:4cdaf9b1e7d0 112 * to the underlying stack. For unsupported options,
PavelSavyhin 0:4cdaf9b1e7d0 113 * NSAPI_ERROR_UNSUPPORTED is returned and the socket is unmodified.
PavelSavyhin 0:4cdaf9b1e7d0 114 *
PavelSavyhin 0:4cdaf9b1e7d0 115 * @param level Stack-specific protocol level
PavelSavyhin 0:4cdaf9b1e7d0 116 * @param optname Stack-specific option identifier
PavelSavyhin 0:4cdaf9b1e7d0 117 * @param optval Option value
PavelSavyhin 0:4cdaf9b1e7d0 118 * @param optlen Length of the option value
PavelSavyhin 0:4cdaf9b1e7d0 119 * @return 0 on success, negative error code on failure
PavelSavyhin 0:4cdaf9b1e7d0 120 */
PavelSavyhin 0:4cdaf9b1e7d0 121 int setsockopt(int level, int optname, const void *optval, unsigned optlen);
PavelSavyhin 0:4cdaf9b1e7d0 122
PavelSavyhin 0:4cdaf9b1e7d0 123 /* Get stack-specific socket options
PavelSavyhin 0:4cdaf9b1e7d0 124 *
PavelSavyhin 0:4cdaf9b1e7d0 125 * The getstackopt allow an application to retrieve stack-specific hints
PavelSavyhin 0:4cdaf9b1e7d0 126 * from the underlying stack. For unsupported options,
PavelSavyhin 0:4cdaf9b1e7d0 127 * NSAPI_ERROR_UNSUPPORTED is returned and optval is unmodified.
PavelSavyhin 0:4cdaf9b1e7d0 128 *
PavelSavyhin 0:4cdaf9b1e7d0 129 * @param level Stack-specific protocol level
PavelSavyhin 0:4cdaf9b1e7d0 130 * @param optname Stack-specific option identifier
PavelSavyhin 0:4cdaf9b1e7d0 131 * @param optval Destination for option value
PavelSavyhin 0:4cdaf9b1e7d0 132 * @param optlen Length of the option value
PavelSavyhin 0:4cdaf9b1e7d0 133 * @return 0 on success, negative error code on failure
PavelSavyhin 0:4cdaf9b1e7d0 134 */
PavelSavyhin 0:4cdaf9b1e7d0 135 int getsockopt(int level, int optname, void *optval, unsigned *optlen);
PavelSavyhin 0:4cdaf9b1e7d0 136
PavelSavyhin 0:4cdaf9b1e7d0 137 /** Register a callback on state change of the socket
PavelSavyhin 0:4cdaf9b1e7d0 138 *
PavelSavyhin 0:4cdaf9b1e7d0 139 * The specified callback will be called on state changes such as when
PavelSavyhin 0:4cdaf9b1e7d0 140 * the socket can recv/send/accept successfully and on when an error
PavelSavyhin 0:4cdaf9b1e7d0 141 * occurs. The callback may also be called spuriously without reason.
PavelSavyhin 0:4cdaf9b1e7d0 142 *
PavelSavyhin 0:4cdaf9b1e7d0 143 * The callback may be called in an interrupt context and should not
PavelSavyhin 0:4cdaf9b1e7d0 144 * perform expensive operations such as recv/send calls.
PavelSavyhin 0:4cdaf9b1e7d0 145 *
PavelSavyhin 0:4cdaf9b1e7d0 146 * @param callback Function to call on state change
PavelSavyhin 0:4cdaf9b1e7d0 147 */
PavelSavyhin 0:4cdaf9b1e7d0 148 void attach(FunctionPointer callback);
PavelSavyhin 0:4cdaf9b1e7d0 149
PavelSavyhin 0:4cdaf9b1e7d0 150 /** Register a callback on state change of the socket
PavelSavyhin 0:4cdaf9b1e7d0 151 *
PavelSavyhin 0:4cdaf9b1e7d0 152 * The specified callback will be called on state changes such as when
PavelSavyhin 0:4cdaf9b1e7d0 153 * the socket can recv/send/accept successfully and on when an error
PavelSavyhin 0:4cdaf9b1e7d0 154 * occurs. The callback may also be called spuriously without reason.
PavelSavyhin 0:4cdaf9b1e7d0 155 *
PavelSavyhin 0:4cdaf9b1e7d0 156 * The callback may be called in an interrupt context and should not
PavelSavyhin 0:4cdaf9b1e7d0 157 * perform expensive operations such as recv/send calls.
PavelSavyhin 0:4cdaf9b1e7d0 158 *
PavelSavyhin 0:4cdaf9b1e7d0 159 * @param tptr Pointer to object to call method on
PavelSavyhin 0:4cdaf9b1e7d0 160 * @param mptr Method to call on state change
PavelSavyhin 0:4cdaf9b1e7d0 161 */
PavelSavyhin 0:4cdaf9b1e7d0 162 template <typename T, typename M>
PavelSavyhin 0:4cdaf9b1e7d0 163 void attach(T *tptr, M mptr) {
PavelSavyhin 0:4cdaf9b1e7d0 164 attach(FunctionPointer(tptr, mptr));
PavelSavyhin 0:4cdaf9b1e7d0 165 }
PavelSavyhin 0:4cdaf9b1e7d0 166
PavelSavyhin 0:4cdaf9b1e7d0 167 protected:
PavelSavyhin 0:4cdaf9b1e7d0 168 Socket();
PavelSavyhin 0:4cdaf9b1e7d0 169 int open(NetworkStack *iface, nsapi_protocol_t proto);
PavelSavyhin 0:4cdaf9b1e7d0 170
PavelSavyhin 0:4cdaf9b1e7d0 171 static void thunk(void *);
PavelSavyhin 0:4cdaf9b1e7d0 172 static void wakeup();
PavelSavyhin 0:4cdaf9b1e7d0 173
PavelSavyhin 0:4cdaf9b1e7d0 174 NetworkStack *_iface;
PavelSavyhin 0:4cdaf9b1e7d0 175 void *_socket;
PavelSavyhin 0:4cdaf9b1e7d0 176 int _timeout;
PavelSavyhin 0:4cdaf9b1e7d0 177 FunctionPointer _callback;
PavelSavyhin 0:4cdaf9b1e7d0 178 };
PavelSavyhin 0:4cdaf9b1e7d0 179
PavelSavyhin 0:4cdaf9b1e7d0 180 #endif