Real Time Logic LLC / Mbed 2 deprecated SMQ Client-example Featured

Dependencies:   EthernetInterface mbed-rtos mbed

Introduction

The SMQ Architecture is an Internet of Things (IoT) publish subscribe end-to-end solution that is optimized for embedded systems to provide instantaneous Device Edge Node connectivity, 1 to 1 Communications, and Ease of Transcending Firewalls. The solution is ideal for resource constrained devices that require real-time dynamic control, analytic information, and firmware updates in both LAN and WAN environments.

Architecture Component List

  • SMQ C Client (Non-secure)
  • SharkMQ (Secure) C Client
  • SMQjs (Javascript)
  • SMQ JAVA
  • SMQ Broker

/media/uploads/wini/smq_architecture.png

SMQ Client-example

A (non-secure) C Client implementation of the SMQ protocol demonstrating device control over the on board LEDs via any modern (WebSocket enabled) Browser interface.

  • Code Size: 3kB

See Also

How to setup your own SMQ IoT cloud server

Most IoT cloud server solutions, whether they provide ready-to-use hosted services or not, are based on a standard Virtual Private Server (VPS). Most developers probably think of Amazon or Microsoft Azure's services when considering the server side of their IoT solution. These high-end services are great if you need to scale up to millions of connected devices. However, for most small-scale operations and DIY projects, a low-cost VPS is more than adequate.

