mbed mqtt

Dependencies:   TextLCD MQTT IAP

main.cpp

Committer:
ncshy
Date:
2018-11-29
Revision:
2:562744909841
Parent:
1:91e33a7fe0b5

File content as of revision 2:562744909841:

#define MQTTCLIENT_QOS2 0
//#define IAP_LOCATION 0x1FFF1FF1
#define HTTP

#include "ESP8266.h"
#include "ESP8266Interface.h"
#include "MQTTNetwork.h"
#include "MQTTmbed.h"
#include "MQTTClient.h"
#include "TCPSocket.h"
#include "IAP.h"
#include "stdlib.h"
#include "time.h"
#include "TextLCD.h"

TextLCD lcd(p6,p8,p25,p26,p27,p28, TextLCD::LCD16x2);
//TextLCD lcd(p15,p16,p17,p18,p19,p20, TextLCD::LCD16x2);
//ESP8266Interface wifi(p28, p27);
ESP8266Interface wifi(p13, p14);
char* salted_id;
Timer timer;
//unsigned int iap_out[10];

void messageArrived(MQTT::MessageData& md) {
    timer.stop();
    MQTT::Message &message = md.message;
    char* number;
    lcd.cls();
    lcd.locate(0,0);
    printf("Message arrived: qos %d , packet id: %d\n", message.qos, message.id);
    printf("Payload %.*s\n", message.payloadlen, (char*)message.payload);
    salted_id = strtok((char *)message.payload, "-");
    number = strtok(NULL, "\0");
   // printf("number is %s\n", number);
    
//    ++arrivedcount;
//    lcd.printf((char*)message.payload);
   // lcd.puts((char*)message.payload);
    lcd.puts((char*)salted_id);
    lcd.locate(0,1);
    lcd.puts((char*)number);
    
    
}

void GET(NetworkInterface *net, const char * address, const char * argument, int portnum)
{
    //TCPSocket socket;
    TCPSocket socket;
    printf("Sending HTTP request to %s:%d/\r\n", address, portnum);

    // Open a socket on the network interface, and create a TCP connection to www.arm.com
     int ret = socket.open(net);
    printf("socket open returns %d\n", ret);
    ret = socket.connect(address, portnum);
    printf("socket connect returns %d\n", ret);
    while (ret < 0) {
        ret = socket.connect(address, portnum);
    printf("socket connect returns %d\n", ret);
    }       

    // Send a simple http request
    char sbuffer[1024]; 
    sprintf(sbuffer, "GET / HTTP/1.1\r\nHost: %s\r\n\r\n", address);

while(1) {
    
    int scount = socket.send(sbuffer, sizeof sbuffer);
    printf("sent %d [%.*s]\r\n", scount, strstr(sbuffer, "\r\n")-sbuffer, sbuffer);
    printf("-->%s\r\n", sbuffer);
    // Recieve a simple http response and print out the response line
    char rbuffer[1024];
    int rcount = socket.recv(rbuffer, sizeof rbuffer);
    printf("recv %d %s\r\n", rcount, rbuffer);
}
    // Close the socket to return its memory and bring down the network interface
    socket.close();
}

int initConnection(const char * SSID, const char * password)
{
    printf("WiFi example\r\n\r\n");

    // Scan for available access points 
  //  scan_demo(&wifi);

    printf("\r\nConnecting...\r\n");
    int ret = wifi.connect(SSID, password);
    if (ret != 0) {
        printf("\r\nConnection error\r\n");
        return -1;
    }

    printf("Success\r\n\r\n");
    printf("MAC: %s\r\n", wifi.get_mac_address());
    printf("IP: %s\r\n", wifi.get_ip_address());
    printf("Netmask: %s\r\n", wifi.get_netmask());
    printf("Gateway: %s\r\n", wifi.get_gateway());
    printf("RSSI: %d\r\n\r\n", wifi.get_rssi());

    //GET(&wifi, "upenn.pennpacapp.com", "1");
    //GET(&wifi, "192.168.8.1", "Testing|testing|1|2|3");
}


