Program for mbed with MQTT music

Dependencies:   C12832 MQTT

Committer:
donovanbaillieu
Date:
Mon Jan 08 15:02:58 2018 +0000
Revision:
0:5e04051a59b9
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donovanbaillieu 0:5e04051a59b9 1 /*******************************************************************************
donovanbaillieu 0:5e04051a59b9 2 * Copyright (c) 2014, 2015 IBM Corp.
donovanbaillieu 0:5e04051a59b9 3 *
donovanbaillieu 0:5e04051a59b9 4 * All rights reserved. This program and the accompanying materials
donovanbaillieu 0:5e04051a59b9 5 * are made available under the terms of the Eclipse Public License v1.0
donovanbaillieu 0:5e04051a59b9 6 * and Eclipse Distribution License v1.0 which accompany this distribution.
donovanbaillieu 0:5e04051a59b9 7 *
donovanbaillieu 0:5e04051a59b9 8 * The Eclipse Public License is available at
donovanbaillieu 0:5e04051a59b9 9 * http://www.eclipse.org/legal/epl-v10.html
donovanbaillieu 0:5e04051a59b9 10 * and the Eclipse Distribution License is available at
donovanbaillieu 0:5e04051a59b9 11 * http://www.eclipse.org/org/documents/edl-v10.php.
donovanbaillieu 0:5e04051a59b9 12 *
donovanbaillieu 0:5e04051a59b9 13 * Contributors:
donovanbaillieu 0:5e04051a59b9 14 * Ian Craggs - initial API and implementation and/or initial documentation
donovanbaillieu 0:5e04051a59b9 15 * Ian Craggs - make sure QoS2 processing works, and add device headers
donovanbaillieu 0:5e04051a59b9 16 *******************************************************************************/
donovanbaillieu 0:5e04051a59b9 17
donovanbaillieu 0:5e04051a59b9 18 /**
donovanbaillieu 0:5e04051a59b9 19 This is a sample program to illustrate the use of the MQTT Client library
donovanbaillieu 0:5e04051a59b9 20 on the mbed platform. The Client class requires two classes which mediate
donovanbaillieu 0:5e04051a59b9 21 access to system interfaces for networking and timing. As long as these two
donovanbaillieu 0:5e04051a59b9 22 classes provide the required public programming interfaces, it does not matter
donovanbaillieu 0:5e04051a59b9 23 what facilities they use underneath. In this program, they use the mbed
donovanbaillieu 0:5e04051a59b9 24 system libraries.
donovanbaillieu 0:5e04051a59b9 25
donovanbaillieu 0:5e04051a59b9 26 */
donovanbaillieu 0:5e04051a59b9 27
donovanbaillieu 0:5e04051a59b9 28 // change this to 1 to output messages to LCD instead of serial
donovanbaillieu 0:5e04051a59b9 29 #define USE_LCD 0
donovanbaillieu 0:5e04051a59b9 30
donovanbaillieu 0:5e04051a59b9 31 #if USE_LCD
donovanbaillieu 0:5e04051a59b9 32 #include "C12832.h"
donovanbaillieu 0:5e04051a59b9 33 #include <stdio.h>
donovanbaillieu 0:5e04051a59b9 34 #include <stdlib.h>
donovanbaillieu 0:5e04051a59b9 35 #include <string.h>
donovanbaillieu 0:5e04051a59b9 36 #include <sstream>
donovanbaillieu 0:5e04051a59b9 37 #include <iostream>
donovanbaillieu 0:5e04051a59b9 38 #include <string>
donovanbaillieu 0:5e04051a59b9 39
donovanbaillieu 0:5e04051a59b9 40 // the actual pins are defined in mbed_app.json and can be overridden per target
donovanbaillieu 0:5e04051a59b9 41 C12832 lcd(LCD_MOSI, LCD_SCK, LCD_MISO, LCD_A0, LCD_NCS);
donovanbaillieu 0:5e04051a59b9 42
donovanbaillieu 0:5e04051a59b9 43 #define logMessage lcd.cls();lcd.printf
donovanbaillieu 0:5e04051a59b9 44
donovanbaillieu 0:5e04051a59b9 45 #else
donovanbaillieu 0:5e04051a59b9 46
donovanbaillieu 0:5e04051a59b9 47 #define logMessage printf
donovanbaillieu 0:5e04051a59b9 48
donovanbaillieu 0:5e04051a59b9 49 #endif
donovanbaillieu 0:5e04051a59b9 50
donovanbaillieu 0:5e04051a59b9 51 #define MQTTCLIENT_QOS2 1
donovanbaillieu 0:5e04051a59b9 52
donovanbaillieu 0:5e04051a59b9 53 #include "easy-connect.h"
donovanbaillieu 0:5e04051a59b9 54 #include "MQTTNetwork.h"
donovanbaillieu 0:5e04051a59b9 55 #include "MQTTmbed.h"
donovanbaillieu 0:5e04051a59b9 56 #include "MQTTClient.h"
donovanbaillieu 0:5e04051a59b9 57
donovanbaillieu 0:5e04051a59b9 58 PwmOut speaker(p26);
donovanbaillieu 0:5e04051a59b9 59
donovanbaillieu 0:5e04051a59b9 60 int arrivedcount = 0;
donovanbaillieu 0:5e04051a59b9 61
donovanbaillieu 0:5e04051a59b9 62 /* Mail */
donovanbaillieu 0:5e04051a59b9 63 typedef struct {
donovanbaillieu 0:5e04051a59b9 64 int frequency; /* AD result of measured voltage */
donovanbaillieu 0:5e04051a59b9 65 } mail_t;
donovanbaillieu 0:5e04051a59b9 66
donovanbaillieu 0:5e04051a59b9 67 Mail<mail_t, 16> mail_box;
donovanbaillieu 0:5e04051a59b9 68
donovanbaillieu 0:5e04051a59b9 69 void messageArrived(MQTT::MessageData& md)
donovanbaillieu 0:5e04051a59b9 70 {
donovanbaillieu 0:5e04051a59b9 71 MQTT::Message &message = md.message;
donovanbaillieu 0:5e04051a59b9 72 logMessage("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
donovanbaillieu 0:5e04051a59b9 73 logMessage("Payload %.*s\r\n", message.payloadlen, (char*)message.payload);
donovanbaillieu 0:5e04051a59b9 74 ++arrivedcount;
donovanbaillieu 0:5e04051a59b9 75
donovanbaillieu 0:5e04051a59b9 76 mail_t *mail = mail_box.alloc();
donovanbaillieu 0:5e04051a59b9 77
donovanbaillieu 0:5e04051a59b9 78 int x = atoi((char*)message.payload);
donovanbaillieu 0:5e04051a59b9 79 mail->frequency = x;
donovanbaillieu 0:5e04051a59b9 80
donovanbaillieu 0:5e04051a59b9 81 mail_box.put(mail);
donovanbaillieu 0:5e04051a59b9 82
donovanbaillieu 0:5e04051a59b9 83 /*for (int i=0; i<10; i++) {
donovanbaillieu 0:5e04051a59b9 84 speaker.period(1.0/x); // 500hz period
donovanbaillieu 0:5e04051a59b9 85 speaker =0.25; //25% duty cycle - mid range volume
donovanbaillieu 0:5e04051a59b9 86 wait(.02);
donovanbaillieu 0:5e04051a59b9 87 speaker=0.0; // turn off audio
donovanbaillieu 0:5e04051a59b9 88 wait(0.5);
donovanbaillieu 0:5e04051a59b9 89 }*/
donovanbaillieu 0:5e04051a59b9 90 }
donovanbaillieu 0:5e04051a59b9 91
donovanbaillieu 0:5e04051a59b9 92 void threadmusic() {
donovanbaillieu 0:5e04051a59b9 93 while (true) {
donovanbaillieu 0:5e04051a59b9 94 osEvent evt = mail_box.get();
donovanbaillieu 0:5e04051a59b9 95 if (evt.status == osEventMail) {
donovanbaillieu 0:5e04051a59b9 96 mail_t *mail = (mail_t*)evt.value.p;
donovanbaillieu 0:5e04051a59b9 97 speaker.period(1.0/mail->frequency);
donovanbaillieu 0:5e04051a59b9 98 speaker =0.5;
donovanbaillieu 0:5e04051a59b9 99 wait(0.5);
donovanbaillieu 0:5e04051a59b9 100 speaker=0.0;
donovanbaillieu 0:5e04051a59b9 101 wait(0.5);
donovanbaillieu 0:5e04051a59b9 102 mail_box.free(mail);
donovanbaillieu 0:5e04051a59b9 103 }
donovanbaillieu 0:5e04051a59b9 104 }
donovanbaillieu 0:5e04051a59b9 105 }
donovanbaillieu 0:5e04051a59b9 106
donovanbaillieu 0:5e04051a59b9 107 Thread thread(threadmusic);
donovanbaillieu 0:5e04051a59b9 108
donovanbaillieu 0:5e04051a59b9 109 int main(int argc, char* argv[])
donovanbaillieu 0:5e04051a59b9 110 {
donovanbaillieu 0:5e04051a59b9 111 float version = 0.6;
donovanbaillieu 0:5e04051a59b9 112 char* topic = "music";
donovanbaillieu 0:5e04051a59b9 113
donovanbaillieu 0:5e04051a59b9 114 logMessage("HelloMQTT: version is %.2f\r\n", version);
donovanbaillieu 0:5e04051a59b9 115
donovanbaillieu 0:5e04051a59b9 116 NetworkInterface* network = easy_connect(true);
donovanbaillieu 0:5e04051a59b9 117 if (!network) {
donovanbaillieu 0:5e04051a59b9 118 return -1;
donovanbaillieu 0:5e04051a59b9 119 }
donovanbaillieu 0:5e04051a59b9 120
donovanbaillieu 0:5e04051a59b9 121 MQTTNetwork mqttNetwork(network);
donovanbaillieu 0:5e04051a59b9 122
donovanbaillieu 0:5e04051a59b9 123 MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork);
donovanbaillieu 0:5e04051a59b9 124
donovanbaillieu 0:5e04051a59b9 125 const char* hostname = "10.0.0.133";
donovanbaillieu 0:5e04051a59b9 126 int port = 1883;
donovanbaillieu 0:5e04051a59b9 127 logMessage("Connecting to %s:%d\r\n", hostname, port);
donovanbaillieu 0:5e04051a59b9 128 int rc = mqttNetwork.connect(hostname, port);
donovanbaillieu 0:5e04051a59b9 129 if (rc != 0)
donovanbaillieu 0:5e04051a59b9 130 logMessage("rc from TCP connect is %d\r\n", rc);
donovanbaillieu 0:5e04051a59b9 131
donovanbaillieu 0:5e04051a59b9 132 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
donovanbaillieu 0:5e04051a59b9 133 data.MQTTVersion = 3;
donovanbaillieu 0:5e04051a59b9 134 data.clientID.cstring = "mbedmusic";
donovanbaillieu 0:5e04051a59b9 135 data.username.cstring = "testuser";
donovanbaillieu 0:5e04051a59b9 136 data.password.cstring = "testpassword";
donovanbaillieu 0:5e04051a59b9 137 if ((rc = client.connect(data)) != 0)
donovanbaillieu 0:5e04051a59b9 138 logMessage("rc from MQTT connect is %d\r\n", rc);
donovanbaillieu 0:5e04051a59b9 139
donovanbaillieu 0:5e04051a59b9 140 if ((rc = client.subscribe(topic, MQTT::QOS2, messageArrived)) != 0)
donovanbaillieu 0:5e04051a59b9 141 logMessage("rc from MQTT subscribe is %d\r\n", rc);
donovanbaillieu 0:5e04051a59b9 142
donovanbaillieu 0:5e04051a59b9 143 /*// QoS 0
donovanbaillieu 0:5e04051a59b9 144 char buf[100];
donovanbaillieu 0:5e04051a59b9 145 sprintf(buf, "Hello World! QoS 0 message from app version %f\r\n", version);
donovanbaillieu 0:5e04051a59b9 146 message.qos = MQTT::QOS0;
donovanbaillieu 0:5e04051a59b9 147 message.retained = false;
donovanbaillieu 0:5e04051a59b9 148 message.dup = false;
donovanbaillieu 0:5e04051a59b9 149 message.payload = (void*)buf;
donovanbaillieu 0:5e04051a59b9 150 message.payloadlen = strlen(buf)+1;
donovanbaillieu 0:5e04051a59b9 151 rc = client.publish(topic, message);
donovanbaillieu 0:5e04051a59b9 152 while (arrivedcount < 1)
donovanbaillieu 0:5e04051a59b9 153 client.yield(100);
donovanbaillieu 0:5e04051a59b9 154
donovanbaillieu 0:5e04051a59b9 155 // QoS 1
donovanbaillieu 0:5e04051a59b9 156 sprintf(buf, "Hello World! QoS 1 message from app version %f\r\n", version);
donovanbaillieu 0:5e04051a59b9 157 message.qos = MQTT::QOS1;
donovanbaillieu 0:5e04051a59b9 158 message.payloadlen = strlen(buf)+1;
donovanbaillieu 0:5e04051a59b9 159 rc = client.publish(topic, message);
donovanbaillieu 0:5e04051a59b9 160 while (arrivedcount < 2)
donovanbaillieu 0:5e04051a59b9 161 client.yield(100);
donovanbaillieu 0:5e04051a59b9 162
donovanbaillieu 0:5e04051a59b9 163 // QoS 2
donovanbaillieu 0:5e04051a59b9 164 sprintf(buf, "Hello World! QoS 2 message from app version %f\r\n", version);
donovanbaillieu 0:5e04051a59b9 165 message.qos = MQTT::QOS2;
donovanbaillieu 0:5e04051a59b9 166 message.payloadlen = strlen(buf)+1;
donovanbaillieu 0:5e04051a59b9 167 rc = client.publish(topic, message);
donovanbaillieu 0:5e04051a59b9 168 while (arrivedcount < 3)
donovanbaillieu 0:5e04051a59b9 169 client.yield(100);
donovanbaillieu 0:5e04051a59b9 170
donovanbaillieu 0:5e04051a59b9 171 if ((rc = client.unsubscribe(topic)) != 0)
donovanbaillieu 0:5e04051a59b9 172 logMessage("rc from unsubscribe was %d\r\n", rc);
donovanbaillieu 0:5e04051a59b9 173
donovanbaillieu 0:5e04051a59b9 174 if ((rc = client.disconnect()) != 0)
donovanbaillieu 0:5e04051a59b9 175 logMessage("rc from disconnect was %d\r\n", rc);
donovanbaillieu 0:5e04051a59b9 176
donovanbaillieu 0:5e04051a59b9 177 mqttNetwork.disconnect();
donovanbaillieu 0:5e04051a59b9 178
donovanbaillieu 0:5e04051a59b9 179 logMessage("Version %.2f: finish %d msgs\r\n", version, arrivedcount);*/
donovanbaillieu 0:5e04051a59b9 180
donovanbaillieu 0:5e04051a59b9 181 while (true){
donovanbaillieu 0:5e04051a59b9 182 client.yield(700);
donovanbaillieu 0:5e04051a59b9 183 }
donovanbaillieu 0:5e04051a59b9 184
donovanbaillieu 0:5e04051a59b9 185 return 0;
donovanbaillieu 0:5e04051a59b9 186 }