Robrecht Daems

Dependencies:   MQTT

Fork of PGO6_VoteController_template by Jens de hoog

Committer:
Robrecht
Date:
Mon Oct 30 16:44:56 2017 +0000
Revision:
2:b47f54fdea91
Parent:
1:34e76c0cbe5a
initial commit

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
Robrecht 2:b47f54fdea91 3 #define BROKER_NAME "143.129.39.151"
jensdehoog 0:fd29cd85e75e 4 #define BROKER_PORT 1883
jensdehoog 0:fd29cd85e75e 5
jensdehoog 0:fd29cd85e75e 6 #include "debounce_button.h"
jensdehoog 0:fd29cd85e75e 7 #include "EthernetInterface.h"
jensdehoog 0:fd29cd85e75e 8 #include "MQTTNetwork.h"
jensdehoog 0:fd29cd85e75e 9 #include "MQTTmbed.h"
jensdehoog 0:fd29cd85e75e 10 #include "MQTTClient.h"
jensdehoog 0:fd29cd85e75e 11
jensdehoog 0:fd29cd85e75e 12 /**
jensdehoog 0:fd29cd85e75e 13 TODO
jensdehoog 0:fd29cd85e75e 14 ----
jensdehoog 0:fd29cd85e75e 15 - Check if the button has been pressed. If so, print the amount of clicks to a serial terminal.
jensdehoog 0:fd29cd85e75e 16 - Make an MQTT-service which:
jensdehoog 0:fd29cd85e75e 17 - starts up a network using EthernetInterface. Make sure the development board requests its address via DHCP.
jensdehoog 0:fd29cd85e75e 18 - makes a client and connects it to the broker using a client ID and credentials (username & password).
jensdehoog 0:fd29cd85e75e 19 - sends messages at the same topic as the smartphone app from PGO 2. Feel free to choose which Quality of Service
jensdehoog 0:fd29cd85e75e 20 you are going to use. Make a separate function which handles the sending procedure. Therefore, this function
jensdehoog 0:fd29cd85e75e 21 can be called each time we want to send a certain message.
jensdehoog 0:fd29cd85e75e 22 - When the button is pressed once, we send an upvote. When pressed twice, a downvote is sent. By pressing 4 times,
jensdehoog 0:fd29cd85e75e 23 the program disconnects from the broker and terminates.
jensdehoog 0:fd29cd85e75e 24
jensdehoog 0:fd29cd85e75e 25 Extra
jensdehoog 0:fd29cd85e75e 26 -----
jensdehoog 0:fd29cd85e75e 27 - Subscribe to the topic on which the song data is published. Display this received message on the serial terminal.
jensdehoog 0:fd29cd85e75e 28 - Test this controller in the complete system of PGO 2. Use these controllers instead of the smartphones.
jensdehoog 0:fd29cd85e75e 29
jensdehoog 0:fd29cd85e75e 30 Tips & tricks
jensdehoog 0:fd29cd85e75e 31 -------------
jensdehoog 0:fd29cd85e75e 32 - To generate an interrupt on the press of a button, use:
jensdehoog 0:fd29cd85e75e 33 InterruptIn button(USER_BUTTON);
jensdehoog 0:fd29cd85e75e 34 ...
jensdehoog 0:fd29cd85e75e 35 button.fall(callback(someFunction));
jensdehoog 1:34e76c0cbe5a 36 The function someFunction(void) is called when this interrupt occurs.
jensdehoog 0:fd29cd85e75e 37 - Before implementing MQTT, test the multiclick feature first.
jensdehoog 1:34e76c0cbe5a 38 You can simply use 'printf()' to print to a serial terminal. The baud rate is 9600.
jensdehoog 0:fd29cd85e75e 39 - Have a look at the MQTT-library for Mbed and the HelloMQTT-example.
jensdehoog 0:fd29cd85e75e 40 - To have a uniform message sending procedure, use the following function usage:
jensdehoog 0:fd29cd85e75e 41 sendMessage(&client, topic, buf, qos, retained, duplicate)
jensdehoog 0:fd29cd85e75e 42 */
jensdehoog 0:fd29cd85e75e 43
Robrecht 2:b47f54fdea91 44 InterruptIn button(USER_BUTTON);
Robrecht 2:b47f54fdea91 45 DigitalOut myled(LED1);
Robrecht 2:b47f54fdea91 46 EthernetInterface eth_interface;
Robrecht 2:b47f54fdea91 47 MQTTNetwork network(&eth_interface);
Robrecht 2:b47f54fdea91 48 MQTT::Client<MQTTNetwork, Countdown> client(network);
Robrecht 2:b47f54fdea91 49 char* topic = "clubIOT/feedback";
Robrecht 2:b47f54fdea91 50 char* subTopic = "clubIOT/songmeta
Robrecht 2:b47f54fdea91 51
Robrecht 2:b47f54fdea91 52 /**
Robrecht 2:b47f54fdea91 53 called when the button generates an interrupt
Robrecht 2:b47f54fdea91 54 */
Robrecht 2:b47f54fdea91 55 void buttonPress()
Robrecht 2:b47f54fdea91 56 {
Robrecht 2:b47f54fdea91 57 button1_pressed=true;
Robrecht 2:b47f54fdea91 58 }
Robrecht 2:b47f54fdea91 59
Robrecht 2:b47f54fdea91 60 /**
Robrecht 2:b47f54fdea91 61 called to initialize MQTT
Robrecht 2:b47f54fdea91 62 */
Robrecht 2:b47f54fdea91 63 void initMQTT()
Robrecht 2:b47f54fdea91 64 {
Robrecht 2:b47f54fdea91 65 eth_interface.connect();
Robrecht 2:b47f54fdea91 66 if(eth_interface.get_ip_address() == NULL)
Robrecht 2:b47f54fdea91 67 printf("ip adres kaput \r\n");
Robrecht 2:b47f54fdea91 68 else
Robrecht 2:b47f54fdea91 69 printf("IP: %s\r\n", eth_interface.get_ip_address());
Robrecht 2:b47f54fdea91 70 const char* hostname = BROKER_NAME;
Robrecht 2:b47f54fdea91 71 int port = BROKER_PORT;
Robrecht 2:b47f54fdea91 72 int rc = network.connect(hostname, port);
Robrecht 2:b47f54fdea91 73 if (rc != 0)
Robrecht 2:b47f54fdea91 74 printf("rc from TCP connect is %d\r\n", rc);
Robrecht 2:b47f54fdea91 75 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
Robrecht 2:b47f54fdea91 76 data.MQTTVersion = 3;
Robrecht 2:b47f54fdea91 77 data.clientID.cstring = "robrecht";
Robrecht 2:b47f54fdea91 78 data.username.cstring = "smartcity";
Robrecht 2:b47f54fdea91 79 data.password.cstring = "smartcity";
Robrecht 2:b47f54fdea91 80 if ((rc = client.connect(data)) != 0)
Robrecht 2:b47f54fdea91 81 printf("rc from MQTT connect is %d\r\n", rc);
Robrecht 2:b47f54fdea91 82 else
Robrecht 2:b47f54fdea91 83 printf("connected\r\n");
Robrecht 2:b47f54fdea91 84 }
Robrecht 2:b47f54fdea91 85
Robrecht 2:b47f54fdea91 86 /**
Robrecht 2:b47f54fdea91 87 send a message over MQTT
Robrecht 2:b47f54fdea91 88 */
Robrecht 2:b47f54fdea91 89 void sendMessage(MQTT::Client<MQTTNetwork, Countdown> *client, char* tempTopic, char* buf ,int qos, bool retained, bool duplicate)
jensdehoog 0:fd29cd85e75e 90 {
Robrecht 2:b47f54fdea91 91 MQTT::Message message;
Robrecht 2:b47f54fdea91 92 if(qos==0)
Robrecht 2:b47f54fdea91 93 message.qos= MQTT::QOS0;
Robrecht 2:b47f54fdea91 94 else if(qos==1)
Robrecht 2:b47f54fdea91 95 message.qos= MQTT::QOS1;
Robrecht 2:b47f54fdea91 96 else
Robrecht 2:b47f54fdea91 97 message.qos= MQTT::QOS2;
Robrecht 2:b47f54fdea91 98 message.retained=retained;
Robrecht 2:b47f54fdea91 99 message.dup=duplicate;
Robrecht 2:b47f54fdea91 100 message.payload= (void*) buf;
Robrecht 2:b47f54fdea91 101 message.payloadlen = strlen(buf)+1;
Robrecht 2:b47f54fdea91 102 client->publish(tempTopic, message);
Robrecht 2:b47f54fdea91 103 }
jensdehoog 0:fd29cd85e75e 104
Robrecht 2:b47f54fdea91 105 /**
Robrecht 2:b47f54fdea91 106 disconnect from MQTT
Robrecht 2:b47f54fdea91 107 */
Robrecht 2:b47f54fdea91 108 void disconnect()
Robrecht 2:b47f54fdea91 109 {
Robrecht 2:b47f54fdea91 110 char buf[100];
Robrecht 2:b47f54fdea91 111 sprintf(buf, "disconnect");
Robrecht 2:b47f54fdea91 112 sendMessage(&client, topic, buf, 0, false, false);
Robrecht 2:b47f54fdea91 113 client.disconnect();
Robrecht 2:b47f54fdea91 114 eth_interface.disconnect();
Robrecht 2:b47f54fdea91 115 }
Robrecht 2:b47f54fdea91 116
Robrecht 2:b47f54fdea91 117 /**
Robrecht 2:b47f54fdea91 118 Called when the controller receives a song
Robrecht 2:b47f54fdea91 119 */
Robrecht 2:b47f54fdea91 120 void printMessage(MQTT::MessageData& data)
Robrecht 2:b47f54fdea91 121 {
Robrecht 2:b47f54fdea91 122 printf("MQTT message: %s\r\n", data.message.payload);
Robrecht 2:b47f54fdea91 123 }
Robrecht 2:b47f54fdea91 124
Robrecht 2:b47f54fdea91 125 int main(int argc, char* argv[])
Robrecht 2:b47f54fdea91 126 {
Robrecht 2:b47f54fdea91 127 initMQTT();
Robrecht 2:b47f54fdea91 128 button.fall(callback(&buttonPress));
Robrecht 2:b47f54fdea91 129 client.subscribe(subTopic, MQTT::QOS1, printMessage);
Robrecht 2:b47f54fdea91 130
Robrecht 2:b47f54fdea91 131 while(1)
Robrecht 2:b47f54fdea91 132 {
Robrecht 2:b47f54fdea91 133 if(button1_pressed){
Robrecht 2:b47f54fdea91 134 button1_pressed = false;
Robrecht 2:b47f54fdea91 135 button1_onpressed_cb();
Robrecht 2:b47f54fdea91 136 }
Robrecht 2:b47f54fdea91 137 if(!button1_busy && result_ready){
Robrecht 2:b47f54fdea91 138 result_ready=false;
Robrecht 2:b47f54fdea91 139 printf("The button was pressed %d times in the last second \r\n", last_multiclick_state);
Robrecht 2:b47f54fdea91 140 char buf[100];
Robrecht 2:b47f54fdea91 141 if(last_multiclick_state==1){
Robrecht 2:b47f54fdea91 142 sprintf(buf, "like");
Robrecht 2:b47f54fdea91 143 sendMessage(&client, topic, buf, 0, false, false);
Robrecht 2:b47f54fdea91 144 }
Robrecht 2:b47f54fdea91 145 else if(last_multiclick_state==2){
Robrecht 2:b47f54fdea91 146 sprintf(buf, "dislike");
Robrecht 2:b47f54fdea91 147 sendMessage(&client, topic, buf, 0, false, false);
Robrecht 2:b47f54fdea91 148 }
Robrecht 2:b47f54fdea91 149 else if(last_multiclick_state==4){
Robrecht 2:b47f54fdea91 150 disconnect();
Robrecht 2:b47f54fdea91 151 return 0;
Robrecht 2:b47f54fdea91 152 }
Robrecht 2:b47f54fdea91 153 }
Robrecht 2:b47f54fdea91 154 }
jensdehoog 0:fd29cd85e75e 155 return 0;
jensdehoog 0:fd29cd85e75e 156 }