Duy_new_test_Water_Monitor

Dependencies:   MQTT NDefLib

Fork of Cloud_IBM_MbedOS by ST

Files at this revision

API Documentation at this revision

Comitter:
mapellil
Date:
Fri Nov 17 08:46:13 2017 +0000
Child:
1:731b764fb26f
Commit message:
first commit

Changed in this revision

.mbedignore Show annotated file Show diff for this revision Revisions of this file
MQTT.lib Show annotated file Show diff for this revision Revisions of this file
MQTTNetwork.h Show annotated file Show diff for this revision Revisions of this file
NDefLib.lib Show annotated file Show diff for this revision Revisions of this file
X_NUCLEO_IKS01A2.lib Show annotated file Show diff for this revision Revisions of this file
X_NUCLEO_NFC01A1.lib Show annotated file Show diff for this revision Revisions of this file
easy-connect.lib 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
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
mbed_app.json Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.mbedignore	Fri Nov 17 08:46:13 2017 +0000
@@ -0,0 +1,4 @@
+easy-connect/atmel-rf-driver/*
+easy-connect/mcr20a-rf-driver/*
+easy-connect/stm-spirit1-rf-driver/*
+easy-connect/esp8266-driver/*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MQTT.lib	Fri Nov 17 08:46:13 2017 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mapellil/code/MQTT/#0534b5d3c941
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MQTTNetwork.h	Fri Nov 17 08:46:13 2017 +0000
@@ -0,0 +1,40 @@
+#ifndef _MQTTNETWORK_H_
+#define _MQTTNETWORK_H_
+ 
+#include "NetworkInterface.h"
+ 
+class MQTTNetwork {
+public:
+    MQTTNetwork(NetworkInterface* aNetwork) : network(aNetwork) {
+        socket = new TCPSocket();
+    }
+ 
+    ~MQTTNetwork() {
+        delete socket;
+    }
+ 
+    int read(unsigned char* buffer, int len, int timeout) {
+			  socket->set_timeout(timeout);
+        return socket->recv(buffer, len);
+    }
+ 
+    int write(unsigned char* buffer, int len, int timeout) {
+			  socket->set_timeout(timeout);			
+        return socket->send(buffer, len);
+    }
+ 
+    int connect(const char* hostname, int port) {
+        socket->open(network);
+        return socket->connect(hostname, port);
+    }
+ 
+    int disconnect() {
+        return socket->close();
+    }
+		 
+private:
+    NetworkInterface* network;
+    TCPSocket* socket;
+};
+ 
+#endif // _MQTTNETWORK_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NDefLib.lib	Fri Nov 17 08:46:13 2017 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/ST/code/NDefLib/#72c86cbd49be
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/X_NUCLEO_IKS01A2.lib	Fri Nov 17 08:46:13 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/ST/code/X_NUCLEO_IKS01A2/#138a7a28bd21
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/X_NUCLEO_NFC01A1.lib	Fri Nov 17 08:46:13 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/ST/code/X_NUCLEO_NFC01A1/#059115ea6ece
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/easy-connect.lib	Fri Nov 17 08:46:13 2017 +0000
@@ -0,0 +1,1 @@
+https://github.com/mapellil/easy-connect/#6af200df4817ec38661b409c7ba417e6098e8f1f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Nov 17 08:46:13 2017 +0000
@@ -0,0 +1,330 @@
+/* SpwfInterface NetworkSocketAPI Example Program
+ * Copyright (c) 2015 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "mbed.h"
+#include "easy-connect.h"
+#include "MQTTClient.h"
+#include "XNucleoIKS01A2.h"
+#include "XNucleoNFC01A1.h"
+#include "NDefLib/NDefNfcTag.h"
+#include "NDefLib/RecordType/RecordURI.h"
+#include "MQTTNetwork.h"
+#include "MQTTmbed.h"
+
+
+//------------------------------------
+// Hyperterminal configuration
+// 9600 bauds, 8-bit data, no parity
+//------------------------------------
+static Serial pc(SERIAL_TX, SERIAL_RX); 
+static DigitalOut myled(LED1);
+static bool quickstartMode = true;      // set to false to connect with authentication tocken
+static bool BlueButtonToggle = false;  
+
+#define ORG_QUICKSTART           // comment to connect to play.internetofthings.ibmcloud.com
+//#define SUBSCRIBE              // uncomment to subscribe to broker msgs (not to be used with IBM broker) 
+//#define X_NUCLEO_NFC01A1_PRESENT // uncomment to add NFC support
+    
+#define MQTT_MAX_PACKET_SIZE 400   
+#define MQTT_MAX_PAYLOAD_SIZE 300 
+
+ // Configuration values needed to connect to IBM IoT Cloud
+#ifdef ORG_QUICKSTART
+#define ORG "quickstart"     // connect to quickstart.internetofthings.ibmcloud.com/ For a registered connection, replace with your org 
+#define ID ""
+#define AUTH_TOKEN ""
+#define DEFAULT_TYPE_NAME "iotsample-mbed-Nucleo"
+#else   // not def ORG_QUICKSTART
+#define ORG "play"             // connect to play.internetofthings.ibmcloud.com/ For a registered connection, replace with your org
+#define ID ""       // For a registered connection, replace with your id
+#define AUTH_TOKEN ""// For a registered connection, replace with your auth-token
+#define DEFAULT_TYPE_NAME "sensor"
+#endif
+
+#define TYPE DEFAULT_TYPE_NAME       // For a registered connection, replace with your type
+#define IBM_IOT_PORT MQTT_PORT
+    
+static char id[30] = ID;                 // mac without colons  
+static char org[12] = ORG;        
+static int connack_rc = 0; // MQTT connack return code
+static char type[30] = TYPE;
+static char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode
+static bool netConnecting = false;
+static int connectTimeout = 1000;
+static bool mqttConnecting = false;
+static bool netConnected = false;
+static bool connected = false;
+static int retryAttempt = 0;
+static char subscription_url[MQTT_MAX_PAYLOAD_SIZE];
+
+static LPS22HBSensor *pressure_sensor;
+static HTS221Sensor  *humidity_sensor;
+static HTS221Sensor  *temp_sensor1;
+
+#ifndef TARGET_SENSOR_TILE
+static void BlueButtonPressed ()
+{
+	BlueButtonToggle = true;	
+}
+#endif
+
+#ifdef SUBSCRIBE
+void subscribe_cb(MQTT::MessageData & msgMQTT) {
+    char msg[MQTT_MAX_PAYLOAD_SIZE];
+    msg[0]='\0';
+    strncat (msg, (char*)msgMQTT.message.payload, msgMQTT.message.payloadlen);
+    printf ("--->>> subscribe_cb msg: %s\n\r", msg);
+}
+
+int subscribe(char *pubTopic, MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client)
+{
+    return client->subscribe(pubTopic, MQTT::QOS1, subscribe_cb);
+}
+#endif
+
+int connect(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTNetwork *mqttNetwork, NetworkInterface* network)
+{
+    const char* iot_ibm = MQTT_BROKER_URL;     
+    char hostname[strlen(org) + strlen(iot_ibm) + 1];
+    
+    sprintf(hostname, "%s%s", org, iot_ibm);
+    // Construct clientId - d:org:type:id
+    char clientId[strlen(org) + strlen(type) + strlen(id) + 5];  
+    sprintf(clientId, "d:%s:%s:%s", org, type, id);  
+    sprintf(subscription_url, "%s.%s/#/device/%s/sensor/", org, "internetofthings.ibmcloud.com",id);
+
+    // Network debug statements 
+    LOG("=====================================\n\r");
+    LOG("Nucleo IP ADDRESS: %s\n\r", network->get_ip_address());
+    LOG("Nucleo MAC ADDRESS: %s\n\r", network->get_mac_address());
+    LOG("Server Hostname: %s port: %d\n\r", hostname, IBM_IOT_PORT);
+//    for(int i = 0; clientId[i]; i++){  // set lowercase mac
+//       clientId[i] = tolower(clientId[i]); 
+//    }    
+    LOG("Client ID: %s\n\r", clientId);
+    LOG("Topic: %s\n\r",MQTT_TOPIC);
+    LOG("Subscription URL: %s\n\r", subscription_url);
+    LOG("=====================================\n\r");    
+    netConnecting = true;
+    int rc = mqttNetwork->connect(hostname, IBM_IOT_PORT);
+    if (rc != 0)
+    {
+        printf("rc from TCP connect is %d\r\n", rc);
+        return rc;
+    }
+    
+    printf ("--->TCP Connected\n\r");
+    netConnected = true;
+    netConnecting = false;		
+		
+    // MQTT Connect
+    mqttConnecting = true;
+    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
+    data.MQTTVersion = 4;
+    data.struct_version=0;
+    data.clientID.cstring = clientId; 
+	data.keepAliveInterval = MQTT_KEEPALIVE;  // in Sec
+    if (!quickstartMode) 
+    {        
+        data.username.cstring = "use-token-auth";
+        data.password.cstring = auth_token;
+    }   
+    if ((rc = client->connect(data)) != 0) {
+        printf("rc from MQTT connect is %d\r\n", rc);
+        connack_rc = rc;
+        return rc;
+    }
+    connected = true;
+    printf ("--->MQTT Connected\n\r"); 
+#ifdef SUBSCRIBE
+		    int rc=0;
+        if ((rc=subscribe(MQTT_TOPIC, client)) == 0) LOG ("--->>>MQTT subscribed to: %s\n\r",MQTT_TOPIC);
+		    else LOG ("--->>>ERROR MQTT subscribe : %s\n\r",MQTT_TOPIC);
+#endif    
+    mqttConnecting = false;
+    connack_rc = rc;
+    return rc;       
+}
+
+
+int getConnTimeout(int attemptNumber)
+{  // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
+   // after 20 attempts, retry every 10 minutes
+    return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
+}
+
+
+void attemptConnect(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTNetwork *mqttNetwork, NetworkInterface* network) 
+{
+    connected = false;
+           
+    while (connect(client, mqttNetwork, network) != MQTT_CONNECTION_ACCEPTED) 
+    {    
+        if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
+            printf ("File: %s, Line: %d Error: %d\n\r",__FILE__,__LINE__, connack_rc);        
+            return; // don't reattempt to connect if credentials are wrong
+        } 
+        int timeout = getConnTimeout(++retryAttempt);
+        WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
+        
+        // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
+        //  or maybe just add the proper members to do this disconnect and call attemptConnect(...)        
+        // this works - reset the system when the retry count gets to a threshold
+        if (retryAttempt == 5)
+            NVIC_SystemReset(); 
+        else
+            wait(timeout);
+    }    
+}
+
+int publish(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client)
+{
+    MQTT::Message message;
+    const char* pubTopic = MQTT_TOPIC;
+            
+    char buf[MQTT_MAX_PAYLOAD_SIZE];
+    float temp, press, hum;
+
+	if (!client->isConnected()) { printf ("---> MQTT DISCONNECTED\n\r"); return MQTT::FAILURE; }
+    temp_sensor1->get_temperature(&temp);
+    pressure_sensor->get_pressure(&press);
+    humidity_sensor->get_humidity(&hum);
+    sprintf(buf,
+     "{\"d\":{\"ST\":\"Nucleo-IoT-mbed\",\"Temp\":%0.4f,\"Pressure\":%0.4f,\"Humidity\":%0.4f}}",
+              temp, press, hum);
+    message.qos = MQTT::QOS0;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf);
+
+    if( (message.payloadlen + strlen(pubTopic)+1) >= MQTT_MAX_PACKET_SIZE )
+        printf("message too long!\r\n");
+    
+    LOG("Publishing %s\n\r", buf);
+    return client->publish(pubTopic, message);    
+}
+ 
+int main()
+{   
+   myled=0;
+   DevI2C *i2c = new DevI2C(I2C_SDA, I2C_SCL);
+   i2c->frequency(400000);    
+	
+   XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(i2c);   
+   pressure_sensor = mems_expansion_board->pt_sensor;
+   temp_sensor1 = mems_expansion_board->ht_sensor;  
+   humidity_sensor = mems_expansion_board->ht_sensor; 
+   pressure_sensor->enable();
+   temp_sensor1->enable();
+   humidity_sensor->enable();
+    
+#if !defined (TARGET_SENSOR_TILE)
+    InterruptIn BlueButton(USER_BUTTON);    
+    BlueButton.fall(&BlueButtonPressed);
+	  BlueButtonToggle = false;
+#endif    
+	
+   pc.printf("\r\nX-NUCLEO-IDW01M1 mbed Application\r\n");     
+   pc.printf("\r\nconnecting to AP\r\n");            
+
+   quickstartMode=false;
+   if (strcmp(org, "quickstart") == 0){quickstartMode = true;}
+   NetworkInterface* network = easy_connect(true);
+   if (!network) {
+       printf ("Error easy_connect\n\r");
+       return -1;
+   } 
+   MQTTNetwork mqttNetwork(network);	
+   MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE> client(mqttNetwork);
+		
+   if (quickstartMode){
+       char mac[50];  // remove all : from mac
+       char *digit=NULL;
+       sprintf (id,"%s", "");                
+       sprintf (mac,"%s",network->get_mac_address()); 
+       digit = strtok (mac,":");
+       while (digit != NULL)
+       {
+           strcat (id, digit);
+           digit = strtok (NULL, ":");
+       }     
+   }
+   printf ("ATTEMPT CONNECT\n\r");
+   attemptConnect(&client, &mqttNetwork, network);
+   if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD)    
+   {
+       printf ("---ERROR line : %d\n\r", __LINE__);
+       while (true)
+       wait(1.0); // Permanent failures - don't retry
+   }
+#ifdef X_NUCLEO_NFC01A1_PRESENT      
+   // program NFC with broker URL        
+   XNucleoNFC01A1 *nfcNucleo = XNucleoNFC01A1::instance(*i2c, NULL, XNucleoNFC01A1::DEFAULT_GPO_PIN, XNucleoNFC01A1::DEFAULT_RF_DISABLE_PIN, NC,NC,NC);  
+   NDefLib::NDefNfcTag& tag = nfcNucleo->get_M24SR().get_NDef_tag();
+   printf("NFC Init done: !\r\n");
+   //open the i2c session with the nfc chip
+   if(tag.open_session()){
+       //create the NDef message and record
+       NDefLib::Message msg;
+       NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTPS, subscription_url);
+       msg.add_record(&rUri);
+       //write the tag
+       if(tag.write(msg)){
+           printf("Tag writed \r\n");
+       }
+       //close the i2c session
+       if(!tag.close_session()){
+           printf("Error Closing the session\r\n");
+       }
+   }else printf("Error open Session\r\n");             
+#endif    
+   myled=1;         
+   int count = 0;    
+   while (true)
+   {
+		 if (BlueButtonToggle == false && connected == true) {
+       if (++count == 6)
+       {               // Publish a message every 3 second
+           if (publish(&client) != MQTT::SUCCESS) { 
+               myled=0;
+			   count=0;
+             client.disconnect();
+			 mqttNetwork.disconnect();			   
+               attemptConnect(&client, &mqttNetwork, network);   // if we have lost the connection                
+           } else {					 
+			  myled=1;
+              count=0;
+					 }
+       }        
+       client.yield(500);  // allow the MQTT client to receive subscribe messages and manage keep alive
+		 } else if (BlueButtonToggle == true && connected == true){   // disconnect MQTT
+			 printf ("--->> Disconnect\n\r");
+       connected = false;
+			 count = 0;
+			 BlueButtonToggle = false;
+#ifdef SUBSCRIBE			 
+  //			 unsubscribe(const char* topicFilter);   // unsubscribe if subscribed
+#endif			 
+			 client.disconnect();
+			 mqttNetwork.disconnect();
+		 } else if (BlueButtonToggle == true && connected == false) {
+			 connected = true;
+			 BlueButtonToggle = false;
+	 } else wait (0.5);
+   }
+}
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-os.lib	Fri Nov 17 08:46:13 2017 +0000
@@ -0,0 +1,1 @@
+https://github.com/ARMmbed/mbed-os/#ca661f9d28526ca8f874b05432493a489c9671ea  
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_app.json	Fri Nov 17 08:46:13 2017 +0000
@@ -0,0 +1,49 @@
+{
+    "config": {
+        "network-interface":{
+            "help": "options are ETHERNET, WIFI_ESP8266, WIFI_IDW0XX1, WIFI_ODIN, WIFI_RTW, MESH_LOWPAN_ND, MESH_THREAD, CELLULAR_ONBOARD",
+            "value": "WIFI_IDW0XX1"                         
+        },
+        "wifi-ssid": {
+           "value": "\"crespan\""
+        },
+        "wifi-password": {
+           "value": "\"Arches0n\""            
+        },
+        "wifi-tx": { 
+           "help": "TX pin for serial connection to external device", 
+           "value": "PA_11" 
+        }, 
+        "wifi-rx": { 
+          "help": "RX pin for serial connection to external device", 
+          "value": "PA_12" 
+        }
+	},
+    "macros": [ "MQTT_BROKER_URL=\".messaging.internetofthings.ibmcloud.com\"",
+                "MQTT_CLIENT_ID=\"g:pvko17:<your DEVICE_ID_TYPE>:<your DEVICE_ID>\"",
+                "MQTT_USERNAME=\"use-token-auth\"",
+                "MQTT_PASSWORD=\"<your DEVICE_ID>\"",
+                "MQTT_TOPIC=\"iot-2/evt/status/fmt/json\"",
+                "MQTT_SENSOR_ID=\"<mmddyyyy>\"",
+	            "MQTT_KEEPALIVE  10",
+				"MQTT_PORT 1883",
+				"MQTT_TLS_PORT 8883"],
+    "target_overrides": {
+        "*": {
+            "target.features_add": ["NANOSTACK", "LOWPAN_ROUTER", "COMMON_PAL"],
+            "mbed-mesh-api.6lowpan-nd-channel-page": 0,
+            "mbed-mesh-api.6lowpan-nd-channel": 12
+        },    
+        "K64F": {
+        },
+        "NUCLEO_F401RE": {
+            "wifi-tx": "D8", 
+            "wifi-rx": "D2",         
+			"target.macros_add": ["IKS01A2"]
+        },
+        "DISCO_L475VG_IOT01A": {
+        },
+        "NUCLEO_L476RG": {
+        }		
+    }
+}