Duy tran / Mbed OS iot_water_monitor_v2

Dependencies:   easy-connect-v16 Watchdog FP MQTTPacket RecordType-v-16 watersenor_and_temp_code

Files at this revision

API Documentation at this revision

Comitter:
DuyLionTran
Date:
Fri Nov 24 17:49:30 2017 +0000
Parent:
0:24bec4d463a5
Child:
2:61d34bc22590
Commit message:
send oke

Changed in this revision

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
--- a/main.cpp	Fri Nov 24 11:19:55 2017 +0000
+++ b/main.cpp	Fri Nov 24 17:49:30 2017 +0000
@@ -1,11 +1,20 @@
-/*******************************************************************************
+/***************************************************************
  * Includes
- *******************************************************************************/
+ ***************************************************************/
 #include "mbed.h"
+#include "easy-connect.h"
+#include "MQTTNetwork.h"
+#include "MQTTmbed.h"
+#include "MQTTClient.h"
 
-/*******************************************************************************
- * Defines
- *******************************************************************************/
+/***************************************************************
+ * Definitions
+ ***************************************************************/
+#define logMessage printf
+#define MQTTCLIENT_QOS2 (0)
+#define MQTT_OK         (0)
+#define MQTT_FAIL       (-1)
+ 
 #define SENSOR_1_PIN  (A0)
 #define SENSOR_2_PIN  (A1)
 #define SENSOR_3_PIN  (A3)
@@ -13,37 +22,153 @@
 
 #define RELAY_1_PIN   (D11)
 #define RELAY_2_PIN   (D12)
- 
-/*******************************************************************************
+
+/***************************************************************
  * Variables
- *******************************************************************************/ 
-/* Global Varialbles */
- 
-/* Private Variables */
+ ***************************************************************/
+float version = 0.6;
+char* topic = "command";
+char* event = "event";
+const char* hostname = "m11.cloudmqtt.com";
+int port = 16416;
+char* clientID = "Duy";
+char* username = "gbmswwpl";
+char* password = "jZf8eSGw39X4";
+
+int arrivedcount = 0;
+uint32_t lastRead = 0;
+
+uint8_t readVal = 0;
+
+Timer  readTime;
+Thread thread;
+Serial serial(USBTX, USBRX);
+
+/***************************************************************
+ * Structs/Classess
+ ***************************************************************/
+NetworkInterface* network = easy_connect(true);
+MQTTNetwork mqttNetwork(network);
+MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork);
+
+/***************************************************************
+ * Callbacks
+ ***************************************************************/
+void messageArrived(MQTT::MessageData& md) {
+    MQTT::Message &message = md.message;
+    logMessage("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
+    logMessage("Payload %.*s\r\n", message.payloadlen, (char*)message.payload);
+    ++arrivedcount;
+}
+
+/***************************************************************
+ * Unity functions
+ ***************************************************************/
+/* Definitions */
  
-/* Structs/Classes */
-AnalogIn sensor_1_value(SENSOR_1_PIN);
-AnalogIn sensor_2_value(SENSOR_2_PIN);
-AnalogIn sensor_3_value(SENSOR_3_PIN);
-AnalogIn sensor_4_value(SENSOR_4_PIN);
-
-DigitalOut relay_1(RELAY_1_PIN);
-DigitalOut relay_2(RELAY_2_PIN);
+/* Declarations */
+void timeoutCallback() {
+    readVal++;
+    char buf[100];
+    
+    MQTT::Message msg;
+    sprintf(buf, "{\"Analog Value 1\":\"%d\"}", readVal);
+    msg.qos = MQTT::QOS0;
+    msg.retained = false;
+    msg.dup = false;
+    msg.payload = (void*)buf;
+    msg.payloadlen = strlen(buf)+1;
+    int ret = client.publish(event, msg);   
+    
+    logMessage("Publish result: %d\r\n", ret);
+}
 
-DigitalOut led(LED1); 
- 
-Serial serial(USBTX, USBRX);
- 
-/*******************************************************************************
+void yield_thread() {
+    while (true) {
+        if ((uint32_t)(readTime.read_ms() - lastRead) > 5000) {
+           readVal++;
+           char buf[100];
+   
+           MQTT::Message msg;
+           sprintf(buf, "{\"Analog Value 1\":\"%d\"}", readVal);
+           msg.qos = MQTT::QOS0;
+           msg.retained = false;
+           msg.dup = false;
+           msg.payload = (void*)buf;
+           msg.payloadlen = strlen(buf)+1;
+           int ret = client.publish(event, msg);   
+           logMessage("Publish result: %d\r\n", ret);
+           lastRead = readTime.read_ms();
+        }
+    }
+}
+/***************************************************************
  * Main
- *******************************************************************************/ 
- 
-void main() {
+ ***************************************************************/
+int main(int argc, char* argv[]) {
+    serial.baud(115200);
+    
+    logMessage("IoT Water Monitor: version is %.2f\r\n", version);
+    network = easy_connect(true);
     
-    serial.baud(115200);
+    if (!network) {
+        logMessage("Failed to connect to the internet\r\n");
+        return ;
+    }
+    MQTTNetwork mqttNetwork(network);
+    MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork);
+
+    logMessage("Connecting to %s:%d\r\n", hostname, port);
+    int rc = mqttNetwork.connect(hostname, port);
+    if (rc != 0)
+        logMessage("rc from TCP connect is %d\r\n", rc);
+
+    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
+    data.MQTTVersion = 3;
+    data.clientID.cstring = clientID;
+    data.username.cstring = username;
+    data.password.cstring = password;
+    if ((rc = client.connect(data)) != 0)
+        logMessage("rc from MQTT connect is %d\r\n", rc);
+
+    if ((rc = client.subscribe(topic, MQTT::QOS0, messageArrived)) != 0)
+        logMessage("rc from MQTT subscribe is %d\r\n", rc);
 
-
-    while(1) {
+    MQTT::Message message;
+    
+    char buf[100];
+    sprintf(buf, "Hello from IoT Water Monitor!  QoS 0 message from app version %f\r\n", version);
+    message.qos = MQTT::QOS0;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf)+1;
+    rc = client.publish(event, message);
+    while (arrivedcount < 1)
+        client.yield(100);
 
+    logMessage("Version %.2f: finish %d msgs\r\n", version, arrivedcount); 
+    thread.start(callback(yield_thread));
+    readTime.start();
+      
+    while(true) {
+//        client.yield(100);   
+        if ((uint32_t)(readTime.read_ms() - lastRead) > 5000) {
+            readVal++;
+            char buf[100];
+    
+            MQTT::Message msg;
+            sprintf(buf, "{\"Analog Value 1\":\"%d\"}", readVal);
+            msg.qos = MQTT::QOS0;
+            msg.retained = false;
+            msg.dup = false;
+            msg.payload = (void*)buf;
+            msg.payloadlen = strlen(buf)+1;
+            int ret = client.publish(event, msg);   
+              
+            logMessage("Publish result: %d\r\n", ret);
+            lastRead = readTime.read_ms();
+        }
     }
-}
\ No newline at end of file
+        
+}
--- a/mbed-os.lib	Fri Nov 24 11:19:55 2017 +0000
+++ b/mbed-os.lib	Fri Nov 24 17:49:30 2017 +0000
@@ -1,1 +1,1 @@
-https://github.com/ARMmbed/mbed-os/#34b61d1612aaec2e5d61a8a43c9764bc2fe8aac0
+https://github.com/ARMmbed/mbed-os/#2885c1b41e63158cb6faf5f107cd821ae06ef26c