ifocus smart light sample v0.9

Dependencies:   MbedJSONValue MQTT

Files at this revision

API Documentation at this revision

Comitter:
zixuanlim
Date:
Thu Dec 12 02:18:11 2019 +0000
Parent:
5:9b664d736a6a
Commit message:
Commit for testing again in local....

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Wed Dec 11 09:52:56 2019 +0000
+++ b/main.cpp	Thu Dec 12 02:18:11 2019 +0000
@@ -9,17 +9,22 @@
 
 #define RELAY_TIMEOUT 1
 
+#define DEVICE_MAC "1f00000001000000"
+#define SOFTWARE_VERSION "0.9.0"
+#define BROKER_URL "ec2-3-0-92-18.ap-southeast-1.compute.amazonaws.com"
+#define BROKER_PORT 1883
+
 #if (defined(TARGET_DISCO_L475VG_IOT01A) || defined(TARGET_DISCO_F413ZH))
 #include "ISM43362Interface.h"
 
-//ISM43362Interface _Wifi(MBED_CONF_APP_WIFI_SPI_MOSI, MBED_CONF_APP_WIFI_SPI_MISO, MBED_CONF_APP_WIFI_SPI_SCLK, MBED_CONF_APP_WIFI_SPI_NSS, MBED_CONF_APP_WIFI_RESET, MBED_CONF_APP_WIFI_DATAREADY, MBED_CONF_APP_WIFI_WAKEUP, false);
-ISM43362Interface _Wifi(false);
+//ISM43362Interface _wifi(MBED_CONF_APP_WIFI_SPI_MOSI, MBED_CONF_APP_WIFI_SPI_MISO, MBED_CONF_APP_WIFI_SPI_SCLK, MBED_CONF_APP_WIFI_SPI_NSS, MBED_CONF_APP_WIFI_RESET, MBED_CONF_APP_WIFI_DATAREADY, MBED_CONF_APP_WIFI_WAKEUP, false);
+ISM43362Interface _wifi(false);
 //
 //#else // External WiFi modules
 //
 //#if MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1
 //#include "SpwfSAInterface.h"
-//SpwfSAInterface _Wifi(MBED_CONF_APP_WIFI_TX, MBED_CONF_APP_WIFI_RX);
+//SpwfSAInterface _wifi(MBED_CONF_APP_WIFI_TX, MBED_CONF_APP_WIFI_RX);
 //
 //#endif // MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1
 
@@ -40,6 +45,7 @@
 
 Thread _dioManagerThread;
 Thread _wifiManagerThread;
+Thread _mqttClientThread;
 
 int _currentRelayTimeout = RELAY_TIMEOUT;
 
@@ -59,6 +65,8 @@
 
 int _isWifiLedOn = 0;
 
+MQTT::Client<MQTTNetwork, Countdown>* _mqttClient;
+
 void OnRelay()
 {
     //_relayLed = 1;
@@ -116,35 +124,105 @@
     }
 }
 
