Initial commit

Dependencies:   MQTT

Fork of PGO6_VoteController_template by Jens de hoog

Committer:
Rennert
Date:
Thu Oct 26 14:25:29 2017 +0000
Revision:
2:f283e5274a0f
Parent:
1:e7a311bd038e
Commented;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jensdehoog 0:fd29cd85e75e 1 #define APP_VERSION 0.6f
jensdehoog 0:fd29cd85e75e 2 #define MQTT_VERSION 3
Rennert 1:e7a311bd038e 3 #define BROKER_NAME "143.129.39.151"
jensdehoog 0:fd29cd85e75e 4 #define BROKER_PORT 1883
Rennert 1:e7a311bd038e 5 #define CLIENTID "Reinout"
Rennert 1:e7a311bd038e 6 #define TOPIC "clubIOT/feedback"
jensdehoog 0:fd29cd85e75e 7 #include "debounce_button.h"
jensdehoog 0:fd29cd85e75e 8 #include "EthernetInterface.h"
jensdehoog 0:fd29cd85e75e 9 #include "MQTTNetwork.h"
jensdehoog 0:fd29cd85e75e 10 #include "MQTTmbed.h"
jensdehoog 0:fd29cd85e75e 11 #include "MQTTClient.h"
jensdehoog 0:fd29cd85e75e 12
Rennert 1:e7a311bd038e 13 DigitalOut info(LED2);
Rennert 1:e7a311bd038e 14 DigitalOut connected(LED3);
Rennert 1:e7a311bd038e 15 EthernetInterface interface;
Rennert 1:e7a311bd038e 16 Timer timer;
Rennert 1:e7a311bd038e 17 MQTTNetwork network(&interface);
Rennert 1:e7a311bd038e 18 MQTT::Client<MQTTNetwork, Countdown> client(network);
Rennert 1:e7a311bd038e 19 MQTT::Message message;
jensdehoog 0:fd29cd85e75e 20
jensdehoog 0:fd29cd85e75e 21 /**
jensdehoog 0:fd29cd85e75e 22 TODO
jensdehoog 0:fd29cd85e75e 23 ----
jensdehoog 0:fd29cd85e75e 24 - Check if the button has been pressed. If so, print the amount of clicks to a serial terminal.
jensdehoog 0:fd29cd85e75e 25 - Make an MQTT-service which:
jensdehoog 0:fd29cd85e75e 26 - starts up a network using EthernetInterface. Make sure the development board requests its address via DHCP.
jensdehoog 0:fd29cd85e75e 27 - makes a client and connects it to the broker using a client ID and credentials (username & password).
jensdehoog 0:fd29cd85e75e 28 - sends messages at the same topic as the smartphone app from PGO 2. Feel free to choose which Quality of Service
jensdehoog 0:fd29cd85e75e 29 you are going to use. Make a separate function which handles the sending procedure. Therefore, this function
jensdehoog 0:fd29cd85e75e 30 can be called each time we want to send a certain message.
jensdehoog 0:fd29cd85e75e 31 - When the button is pressed once, we send an upvote. When pressed twice, a downvote is sent. By pressing 4 times,
jensdehoog 0:fd29cd85e75e 32 the program disconnects from the broker and terminates.
jensdehoog 0:fd29cd85e75e 33
jensdehoog 0:fd29cd85e75e 34 Extra
jensdehoog 0:fd29cd85e75e 35 -----
jensdehoog 0:fd29cd85e75e 36 - Subscribe to the topic on which the song data is published. Display this received message on the serial terminal.
jensdehoog 0:fd29cd85e75e 37 - Test this controller in the complete system of PGO 2. Use these controllers instead of the smartphones.
jensdehoog 0:fd29cd85e75e 38
jensdehoog 0:fd29cd85e75e 39 Tips & tricks
jensdehoog 0:fd29cd85e75e 40 -------------
jensdehoog 0:fd29cd85e75e 41 - To generate an interrupt on the press of a button, use:
jensdehoog 0:fd29cd85e75e 42 InterruptIn button(USER_BUTTON);
jensdehoog 0:fd29cd85e75e 43 ...
jensdehoog 0:fd29cd85e75e 44 button.fall(callback(someFunction));
jensdehoog 0:fd29cd85e75e 45 - Before implementing MQTT, test the multiclick feature first.
jensdehoog 0:fd29cd85e75e 46 - Have a look at the MQTT-library for Mbed and the HelloMQTT-example.
jensdehoog 0:fd29cd85e75e 47 - To have a uniform message sending procedure, use the following function usage:
jensdehoog 0:fd29cd85e75e 48 sendMessage(&client, topic, buf, qos, retained, duplicate)
jensdehoog 0:fd29cd85e75e 49 */
Rennert 2:f283e5274a0f 50
Rennert 2:f283e5274a0f 51 //Connects to Network & MQTT
Rennert 1:e7a311bd038e 52 void connect(char* name){
Rennert 1:e7a311bd038e 53 interface.connect();
Rennert 1:e7a311bd038e 54 while(interface.get_ip_address()== NULL){
Rennert 1:e7a311bd038e 55 }
Rennert 1:e7a311bd038e 56
Rennert 1:e7a311bd038e 57 network.connect(BROKER_NAME, BROKER_PORT);
Rennert 1:e7a311bd038e 58 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
Rennert 1:e7a311bd038e 59 data.MQTTVersion = 3;
Rennert 1:e7a311bd038e 60 data.clientID.cstring = name;
Rennert 1:e7a311bd038e 61 data.username.cstring = "smartcity";
Rennert 1:e7a311bd038e 62 data.password.cstring = "smartcity";
Rennert 1:e7a311bd038e 63 client.connect(data);
Rennert 1:e7a311bd038e 64 connected=1;
Rennert 1:e7a311bd038e 65 }
Rennert 1:e7a311bd038e 66
Rennert 2:f283e5274a0f 67 //Publishes MQTT data
Rennert 1:e7a311bd038e 68 void send(char* feedback){
Rennert 1:e7a311bd038e 69 char buf[100];
Rennert 1:e7a311bd038e 70 sprintf(buf, feedback);
Rennert 1:e7a311bd038e 71 sprintf(buf+ strlen(buf), CLIENTID);
Rennert 1:e7a311bd038e 72 // QoS 0
Rennert 1:e7a311bd038e 73 message.qos = MQTT::QOS0;
Rennert 1:e7a311bd038e 74 message.retained = false;
Rennert 1:e7a311bd038e 75 message.dup = false;
Rennert 1:e7a311bd038e 76 message.payload = (void*)buf;
Rennert 1:e7a311bd038e 77 message.payloadlen = strlen(buf)+1;
Rennert 1:e7a311bd038e 78 client.publish(TOPIC, message);
Rennert 1:e7a311bd038e 79 }
Rennert 1:e7a311bd038e 80
Rennert 2:f283e5274a0f 81 //Disconnects MQTT
Rennert 1:e7a311bd038e 82 void disconnect(void){
Rennert 1:e7a311bd038e 83 client.unsubscribe(TOPIC);
Rennert 1:e7a311bd038e 84 client.disconnect();
Rennert 1:e7a311bd038e 85 network.disconnect();
Rennert 1:e7a311bd038e 86 connected=0;
Rennert 1:e7a311bd038e 87 }
Rennert 1:e7a311bd038e 88
Rennert 2:f283e5274a0f 89 //Processes message arrived
Rennert 1:e7a311bd038e 90 void messageArrived(MQTT::MessageData& md)
Rennert 1:e7a311bd038e 91 {
Rennert 1:e7a311bd038e 92 MQTT::Message &message = md.message;
Rennert 1:e7a311bd038e 93 info=1;
Rennert 2:f283e5274a0f 94 //NOTE: Due to lack of working serial terminal, sends data to clubIOT/feedback for reading. This should be printf.
Rennert 1:e7a311bd038e 95 char buf[100];
Rennert 1:e7a311bd038e 96 sprintf(buf,"Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
Rennert 1:e7a311bd038e 97 send(buf);
Rennert 1:e7a311bd038e 98 sprintf(buf,"Payload %.*s\r\n", message.payloadlen, (char*)message.payload);
Rennert 1:e7a311bd038e 99 send(buf);
Rennert 1:e7a311bd038e 100 }
Rennert 1:e7a311bd038e 101
Rennert 2:f283e5274a0f 102 //Subscribe to MQTT topic
Rennert 1:e7a311bd038e 103 void subscribe(char* topic){
Rennert 1:e7a311bd038e 104 client.subscribe(topic, MQTT::QOS2, messageArrived);
Rennert 1:e7a311bd038e 105 }
jensdehoog 0:fd29cd85e75e 106
Rennert 2:f283e5274a0f 107
jensdehoog 0:fd29cd85e75e 108 int main(int argc, char* argv[])
jensdehoog 0:fd29cd85e75e 109 {
Rennert 2:f283e5274a0f 110 connect("Reinout");
Rennert 1:e7a311bd038e 111 subscribe("clubIOT/songmeta");
Rennert 2:f283e5274a0f 112 //Connect button to interrupt
Rennert 1:e7a311bd038e 113 InterruptIn button(USER_BUTTON);
Rennert 2:f283e5274a0f 114 button.fall(callback(&button1_onpressed_cb));
Rennert 1:e7a311bd038e 115
Rennert 1:e7a311bd038e 116 while(connected){
Rennert 1:e7a311bd038e 117 if(!button1_busy && multiclick_state!=0){
Rennert 1:e7a311bd038e 118 if(multiclick_state==1)
Rennert 1:e7a311bd038e 119 send("like-");
Rennert 1:e7a311bd038e 120 else if(multiclick_state==2)
Rennert 1:e7a311bd038e 121 send("dislike-");
Rennert 1:e7a311bd038e 122 else if(multiclick_state==4)
Rennert 1:e7a311bd038e 123 // if(connected==1)
Rennert 1:e7a311bd038e 124 disconnect();
Rennert 1:e7a311bd038e 125 // else connect("Jef");
Rennert 1:e7a311bd038e 126 multiclick_state=0;
Rennert 1:e7a311bd038e 127 }
Rennert 1:e7a311bd038e 128 }
jensdehoog 0:fd29cd85e75e 129 return 0;
jensdehoog 0:fd29cd85e75e 130 }