
ifocus smart light sample v0.9
Dependencies: MbedJSONValue MQTT
Diff: main.cpp
- Revision:
- 6:cd4d7e943f96
- Parent:
- 5:9b664d736a6a
--- 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)