v1

Dependencies:   MQTTSN mbed-http

MQTTSN_func.h

Committer:
m_ahsan
Date:
2019-03-11
Revision:
15:557d0008dd2d

File content as of revision 15:557d0008dd2d:

int connack_rc = 0;
int retryAttempt = 0;
int connectTimeout = 1000;
int rc = 0;

enum connack_return_codes
{
    MQTTSN_CONNECTION_ACCEPTED = 0,
    MQTTSN_REJECTED_CONGESTION = 1,
    MQTTSN_REJECTED_INVALID_TOPIC_ID = 2,
    MQTTSN_REJECTED_NOT_SUPPORTED= 3,
};

static volatile bool isMessageArrived = false;
int arrivedcount = 0;

int connect(MQTTSN::Client<MQTTSNUDP, Countdown> *client, MQTTSNUDP* ipstack)
{ 
    int rc;
    MQTTSNPacket_connectData data = MQTTSNPacket_connectData_initializer;       
    data.clientID.cstring = MQTT_CLIENT_ID;
    data.duration = 60;
    if ((rc = client->connect(data)) == 0) {
        printf ("--->MQTT-SN Connected\n\r");
    }
    else {
        printf("MQTT-SN connect returned %d\n", rc);        
    }
    if (rc >= 0)
        connack_rc = rc;
    return rc;
}

int getConnTimeout(int attemptNumber)
{  // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
   // after 20 attempts, retry every 10 minutes
    return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
}

void attemptConnect(MQTTSN::Client<MQTTSNUDP, Countdown> *client, MQTTSNUDP* ipstack)
{          
    while (connect(client, ipstack) != MQTTSN_CONNECTION_ACCEPTED) 
    {    
        int timeout = getConnTimeout(++retryAttempt);
        printf("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
        
        // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
        //  or maybe just add the proper members to do this disconnect and call attemptConnect(...)        
        // this works - reset the system when the retry count gets to a threshold
        if (retryAttempt == 5)
            NVIC_SystemReset();
        else
            wait(timeout);
    }
}

void messageArrived(MQTTSN::MessageData& md)
{
    MQTTSN::Message &message = md.message;
    printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\n, Number: %d", message.qos, message.retained, message.dup, message.id, arrivedcount);
    memcpy(messageBuffer, (char*)message.payload, message.payloadlen);
    messageBuffer[message.payloadlen] = '\0';
    printf("Payload %.*s\n", message.payloadlen, (char*)message.payload);
    printf("Payload length %d\n",message.payloadlen);
    ++arrivedcount;
    process_msg();
    isMessageArrived = true;
}

int subscribe(MQTTSN::Client<MQTTSNUDP, Countdown> *client, MQTTSNUDP* ipstack, MQTTSN_topicid& topicid)
{  
    //MQTTSN_topicid topicid;
    topicid.type = MQTTSN_TOPIC_TYPE_NORMAL;
    topicid.data.long_.name = MQTT_TOPIC;
    topicid.data.long_.len = strlen(MQTT_TOPIC);
    MQTTSN::QoS grantedQoS;
    return client->subscribe(topicid, MQTTSN::QOS1, grantedQoS, messageArrived);
}

int publish(MQTTSN::Client<MQTTSNUDP, Countdown> *client, MQTTSNUDP* ipstack, MQTTSN_topicid& topicid2)
{
    int rc;
    if(PUB_REG == false)
    {
        if ((rc = subscribe(client, ipstack, topicid2)) != 0)
         printf("rc from MQTT subscribe is %d\n", rc);
    else{
         printf("Subscribed to Topic %s\n", MQTT_TOPIC);
         PUB_REG = true;
         }
    }

    MQTTSN::Message message;
    message.qos = MQTTSN::QOS1;
    message.retained = false;
    message.dup = false;
    message.payload = (void*)buf;
    message.payloadlen = strlen(buf)+1;
    return client->publish(topicid2, message);
}