Committer:
wini
Date:
Wed Dec 03 23:54:54 2014 +0000
Revision:
0:bd3aeb15634e
Child:
2:bac2873dbd15
SimpleMQ IoT protocol: first release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wini 0:bd3aeb15634e 1 /**
wini 0:bd3aeb15634e 2 * ____ _________ __ _
wini 0:bd3aeb15634e 3 * / __ \___ ____ _/ /_ __(_)___ ___ ___ / / ____ ____ _(_)____
wini 0:bd3aeb15634e 4 * / /_/ / _ \/ __ `/ / / / / / __ `__ \/ _ \/ / / __ \/ __ `/ / ___/
wini 0:bd3aeb15634e 5 * / _, _/ __/ /_/ / / / / / / / / / / / __/ /___/ /_/ / /_/ / / /__
wini 0:bd3aeb15634e 6 * /_/ |_|\___/\__,_/_/ /_/ /_/_/ /_/ /_/\___/_____/\____/\__, /_/\___/
wini 0:bd3aeb15634e 7 * /____/
wini 0:bd3aeb15634e 8 *
wini 0:bd3aeb15634e 9 * SharkSSL Embedded SSL/TLS Stack
wini 0:bd3aeb15634e 10 ****************************************************************************
wini 0:bd3aeb15634e 11 * PROGRAM MODULE
wini 0:bd3aeb15634e 12 *
wini 0:bd3aeb15634e 13 * $Id: seLwIP.c 3617 2014-12-03 23:38:39Z wini $
wini 0:bd3aeb15634e 14 *
wini 0:bd3aeb15634e 15 * COPYRIGHT: Real Time Logic LLC, 2014
wini 0:bd3aeb15634e 16 *
wini 0:bd3aeb15634e 17 * This software is copyrighted by and is the sole property of Real
wini 0:bd3aeb15634e 18 * Time Logic LLC. All rights, title, ownership, or other interests in
wini 0:bd3aeb15634e 19 * the software remain the property of Real Time Logic LLC. This
wini 0:bd3aeb15634e 20 * software may only be used in accordance with the terms and
wini 0:bd3aeb15634e 21 * conditions stipulated in the corresponding license agreement under
wini 0:bd3aeb15634e 22 * which the software has been supplied. Any unauthorized use,
wini 0:bd3aeb15634e 23 * duplication, transmission, distribution, or disclosure of this
wini 0:bd3aeb15634e 24 * software is expressly forbidden.
wini 0:bd3aeb15634e 25 *
wini 0:bd3aeb15634e 26 * This Copyright notice may not be removed or modified without prior
wini 0:bd3aeb15634e 27 * written consent of Real Time Logic LLC.
wini 0:bd3aeb15634e 28 *
wini 0:bd3aeb15634e 29 * Real Time Logic LLC. reserves the right to modify this software
wini 0:bd3aeb15634e 30 * without notice.
wini 0:bd3aeb15634e 31 *
wini 0:bd3aeb15634e 32 * http://realtimelogic.com
wini 0:bd3aeb15634e 33 * http://sharkssl.com
wini 0:bd3aeb15634e 34 ****************************************************************************
wini 0:bd3aeb15634e 35 */
wini 0:bd3aeb15634e 36
wini 0:bd3aeb15634e 37
wini 0:bd3aeb15634e 38 #include <selib.h>
wini 0:bd3aeb15634e 39
wini 0:bd3aeb15634e 40 #ifndef SharkSSLLwIP
wini 0:bd3aeb15634e 41 #error SharkSSLLwIP not defined -> Using incorrect selibplat.h
wini 0:bd3aeb15634e 42 #endif
wini 0:bd3aeb15634e 43
wini 0:bd3aeb15634e 44
wini 0:bd3aeb15634e 45 int se_accept(SOCKET** listenSock, U32 timeout, SOCKET** outSock)
wini 0:bd3aeb15634e 46 {
wini 0:bd3aeb15634e 47 err_t err;
wini 0:bd3aeb15634e 48 memset(*outSock, 0, sizeof(SOCKET));
wini 0:bd3aeb15634e 49 if(timeout != INFINITE_TMO)
wini 0:bd3aeb15634e 50 netconn_set_recvtimeout((*listenSock)->con, timeout);
wini 0:bd3aeb15634e 51 L_accept:
wini 0:bd3aeb15634e 52 err = netconn_accept((*listenSock)->con, &(*outSock)->con);
wini 0:bd3aeb15634e 53 if(err != ERR_OK)
wini 0:bd3aeb15634e 54 {
wini 0:bd3aeb15634e 55 if(err == ERR_TIMEOUT)
wini 0:bd3aeb15634e 56 {
wini 0:bd3aeb15634e 57 if(timeout == INFINITE_TMO)
wini 0:bd3aeb15634e 58 {
wini 0:bd3aeb15634e 59 netconn_set_recvtimeout((*listenSock)->con, 100000);
wini 0:bd3aeb15634e 60 goto L_accept;
wini 0:bd3aeb15634e 61 }
wini 0:bd3aeb15634e 62 return 0;
wini 0:bd3aeb15634e 63 }
wini 0:bd3aeb15634e 64 return -1;
wini 0:bd3aeb15634e 65 }
wini 0:bd3aeb15634e 66 return 1;
wini 0:bd3aeb15634e 67 }
wini 0:bd3aeb15634e 68
wini 0:bd3aeb15634e 69
wini 0:bd3aeb15634e 70 int se_bind(SOCKET* sock, U16 port)
wini 0:bd3aeb15634e 71 {
wini 0:bd3aeb15634e 72 int err;
wini 0:bd3aeb15634e 73 memset(sock, 0, sizeof(SOCKET));
wini 0:bd3aeb15634e 74 sock->con = netconn_new(NETCONN_TCP);
wini 0:bd3aeb15634e 75 if( ! sock->con )
wini 0:bd3aeb15634e 76 return -1;
wini 0:bd3aeb15634e 77 if(netconn_bind(sock->con, IP_ADDR_ANY, port) == ERR_OK)
wini 0:bd3aeb15634e 78 {
wini 0:bd3aeb15634e 79 if(netconn_listen(sock->con) == ERR_OK)
wini 0:bd3aeb15634e 80 return 0;
wini 0:bd3aeb15634e 81 err = -2;
wini 0:bd3aeb15634e 82 }
wini 0:bd3aeb15634e 83 else
wini 0:bd3aeb15634e 84 err = -3;
wini 0:bd3aeb15634e 85 netconn_delete(sock->con);
wini 0:bd3aeb15634e 86 sock->con=0;
wini 0:bd3aeb15634e 87 return err;
wini 0:bd3aeb15634e 88 }
wini 0:bd3aeb15634e 89
wini 0:bd3aeb15634e 90
wini 0:bd3aeb15634e 91
wini 0:bd3aeb15634e 92 /* Returns 0 on success.
wini 0:bd3aeb15634e 93 Error codes returned:
wini 0:bd3aeb15634e 94 -1: Cannot create socket: Fatal
wini 0:bd3aeb15634e 95 -2: Cannot resolve 'address'
wini 0:bd3aeb15634e 96 -3: Cannot connect
wini 0:bd3aeb15634e 97 */
wini 0:bd3aeb15634e 98 int se_connect(SOCKET* sock, const char* name, U16 port)
wini 0:bd3aeb15634e 99 {
wini 0:bd3aeb15634e 100
wini 0:bd3aeb15634e 101
wini 0:bd3aeb15634e 102 ip_addr_t addr;
wini 0:bd3aeb15634e 103 memset(sock, 0, sizeof(SOCKET));
wini 0:bd3aeb15634e 104 if(netconn_gethostbyname(name, &addr) != ERR_OK)
wini 0:bd3aeb15634e 105 return -2;
wini 0:bd3aeb15634e 106 sock->con = netconn_new(NETCONN_TCP);
wini 0:bd3aeb15634e 107 if( ! sock->con )
wini 0:bd3aeb15634e 108 return -1;
wini 0:bd3aeb15634e 109 if(netconn_connect(sock->con, &addr, port) == ERR_OK)
wini 0:bd3aeb15634e 110 return 0;
wini 0:bd3aeb15634e 111 netconn_delete(sock->con);
wini 0:bd3aeb15634e 112 sock->con=0;
wini 0:bd3aeb15634e 113 return -3;
wini 0:bd3aeb15634e 114 }
wini 0:bd3aeb15634e 115
wini 0:bd3aeb15634e 116
wini 0:bd3aeb15634e 117
wini 0:bd3aeb15634e 118 void se_close(SOCKET* sock)
wini 0:bd3aeb15634e 119 {
wini 0:bd3aeb15634e 120 if(sock->con)
wini 0:bd3aeb15634e 121 netconn_delete(sock->con);
wini 0:bd3aeb15634e 122 if(sock->nbuf)
wini 0:bd3aeb15634e 123 netbuf_delete(sock->nbuf);
wini 0:bd3aeb15634e 124 memset(sock, 0, sizeof(SOCKET));
wini 0:bd3aeb15634e 125 }
wini 0:bd3aeb15634e 126
wini 0:bd3aeb15634e 127
wini 0:bd3aeb15634e 128
wini 0:bd3aeb15634e 129 S32 se_send(SOCKET* sock, const void* buf, U32 len)
wini 0:bd3aeb15634e 130 {
wini 0:bd3aeb15634e 131 err_t err=netconn_write(sock->con, buf, len, NETCONN_COPY);
wini 0:bd3aeb15634e 132 if(err != ERR_OK)
wini 0:bd3aeb15634e 133 {
wini 0:bd3aeb15634e 134 se_close(sock);
wini 0:bd3aeb15634e 135 return (S32)err;
wini 0:bd3aeb15634e 136 }
wini 0:bd3aeb15634e 137 return len;
wini 0:bd3aeb15634e 138 }
wini 0:bd3aeb15634e 139
wini 0:bd3aeb15634e 140
wini 0:bd3aeb15634e 141
wini 0:bd3aeb15634e 142 S32 se_recv(SOCKET* sock, void* buf, U32 len, U32 timeout)
wini 0:bd3aeb15634e 143 {
wini 0:bd3aeb15634e 144 if( ! sock->nbuf )
wini 0:bd3aeb15634e 145 {
wini 0:bd3aeb15634e 146 err_t err;
wini 0:bd3aeb15634e 147 if(timeout != INFINITE_TMO)
wini 0:bd3aeb15634e 148 netconn_set_recvtimeout(sock->con, timeout);
wini 0:bd3aeb15634e 149 L_read:
wini 0:bd3aeb15634e 150 err = netconn_recv(sock->con, &sock->nbuf);
wini 0:bd3aeb15634e 151 if(err != ERR_OK)
wini 0:bd3aeb15634e 152 {
wini 0:bd3aeb15634e 153 if(err == ERR_TIMEOUT)
wini 0:bd3aeb15634e 154 {
wini 0:bd3aeb15634e 155 if(timeout == INFINITE_TMO)
wini 0:bd3aeb15634e 156 {
wini 0:bd3aeb15634e 157 netconn_set_recvtimeout(sock->con, 100000);
wini 0:bd3aeb15634e 158 goto L_read;
wini 0:bd3aeb15634e 159 }
wini 0:bd3aeb15634e 160 return 0;
wini 0:bd3aeb15634e 161 }
wini 0:bd3aeb15634e 162 se_close(sock);
wini 0:bd3aeb15634e 163 return (S32)err;
wini 0:bd3aeb15634e 164 }
wini 0:bd3aeb15634e 165 }
wini 0:bd3aeb15634e 166 if( ! sock->data )
wini 0:bd3aeb15634e 167 netbuf_data(sock->nbuf, (void**)&sock->data, &sock->len);
wini 0:bd3aeb15634e 168 if(sock->len <= len)
wini 0:bd3aeb15634e 169 {
wini 0:bd3aeb15634e 170 memcpy(buf,sock->data,sock->len);
wini 0:bd3aeb15634e 171 sock->data=0;
wini 0:bd3aeb15634e 172 if(netbuf_next(sock->nbuf) < 0)
wini 0:bd3aeb15634e 173 {
wini 0:bd3aeb15634e 174 netbuf_delete(sock->nbuf);
wini 0:bd3aeb15634e 175 sock->nbuf=0;
wini 0:bd3aeb15634e 176 }
wini 0:bd3aeb15634e 177 len = sock->len;
wini 0:bd3aeb15634e 178 }
wini 0:bd3aeb15634e 179 else
wini 0:bd3aeb15634e 180 {
wini 0:bd3aeb15634e 181 memcpy(buf,sock->data,len);
wini 0:bd3aeb15634e 182 sock->data += len;
wini 0:bd3aeb15634e 183 sock->len -= len;
wini 0:bd3aeb15634e 184 }
wini 0:bd3aeb15634e 185 return len;
wini 0:bd3aeb15634e 186 }
wini 0:bd3aeb15634e 187
wini 0:bd3aeb15634e 188
wini 0:bd3aeb15634e 189
wini 0:bd3aeb15634e 190 int se_sockValid(SOCKET* sock)
wini 0:bd3aeb15634e 191 {
wini 0:bd3aeb15634e 192 return sock->con != 0;
wini 0:bd3aeb15634e 193 }