
ifocus smart light sample v0.9
Dependencies: MbedJSONValue MQTT
main.cpp
- Committer:
- zixuanlim
- Date:
- 2019-12-12
- Revision:
- 6:cd4d7e943f96
- Parent:
- 5:9b664d736a6a
File content as of revision 6:cd4d7e943f96:
#include "mbed.h" #include "TCPSocket.h" #include "MQTTNetwork.h" #include "MQTTmbed.h" #include "MQTTClient.h" #define WIFI_IDW0XX1 2 #define MQTTCLIENT_QOS2 1 #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); // //#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); // //#endif // MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1 #endif //WiFi LED region #define WIFI_LED_ON {_wifiLed.output(); _wifiLed = 1;_isWifiLedOn = 1;} #define WIFI_LED_OFF {_wifiLed.input(); _isWifiLedOn = 0;} DigitalOut _pirSensorLed(LED1); DigitalOut _relayLed(LED2); DigitalInOut _wifiLed(LED3); DigitalOut _relay1(D7); InterruptIn _motionTrigger(D2); Thread _dioManagerThread; Thread _wifiManagerThread; Thread _mqttClientThread; int _currentRelayTimeout = RELAY_TIMEOUT; typedef enum ServerConnectivity { Disconnected, Connected }ServerConnectivity; ServerConnectivity _brokerConnection; ServerConnectivity _pelionConnection; Timer _resetRelayTimer; bool _isRelayTriggered = false; bool _isWifiConnected = false; int _isWifiLedOn = 0; MQTT::Client<MQTTNetwork, Countdown>* _mqttClient; void OnRelay() { //_relayLed = 1; _relay1 = 1; _isRelayTriggered = true; } void OffRelay() { if(!_pirSensorLed) { //_relayLed = 0; _relay1 = 0; _isRelayTriggered = false; _resetRelayTimer.stop(); } else { _resetRelayTimer.reset(); } } void OnTrigger() { _pirSensorLed = 1; _resetRelayTimer.reset(); if(!_isRelayTriggered) { OnRelay(); _resetRelayTimer.start(); } } void OffTrigger() { _pirSensorLed = 0; //When no more motion trigger, off the PIR LED } void HandlePIR() { _motionTrigger.rise(&OnTrigger); _motionTrigger.fall(&OffTrigger); while(true) { if(_isRelayTriggered) //If relay is triggering { if(_resetRelayTimer.read() > _currentRelayTimeout) //Read Timer, if timer read above target time { OffRelay(); //Turn off the relay } } thread_sleep_for(500); } } 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() { _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) { if (status == NSAPI_EVENT_CONNECTION_STATUS_CHANGE) { switch(param) { case NSAPI_STATUS_GLOBAL_UP: { _isWifiConnected = true; _currentRelayTimeout = 10; //ZXLIM - Assume connected to broker and control by broker _mqttClientThread.start(callback(ConnectBroker,&_wifi)); WIFI_LED_ON; break; } default: { _isWifiConnected = false; //ZXLIM - Ignore connected LAN 1st. _currentRelayTimeout = 1; WIFI_LED_OFF; break; } } } } int main() { _dioManagerThread.start(callback(HandlePIR)); _wifi.attach(&status_callback); _wifi.set_blocking(false); _wifiManagerThread.start(callback(ConnectWifi)); while(true) { while(!_isWifiConnected) { if(!_isWifiLedOn) { WIFI_LED_ON; } else { WIFI_LED_OFF; } thread_sleep_for(100); } thread_sleep_for(500); } }