SMQ is an easy to use machine-to-machine (M2M)/"Internet of Things" connectivity protocol that follows the publish subscribe design pattern.

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:
Fri Jan 02 20:27:26 2015 +0000
Revision:
1:734fa1459f69
Parent:
0:bd3aeb15634e
Child:
2:bac2873dbd15
Bug fixes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wini 0:bd3aeb15634e 1
wini 0:bd3aeb15634e 2 #include "mbed.h"
wini 0:bd3aeb15634e 3 #include "ledctrl.h"
wini 0:bd3aeb15634e 4 #include "EthernetInterface.h"
wini 0:bd3aeb15634e 5
wini 0:bd3aeb15634e 6 DigitalOut led1(LED1);
wini 1:734fa1459f69 7 DigitalOut led2(LED2);
wini 1:734fa1459f69 8 DigitalOut led3(LED3);
wini 1:734fa1459f69 9 DigitalOut led4(LED4);
wini 0:bd3aeb15634e 10
wini 0:bd3aeb15634e 11 static const LedInfo ledInfo[] = {
wini 0:bd3aeb15634e 12 {
wini 0:bd3aeb15634e 13 "LED 1",
wini 1:734fa1459f69 14 LedColor_yellow,
wini 0:bd3aeb15634e 15 1
wini 1:734fa1459f69 16 },
wini 1:734fa1459f69 17 {
wini 1:734fa1459f69 18 "LED 2",
wini 1:734fa1459f69 19 LedColor_red,
wini 1:734fa1459f69 20 2
wini 1:734fa1459f69 21 },
wini 1:734fa1459f69 22 {
wini 1:734fa1459f69 23 "LED 3",
wini 1:734fa1459f69 24 LedColor_blue,
wini 1:734fa1459f69 25 3
wini 1:734fa1459f69 26 },
wini 1:734fa1459f69 27 {
wini 1:734fa1459f69 28 "LED 4",
wini 1:734fa1459f69 29 LedColor_yellow,
wini 1:734fa1459f69 30 4
wini 0:bd3aeb15634e 31 }
wini 0:bd3aeb15634e 32 };
wini 0:bd3aeb15634e 33
wini 0:bd3aeb15634e 34
wini 0:bd3aeb15634e 35 extern "C" int
wini 0:bd3aeb15634e 36 ledState(int ledId, int on, int set)
wini 0:bd3aeb15634e 37 {
wini 0:bd3aeb15634e 38 static int leds[sizeof(ledInfo)/sizeof(ledInfo[1])];
wini 0:bd3aeb15634e 39 baAssert(ledId >= 1 && ledId <= sizeof(ledInfo)/sizeof(ledInfo[1]));
wini 0:bd3aeb15634e 40 if(set)
wini 0:bd3aeb15634e 41 leds[ledId-1] = on;
wini 0:bd3aeb15634e 42 return leds[ledId-1];
wini 0:bd3aeb15634e 43 }
wini 0:bd3aeb15634e 44
wini 0:bd3aeb15634e 45
wini 0:bd3aeb15634e 46 const LedInfo* getLedInfo(int* len)
wini 0:bd3aeb15634e 47 {
wini 0:bd3aeb15634e 48 *len = sizeof(ledInfo) / sizeof(ledInfo[0]);
wini 0:bd3aeb15634e 49 return ledInfo;
wini 0:bd3aeb15634e 50 }
wini 0:bd3aeb15634e 51
wini 0:bd3aeb15634e 52 extern "C" const char* getDevName(void)
wini 0:bd3aeb15634e 53 {
wini 0:bd3aeb15634e 54 return "mbed: Arch Pro";
wini 0:bd3aeb15634e 55 }
wini 0:bd3aeb15634e 56
wini 1:734fa1459f69 57 static void blinkAll(int fast)
wini 1:734fa1459f69 58 {
wini 1:734fa1459f69 59 int i;
wini 1:734fa1459f69 60 for(i = 1 ; i <= 4 ; i++) setLed(i, FALSE);
wini 1:734fa1459f69 61 for(i = 1 ; i <= 4 ; i++)
wini 1:734fa1459f69 62 {
wini 1:734fa1459f69 63 setLed(i, TRUE);
wini 1:734fa1459f69 64 wait_ms(fast ? 120: 400);
wini 1:734fa1459f69 65 }
wini 1:734fa1459f69 66 for(i = 1 ; i <= 4 ; i++)
wini 1:734fa1459f69 67 {
wini 1:734fa1459f69 68 setLed(i, FALSE);
wini 1:734fa1459f69 69 wait_ms(fast ? 120: 400);
wini 1:734fa1459f69 70 }
wini 1:734fa1459f69 71 }
wini 1:734fa1459f69 72
wini 1:734fa1459f69 73
wini 1:734fa1459f69 74 static void blink(int led)
wini 1:734fa1459f69 75 {
wini 1:734fa1459f69 76 int i;
wini 1:734fa1459f69 77 for(i = 0 ; i < 30; i++)
wini 1:734fa1459f69 78 {
wini 1:734fa1459f69 79 setLed(led, 1);
wini 1:734fa1459f69 80 wait_ms(120);
wini 1:734fa1459f69 81 setLed(led, 0);
wini 1:734fa1459f69 82 wait_ms(120);
wini 1:734fa1459f69 83 }
wini 1:734fa1459f69 84 }
wini 1:734fa1459f69 85
wini 0:bd3aeb15634e 86 extern "C" int setLed(int ledId, int on)
wini 0:bd3aeb15634e 87 {
wini 0:bd3aeb15634e 88 ledState(ledId, on, TRUE);
wini 1:734fa1459f69 89 on = on ? 0 : 1;
wini 1:734fa1459f69 90 switch(ledId)
wini 1:734fa1459f69 91 {
wini 1:734fa1459f69 92 case 1: led1 = on; break;
wini 1:734fa1459f69 93 case 2: led2 = on; break;
wini 1:734fa1459f69 94 case 3: led3 = on; break;
wini 1:734fa1459f69 95 case 4: led4 = on; break;
wini 1:734fa1459f69 96 }
wini 0:bd3aeb15634e 97 return 0;
wini 0:bd3aeb15634e 98 }
wini 0:bd3aeb15634e 99
wini 0:bd3aeb15634e 100
wini 0:bd3aeb15634e 101 extern "C" int setLedFromDevice(int* ledId, int* on)
wini 0:bd3aeb15634e 102 {
wini 0:bd3aeb15634e 103 return FALSE;
wini 0:bd3aeb15634e 104 }
wini 0:bd3aeb15634e 105
wini 0:bd3aeb15634e 106 extern "C" void setProgramStatus(ProgramStatus s)
wini 0:bd3aeb15634e 107 {
wini 1:734fa1459f69 108 int i;
wini 1:734fa1459f69 109 for(i = 1 ; i <= 4 ; i++) setLed(i, FALSE);
wini 1:734fa1459f69 110 switch(s)
wini 1:734fa1459f69 111 {
wini 1:734fa1459f69 112 case ProgramStatus_Restarting:
wini 1:734fa1459f69 113 blinkAll(FALSE);
wini 1:734fa1459f69 114 case ProgramStatus_Starting:
wini 1:734fa1459f69 115 blinkAll(TRUE);
wini 1:734fa1459f69 116 break;
wini 1:734fa1459f69 117
wini 1:734fa1459f69 118 case ProgramStatus_Connecting:
wini 1:734fa1459f69 119 setLed(1, TRUE);
wini 1:734fa1459f69 120 break;
wini 1:734fa1459f69 121
wini 1:734fa1459f69 122 case ProgramStatus_SslHandshake:
wini 1:734fa1459f69 123 setLed(2, TRUE);
wini 1:734fa1459f69 124 break;
wini 1:734fa1459f69 125
wini 1:734fa1459f69 126 case ProgramStatus_DeviceReady:
wini 1:734fa1459f69 127 for(i = 1 ; i <= 4 ; i++) setLed(i, TRUE);
wini 1:734fa1459f69 128 wait(1);
wini 1:734fa1459f69 129 for(i = 1 ; i <= 4 ; i++) setLed(i, FALSE);
wini 1:734fa1459f69 130 break;
wini 1:734fa1459f69 131
wini 1:734fa1459f69 132 case ProgramStatus_CloseCommandReceived:
wini 1:734fa1459f69 133 blink(3);
wini 1:734fa1459f69 134 break;
wini 1:734fa1459f69 135
wini 1:734fa1459f69 136 default:
wini 1:734fa1459f69 137 blinkAll(FALSE);
wini 1:734fa1459f69 138 switch(s)
wini 1:734fa1459f69 139 {
wini 1:734fa1459f69 140 case ProgramStatus_SocketError:
wini 1:734fa1459f69 141 case ProgramStatus_DnsError:
wini 1:734fa1459f69 142 case ProgramStatus_WebServiceNotAvailError:
wini 1:734fa1459f69 143 case ProgramStatus_InvalidCommandError:
wini 1:734fa1459f69 144 case ProgramStatus_PongResponseError:
wini 1:734fa1459f69 145 blink(1);
wini 1:734fa1459f69 146 break;
wini 1:734fa1459f69 147
wini 1:734fa1459f69 148 case ProgramStatus_ConnectionError:
wini 1:734fa1459f69 149 blink(2);
wini 1:734fa1459f69 150 break;
wini 1:734fa1459f69 151
wini 1:734fa1459f69 152 case ProgramStatus_CertificateNotTrustedError:
wini 1:734fa1459f69 153 case ProgramStatus_SslHandshakeError:
wini 1:734fa1459f69 154 blink(3);
wini 1:734fa1459f69 155 break;
wini 1:734fa1459f69 156
wini 1:734fa1459f69 157 case ProgramStatus_MemoryError:
wini 1:734fa1459f69 158 for(i = 1 ; i <= 4 ; i++) blink(i);
wini 1:734fa1459f69 159 break;
wini 1:734fa1459f69 160 }
wini 1:734fa1459f69 161 }
wini 0:bd3aeb15634e 162 }
wini 0:bd3aeb15634e 163
wini 1:734fa1459f69 164 extern "C" {
wini 1:734fa1459f69 165 int smqUniqueIdLen;
wini 1:734fa1459f69 166 const char* smqUniqueId;
wini 1:734fa1459f69 167 }
wini 0:bd3aeb15634e 168
wini 0:bd3aeb15634e 169 int main()
wini 0:bd3aeb15634e 170 {
wini 0:bd3aeb15634e 171 EthernetInterface eth;
wini 1:734fa1459f69 172 xprintf(("\n\n\nIn main\n"));
wini 1:734fa1459f69 173 eth.init(); //Use DHCP
wini 1:734fa1459f69 174 xprintf(("EthernetInterface connect\n"));
wini 1:734fa1459f69 175 blinkAll(FALSE);
wini 1:734fa1459f69 176 eth.connect();
wini 1:734fa1459f69 177 xprintf(("IP Address is %s\n", eth.getIPAddress()));
wini 1:734fa1459f69 178 smqUniqueId = eth.getMACAddress();
wini 1:734fa1459f69 179 smqUniqueIdLen = strlen(smqUniqueId);
wini 1:734fa1459f69 180 mainTask(0);
wini 0:bd3aeb15634e 181 error("mainTask returned");
wini 0:bd3aeb15634e 182 }