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);
}
}
}
Rick McConney
