pro_client_device
Dependencies: C12832 EthernetInterface LM75B MMA7660 MQTT mbed-rtos mbed
Fork of IBMIoTClientEthernetExample by
Revision 20:8778deb906b2, committed 2017-01-12
- Comitter:
- occle
- Date:
- Thu Jan 12 15:51:01 2017 +0000
- Parent:
- 19:d91f7b4ef2a9
- Commit message:
- pro_client_device
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r d91f7b4ef2a9 -r 8778deb906b2 main.cpp --- a/main.cpp Mon May 23 13:48:48 2016 +0000 +++ b/main.cpp Thu Jan 12 15:51:01 2017 +0000 @@ -1,50 +1,11 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 IBM Corp. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Eclipse Distribution License v1.0 which accompany this distribution. - * - * The Eclipse Public License is available at - * http://www.eclipse.org/legal/epl-v10.html - * and the Eclipse Distribution License is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * Contributors: - * Sam Danbury - initial implementation - * Ian Craggs - refactoring to remove STL and other changes - * Sam Grove - added check for Ethernet cable. - * Chris Styles - Added additional menu screen for software revision - * James Sutton - Mac fix and extra debug - * Ian Craggs - add not authorized messages - * - * To do : - * Add magnetometer sensor output to IoT data stream - * - *******************************************************************************/ #include "LM75B.h" #include "MMA7660.h" -#include "MQTTClient.h" #include "MQTTEthernet.h" #include "C12832.h" #include "Arial12x12.h" #include "rtos.h" -// Update this to the next number *before* a commit -#define __APP_SW_REVISION__ "18" - -// Configuration values needed to connect to IBM IoT Cloud -#define ORG "quickstart" // For a registered connection, replace with your org -#define ID "" // For a registered connection, replace with your id -#define AUTH_TOKEN "" // For a registered connection, replace with your auth-token -#define TYPE DEFAULT_TYPE_NAME // For a registered connection, replace with your type - -#define MQTT_PORT 1883 -#define MQTT_TLS_PORT 8883 -#define IBM_IOT_PORT MQTT_PORT - -#define MQTT_MAX_PACKET_SIZE 250 #if defined(TARGET_UBLOX_C027) #warning "Compiling for mbed C027" @@ -57,104 +18,61 @@ #include "K64F.h" #endif - -bool quickstartMode = true; -char org[11] = ORG; -char type[30] = TYPE; -char id[30] = ID; // mac without colons -char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode - -bool connected = false; -bool mqttConnecting = false; -bool netConnected = false; -bool netConnecting = false; -bool ethernetInitialising = true; -int connack_rc = 0; // MQTT connack return code -int retryAttempt = 0; -int menuItem = 0; +/*--INITS-------------------------------------------------------------------------------*/ +EthernetInterface eth; //create ethernet +UDPSocket sock; //creat Ethernet socket +Endpoint server; //create endpoint +InterruptIn joyclick(D4); //joystick click as interrupt +AnalogIn pot1 (A0); //left potentiometer char* joystickPos = "CENTRE"; int blink_interval = 0; -char* ip_addr = ""; -char* gateway_addr = ""; -char* host_addr = ""; -int connectTimeout = 1000; +/*--CONSTANTS---------------------------------------------------------------------------*/ +const int PORT = 7; +static const char* SERVER_IP = "192.168.1.110"; //IP of server board +static const char* CLIENT_IP = "192.168.1.102"; //IP of client board +static const char* MASK = "255.255.255.0"; //mask +static const char* GATEWAY = "192.168.1.1"; //gateway -// If we wanted to manually set the MAC address, -// this is how to do it. In this example, we take -// the original Mbed Set MAC address and combine it -// with a prefix of our choosing. - /* -extern "C" void $Super$$mbed_mac_address(char *s); -extern "C" void $Sub$$mbed_mac_address(char *s) -{ - char originalMAC[6] = ""; - $Super$$mbed_mac_address(originalMAC); - - char mac[6]; - mac[0] = 0x00; - mac[1] = 0x08; - mac[2] = 0xdc; - mac[3] = originalMAC[3]; - mac[4] = originalMAC[4]; - mac[5] = originalMAC[5]; - memcpy(s, mac, 6); -} -*/ - - -void off() -{ - r = g = b = 1.0; // 1 is off, 0 is full brightness -} - -void red() -{ - r = 0.7; g = 1.0; b = 1.0; // 1 is off, 0 is full brightness -} - -void yellow() +/*--VARIABLES---------------------------------------------------------------------------*/ +int n; //size of received message +char in_buffer[1]; //create receive buffer +char counter[1] = {0}; //sample send buffer +int menuItem = 0; +int servertemp; //temperature of the server device +float idealtemp; //desired temperature +/*--FUNCTION DEFINITIONS----------------------------------------------------------------*/ +/*****************************************************************************INIT_ETH***/ +void init_eth(void) { - r = 0.7; g = 0.7; b = 1.0; // 1 is off, 0 is full brightness -} - -void green() -{ - r = 1.0; g = 0.7; b = 1.0; // 1 is off, 0 is full brightness -} - - -void flashing_yellow(void const *args) + eth.init(CLIENT_IP, MASK, GATEWAY); //set up IP + eth.connect(); //connect ethernet + + sock.init(); //initialize socket + + server.set_address(SERVER_IP, PORT); //set address of server + +} //end init_eth() +/******************************************************************************END_ETH***/ +void end_eth(void) { - bool on = false; - while (!connected && connack_rc != MQTT_NOT_AUTHORIZED && connack_rc != MQTT_BAD_USERNAME_OR_PASSWORD) // flashing yellow only while connecting - { - on = !on; - if (on) - yellow(); - else - off(); - wait(0.5); - } -} - + sock.close(); //close socket + eth.disconnect(); //close Ethernet + +} //end end_eth() -void flashing_red(void const *args) // to be used when the connection is lost +/*****************************************************************************TEMP***/ +void TEMP() { - bool on = false; - while (!connected) - { - on = !on; - if (on) - red(); - else - off(); - wait(2.0); - } + counter[0] = (int)pot1*30; + sock.sendTo(server, counter, sizeof(counter)); //send message + + n = sock.receiveFrom(server, in_buffer, sizeof(in_buffer)); //receive message from server + in_buffer[n] = '\0'; //add \0 to end of message + servertemp = in_buffer[0]; } - - +/*****************************************************************************printMenu***/ void printMenu(int menuItem) { static char last_line1[30] = "", last_line2[30] = ""; @@ -163,71 +81,25 @@ switch (menuItem) { case 0: - sprintf(line1, "IBM IoT Cloud"); + sprintf(line1, "Smart home system"); sprintf(line2, "Scroll with joystick"); break; case 1: - sprintf(line1, "Go to:"); - sprintf(line2, "http://ibm.biz/iotqstart"); + sprintf(line1, "Use left dial to"); + sprintf(line2, "set ideal temperature"); break; case 2: - sprintf(line1, "Device Identity:"); - sprintf(line2, "%s", id); + sprintf(line1, "Ideal temperature"); + sprintf(line2, "set to = %.0f", (float)pot1*30); break; case 3: - sprintf(line1, "MQTT Status:"); - if (mqttConnecting) - sprintf(line2, "Connecting... %d/5", retryAttempt); + sprintf(line1, "Temperature = %d", servertemp); + if(servertemp <(float)pot1*30) + sprintf(line2, "Heating ON"); else - { - if (connected) - sprintf(line2, "Connected"); - else - { - switch (connack_rc) - { - case MQTT_CLIENTID_REJECTED: - sprintf(line2, "Clientid rejected"); - break; - case MQTT_BAD_USERNAME_OR_PASSWORD: - sprintf(line2, "Invalid username or password"); - break; - case MQTT_NOT_AUTHORIZED: - sprintf(line2, "Not authorized"); - break; - default: - sprintf(line2, "Disconnected"); - } - } - } + sprintf(line2, "Heating OFF"); break; - case 4: - sprintf(line1, "Ethernet State:"); - sprintf(line2, ethernetInitialising ? "Initializing..." : "Initialized"); - break; - case 5: - sprintf(line1, "Socket State:"); - if (netConnecting) - sprintf(line2, "Connecting... %d/5", retryAttempt); - else - sprintf(line2, netConnected ? "Connected" : "Disconnected"); - break; - case 6: - sprintf(line1, "IP Address:"); - sprintf(line2, "%s", ip_addr); - break; - case 7: - sprintf(line1, "Gateway:"); - sprintf(line2, "%s", gateway_addr); - break; - case 8: - sprintf(line1, "App version:"); - sprintf(line2, "%s", __APP_SW_REVISION__); - break; - case 9: - sprintf(line1, "Current Timeout:"); - sprintf(line2, "%d ms", connectTimeout); - break; + } if (strcmp(line1, last_line1) != 0 || strcmp(line2, last_line2) != 0) @@ -243,14 +115,14 @@ } } - +/*****************************************************************************setMenu***/ void setMenu() { if (Down) { joystickPos = "DOWN"; - if (menuItem >= 0 && menuItem < 9) + if (menuItem >= 0 && menuItem < 3) printMenu(++menuItem); } else if (Left) @@ -260,7 +132,7 @@ else if (Up) { joystickPos = "UP"; - if (menuItem <= 9 && menuItem > 0) + if (menuItem <= 3 && menuItem > 0) printMenu(--menuItem); } else if (Right) @@ -269,6 +141,7 @@ joystickPos = "CENTRE"; } +/*****************************************************************************menu_loop***/ void menu_loop(void const *args) { int count = 0; @@ -289,233 +162,38 @@ { lcd.cls(); lcd.locate(0,0); - lcd.printf("IBM IoT Cloud"); + lcd.printf("Welcome"); lcd.locate(0,16); lcd.printf(message); } -int connect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack) -{ - const char* iot_ibm = ".messaging.internetofthings.ibmcloud.com"; - - char hostname[strlen(org) + strlen(iot_ibm) + 1]; - sprintf(hostname, "%s%s", org, iot_ibm); - EthernetInterface& eth = ipstack->getEth(); - ip_addr = eth.getIPAddress(); - gateway_addr = eth.getGateway(); - - // Construct clientId - d:org:type:id - char clientId[strlen(org) + strlen(type) + strlen(id) + 5]; - sprintf(clientId, "d:%s:%s:%s", org, type, id); - - // Network debug statements - LOG("=====================================\n"); - LOG("Connecting Ethernet.\n"); - LOG("IP ADDRESS: %s\n", eth.getIPAddress()); - LOG("MAC ADDRESS: %s\n", eth.getMACAddress()); - LOG("Gateway: %s\n", eth.getGateway()); - LOG("Network Mask: %s\n", eth.getNetworkMask()); - LOG("Server Hostname: %s\n", hostname); - LOG("Client ID: %s\n", clientId); - LOG("=====================================\n"); - - netConnecting = true; - int rc = ipstack->connect(hostname, IBM_IOT_PORT, connectTimeout); - if (rc != 0) - { - WARN("IP Stack connect returned: %d\n", rc); - return rc; - } - netConnected = true; - netConnecting = false; - - // MQTT Connect - mqttConnecting = true; - MQTTPacket_connectData data = MQTTPacket_connectData_initializer; - data.MQTTVersion = 3; - data.clientID.cstring = clientId; - - if (!quickstartMode) - { - data.username.cstring = "use-token-auth"; - data.password.cstring = auth_token; - } - - if ((rc = client->connect(data)) == 0) - { - connected = true; - green(); - displayMessage("Connected"); - wait(1); - displayMessage("Scroll with joystick"); - } - else - WARN("MQTT connect returned %d\n", rc); - if (rc >= 0) - connack_rc = rc; - mqttConnecting = false; - return rc; -} - - -int getConnTimeout(int attemptNumber) -{ // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute - // after 20 attempts, retry every 10 minutes - return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600; -} - - -void attemptConnect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack) -{ - connected = false; - - // make sure a cable is connected before starting to connect - while (!linkStatus()) - { - wait(1.0f); - WARN("Ethernet link not present. Check cable connection\n"); - } - - while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED) - { - if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) - return; // don't reattempt to connect if credentials are wrong - - Thread red_thread(flashing_red); - - int timeout = getConnTimeout(++retryAttempt); - WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout); - - // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed - // or maybe just add the proper members to do this disconnect and call attemptConnect(...) - - // this works - reset the system when the retry count gets to a threshold - if (retryAttempt == 5) - NVIC_SystemReset(); - else - wait(timeout); - } -} - - -int publish(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack) -{ - MQTT::Message message; - char* pubTopic = "iot-2/evt/status/fmt/json"; - - char buf[250]; - sprintf(buf, - "{\"d\":{\"myName\":\"IoT mbed\",\"accelX\":%0.4f,\"accelY\":%0.4f,\"accelZ\":%0.4f,\"temp\":%0.4f,\"joystick\":\"%s\",\"potentiometer1\":%0.4f,\"potentiometer2\":%0.4f}}", - MMA.x(), MMA.y(), MMA.z(), sensor.temp(), joystickPos, ain1.read(), ain2.read()); - message.qos = MQTT::QOS0; - message.retained = false; - message.dup = false; - message.payload = (void*)buf; - message.payloadlen = strlen(buf); - - LOG("Publishing %s\n", buf); - return client->publish(pubTopic, message); -} - - -char* getMac(EthernetInterface& eth, char* buf, int buflen) // Obtain MAC address -{ - strncpy(buf, eth.getMACAddress(), buflen); - - char* pos; // Remove colons from mac address - while ((pos = strchr(buf, ':')) != NULL) - memmove(pos, pos + 1, strlen(pos) + 1); - return buf; -} - - -void messageArrived(MQTT::MessageData& md) -{ - MQTT::Message &message = md.message; - char topic[md.topicName.lenstring.len + 1]; - - sprintf(topic, "%.*s", md.topicName.lenstring.len, md.topicName.lenstring.data); - - LOG("Message arrived on topic %s: %.*s\n", topic, message.payloadlen, message.payload); - - // Command topic: iot-2/cmd/blink/fmt/json - cmd is the string between cmd/ and /fmt/ - char* start = strstr(topic, "/cmd/") + 5; - int len = strstr(topic, "/fmt/") - start; - - if (memcmp(start, "blink", len) == 0) - { - char payload[message.payloadlen + 1]; - sprintf(payload, "%.*s", message.payloadlen, (char*)message.payload); - - char* pos = strchr(payload, '}'); - if (pos != NULL) - { - *pos = '\0'; - if ((pos = strchr(payload, ':')) != NULL) - { - int blink_rate = atoi(pos + 1); - blink_interval = (blink_rate <= 0) ? 0 : (blink_rate > 50 ? 1 : 50/blink_rate); - } - } - } - else - WARN("Unsupported command: %.*s\n", len, start); -} - int main() { - quickstartMode = (strcmp(org, "quickstart") == 0); - lcd.set_font((unsigned char*) Arial12x12); // Set a nice font for the LCD screen led2 = LED2_OFF; // K64F: turn off the main board LED - displayMessage("Connecting"); - Thread yellow_thread(flashing_yellow); Thread menu_thread(menu_loop); - LOG("***** IBM IoT Client Ethernet Example *****\n"); - MQTTEthernet ipstack; - ethernetInitialising = false; - MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack); - LOG("Ethernet Initialized\n"); - - if (quickstartMode) - getMac(ipstack.getEth(), id, sizeof(id)); - - attemptConnect(&client, &ipstack); + - if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) - { - red(); - while (true) - wait(1.0); // Permanent failures - don't retry - } - if (!quickstartMode) - { - int rc = 0; - if ((rc = client.subscribe("iot-2/cmd/+/fmt/json", MQTT::QOS1, messageArrived)) != 0) - WARN("rc from MQTT subscribe is %d\n", rc); - } - - blink_interval = 0; int count = 0; while (true) { if (++count == 100) { // Publish a message every second - if (publish(&client, &ipstack) != 0) - attemptConnect(&client, &ipstack); // if we have lost the connection - count = 0; - } + if (blink_interval == 0) led2 = LED2_OFF; else if (count % blink_interval == 0) led2 = !led2; - client.yield(10); // allow the MQTT client to receive messages + + TEMP(); + idealtemp=(float)pot1*30; + } } }