int main(int argc, char* argv[]) {
    int ret;
    
    //Define host name/ identification
    //const char *hostname = "192.168.4.1";
        //const char *hostname = "35.196.225.7";
    const char *hostname = "192.168.43.138";
    char topic[100];
    char subscription_topic[100];
    char id[8];
    char deviceID[33];
    char uuid[45];
    int portnum = 8087;

    IAP iap;
    
    unsigned int iap_out;
    iap_out = iap.read_ID();
    
    int *iap_serial = (int *)malloc(sizeof(int) * 4);
    iap_serial = iap.read_serial();
    
 
   #ifdef DEBUG_PRINT
    printf("IAP output is %08x\n",iap_out);
    printf("IAP output is %08x\n", *(iap_serial));
    printf("IAP output is %08x\n", *(iap_serial+ 1));
    printf("IAP output is %08x\n", *(iap_serial+ 2));
    printf("IAP output is %08x\n", *(iap_serial+ 3));
    printf("size of int is %d\n", sizeof(int));
    #endif
    
    sprintf(id, "%08x", iap_out);
    sprintf(deviceID, "%08x%08x%08x%08x", *(iap_serial),*(iap_serial + 1),*(iap_serial+ 2),*(iap_serial+ 3));
    sprintf(uuid, "%8s-%32s", id, deviceID);
    printf("uuid: %s\n", uuid);
    sprintf(topic, "cis541/hw-mqtt/%s/data", uuid);
    printf("topic: %s\n", topic);
    sprintf(subscription_topic, "cis541/hw-mqtt/%s/echo", uuid);
    printf("subscribe topic: %s\n", subscription_topic);
    
 #ifdef MQTT   
    MQTTNetwork mqttnw(&wifi);
    MQTT::Client<MQTTNetwork, Countdown> client(mqttnw);
#endif

    //initConnection("Aspire-E5-573G", "03fee30fde");
    //initConnection("Pi_Network", "warehouse");    
    initConnection("OnePlus3", "magnasift");
    //Specify network parameters
    
  /*
    wifi.set_credentials(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
    ret = wifi.connect();
    if(ret < 0) {
        printf("Error in connecting to AP \n");    
    }
    
        printf("IP address is %s \n", wifi.get_ip_address());    
    
  */
  
  
  
 #ifdef MQTT   
    //Establish connection
    ret = mqttnw.connect(hostname, portnum);
    if(ret < 0) {
        printf("Error in connecting to mqttnw ret: %d\n", ret);    
    }
    
     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;  
 //    connackData connData;
     data.clientID.cstring = uuid;
     data.username.cstring = "mbed";
     data.password.cstring = "homework";
    
    ret = client.connect(data);
    if(ret < 0) {
        printf("Error in connecting to MQTT server at %s, ret i %d\n", hostname, ret);    
    }
  
    ret = client.subscribe(subscription_topic, MQTT::QOS0, messageArrived);
    if(ret < 0) {
        printf("Client did not subscribe to topic %s, ret is %d\n", subscription_topic, ret);    
    }
    printf("client subscribe ret is %d\n", ret);
    
    int count = 0;
    //Create a message in buffer
    char msgbuf[20] = "Test Data";
    int rand_num;
    MQTT::Message message;
    message.qos = MQTT::QOS1;
    message.retained = false;
    message.dup = false;
    
    while(1) {
        
        //rand_num = 5 * (count % 20);
        rand_num = rand() % 100;
//        printf("rand_num %02d\n", rand_num);
        sprintf(msgbuf, "%02d", rand_num);
        message.payload = (void*)msgbuf;
        message.payloadlen = strlen(msgbuf)+1;  
        ret = client.publish(topic, message);  
        timer.reset();  
        timer.start();
    
        if(ret != 0) {
            printf("Client publish failure %d\n", ret);    
        } else {
            printf("Client publish successful %d\n", ret);    
        }
        client.yield(1000);
     
        wait(4);
        printf("Timer observed value is %f\n", timer.read());   
    }
    
    client.unsubscribe(subscription_topic);
    client.disconnect();
#endif
  
#ifdef HTTP   
    GET(&wifi, hostname, "", portnum);
    printf("End of GET\n");
#endif 

    return 0;
}