ifocus smart light sample v0.9

Dependencies:   MbedJSONValue MQTT

Committer:
zixuanlim
Date:
Thu Dec 12 02:18:11 2019 +0000
Revision:
6:cd4d7e943f96
Parent:
5:9b664d736a6a
Commit for testing again in local....

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zixuanlim 0:324ca5eb468c 1 #include "mbed.h"
zixuanlim 0:324ca5eb468c 2 #include "TCPSocket.h"
zixuanlim 0:324ca5eb468c 3 #include "MQTTNetwork.h"
zixuanlim 0:324ca5eb468c 4 #include "MQTTmbed.h"
zixuanlim 0:324ca5eb468c 5 #include "MQTTClient.h"
zixuanlim 0:324ca5eb468c 6
zixuanlim 0:324ca5eb468c 7 #define WIFI_IDW0XX1 2
zixuanlim 0:324ca5eb468c 8 #define MQTTCLIENT_QOS2 1
zixuanlim 0:324ca5eb468c 9
zixuanlim 5:9b664d736a6a 10 #define RELAY_TIMEOUT 1
zixuanlim 4:dffb6c949dbf 11
zixuanlim 6:cd4d7e943f96 12 #define DEVICE_MAC "1f00000001000000"
zixuanlim 6:cd4d7e943f96 13 #define SOFTWARE_VERSION "0.9.0"
zixuanlim 6:cd4d7e943f96 14 #define BROKER_URL "ec2-3-0-92-18.ap-southeast-1.compute.amazonaws.com"
zixuanlim 6:cd4d7e943f96 15 #define BROKER_PORT 1883
zixuanlim 6:cd4d7e943f96 16
zixuanlim 0:324ca5eb468c 17 #if (defined(TARGET_DISCO_L475VG_IOT01A) || defined(TARGET_DISCO_F413ZH))
zixuanlim 0:324ca5eb468c 18 #include "ISM43362Interface.h"
zixuanlim 0:324ca5eb468c 19
zixuanlim 6:cd4d7e943f96 20 //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);
zixuanlim 6:cd4d7e943f96 21 ISM43362Interface _wifi(false);
zixuanlim 4:dffb6c949dbf 22 //
zixuanlim 4:dffb6c949dbf 23 //#else // External WiFi modules
zixuanlim 4:dffb6c949dbf 24 //
zixuanlim 4:dffb6c949dbf 25 //#if MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1
zixuanlim 4:dffb6c949dbf 26 //#include "SpwfSAInterface.h"
zixuanlim 6:cd4d7e943f96 27 //SpwfSAInterface _wifi(MBED_CONF_APP_WIFI_TX, MBED_CONF_APP_WIFI_RX);
zixuanlim 4:dffb6c949dbf 28 //
zixuanlim 4:dffb6c949dbf 29 //#endif // MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1
zixuanlim 0:324ca5eb468c 30
zixuanlim 0:324ca5eb468c 31 #endif
zixuanlim 4:dffb6c949dbf 32
zixuanlim 5:9b664d736a6a 33 //WiFi LED region
zixuanlim 5:9b664d736a6a 34
zixuanlim 5:9b664d736a6a 35 #define WIFI_LED_ON {_wifiLed.output(); _wifiLed = 1;_isWifiLedOn = 1;}
zixuanlim 5:9b664d736a6a 36 #define WIFI_LED_OFF {_wifiLed.input(); _isWifiLedOn = 0;}
zixuanlim 5:9b664d736a6a 37
zixuanlim 4:dffb6c949dbf 38 DigitalOut _pirSensorLed(LED1);
zixuanlim 4:dffb6c949dbf 39 DigitalOut _relayLed(LED2);
zixuanlim 5:9b664d736a6a 40 DigitalInOut _wifiLed(LED3);
zixuanlim 4:dffb6c949dbf 41
zixuanlim 4:dffb6c949dbf 42 DigitalOut _relay1(D7);
zixuanlim 0:324ca5eb468c 43
zixuanlim 4:dffb6c949dbf 44 InterruptIn _motionTrigger(D2);
zixuanlim 4:dffb6c949dbf 45
zixuanlim 4:dffb6c949dbf 46 Thread _dioManagerThread;
zixuanlim 4:dffb6c949dbf 47 Thread _wifiManagerThread;
zixuanlim 6:cd4d7e943f96 48 Thread _mqttClientThread;
zixuanlim 4:dffb6c949dbf 49
zixuanlim 4:dffb6c949dbf 50 int _currentRelayTimeout = RELAY_TIMEOUT;
zixuanlim 0:324ca5eb468c 51
zixuanlim 4:dffb6c949dbf 52 typedef enum ServerConnectivity
zixuanlim 0:324ca5eb468c 53 {
zixuanlim 4:dffb6c949dbf 54 Disconnected,
zixuanlim 4:dffb6c949dbf 55 Connected
zixuanlim 4:dffb6c949dbf 56 }ServerConnectivity;
zixuanlim 4:dffb6c949dbf 57
zixuanlim 4:dffb6c949dbf 58 ServerConnectivity _brokerConnection;
zixuanlim 4:dffb6c949dbf 59 ServerConnectivity _pelionConnection;
zixuanlim 4:dffb6c949dbf 60
zixuanlim 4:dffb6c949dbf 61 Timer _resetRelayTimer;
zixuanlim 4:dffb6c949dbf 62
zixuanlim 4:dffb6c949dbf 63 bool _isRelayTriggered = false;
zixuanlim 5:9b664d736a6a 64 bool _isWifiConnected = false;
zixuanlim 5:9b664d736a6a 65
zixuanlim 5:9b664d736a6a 66 int _isWifiLedOn = 0;
zixuanlim 4:dffb6c949dbf 67
zixuanlim 6:cd4d7e943f96 68 MQTT::Client<MQTTNetwork, Countdown>* _mqttClient;
zixuanlim 6:cd4d7e943f96 69
zixuanlim 4:dffb6c949dbf 70 void OnRelay()
zixuanlim 4:dffb6c949dbf 71 {
zixuanlim 5:9b664d736a6a 72 //_relayLed = 1;
zixuanlim 4:dffb6c949dbf 73 _relay1 = 1;
zixuanlim 4:dffb6c949dbf 74 _isRelayTriggered = true;
zixuanlim 0:324ca5eb468c 75 }
zixuanlim 0:324ca5eb468c 76
zixuanlim 4:dffb6c949dbf 77 void OffRelay()
zixuanlim 0:324ca5eb468c 78 {
zixuanlim 5:9b664d736a6a 79 if(!_pirSensorLed)
zixuanlim 5:9b664d736a6a 80 {
zixuanlim 5:9b664d736a6a 81 //_relayLed = 0;
zixuanlim 5:9b664d736a6a 82 _relay1 = 0;
zixuanlim 5:9b664d736a6a 83 _isRelayTriggered = false;
zixuanlim 5:9b664d736a6a 84 _resetRelayTimer.stop();
zixuanlim 5:9b664d736a6a 85 }
zixuanlim 5:9b664d736a6a 86 else
zixuanlim 5:9b664d736a6a 87 {
zixuanlim 5:9b664d736a6a 88 _resetRelayTimer.reset();
zixuanlim 5:9b664d736a6a 89 }
zixuanlim 4:dffb6c949dbf 90 }
zixuanlim 4:dffb6c949dbf 91
zixuanlim 4:dffb6c949dbf 92 void OnTrigger()
zixuanlim 4:dffb6c949dbf 93 {
zixuanlim 4:dffb6c949dbf 94 _pirSensorLed = 1;
zixuanlim 4:dffb6c949dbf 95 _resetRelayTimer.reset();
zixuanlim 4:dffb6c949dbf 96
zixuanlim 4:dffb6c949dbf 97 if(!_isRelayTriggered)
zixuanlim 4:dffb6c949dbf 98 {
zixuanlim 4:dffb6c949dbf 99 OnRelay();
zixuanlim 4:dffb6c949dbf 100 _resetRelayTimer.start();
zixuanlim 0:324ca5eb468c 101 }
zixuanlim 0:324ca5eb468c 102 }
zixuanlim 0:324ca5eb468c 103
zixuanlim 4:dffb6c949dbf 104 void OffTrigger()
zixuanlim 0:324ca5eb468c 105 {
zixuanlim 5:9b664d736a6a 106 _pirSensorLed = 0; //When no more motion trigger, off the PIR LED
zixuanlim 0:324ca5eb468c 107 }
zixuanlim 0:324ca5eb468c 108
zixuanlim 4:dffb6c949dbf 109 void HandlePIR()
zixuanlim 0:324ca5eb468c 110 {
zixuanlim 4:dffb6c949dbf 111 _motionTrigger.rise(&OnTrigger);
zixuanlim 4:dffb6c949dbf 112 _motionTrigger.fall(&OffTrigger);
zixuanlim 4:dffb6c949dbf 113
zixuanlim 4:dffb6c949dbf 114 while(true)
zixuanlim 4:dffb6c949dbf 115 {
zixuanlim 5:9b664d736a6a 116 if(_isRelayTriggered) //If relay is triggering
zixuanlim 4:dffb6c949dbf 117 {
zixuanlim 5:9b664d736a6a 118 if(_resetRelayTimer.read() > _currentRelayTimeout) //Read Timer, if timer read above target time
zixuanlim 4:dffb6c949dbf 119 {
zixuanlim 5:9b664d736a6a 120 OffRelay(); //Turn off the relay
zixuanlim 4:dffb6c949dbf 121 }
zixuanlim 4:dffb6c949dbf 122 }
zixuanlim 5:9b664d736a6a 123 thread_sleep_for(500);
zixuanlim 4:dffb6c949dbf 124 }
zixuanlim 4:dffb6c949dbf 125 }
zixuanlim 0:324ca5eb468c 126
zixuanlim 6:cd4d7e943f96 127 int arrivedcount = 0;
zixuanlim 6:cd4d7e943f96 128
zixuanlim 6:cd4d7e943f96 129 void messageArrived(MQTT::MessageData& md)
zixuanlim 6:cd4d7e943f96 130 {
zixuanlim 6:cd4d7e943f96 131 MQTT::Message &message = md.message;
zixuanlim 6:cd4d7e943f96 132 char* payload = (char*)message.payload;
zixuanlim 6:cd4d7e943f96 133 printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
zixuanlim 6:cd4d7e943f96 134 printf("Payload %.*s\r\n", message.payloadlen, payload);
zixuanlim 6:cd4d7e943f96 135 arrivedcount++;
zixuanlim 6:cd4d7e943f96 136
zixuanlim 6:cd4d7e943f96 137 MQTT::Message newMessage;
zixuanlim 6:cd4d7e943f96 138 // QoS 0
zixuanlim 6:cd4d7e943f96 139 char buf[100];
zixuanlim 6:cd4d7e943f96 140 sprintf(buf, "Bello From another side! QoS 0 newMessage from app version %s\r\n", SOFTWARE_VERSION);
zixuanlim 6:cd4d7e943f96 141 newMessage.qos = MQTT::QOS0;
zixuanlim 6:cd4d7e943f96 142 newMessage.retained = false;
zixuanlim 6:cd4d7e943f96 143 newMessage.dup = false;
zixuanlim 6:cd4d7e943f96 144 newMessage.payload = (void*)buf;
zixuanlim 6:cd4d7e943f96 145 newMessage.payloadlen = strlen(buf)+1;
zixuanlim 6:cd4d7e943f96 146 _mqttClient->publish("testing123", newMessage);
zixuanlim 6:cd4d7e943f96 147
zixuanlim 6:cd4d7e943f96 148 }
zixuanlim 6:cd4d7e943f96 149
zixuanlim 6:cd4d7e943f96 150 void ConnectBroker(NetworkInterface *net)
zixuanlim 6:cd4d7e943f96 151 {
zixuanlim 6:cd4d7e943f96 152 MQTTNetwork mqttNetwork(net);
zixuanlim 6:cd4d7e943f96 153 char* topic = "testing123";
zixuanlim 6:cd4d7e943f96 154
zixuanlim 6:cd4d7e943f96 155 MQTT::Client<MQTTNetwork, Countdown> client (mqttNetwork);
zixuanlim 6:cd4d7e943f96 156
zixuanlim 6:cd4d7e943f96 157 _mqttClient = &client;
zixuanlim 6:cd4d7e943f96 158
zixuanlim 6:cd4d7e943f96 159 int rc = mqttNetwork.connect(BROKER_URL, BROKER_PORT);
zixuanlim 6:cd4d7e943f96 160 if (rc != 0)
zixuanlim 6:cd4d7e943f96 161 printf("rc from TCP connect is %d\r\n", rc);
zixuanlim 6:cd4d7e943f96 162
zixuanlim 6:cd4d7e943f96 163 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
zixuanlim 6:cd4d7e943f96 164 data.MQTTVersion = 3;
zixuanlim 6:cd4d7e943f96 165 data.clientID.cstring = DEVICE_MAC;
zixuanlim 6:cd4d7e943f96 166 data.username.cstring = DEVICE_MAC;
zixuanlim 6:cd4d7e943f96 167 data.password.cstring = DEVICE_MAC;
zixuanlim 6:cd4d7e943f96 168
zixuanlim 6:cd4d7e943f96 169 if ((rc = _mqttClient->connect(data)) != 0)
zixuanlim 6:cd4d7e943f96 170 printf("rc from MQTT connect is %d\r\n", rc);
zixuanlim 6:cd4d7e943f96 171
zixuanlim 6:cd4d7e943f96 172 if ((rc = _mqttClient->subscribe(topic, MQTT::QOS2, messageArrived)) != 0)
zixuanlim 6:cd4d7e943f96 173 printf("rc from MQTT subscribe is %d\r\n", rc);
zixuanlim 6:cd4d7e943f96 174
zixuanlim 6:cd4d7e943f96 175 MQTT::Message message;
zixuanlim 6:cd4d7e943f96 176
zixuanlim 6:cd4d7e943f96 177 // QoS 0
zixuanlim 6:cd4d7e943f96 178 char buf[100];
zixuanlim 6:cd4d7e943f96 179 sprintf(buf, "Hello World! QoS 0 message from app version %s\r\n", SOFTWARE_VERSION);
zixuanlim 6:cd4d7e943f96 180 message.qos = MQTT::QOS0;
zixuanlim 6:cd4d7e943f96 181 message.retained = false;
zixuanlim 6:cd4d7e943f96 182 message.dup = false;
zixuanlim 6:cd4d7e943f96 183 message.payload = (void*)buf;
zixuanlim 6:cd4d7e943f96 184 message.payloadlen = strlen(buf)+1;
zixuanlim 6:cd4d7e943f96 185 rc = _mqttClient->publish(topic, message);
zixuanlim 6:cd4d7e943f96 186 while (arrivedcount < 1)
zixuanlim 6:cd4d7e943f96 187 _mqttClient->yield(100);
zixuanlim 6:cd4d7e943f96 188
zixuanlim 6:cd4d7e943f96 189 // QoS 1
zixuanlim 6:cd4d7e943f96 190 sprintf(buf, "Hello World! QoS 1 message from app version %s\r\n", SOFTWARE_VERSION);
zixuanlim 6:cd4d7e943f96 191 message.qos = MQTT::QOS1;
zixuanlim 6:cd4d7e943f96 192 message.payloadlen = strlen(buf)+1;
zixuanlim 6:cd4d7e943f96 193 rc = _mqttClient->publish(topic, message);
zixuanlim 6:cd4d7e943f96 194 while (arrivedcount < 2)
zixuanlim 6:cd4d7e943f96 195 _mqttClient->yield(100);
zixuanlim 6:cd4d7e943f96 196
zixuanlim 6:cd4d7e943f96 197 // QoS 2
zixuanlim 6:cd4d7e943f96 198 sprintf(buf, "Hello World! QoS 2 message from app version %s\r\n", SOFTWARE_VERSION);
zixuanlim 6:cd4d7e943f96 199 message.qos = MQTT::QOS2;
zixuanlim 6:cd4d7e943f96 200 message.payloadlen = strlen(buf)+1;
zixuanlim 6:cd4d7e943f96 201 rc = _mqttClient->publish(topic, message);
zixuanlim 6:cd4d7e943f96 202
zixuanlim 6:cd4d7e943f96 203 while (arrivedcount < 3)
zixuanlim 6:cd4d7e943f96 204 _mqttClient->yield(100);
zixuanlim 6:cd4d7e943f96 205
zixuanlim 6:cd4d7e943f96 206 while(true)
zixuanlim 6:cd4d7e943f96 207 {
zixuanlim 6:cd4d7e943f96 208 _mqttClient->yield(100);
zixuanlim 6:cd4d7e943f96 209 }
zixuanlim 6:cd4d7e943f96 210 }
zixuanlim 0:324ca5eb468c 211
zixuanlim 4:dffb6c949dbf 212 void ConnectWifi()
zixuanlim 5:9b664d736a6a 213 {
zixuanlim 6:cd4d7e943f96 214 _wifi.disconnect();
zixuanlim 6:cd4d7e943f96 215 _wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
zixuanlim 6:cd4d7e943f96 216 //int ret = 0;
zixuanlim 6:cd4d7e943f96 217 // do
zixuanlim 6:cd4d7e943f96 218 // {
zixuanlim 6:cd4d7e943f96 219 // ret = _wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
zixuanlim 6:cd4d7e943f96 220 // if(ret != 0)
zixuanlim 6:cd4d7e943f96 221 // {
zixuanlim 6:cd4d7e943f96 222 // thread_sleep_for(500);
zixuanlim 6:cd4d7e943f96 223 // }
zixuanlim 6:cd4d7e943f96 224 // }while(ret != 0);
zixuanlim 6:cd4d7e943f96 225 //
zixuanlim 4:dffb6c949dbf 226 }
zixuanlim 4:dffb6c949dbf 227
zixuanlim 5:9b664d736a6a 228 void status_callback(nsapi_event_t status, intptr_t param)
zixuanlim 5:9b664d736a6a 229 {
zixuanlim 5:9b664d736a6a 230 if (status == NSAPI_EVENT_CONNECTION_STATUS_CHANGE) {
zixuanlim 5:9b664d736a6a 231 switch(param) {
zixuanlim 5:9b664d736a6a 232 case NSAPI_STATUS_GLOBAL_UP:
zixuanlim 5:9b664d736a6a 233 {
zixuanlim 5:9b664d736a6a 234 _isWifiConnected = true;
zixuanlim 5:9b664d736a6a 235 _currentRelayTimeout = 10; //ZXLIM - Assume connected to broker and control by broker
zixuanlim 6:cd4d7e943f96 236 _mqttClientThread.start(callback(ConnectBroker,&_wifi));
zixuanlim 5:9b664d736a6a 237 WIFI_LED_ON;
zixuanlim 5:9b664d736a6a 238 break;
zixuanlim 5:9b664d736a6a 239 }
zixuanlim 5:9b664d736a6a 240 default:
zixuanlim 5:9b664d736a6a 241 {
zixuanlim 5:9b664d736a6a 242 _isWifiConnected = false; //ZXLIM - Ignore connected LAN 1st.
zixuanlim 5:9b664d736a6a 243 _currentRelayTimeout = 1;
zixuanlim 6:cd4d7e943f96 244 WIFI_LED_OFF;
zixuanlim 5:9b664d736a6a 245 break;
zixuanlim 5:9b664d736a6a 246 }
zixuanlim 5:9b664d736a6a 247 }
zixuanlim 5:9b664d736a6a 248 }
zixuanlim 5:9b664d736a6a 249 }
zixuanlim 5:9b664d736a6a 250
zixuanlim 4:dffb6c949dbf 251 int main()
zixuanlim 4:dffb6c949dbf 252 {
zixuanlim 0:324ca5eb468c 253
zixuanlim 5:9b664d736a6a 254 _dioManagerThread.start(callback(HandlePIR));
zixuanlim 6:cd4d7e943f96 255 _wifi.attach(&status_callback);
zixuanlim 6:cd4d7e943f96 256 _wifi.set_blocking(false);
zixuanlim 4:dffb6c949dbf 257 _wifiManagerThread.start(callback(ConnectWifi));
zixuanlim 4:dffb6c949dbf 258
zixuanlim 4:dffb6c949dbf 259 while(true)
zixuanlim 4:dffb6c949dbf 260 {
zixuanlim 5:9b664d736a6a 261 while(!_isWifiConnected)
zixuanlim 5:9b664d736a6a 262 {
zixuanlim 5:9b664d736a6a 263 if(!_isWifiLedOn)
zixuanlim 5:9b664d736a6a 264 {
zixuanlim 5:9b664d736a6a 265 WIFI_LED_ON;
zixuanlim 5:9b664d736a6a 266 }
zixuanlim 5:9b664d736a6a 267 else
zixuanlim 5:9b664d736a6a 268 {
zixuanlim 5:9b664d736a6a 269 WIFI_LED_OFF;
zixuanlim 5:9b664d736a6a 270 }
zixuanlim 5:9b664d736a6a 271 thread_sleep_for(100);
zixuanlim 5:9b664d736a6a 272 }
zixuanlim 5:9b664d736a6a 273 thread_sleep_for(500);
zixuanlim 4:dffb6c949dbf 274 }
zixuanlim 4:dffb6c949dbf 275 }