Aleksander Chernyavskiy
/
pgo6_aleksander_chernyavskiy
opdracht mqtt nucleo
Fork of PGO6_VoteController_template by
Diff: main.cpp
- Revision:
- 3:abfa79c5b7bd
- Parent:
- 2:5b7d055dbc91
diff -r 5b7d055dbc91 -r abfa79c5b7bd main.cpp --- a/main.cpp Tue Oct 31 09:01:56 2017 +0000 +++ b/main.cpp Thu Oct 11 15:52:51 2018 +0000 @@ -14,10 +14,8 @@ /** TODO ---- - - Check if the button has been pressed. If so, print the amount of clicks to a serial terminal. + - Make an MQTT-service which: - - starts up a network using EthernetInterface. Make sure the development board requests its address via DHCP. - - makes a client and connects it to the broker using a client ID and credentials (username & password). - sends messages at the same topic as the smartphone app from PGO 2. Feel free to choose which Quality of Service you are going to use. Make a separate function which handles the sending procedure. Therefore, this function can be called each time we want to send a certain message. @@ -30,19 +28,88 @@ - Test this controller in the complete system of PGO 2. Use these controllers instead of the smartphones. Tips & tricks - ------------- - - To generate an interrupt on the press of a button, use: - InterruptIn button(USER_BUTTON); - ... - button.fall(callback(someFunction)); - Before implementing MQTT, test the multiclick feature first. - Have a look at the MQTT-library for Mbed and the HelloMQTT-example. - To have a uniform message sending procedure, use the following function usage: sendMessage(&client, topic, buf, qos, retained, duplicate) */ - +InterruptIn button1(USER_BUTTON); +int sendMessage(MQTT::Client<MQTTNetwork, Countdown> client, char* msg, char* topic) { + MQTT::Message message; + // QoS 0 + char buf[100]; + sprintf(buf, msg); + message.qos = MQTT::QOS0; + message.retained = false; + message.dup = false; + message.payload = (void*)buf; + message.payloadlen = strlen(buf)+1; + int rc = client.publish(topic, message); + // while (arrivedcount < 1) + // client.yield(100); + return rc; +} int main(int argc, char* argv[]) { - + // enables the interrupt on the button + button1.fall(callback(button1_onpressed_cb)); + EthernetInterface eth; + // starts up a network using EthernetInterface. Make sure the development board requests its address via DHCP. + if (eth.connect() == 0) { + printf("Ip address: %s,\n", eth.get_ip_address()); + } else { + printf("Something went wrong with connecting the ethernet interface\n"); + return -1; + } + + MQTTNetwork mqttNetwork(ð); + MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork); + printf("Connecting to %s on port %d", BROKER_NAME, BROKER_PORT); + // makes a client and connects it to the broker using a client ID and credentials (username & password). + int rc = mqttNetwork.connect(BROKER_NAME, BROKER_PORT); + if (rc != 0) { + printf("return code is %d", rc); + } + + MQTTPacket_connectData data = MQTTPacket_connectData_initializer; + data.MQTTVersion = 3; + data.clientID.cstring = "mbed-sample"; + data.username.cstring = "testusser"; + data.password.cstring = "testpassword"; + int rc2 = client.connect(data); + if ( rc2 != 0) + printf("rc from MQTT connect is %d\r\n", rc); + + while(1) { + // Check if the button has been pressed. If so, print the amount of clicks to a serial terminal. + // printf("The button has been pressed %d times \n", multiclick_state); + + //makes sure there is no infinite loop in the switch case + if(multiclick_state != 0) { + switch(multiclick_state) { + case 1: + printf("Upvote has been sent\n"); + sendMessage(client, "Upvote", "alex"); + break; + case 2: + printf("Downvote has been sent\n"); + sendMessage(client, "Downvote", "alex"); + break; + case 3: + printf("No action\n"); + break; + case 4: + printf("Disconnecting...\n"); + sendMessage(client, "Disconnect", "alex"); + break; + default: + printf("No action\n"); + break; + } + multiclick_state = 0; + } + + } + return 0; }