Proximity sensor mqtt version
Dependencies: MQTT-JMF WNCInterface mbed-rtos mbed
Fork of WNCInterface_MQTT_hivemq by
main.cpp
- Committer:
- elmkom
- Date:
- 2016-09-27
- Revision:
- 2:29a6a34179ce
- Parent:
- 1:1b516e98444f
File content as of revision 2:29a6a34179ce:
//#define MQTT_DEBUG #include "mbed.h" #include "MQTTClient.h" #include "MQTTFormat.h" //#include "MQTTEthernet.h" #include "MQTTWNCInterface.h" #include "rtos.h" #include "k64f.h" #include "Proximity.h" // connect options for MQTT broker #define BROKER "iot.foundry.att.com" // MQTT broker URL #define PORT 1880 // MQTT broker port number #define CLIENTID "96430312d8f7" // use K64F MAC address without colons #define USERNAME "" // not required for MQTT Dashboard public broker #define PASSWORD "" // not required for MQTT Dashboard public broker #define TOPIC "proximity" // MQTT topic Proximity proximityStrip; Queue<uint32_t, 6> messageQ; struct rcvd_errs{ int err; char *er; }; rcvd_errs response[] = { 200, "200 OK - Request has succeeded.", 201, "201 Created - Request has been fulfilled and a new resource created.", 202, "202 Accepted - The request has been accepted for processing, but the processing will be completed asynchronously", 204, "204 No Content - The server has fulfilled the request but does not need to return an entity-body.", 400, "400 Bad Request - Bad request (e.g. sending an array when the API is expecting a hash.)", 401, "401 Unauthorized - No valid API key provided.", 403, "403 Forbidden - You tried to access a disabled device, or your API key is not allowed to access that resource, etc.", 404, "404 Not Found - The requested item could not be found.", 405, "405 Method Not Allowed - The HTTP method specified is not allowed.", 415, "415 Unsupported Media Type - The requested media type is currently not supported.", 422, "422 Unprocessable Entity - Can result from sending invalid fields.", 429, "429 Too Many Requests - The user has sent too many requests in a given period of time.", 500, "500 Server errors - Something went wrong in the M2X server", 502, "502 Server errors - Something went wrong in the M2X server", 503, "503 Server errors - Something went wrong in the M2X server", 504, "504 Server errors - Something went wrong in the M2X server", }; #define RCMAX sizeof(response)/sizeof(rcvd_errs) char * response_str(int rc) { static char *unkown = "Unknown error code..."; int i=0; while( response[i].err != rc && i < RCMAX) i++; return (i<RCMAX? response[i].er : unkown); } // LED color control function void controlLED(color_t led_color) { switch(led_color) { case red : greenLED = blueLED = 1; redLED = 0.7; break; case green : redLED = blueLED = 1; greenLED = 0.7; break; case blue : redLED = greenLED = 1; blueLED = 0.7; break; case off : redLED = greenLED = blueLED = 1; break; } } // Switch 2 interrupt handler void sw2_ISR(void) { messageQ.put((uint32_t*)22); } // Switch3 interrupt handler void sw3_ISR(void) { messageQ.put((uint32_t*)33); } // MQTT message arrived callback function void messageArrived(MQTT::MessageData& md) { MQTT::Message &message = md.message; printf("Receiving MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload); if (message.payloadlen == 3) { if (strncmp((char*)message.payload, "red", 3) == 0) controlLED(red); else if(strncmp((char*)message.payload, "grn", 3) == 0) controlLED(green); else if(strncmp((char*)message.payload, "blu", 3) == 0) controlLED(blue); else if(strncmp((char*)message.payload, "off", 3) == 0) controlLED(off); } } int main() { int rc, good = 0; Timer tmr; char* topic = TOPIC; int count = 0; // turn off LED controlLED(red); // set SW2 and SW3 to generate interrupt on falling edge switch2.fall(&sw2_ISR); switch3.fall(&sw3_ISR); // initialize ethernet interface MQTTwnc ipstack = MQTTwnc(); // get and display client network info WNCInterface& eth = ipstack.getEth(); // construct the MQTT client MQTT::Client<MQTTwnc, Countdown> client = MQTT::Client<MQTTwnc, Countdown>(ipstack); char* hostname = BROKER; int port = PORT; printf("\r\n\r\nWelcome to the K64F MQTT Demo!\r\n"); printf("\r\nConnected to local network...\r\n"); printf("IP address is %s\r\n", eth.getIPAddress()); printf("MAC address is %s\r\n", eth.getMACAddress()); printf("Gateway address is %s\r\n", eth.getGateway()); MQTTPacket_connectData data = MQTTPacket_connectData_initializer; int tries; while( !good ) { tries=0; // connect to TCP socket and check return code tmr.start(); rc = 1; while( rc && tries < 3) { printf("\r\n\r\nAttempting TCP connect to %s:%d: ", hostname, port); rc = ipstack.connect(hostname, port); if( rc ) { printf("Failed!!\r\n"); while( tmr.read_ms() < 5000 ) ; tries++; tmr.reset(); } else { printf("Success!\r\n"); rc = 0; } } data.MQTTVersion = 3; data.clientID.cstring = eth.getMACAddress(); // data.username.cstring = USERNAME; // data.password.cstring = PASSWORD; // send MQTT connect packet and check return code rc = 1; tmr.reset(); while( !client.isConnected() && rc && tries < 3) { printf("Attempting (%d) MQTT connect to %s:%d: ", tries, hostname, port); rc = client.connect(data); if( rc ) { printf("Connection Failed!\r\n"); while( tmr.read_ms() < 5000 ); tmr.reset(); tries++; } else printf("Connected!\r\n"); } // subscribe to MQTT topic tmr.reset(); rc = 1; while( rc && client.isConnected() && tries < 3) { printf("We are %s, Subscribing to MQTT topic %s (%d): ", client.isConnected()?"connected":"NOT CONNECTED",topic,tries); rc = client.subscribe(topic, MQTT::QOS0, messageArrived); if( rc ) { printf("Subscribe request failed!\r\n"); while( tmr.read_ms() < 5000 ); tries++; tmr.reset(); } else { good=1; printf("Subscribe successful!\r\n"); } } } controlLED(blue); MQTT::Message message; char buf[512]; message.qos = MQTT::QOS0; message.retained = false; message.dup = false; message.payload = (void*)buf; message.payloadlen = strlen(buf)+1; sprintf(buf, "[\"Hi\"]"); message.payloadlen = strlen(buf)+1; rc = client.publish(topic, message); if( rc ) { printf("Publish request failed! (%d)\r\n",rc); } else { printf("Publish successful!\r\n"); client.yield(100); } proximityStrip.init(); proximityStrip.on(); while(true) { count++; if(count >= 30) { count = 0; sprintf(buf, "wake"); message.payloadlen = strlen(buf)+1; controlLED(red); rc = client.publish(topic, message); controlLED(off); if( rc ) { printf("Publish request failed! (%d)\r\n",rc); } else { printf("Publish successful!\r\n"); client.yield(100); } } osEvent switchEvent = messageQ.get(100); controlLED(green); proximityStrip.scan(); controlLED(off); if(proximityStrip.changed(50)) { controlLED(blue); char* data = proximityStrip.getDataStr(); printf("data:%s",data); sprintf(buf, data); //sprintf(buf, "[{\"s\":\"1\"},{\"s\":\"2\"}]"); message.payloadlen = strlen(buf)+1; rc = client.publish(topic, message); if( rc ) { printf("Publish request failed! (%d)\r\n",rc); } else { printf("Publish successful!\r\n"); count=0; client.yield(100); } } if (switchEvent.value.v == 22 || switchEvent.value.v == 33) { switch(switchEvent.value.v) { case 22 : sprintf(buf, "sw2"); message.payloadlen = strlen(buf)+1; break; case 33 : sprintf(buf, "sw3"); message.payloadlen = strlen(buf)+1; break; } printf("Publishing MQTT message: %s (%d)\r\n", (char*)message.payload, message.payloadlen); rc = client.publish(topic, message); if( rc ) { printf("Publish request failed! (%d)\r\n",rc); } else { printf("Publish successful!\r\n"); count=0; client.yield(100); } } else { client.yield(100); } } }