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
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
- SharkMQ (Secure) Client Example
- SMQ LED Demonstration Tutorial
- SMQ Documentation
- Real Time Logic LLC public SMQ Broker access.
- How to set up your own low cost SMQ Broker cloud server solution Tutorial.
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.
main.cpp@1:734fa1459f69, 2015-01-02 (annotated)
- 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?
User | Revision | Line number | New 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 | } |