MQTT version for enno SDK

Dependencies:   EthernetInterface MQTT mbed-rtos mbed serialzation_lib

Fork of HelloMQTT by MQTT

Files at this revision

API Documentation at this revision

Comitter:
weiarm2015
Date:
Wed Nov 25 07:07:31 2015 +0000
Parent:
19:7f7aba7a4a8b
Child:
21:c5f6350a292d
Commit message:
?

Changed in this revision

C027.h Show diff for this revision Revisions of this file
C12832.lib Show diff for this revision Revisions of this file
K64F.h Show diff for this revision Revisions of this file
LPC1768.h Show diff for this revision Revisions of this file
Linux-example/LinuxIPStack.h Show diff for this revision Revisions of this file
Linux-example/LinuxMQTT.h Show diff for this revision Revisions of this file
Linux-example/linux-main.cpp Show diff for this revision Revisions of this file
common/enno_error.h Show annotated file Show diff for this revision Revisions of this file
enno_config.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
protocol/CplusplusToC.cpp Show annotated file Show diff for this revision Revisions of this file
protocol/enno_api.c Show annotated file Show diff for this revision Revisions of this file
protocol/enno_api.h Show annotated file Show diff for this revision Revisions of this file
protocol/enno_api_mqtt_wrapper.c Show annotated file Show diff for this revision Revisions of this file
serialzation_lib.lib Show annotated file Show diff for this revision Revisions of this file
--- a/C027.h	Thu Jul 30 13:49:18 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014 IBM Corp.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Eclipse Distribution License v1.0 which accompany this distribution.
- *
- * The Eclipse Public License is available at
- *    http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- *   http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *    Ian Craggs - initial implementation
- *******************************************************************************/
-
-#if !defined(K64F_H)
-#define K64F_H
-
-C12832 lcd(D11, D13, D12, D7, D10);
-PwmOut r(D5);
-PwmOut g(D9);
-PwmOut b(D8);
-DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3);
-DigitalIn Up(A2); DigitalIn Down(A3); DigitalIn Left(A4); DigitalIn Right(A5); DigitalIn Click(D4);
-AnalogIn ain1 (A0); AnalogIn ain2 (A1);
-
-#define LED2_OFF 0
-#define LED2_ON 1
-
-#define DEFAULT_TYPE_NAME "iotsample-mbed-c027"
-
-#include "lpc_phy.h"
-// need a wrapper since K64F and LPC1768 wont have the same name for mii read methods
-static uint32_t linkStatus(void)
-{
-    return (lpc_mii_read_data() & 1);
-}
-
-#endif
\ No newline at end of file
--- a/C12832.lib	Thu Jul 30 13:49:18 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-https://mbed.org/teams/components/code/C12832/#03069e3deaa4
--- a/K64F.h	Thu Jul 30 13:49:18 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014 IBM Corp.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Eclipse Distribution License v1.0 which accompany this distribution.
- *
- * The Eclipse Public License is available at
- *    http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- *   http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *    Ian Craggs - initial implementation
- *    Sam Grove  - added method to check the status of the Ethernet cable 
- *******************************************************************************/
-
-#if !defined(K64F_H)
-#define K64F_H
-
-C12832 lcd(D11, D13, D12, D7, D10);
-BusOut led2 (LED_BLUE);
-BusOut r (D5);
-BusOut g (D9);
-BusOut b (D8);
-DigitalIn Up(A2); DigitalIn Down(A3); DigitalIn Right(A4); DigitalIn Left(A5); DigitalIn Click(D4);
-AnalogIn ain1(A0); AnalogIn ain2(A1);
-
-#define LED2_OFF 1
-#define LED2_ON 0
-
-#define DEFAULT_TYPE_NAME "iotsample-mbed-k64f"
-
-//#include "lpc_phy.h"
-// need a wrapper since K64F and LPC1768 wont have the same name for mii read methods
-static uint32_t linkStatus(void)
-{
-    return (1);
-}
-
-#endif
\ No newline at end of file
--- a/LPC1768.h	Thu Jul 30 13:49:18 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014 IBM Corp.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Eclipse Distribution License v1.0 which accompany this distribution.
- *
- * The Eclipse Public License is available at
- *    http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- *   http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *    Ian Craggs - initial implementation
- *    Sam Grove  - added mehtod to check the status of the Ethernet cable
- *******************************************************************************/
-
-#if !defined(LPC1768_H)
-#define LPC1768_H
-
-C12832 lcd(p5, p7, p6, p8, p11);
-DigitalOut led2(LED2);
-PwmOut r(p23);
-PwmOut g(p24);
-PwmOut b(p25);
-DigitalIn Down(p12);
-DigitalIn Left(p13);
-DigitalIn Click(p14);
-DigitalIn Up(p15);
-DigitalIn Right(p16);
-AnalogIn ain1(p19);
-AnalogIn ain2(p20);
-
-#define LED2_OFF 0
-#define LED2_ON 1
-
-#define DEFAULT_TYPE_NAME "iotsample-mbed-lpc1768"
-
-#include "lpc_phy.h"
-// need a wrapper since K64F and LPC1768 wont have the same name for mii read methods
-static uint32_t linkStatus(void)
-{
-    return (lpc_mii_read_data() & 1);
-}
-
-#endif
\ No newline at end of file
--- a/Linux-example/LinuxIPStack.h	Thu Jul 30 13:49:18 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-#if !defined(LINUX_IPSTACK_H)
-#define LINUX_IPSTACK_H
-
-class IPStack 
-{
-public:    
-    IPStack()
-    {
-
-    }
-    
-    int Socket_error(const char* aString)
-    {
-
-        if (errno != EINTR && errno != EAGAIN && errno != EINPROGRESS && errno != EWOULDBLOCK)
-        {
-            if (strcmp(aString, "shutdown") != 0 || (errno != ENOTCONN && errno != ECONNRESET))
-                printf("Socket error %s in %s for socket %d\n", strerror(errno), aString, mysock);
-        }
-        return errno;
-    }
-
-    int connect(const char* hostname, int port)
-    {
-        int type = SOCK_STREAM;
-        struct sockaddr_in address;
-        int rc = -1;
-        sa_family_t family = AF_INET;
-        struct addrinfo *result = NULL;
-        struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL};
-
-        if ((rc = getaddrinfo(hostname, NULL, &hints, &result)) == 0)
-        {
-            struct addrinfo* res = result;
-
-            /* prefer ip4 addresses */
-            while (res)
-            {
-                if (res->ai_family == AF_INET)
-                {
-                    result = res;
-                    break;
-                }
-                res = res->ai_next;
-            }
-
-            if (result->ai_family == AF_INET)
-            {
-                address.sin_port = htons(port);
-                address.sin_family = family = AF_INET;
-                address.sin_addr = ((struct sockaddr_in*)(result->ai_addr))->sin_addr;
-            }
-            else
-                rc = -1;
-
-            freeaddrinfo(result);
-        }
-
-        if (rc == 0)
-        {
-            mysock = socket(family, type, 0);
-            if (mysock != -1)
-            {
-                int opt = 1;
-
-                //if (setsockopt(mysock, SOL_SOCKET, SO_NOSIGPIPE, (void*)&opt, sizeof(opt)) != 0)
-                //  printf("Could not set SO_NOSIGPIPE for socket %d", mysock);
-                
-                rc = ::connect(mysock, (struct sockaddr*)&address, sizeof(address));
-            }
-        }
-
-        return rc;
-    }
-
-    int read(char* buffer, int len, int timeout_ms)
-    {
-        struct timeval interval = {timeout_ms / 1000, (timeout_ms % 1000) * 1000};
-        if (interval.tv_sec < 0 || (interval.tv_sec == 0 && interval.tv_usec <= 0))
-        {
-            interval.tv_sec = 0;
-            interval.tv_usec = 100;
-        }
-
-        setsockopt(mysock, SOL_SOCKET, SO_RCVTIMEO, (char *)&interval, sizeof(struct timeval));
-
-        //printf("reading %d bytes\n", len);
-        int rc = ::recv(mysock, buffer, (size_t)len, 0);
-        if (rc == -1)
-            Socket_error("read");
-        //printf("read %d bytes\n", rc);
-        return rc;
-    }
-    
-    int write(char* buffer, int len, int timeout)
-    {
-        struct timeval tv;
-
-        tv.tv_sec = 0;  /* 30 Secs Timeout */
-        tv.tv_usec = timeout * 1000;  // Not init'ing this can cause strange errors
-
-        setsockopt(mysock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval));
-        int rc = ::write(mysock, buffer, len);
-        //printf("write rc %d\n", rc);
-        return rc;
-    }
-
-    int disconnect()
-    {
-        return ::close(mysock);
-    }
-    
-private:
-
-    int mysock; 
-    
-};
-
-#endif
\ No newline at end of file
--- a/Linux-example/LinuxMQTT.h	Thu Jul 30 13:49:18 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-#if !defined(LINUXMQTT_H)
-#define LINUXMQTT_H
-
-class Countdown
-{
-public:
-    Countdown()
-    { 
-    
-    }
-
-    Countdown(int ms)
-    { 
-        countdown_ms(ms);
-    }
-    
-
-    bool expired()
-    {
-        struct timeval now, res;
-        gettimeofday(&now, NULL);
-        timersub(&end_time, &now, &res);        
-        //printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
-        //if (res.tv_sec > 0 || res.tv_usec > 0)
-        //  printf("expired %d %d\n", res.tv_sec, res.tv_usec);
-        return res.tv_sec < 0 || (res.tv_sec == 0 && res.tv_usec <= 0);
-    }
-    
-
-    void countdown_ms(int ms)  
-    {
-        struct timeval now;
-        gettimeofday(&now, NULL);
-        struct timeval interval = {ms / 1000, (ms % 1000) * 1000};
-        //printf("interval %d %d\n", interval.tv_sec, interval.tv_usec);
-        timeradd(&now, &interval, &end_time);
-    }
-
-    
-    void countdown(int seconds)
-    {
-        struct timeval now;
-        gettimeofday(&now, NULL);
-        struct timeval interval = {seconds, 0};
-        timeradd(&now, &interval, &end_time);
-    }
-
-    
-    int left_ms()
-    {
-        struct timeval now, res;
-        gettimeofday(&now, NULL);
-        timersub(&end_time, &now, &res);
-        //printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
-        return (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000;
-    }
-    
-private:
-
-    struct timeval end_time;
-};
-
-
-#endif
\ No newline at end of file
--- a/Linux-example/linux-main.cpp	Thu Jul 30 13:49:18 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014 IBM Corp.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Eclipse Distribution License v1.0 which accompany this distribution.
- *
- * The Eclipse Public License is available at
- *    http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- *   http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *    Ian Craggs - initial API and implementation and/or initial documentation
- *******************************************************************************/
-  
- /**
-  This is a sample program to illustrate the use of the MQTT Client library
-  on Linux.  The Client class requires two classes which mediate
-  access to system interfaces for networking and timing.  As long as these two
-  classes provide the required public programming interfaces, it does not matter
-  what facilities they use underneath. In this program, they use the Linux
-  system libraries.
- 
- */
-
-#if defined(LINUX)
-
-#include "LinuxMQTT.h"
-#include "LinuxIPStack.h"
-#include "MQTTClient.h"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/select.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-
-#define DEFAULT_STACK_SIZE -1
-
-
-int arrivedcount = 0;
-
-void messageArrived(MQTT::Message* message)
-{
-	printf("Message %d arrived: qos %d, retained %d, dup %d, packetid %d\n", 
-		++arrivedcount, message->qos, message->retained, message->dup, message->id);
-    printf("Payload %.*s\n", message->payloadlen, (char*)message->payload);
-}
-
-
-int connect(MQTT::Client<IPStack, Countdown>::connectionLostInfo* info)
-{
-    const char* hostname = "localhost"; //"m2m.eclipse.org";
-    int port = 1883;
-    printf("Connecting to %s:%d\n", hostname, port);
-    int rc = info->network->connect(hostname, port);
-	if (rc != 0)
-	    printf("rc from TCP connect is %d\n", rc);
- 
-    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;       
-    data.MQTTVersion = 3;
-    data.clientID.cstring = (char*)"mbed-icraggs";
-    rc = info->client->connect(&data);
-	if (rc != 0)
-	    printf("rc from MQTT connect is %d\n", rc);
-    
-    return rc;
-}
-
-
-int main(int argc, char* argv[])
-{   
-    IPStack ipstack = IPStack();
-    float version = 0.3;
-    const char* topic = "mbed-sample";
-    
-    printf("Version is %f\n", version);
-              
-    MQTT::Client<IPStack, Countdown> client = MQTT::Client<IPStack, Countdown>(ipstack);
-    
-    client.setConnectionLostHandler(connect);
-
-    MQTT::Client<IPStack, Countdown>::connectionLostInfo info = {&client, &ipstack};
-    int rc = connect(&info);
-    
-    rc = client.subscribe(topic, MQTT::QOS2, messageArrived);   
-    if (rc != 0)
-        printf("rc from MQTT subscribe is %d\n", rc);
-
-    MQTT::Message message;
-
-    // QoS 0
-    char buf[100];
-    sprintf(buf, "Hello World!  QoS 0 message from app version %f", version);
-    message.qos = MQTT::QOS0;
-    message.retained = false;
-    message.dup = false;
-    message.payload = (void*)buf;
-    message.payloadlen = strlen(buf)+1;
-    rc = client.publish(topic, &message);
-    while (arrivedcount == 0)
-        client.yield(100);
-        
-    // QoS 1
-	printf("Now QoS 1\n");
-    sprintf(buf, "Hello World!  QoS 1 message from app version %f", version);
-    message.qos = MQTT::QOS1;
-    message.payloadlen = strlen(buf)+1;
-    rc = client.publish(topic, &message);
-    while (arrivedcount == 1)
-        client.yield(100);
-        
-    // QoS 2
-    sprintf(buf, "Hello World!  QoS 2 message from app version %f", version);
-    message.qos = MQTT::QOS2;
-    message.payloadlen = strlen(buf)+1;
-    rc = client.publish(topic, &message);
-    while (arrivedcount == 2)
-        client.yield(100);
-    
-    rc = client.unsubscribe(topic);
-    if (rc != 0)
-        printf("rc from unsubscribe was %d\n", rc);
-    
-    rc = client.disconnect();
-    if (rc != 0)
-        printf("rc from disconnect was %d\n", rc);
-    
-    ipstack.disconnect();
-    
-    printf("Finishing with %d messages received\n", arrivedcount);
-    
-    return 0;
-}
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/enno_error.h	Wed Nov 25 07:07:31 2015 +0000
@@ -0,0 +1,41 @@
+/*
+ * enno_error.h
+ *
+ *  Created on: 2015年11月20日
+ *      Author: wzy
+ */
+
+#ifndef COM_ENNO_ERROR_H_
+#define COM_ENNO_ERROR_H_
+
+#if definded(__cplusplus)
+extern "C" {
+#endif
+
+typedef enum {
+    NONE_ERROR = 0,
+    /** Success return value - no error occurred. */
+            GENERIC_ERROR = -1,
+    /** A generic error.  A placeholder for a more specific error. */
+            NULL_VALUE_ERROR = -2,
+    /** A required parameter was passed as null. */
+            CONNECTION_ERROR = -3,
+    /** A connection could not be established. */
+            SUBSCRIBE_ERROR = -4,
+    /** The subscribe failed.  A SUBACK was not returned from the service. */
+            PUBLISH_ERROR = -5,
+    /** The publish failed.  In the case of a QoS 1 message a PUBACK was not received. */
+            DISCONNECT_ERROR = -6,
+    /** The disconnect failed.  The disconnect control packet could not be sent. */
+            YIELD_ERROR = -7,
+    /** An error occurred when yielding to the IoT MQTT client.  A possible cause is an unexpected TCP socket disconnect. */
+            TCP_CONNECT_ERROR = -8,
+    /** The TCP socket could not be established. */
+            UNSUBSCRIBE_ERROR = -15,            /** The unsubscribe failed.  The unsubscribe control packet could not be sent. */
+
+} Error_t;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* COM_ENNO_ERROR_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/enno_config.h	Wed Nov 25 07:07:31 2015 +0000
@@ -0,0 +1,16 @@
+/*
+ * enno_config.h
+ *
+ *  Created on: 2015年11月20日
+ *      Author: wzy
+ */
+
+#ifndef ENNO_CONFIG_H_
+#define ENNO_CONFIG_H_
+
+
+#define ENNO_IOT_TX_BUF_LEN 512
+#define ENNO_IOT_RX_BUF_LEN 512
+
+
+#endif /* ENNO_CONFIG_H_ */
--- a/main.cpp	Thu Jul 30 13:49:18 2015 +0000
+++ b/main.cpp	Wed Nov 25 07:07:31 2015 +0000
@@ -1,135 +1,29 @@
-/*******************************************************************************
- * Copyright (c) 2014, 2015 IBM Corp.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Eclipse Distribution License v1.0 which accompany this distribution.
- *
- * The Eclipse Public License is available at
- *    http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- *   http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *    Ian Craggs - initial API and implementation and/or initial documentation
- *    Ian Craggs - make sure QoS2 processing works, and add device headers
- *******************************************************************************/
- 
- /**
-  This is a sample program to illustrate the use of the MQTT Client library
-  on the mbed platform.  The Client class requires two classes which mediate
-  access to system interfaces for networking and timing.  As long as these two
-  classes provide the required public programming interfaces, it does not matter
-  what facilities they use underneath. In this program, they use the mbed
-  system libraries.
- 
- */
- 
- // change this to 0 to output messages to serial instead of LCD
-#define USE_LCD 1
-
-#if USE_LCD
-#include "C12832.h"
-
-#if defined(TARGET_UBLOX_C027)
-#warning "Compiling for mbed C027"
-#include "C027.h"
-#elif defined(TARGET_LPC1768)
-#warning "Compiling for mbed LPC1768"
-#include "LPC1768.h"
-#elif defined(TARGET_K64F)
-#warning "Compiling for mbed K64F"
-#include "K64F.h"
-#endif
-
-#define printf lcd.cls();lcd.printf
-
-#endif
+#include "mbed.h"
+#include "enno_api.h"
 
 #define MQTTCLIENT_QOS2 1
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
 
-#include "MQTTEthernet.h"
-#include "MQTTClient.h"
-
-int arrivedcount = 0;
-
+int main(int argc, char* argv[]){
 
-void messageArrived(MQTT::MessageData& md)
-{
-    MQTT::Message &message = md.message;
-    printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\n", message.qos, message.retained, message.dup, message.id);
-    printf("Payload %.*s\n", message.payloadlen, (char*)message.payload);
-    ++arrivedcount;
+    float version = 0.5;
+    led1=1;led2=1;led3=1;led4=1;                    //light on
+    wait(0.5);
+    led1=!led1;led2=!led2;led3=!led3;led4=!led4;    //light off
+    wait(0.5);
+    led1=!led1;led2=!led2;led3=!led3;led4=!led4;    //light on
+    wait(0.5);
+    led1=!led1;led2=!led2;led3=!led3;led4=!led4;    //light off
+
+    printf("HelloMQTT: version is %f\n", version);
+
+    return 0;
 }
 
 
-int main(int argc, char* argv[])
-{   
-    MQTTEthernet ipstack = MQTTEthernet();
-    float version = 0.5;
-    char* topic = "mbed-sample";
-    
-    printf("HelloMQTT: version is %f\n", version);
-              
-    MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
-    
-    char* hostname = "m2m.eclipse.org";
-    int port = 1883;
-    printf("Connecting to %s:%d\n", hostname, port);
-    int rc = ipstack.connect(hostname, port);
-    if (rc != 0)
-        printf("rc from TCP connect is %d\n", rc);
- 
-    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;       
-    data.MQTTVersion = 3;
-    data.clientID.cstring = "mbed-sample";
-    data.username.cstring = "testuser";
-    data.password.cstring = "testpassword";
-    if ((rc = client.connect(data)) != 0)
-        printf("rc from MQTT connect is %d\n", rc);
-    
-    if ((rc = client.subscribe(topic, MQTT::QOS2, messageArrived)) != 0)
-        printf("rc from MQTT subscribe is %d\n", rc);
 
-    MQTT::Message message;
 
-    // QoS 0
-    char buf[100];
-    sprintf(buf, "Hello World!  QoS 0 message from app version %f\n", version);
-    message.qos = MQTT::QOS0;
-    message.retained = false;
-    message.dup = false;
-    message.payload = (void*)buf;
-    message.payloadlen = strlen(buf)+1;
-    rc = client.publish(topic, message);
-    while (arrivedcount < 1)
-        client.yield(100);
-        
-    // QoS 1
-    sprintf(buf, "Hello World!  QoS 1 message from app version %f\n", version);
-    message.qos = MQTT::QOS1;
-    message.payloadlen = strlen(buf)+1;
-    rc = client.publish(topic, message);
-    while (arrivedcount < 2)
-        client.yield(100);
-        
-    // QoS 2
-    sprintf(buf, "Hello World!  QoS 2 message from app version %f\n", version);
-    message.qos = MQTT::QOS2;
-    message.payloadlen = strlen(buf)+1;
-    rc = client.publish(topic, message);
-    while (arrivedcount < 3)
-        client.yield(100);
-            
-    if ((rc = client.unsubscribe(topic)) != 0)
-        printf("rc from unsubscribe was %d\n", rc);
-    
-    if ((rc = client.disconnect()) != 0)
-        printf("rc from disconnect was %d\n", rc);
-    
-    ipstack.disconnect();
-    
-    printf("Version %.2f: finish %d msgs\n", version, arrivedcount);
-    
-    return 0;
-}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/protocol/CplusplusToC.cpp	Wed Nov 25 07:07:31 2015 +0000
@@ -0,0 +1,49 @@
+#include "MQTTClient.h"
+#include "stdio.h"
+
+static MQTTEthernet ipstack = MQTTEthernet();
+static MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
+
+extern "C"{
+    int trans_connect(char *hostURL, uint16_t port, char *appKey);    
+    int trans_subscribe();
+    int trans_publish();
+    int trans_unsubscribe(char *pTopic);
+    int trans_disconnect();
+    int trans_loop(int timeout);
+}
+
+ int trans_connect(char *hostURL, uint16_t port, char *appKey){
+     int i = 0;
+     
+     return i;
+}   
+int trans_subscribe(){
+     int i = 0;
+     return i;
+}
+int trans_publish(){
+     int i = 0;
+     return i;
+}
+int trans_unsubscribe(char *pTopic){
+    int i = 0;
+    if ((i = client.unsubscribe(pTopic))!= 0){
+        printf("Error: unsubscribe fail %d\n", i);
+    }
+    return i; 
+}
+int trans_disconnect(){
+    int i = 0;
+    if ((i = client.disconnect()) != 0)
+         printf("Error: disconnect fail %d\n", i);
+    if(i ==0 ) {
+        ipstack.disconnect();
+    }    
+    return i;
+}
+int trans_loop(int timeout){
+    int i = 0;
+    i = client.yield(timeout);
+    return i;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/protocol/enno_api.c	Wed Nov 25 07:07:31 2015 +0000
@@ -0,0 +1,6 @@
+#include <stdio.h>
+#include <stdbool.h>
+#include "enno_api.h"
+#include "sitewhere.pb.h"
+#include "sitewhere.h"
+#include "pb_decode.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/protocol/enno_api.h	Wed Nov 25 07:07:31 2015 +0000
@@ -0,0 +1,160 @@
+/*
+ * enno_api.h
+ *
+ *  Created on: 2015年11月20日
+ *      Author: wzy
+ */
+
+#ifndef PROTOCOL_ENNO_API_H_
+#define PROTOCOL_ENNO_API_H_
+
+//
+// Created by root on 11/10/15.
+//
+#if definded(__cplusplus)
+extern "C" {
+#endif
+
+#include "stddef.h"
+#include "stdbool.h"
+#include "stdint.h"
+#include "enno_error.h"
+#include "enno_config.h"
+
+
+
+typedef struct {
+    char *pHardwareId;
+    char *pSpecificationToken;
+    char *pOriginator;
+} Register_enno;
+
+typedef struct {
+    char *pHardwareId;
+    char *pMessage;
+    char *pOriginator;
+} Acknowledge_enno;
+
+typedef struct {
+    char *pHardwareId;
+    char *pName;
+    char *pOriginator;
+    float value;
+    int64_t eventDate;
+} Measurement_enno;
+
+typedef struct {
+    char *pHardwareId;
+    char *pOriginator;
+    float lat;
+    float lon;
+    float ele;
+    int64_t eventDate;
+} Location_enno;
+
+typedef struct {
+    char *pHardwareId;
+    char *pAlertType;
+    char *pAlertMessage;
+    char *pOriginator;
+    int64_t eventDate;
+} Alert_enno;
+
+typedef struct {
+    char messageType;
+    Register_enno Register;
+    Acknowledge_enno Acknowledge;
+    Measurement_enno Measurement;
+    Location_enno Location;
+    Alert_enno Alert;
+} EnnoMessages;
+//extern EnnoMessages EnnoMessagesDefault;
+EnnoMessages EnnoMessagesDefault = {
+        .messageType = 'R',
+        .Register = {.pHardwareId = "enno-default-test-id-11", .pSpecificationToken = "417b36a8-21ef-4196-a8fe-cc756f994d0b", .pOriginator = NULL}, //7dfd6d63-5e8d-4380-be04-fc5c73801dfb
+        .Acknowledge = {.pMessage = NULL, .pOriginator = NULL},
+        .Measurement = {.pName = "Temperature", .pOriginator = NULL, .value = 16, .eventDate = 0},
+        .Location = {.pOriginator = NULL, .lat = 27.59, .lon = 86.5, .ele = 8844.43, .eventDate = 0},
+        .Alert = {.pAlertType = "enno.info", .pAlertMessage = "I am alive", .pOriginator = NULL, .eventDate = 0}
+};
+
+/**
+ * @brief Handles the system callback message
+ *
+ * params:  topic   the topic subscribed by client
+ *          payload the received payload
+ *          length  the length of payload
+ *
+ */
+void ennoSystemMessageHandler(char* topic, char* payload, int length);
+
+/**
+ * @brief Connection Function
+ *
+ * Called to establish an connection with the Enno IoT Service
+ *
+ * @param:  HostURL the website address to connect
+ *          port    listening port
+ *          appKey  a key for authentication
+ * @return An IoT Error Type defining successful/failed connection
+ */
+
+Error_t enno_connect(char *HostURL, uint16_t port, char *appKey);
+
+/**
+ * @brief Subscribe to a topic.
+ *
+ * Called to send a subscribe message to the broker
+ *
+ * @param:  Topic       Pointer to a Topic
+ *          callback    Pointer to a callback function
+ * @return An IoT Error Type defining successful/failed subscription
+ */
+Error_t enno_subscribe(char *topic, void *callback);
+/**
+ * @brief Publish a message to a path
+ *
+ * Called to publish a message to a path.
+ *
+ * @param:  path           the destination of message sent to
+ *          messages_enno  Pointer to the published message
+ * @return An IoT Error Type defining successful/failed publish
+ */
+
+//Error_t enno_publish(char path, EnnoParams *Params_enno, PublishParams *pParams);
+Error_t enno_publish(char *path, EnnoMessages *messages_enno);
+/**
+ * @brief Unsubscribe to an topic.
+ *
+ * Called to send an usubscribe message to the broker requesting removal of a subscription
+ * to a topic.
+ *
+ * @param:  pTopic      Pointer to the requested topic string. Ensure the string is null terminated
+ * @return An IoT Error Type defining successful/failed unsubscription
+ */
+Error_t enno_unsubscribe(char *pTopic);
+
+/**
+ * @brief Disconnect a Connection
+ *
+ * Called to send a disconnect message to the broker.
+ *
+ * @return An IoT Error Type defining successful/failed send of the disconnect control packet.
+ */
+Error_t enno_disconnect();
+
+/**
+ * @brief Yield to the  client
+ *
+ * Called to yield the current thread to the underlying  client.
+ *
+ * @param timeout Maximum number of milliseconds to pass thread execution to the client.
+ * @return An IoT Error Type defining successful/failed client processing.
+ */
+
+Error_t enno_loop(int timeout);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PROTOCOL_ENNO_API_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/protocol/enno_api_mqtt_wrapper.c	Wed Nov 25 07:07:31 2015 +0000
@@ -0,0 +1,177 @@
+#include "mbed.h"
+#include "MQTTEthernet.h"
+#include "MQTTPacket.h"
+#include "MQTTClient.h"
+#include "pb_decode.h"
+#include "sitewhere.h"
+#include "sitewhere.pb.h"
+#include "enno_api.h"
+
+
+//static iot_disconnect_handler clientDisconnectHandler;    //warning defined but not used
+
+/**
+ * @brief Communication Protocol Type
+ *
+ * Defining an MQTT version Type
+ *
+ */
+typedef enum {
+    MQTT_3_1 = 3,               // MQTT 3.1   (protocol_lib message byte = 3)
+    MQTT_3_1_1 = 4              // MQTT 3.1.1 (protocol_lib message byte = 4)
+} MQTT_Ver_t;
+
+/**
+ * @brief Quality of Service Type
+ *
+ * Defining a QoS type.
+ * @note QoS 2 is \b NOT supported by the Enno IoT Service at the time of this SDK release.  //?wzy
+ *
+ */
+typedef enum {
+    QOS_0,                      // QoS 0 = at most once delivery
+    QOS_1,                      // QoS 1 = at least once delivery
+    QOS_2                       // QoS 2 is NOT supported
+} QoSLevel;
+
+/**
+ * @brief Last Will and Testament Definition
+ *
+ * Defining a type for LWT parameters.
+ * @note Retained messages are \b NOT supported by the Enno IoT Service at the time of this SDK release.  //?
+ *
+ */
+typedef struct {
+    const char *pTopicName;     // LWT Topic
+    const char *pMessage;       // Message to be delivered as LWT
+    bool isRetained;            // NOT supported
+    QoSLevel qos;               // QoS of LWT message
+} MQTTWillOptions;
+
+/**
+ * @brief MQTT Message Parameters
+ *
+ * Defines a type for properties of MQTT messages including topic, payload an QoS.
+ *
+ */
+typedef struct {
+    QoSLevel qos;               // Message Quality of Service
+    bool isRetained;            // Retained messages are \b NOT supported by the Enno IoT Service at the time of this SDK release.
+    bool isDuplicate;           // Is this message a duplicate QoS > 0 message?  Handled automatically by the MQTT client.
+    uint16_t id;                // Message sequence identifier.  Handled automatically by the MQTT client.
+    void *pPayload;             // Pointer to MQTT message payload (bytes).
+    uint32_t PayloadLen;        // Length of MQTT payload.
+} MQTTMessageParams;
+
+typedef void (*iot_disconnect_handler)(void);
+
+typedef struct {
+    char *pClientID;                                 // Pointer to a string defining the MQTT client ID (this needs to be unique \b per \b device )
+    char *pUserName;                                 // Not used in the Enno IoT Service
+    char *pPassword;                                 // Not used in the Enno IoT Service
+    MQTT_Ver_t MQTTVersion;                          // Desired MQTT version used during connection
+    uint16_t KeepAliveInterval_Sec;                  // MQTT keep alive interval in seconds.  Defines inactivity time allowed before determining the connection has been lost.
+    bool isCleansession;                             // MQTT clean session.  True = this session is to be treated as clean.  Previous server state is cleared and no stated is retained from this connection.
+    bool isWillMsgPresent;                           // Is there a LWT associated with this connection?
+    MQTTWillOptions will;                            // MQTT LWT parameters.
+    uint32_t mqttCommandTimeout_ms;                  // Timeout for MQTT blocking calls.  In milliseconds.
+    iot_disconnect_handler disconnectHandler;        // Callback to be invoked upon connection loss.
+} ConnectParams;
+
+const MQTTWillOptions MQTTwillOptionsDefault = {
+        .pTopicName = NULL,
+        .pMessage = NULL,
+        .isRetained = false,
+        .qos = QOS_0
+};
+MQTTMessageParams MQTTMessageParamsDefault = {
+        .qos = QOS_0,
+        .isRetained=false,
+        .isDuplicate = false,
+        .id = 0,
+        .pPayload = NULL,
+        .PayloadLen = 0
+};
+ConnectParams ConnectParamsDefault = {
+        .pClientID = "mbed-sample",
+        .pUserName = NULL,
+        .pPassword = NULL,
+        .MQTTVersion = MQTT_3_1,
+        .KeepAliveInterval_Sec = 10,
+        .isCleansession = true,
+        .isWillMsgPresent = false,
+        .will={.pTopicName = NULL, .pMessage = NULL, .isRetained = false, .qos = QOS_0},
+        .mqttCommandTimeout_ms = 2000,
+        .disconnectHandler = NULL
+};
+
+
+
+
+
+
+static Error_t parseConnectParamsForError(char *hostURL) {
+    Error_t rc = NONE_ERROR;
+    if (NULL == hostURL) {
+        rc = NULL_VALUE_ERROR;
+        printf("ERROR: hostURL can not be empty!\n");
+    }
+    return rc;
+}
+
+static bool isPowerCycle = true;
+
+Error_t enno_connect(char *hostURL, uint16_t port, char *appKey){
+    Error_t rc = NONE_ERROR;
+    
+    if
+    return rc;
+}
+
+Error_t enno_subscribe(char *topic, void *callback){
+    Error_t rc = NONE_ERROR;
+    if (trans_subscribe()){
+        rc = SUBSCRIBE_ERROR;
+    }
+    return rc;
+}
+*/
+Error_t enno_publish(char *path, EnnoMessages *messages_enno){
+    Error_t rc = NONE_ERROR;
+    if (0 != trans_publish()){
+        rc = PUBLISH_ERROR;    
+    }
+    return rc;
+}
+
+Error_t enno_unsubscribe(char *pTopic) {
+    Error_t rc = NONE_ERROR;
+    if (0 != trans_unsubscribe(pTopic)) {
+        rc = UNSUBSCRIBE_ERROR;
+    }
+    return rc;
+
+}
+
+Error_t enno_disconnect() {
+    Error_t rc = NONE_ERROR;
+    if (0! =trans_disconnect()){
+        rc = DISCONNECT_ERROR;
+    }
+    return rc;
+}
+
+Error_t enno_loop(int timeout) {
+    Error_t rc = NONE_ERROR;
+    if (0 != trans_loop(timeout)){
+        rc = YIELD_ERROR;
+    }
+    return rc;
+}
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/serialzation_lib.lib	Wed Nov 25 07:07:31 2015 +0000
@@ -0,0 +1,1 @@
+serialzation_lib#056edc3ec132