+int arrivedcount = 0;
+
+void messageArrived(MQTT::MessageData& md)
+{
+    MQTT::Message &message = md.message;    
+    char* payload = (char*)message.payload;
+    printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
+    printf("Payload %.*s\r\n", message.payloadlen, payload);
+    arrivedcount++;
+    
+    MQTT::Message newMessage;
+        // QoS 0
+    char buf[100];
+    sprintf(buf, "Bello From another side!  QoS 0 newMessage from app version %s\r\n", SOFTWARE_VERSION);
+    newMessage.qos = MQTT::QOS0;
+    newMessage.retained = false;
+    newMessage.dup = false;
+    newMessage.payload = (void*)buf;
+    newMessage.payloadlen = strlen(buf)+1;
+    _mqttClient->publish("testing123", newMessage);
+
+}
+
+void ConnectBroker(NetworkInterface *net)
+{
+    MQTTNetwork mqttNetwork(net);
+    char* topic = "testing123";
+
+    MQTT::Client<MQTTNetwork, Countdown> client (mqttNetwork);
+    
+    _mqttClient = &client;
+    
+    int rc = mqttNetwork.connect(BROKER_URL, BROKER_PORT);
+    if (rc != 0)
+        printf("rc from TCP connect is %d\r\n", rc);
+        
+    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
+    data.MQTTVersion = 3;
+    data.clientID.cstring = DEVICE_MAC;
+    data.username.cstring = DEVICE_MAC;
+    data.password.cstring = DEVICE_MAC;
+    
+    if ((rc = _mqttClient->connect(data)) != 0)
+        printf("rc from MQTT connect is %d\r\n", rc);
+
+    if ((rc = _mqttClient->subscribe(topic, MQTT::QOS2, messageArrived)) != 0)
+        printf("rc from MQTT subscribe is %d\r\n", rc);
+
+    MQTT::Message message;
+    
+    // QoS 0
+    char buf[100];
+    sprintf(buf, "Hello World!  QoS 0 message from app version %s\r\n", SOFTWARE_VERSION);
+    message.qos = MQTT::QOS0;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf)+1;
+    rc = _mqttClient->publish(topic, message);
+    while (arrivedcount < 1)
+        _mqttClient->yield(100);
+
+    // QoS 1
+    sprintf(buf, "Hello World!  QoS 1 message from app version %s\r\n", SOFTWARE_VERSION);
+    message.qos = MQTT::QOS1;
+    message.payloadlen = strlen(buf)+1;
+    rc = _mqttClient->publish(topic, message);
+    while (arrivedcount < 2)
+        _mqttClient->yield(100);
+
+    // QoS 2
+    sprintf(buf, "Hello World!  QoS 2 message from app version %s\r\n", SOFTWARE_VERSION);
+    message.qos = MQTT::QOS2;
+    message.payloadlen = strlen(buf)+1;
+    rc = _mqttClient->publish(topic, message);
+
+    while (arrivedcount < 3)
+        _mqttClient->yield(100);
+
+    while(true)
+    {
+        _mqttClient->yield(100);
+    }
+}
 
 void ConnectWifi()
 {   
-    do
-    {
-        if(!_isWifiConnected)
-        {
-            _Wifi.disconnect();
-
-            int ret = 0;
-            do
-            {
-                ret = _Wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
-                if(ret != 0)
-                {
-                    thread_sleep_for(500);
-                }
-            }while(ret != 0);
-            
-            //Connected to WiFi interface or WIFI?
-            
-            //Start connectivity
-        }
-        else
-        {
-            _relayLed = !_relayLed;
-        }        
-        thread_sleep_for(500);
-    }while(true);
+    _wifi.disconnect();
+    _wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
+    //int ret = 0;
+//    do
+//    {
+//        ret = _wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
+//        if(ret != 0)
+//        {
+//            thread_sleep_for(500);
+//        }
+//    }while(ret != 0);
+//       
 }
 
 void status_callback(nsapi_event_t status, intptr_t param)
@@ -155,6 +233,7 @@
             {
                 _isWifiConnected = true;
                 _currentRelayTimeout = 10; //ZXLIM - Assume connected to broker and control by broker
+                _mqttClientThread.start(callback(ConnectBroker,&_wifi));
                 WIFI_LED_ON;
                 break;
             }
@@ -162,18 +241,19 @@
             {
                 _isWifiConnected = false; //ZXLIM - Ignore connected LAN 1st.
                 _currentRelayTimeout = 1;
+                WIFI_LED_OFF;
                 break;
             }
         }
     }
 }
 
-
 int main()
 {
     
     _dioManagerThread.start(callback(HandlePIR));    
-    _Wifi.attach(&status_callback);
+    _wifi.attach(&status_callback);
+    _wifi.set_blocking(false);
     _wifiManagerThread.start(callback(ConnectWifi));
     
     while(true)