CIS441 Proj MS 2b

Dependencies:   TextLCD MQTT

Committer:
mwgold
Date:
Wed Dec 11 21:13:57 2019 +0000
Revision:
4:ef8866873df5
Child:
7:15c2ed6e5162
test0;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mwgold 4:ef8866873df5 1 #include "Communication.h"
mwgold 4:ef8866873df5 2
mwgold 4:ef8866873df5 3 MQTT::Client<MQTTNetwork, Countdown>* Communication::client(MQTT::Client<MQTTNetwork, Countdown>* new_client) {
mwgold 4:ef8866873df5 4 MQTT::Client<MQTTNetwork, Countdown>* client = NULL;
mwgold 4:ef8866873df5 5 if (new_client != NULL) {
mwgold 4:ef8866873df5 6 client = new_client;
mwgold 4:ef8866873df5 7 }
mwgold 4:ef8866873df5 8 return client;
mwgold 4:ef8866873df5 9 }
mwgold 4:ef8866873df5 10
mwgold 4:ef8866873df5 11 const char* Communication::mac_address(const char* new_add) {
mwgold 4:ef8866873df5 12 static const char* mac_address = NULL;
mwgold 4:ef8866873df5 13 if (new_add != NULL) {
mwgold 4:ef8866873df5 14 mac_address = new_add;
mwgold 4:ef8866873df5 15 }
mwgold 4:ef8866873df5 16 return mac_address;
mwgold 4:ef8866873df5 17 }
mwgold 4:ef8866873df5 18
mwgold 4:ef8866873df5 19 Communication::Communication() {}
mwgold 4:ef8866873df5 20
mwgold 4:ef8866873df5 21 /*
mwgold 4:ef8866873df5 22 This function sets up the wifi module and connects it to the SSID
mwgold 4:ef8866873df5 23 configured in the configuration file. It also prints out the MAC address
mwgold 4:ef8866873df5 24 of the module, which is needed if you are trying to use campus wifi.
mwgold 4:ef8866873df5 25 This function returns NULL if there are any issues.
mwgold 4:ef8866873df5 26 */
mwgold 4:ef8866873df5 27 WiFiInterface* Communication::setup_wifi() {
mwgold 4:ef8866873df5 28 // Get a handle to the WiFi module
mwgold 4:ef8866873df5 29 WiFiInterface* wifi = WiFiInterface::get_default_instance();
mwgold 4:ef8866873df5 30
mwgold 4:ef8866873df5 31 // Connect the module to the wifi, based on the SSID and password
mwgold 4:ef8866873df5 32 // specified in the mbed_app.json configuration file
mwgold 4:ef8866873df5 33 // If you are using AirPennNet-Device, this will not succeed until the MAC
mwgold 4:ef8866873df5 34 // address (printed shortly after this) is registered
mwgold 4:ef8866873df5 35 int rc = wifi->connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
mwgold 4:ef8866873df5 36
mwgold 4:ef8866873df5 37 if (rc != 0) {
mwgold 4:ef8866873df5 38 return NULL;
mwgold 4:ef8866873df5 39 }
mwgold 4:ef8866873df5 40
mwgold 4:ef8866873df5 41 return wifi;
mwgold 4:ef8866873df5 42 }
mwgold 4:ef8866873df5 43
mwgold 4:ef8866873df5 44 /*
mwgold 4:ef8866873df5 45 This function creates the MQTT client and connects it to the MQTT broker
mwgold 4:ef8866873df5 46 that we have setup for the course. If there are any errors with the
mwgold 4:ef8866873df5 47 connection, it will return NULL
mwgold 4:ef8866873df5 48 */
mwgold 4:ef8866873df5 49 MQTT::Client<MQTTNetwork, Countdown>* Communication::setup_mqtt(MQTTNetwork &network) {
mwgold 4:ef8866873df5 50 // the hostname and port point to a Google Cloud MQTT server we setup for
mwgold 4:ef8866873df5 51 // this project
mwgold 4:ef8866873df5 52 const char* hostname = "34.68.206.11";
mwgold 4:ef8866873df5 53 int port = 1883;
mwgold 4:ef8866873df5 54
mwgold 4:ef8866873df5 55 // Create the underlying network connection to the MQTT server
mwgold 4:ef8866873df5 56 int rc = network.connect(hostname, port);
mwgold 4:ef8866873df5 57 if (rc != 0) {
mwgold 4:ef8866873df5 58 return NULL;
mwgold 4:ef8866873df5 59 }
mwgold 4:ef8866873df5 60
mwgold 4:ef8866873df5 61 // Connect the MQTT client to the server
mwgold 4:ef8866873df5 62 MQTT::Client<MQTTNetwork, Countdown>* client = new MQTT::Client<MQTTNetwork, Countdown>(network);
mwgold 4:ef8866873df5 63 rc = client->connect();
mwgold 4:ef8866873df5 64 if (rc != 0) {
mwgold 4:ef8866873df5 65 return NULL;
mwgold 4:ef8866873df5 66 }
mwgold 4:ef8866873df5 67
mwgold 4:ef8866873df5 68 return client;
mwgold 4:ef8866873df5 69 }
mwgold 4:ef8866873df5 70
mwgold 4:ef8866873df5 71 //callback for update/control messages
mwgold 4:ef8866873df5 72 void Communication::update_message_arrived(MQTT::MessageData& md)
mwgold 4:ef8866873df5 73 {
mwgold 4:ef8866873df5 74 MQTT::Message &message = md.message;
mwgold 4:ef8866873df5 75 char* payload = (char*)message.payload;
mwgold 4:ef8866873df5 76 int id = payload[0] - 48;
mwgold 4:ef8866873df5 77 int speed = payload[3] - 48;
mwgold 4:ef8866873df5 78 if(message.payloadlen > 3) {
mwgold 4:ef8866873df5 79 speed = speed * 10 + payload[4] - 48;
mwgold 4:ef8866873df5 80 }
mwgold 4:ef8866873df5 81
mwgold 4:ef8866873df5 82 Road::road_in_use(NULL)->update_car_speed(id, speed);
mwgold 4:ef8866873df5 83 }
mwgold 4:ef8866873df5 84
mwgold 4:ef8866873df5 85 //callback for sync messages
mwgold 4:ef8866873df5 86 void Communication::sync_message_arrived(MQTT::MessageData& md)
mwgold 4:ef8866873df5 87 {
mwgold 4:ef8866873df5 88 MQTT::Message &message = md.message;
mwgold 4:ef8866873df5 89 char* payload = (char*)message.payload;
mwgold 4:ef8866873df5 90 if (strcmp (Communication::mac_address(NULL), payload) != 0) {
mwgold 4:ef8866873df5 91 Road::ready(1);
mwgold 4:ef8866873df5 92 }
mwgold 4:ef8866873df5 93 }
mwgold 4:ef8866873df5 94
mwgold 4:ef8866873df5 95 //initialize the client
mwgold 4:ef8866873df5 96 int Communication::init() {
mwgold 4:ef8866873df5 97 WiFiInterface* wifi = setup_wifi();
mwgold 4:ef8866873df5 98
mwgold 4:ef8866873df5 99 // There was a problem connecting the wifi, so exit
mwgold 4:ef8866873df5 100 if (wifi == NULL) {
mwgold 4:ef8866873df5 101 return -1;
mwgold 4:ef8866873df5 102 }
mwgold 4:ef8866873df5 103
mwgold 4:ef8866873df5 104 Communication::mac_address(wifi->get_mac_address());
mwgold 4:ef8866873df5 105
mwgold 4:ef8866873df5 106 // Create the network object needed by the MQTT client
mwgold 4:ef8866873df5 107 MQTTNetwork network(wifi);
mwgold 4:ef8866873df5 108
mwgold 4:ef8866873df5 109 Communication::client(setup_mqtt(network));
mwgold 4:ef8866873df5 110
mwgold 4:ef8866873df5 111 // There was a problem connecting the MQTT client, so exit
mwgold 4:ef8866873df5 112 if (Communication::client(NULL) == NULL) {
mwgold 4:ef8866873df5 113 return -1;
mwgold 4:ef8866873df5 114 }
mwgold 4:ef8866873df5 115
mwgold 4:ef8866873df5 116 // Subscribe to topics / register callbacks
mwgold 4:ef8866873df5 117 char buf[100];
mwgold 4:ef8866873df5 118 sprintf(buf, "Chen_Goldsmith_Update/%s", Communication::mac_address(NULL));
mwgold 4:ef8866873df5 119 char* update_topic = (char*) buf;
mwgold 4:ef8866873df5 120 int rc = Communication::client(NULL)->subscribe(update_topic, MQTT::QOS1, update_message_arrived);
mwgold 4:ef8866873df5 121 if (rc != 0) {
mwgold 4:ef8866873df5 122 return -1;
mwgold 4:ef8866873df5 123 }
mwgold 4:ef8866873df5 124 char* sync_topic = "Chen_Goldsmith_Sync";
mwgold 4:ef8866873df5 125 rc = Communication::client(NULL)->subscribe(sync_topic, MQTT::QOS1, sync_message_arrived);
mwgold 4:ef8866873df5 126 if (rc != 0) {
mwgold 4:ef8866873df5 127 return -1;
mwgold 4:ef8866873df5 128 }
mwgold 4:ef8866873df5 129
mwgold 4:ef8866873df5 130 return 1;
mwgold 4:ef8866873df5 131 }
mwgold 4:ef8866873df5 132
mwgold 4:ef8866873df5 133 int Communication::publish_car_info(int id, int pos, int speed) {
mwgold 4:ef8866873df5 134 MQTT::Message message;
mwgold 4:ef8866873df5 135
mwgold 4:ef8866873df5 136 char* topic = "Chen_Goldsmith_Car_Info";
mwgold 4:ef8866873df5 137 char buf[100];
mwgold 4:ef8866873df5 138 sprintf(buf, "%d, %d, %d, %s", id, pos, speed, Communication::mac_address(NULL));
mwgold 4:ef8866873df5 139 int rc = Communication::client(NULL)->publish(topic, (char*) buf, strlen(buf)+1, MQTT::QOS1);
mwgold 4:ef8866873df5 140
mwgold 4:ef8866873df5 141 if (rc != 0) {
mwgold 4:ef8866873df5 142 return -1;
mwgold 4:ef8866873df5 143 } else {
mwgold 4:ef8866873df5 144 return 0;
mwgold 4:ef8866873df5 145 }
mwgold 4:ef8866873df5 146 }
mwgold 4:ef8866873df5 147
mwgold 4:ef8866873df5 148 int Communication::publish_road_ready() {
mwgold 4:ef8866873df5 149 MQTT::Message message;
mwgold 4:ef8866873df5 150
mwgold 4:ef8866873df5 151 char* topic = "Chen_Goldsmith_Sync";
mwgold 4:ef8866873df5 152 char buf[100];
mwgold 4:ef8866873df5 153 sprintf(buf, "%s", Communication::mac_address(NULL));
mwgold 4:ef8866873df5 154 int rc = Communication::client(NULL)->publish(topic, (char*) buf, strlen(buf)+1, MQTT::QOS1);
mwgold 4:ef8866873df5 155
mwgold 4:ef8866873df5 156 if (rc != 0) {
mwgold 4:ef8866873df5 157 return -1;
mwgold 4:ef8866873df5 158 } else {
mwgold 4:ef8866873df5 159 return 0;
mwgold 4:ef8866873df5 160 }
mwgold 4:ef8866873df5 161 }
mwgold 4:ef8866873df5 162
mwgold 4:ef8866873df5 163 void Communication::disconnect() {
mwgold 4:ef8866873df5 164 Communication::client(NULL)->disconnect();
mwgold 4:ef8866873df5 165 }