Exemplo n.º 1
0
static void mqttClient_connExpiryHndlr(le_timer_Ref_t timer)
{
  mqttClient_t* clientData = le_timer_GetContextPtr(timer);
  int32_t rc = LE_OK;

  LE_ASSERT(clientData);

  rc = mqttClient_close(clientData);
  if (rc)
  {
    LE_ERROR("mqttClient_close() failed(%d)", rc);
    goto cleanup;
  }

  LE_DEBUG("<--- reconnect");
  rc = mqttClient_connect(clientData);
  if (rc)
  {
    LE_ERROR("mqttClient_connect() failed(%d)", rc);
    goto cleanup;
  }

cleanup:
  return;
}
Exemplo n.º 2
0
MqttReturnCode mqttClient_startPub(AJBMqttClient *client,MqttConfigure config,MqttDispatcher dispatcher){
    
    newAJBMqttClient(client,config.username, config.password, config.clientid,config.cleansession);
    
    client->keepAlive = config.keepAlive;    //default is 20s
    client->qos = 2;                      //default is QOS2
    client->timout_ms = config.timeout_ms;   //default is 2000ms
    client->aliveAttr = config.aliveAttr;
    
    MqttLog("%d-%d-%d-%d",client->aliveAttr.auto_con,client->aliveAttr.recon_int,client->aliveAttr.recon_max,client->aliveAttr.reconnecting);
    
    client->dispatcher = dispatcher;
    client->dispatcher.shouldReSubscribe = NULL;
    
    
    mqttClient_setDispatcher(client,dispatcher);
    
    client->keepworking = 1;
    mqttClient_connect(client,config.host,config.port);
    //    client->keepworking = 0;
    strcpy(client->topic, config.topic);
    
    dispatcher.shouldReSubscribe = dispatcher.shouldReSubscribe;
    printf("%s\n",client->clientId);
    return 0;
}
Exemplo n.º 3
0
static int mqttClient_write(mqttClient_t* clientData, int length)
{
  int bytes = length ? length:clientData->session.tx.bytesLeft;
  le_result_t rc = LE_OK;

  LE_ASSERT(clientData);

  clientData->session.cmdLen = length;

  if (clientData->session.sock == MQTT_CLIENT_INVALID_SOCKET)
  {
    rc = mqttClient_connect(clientData);
    if (rc)
    {
      LE_ERROR("mqttClient_connect() failed(%d)", errno);
      rc = LE_IO_ERROR;
      goto cleanup;
    }
  }
  else
  {
    while (bytes > 0)
    {
      mqttClient_dumpBuffer(clientData->session.tx.ptr, bytes);
      int sent = write(clientData->session.sock, clientData->session.tx.ptr, bytes);
      if (sent == -1)
      {
        if (errno == EAGAIN)
        {
          le_fdMonitor_Enable(clientData->session.sockFdMonitor, POLLOUT);
          clientData->session.tx.bytesLeft = bytes;
          LE_WARN("send blocked(%u)", clientData->session.tx.bytesLeft);
          goto cleanup;
        }
        else
        {
          LE_ERROR("write() failed(%d)", errno);
          rc = LE_IO_ERROR;
          goto cleanup;
        }
      }
      else
      {
        clientData->session.tx.ptr += sent;
        bytes -= sent;
      }
    }

    le_timer_Restart(clientData->session.pingTimer);

    clientData->session.tx.ptr = clientData->session.tx.buf;
    clientData->session.rx.ptr = clientData->session.rx.buf;
  }

cleanup:
  return rc;
}
Exemplo n.º 4
0
static void mqttClient_cmdExpiryHndlr(le_timer_Ref_t timer)
{
  mqttClient_t* clientData = le_timer_GetContextPtr(timer);
  int32_t rc = LE_OK;

  LE_ASSERT(clientData);

  if (clientData->session.cmdRetries < MQTT_CLIENT_MAX_SEND_RETRIES)
  {
    if (clientData->session.sock == MQTT_CLIENT_INVALID_SOCKET)
    {
      LE_DEBUG("<--- reconnect");
      rc = mqttClient_connect(clientData);
      if (rc)
      {
        LE_ERROR("mqttClient_connect() failed(%d)", rc);
        goto cleanup;
      }
    }
    else
    {
      LE_DEBUG("<--- resend CMD(%u)", clientData->session.cmdRetries++);
      rc = mqttClient_write(clientData, clientData->session.cmdLen);
      if (rc)
      {
        LE_ERROR("mqttClient_write() failed(%d)", rc);
        goto cleanup;
      }
    }
  }
  else
  {
    LE_ERROR("maximum retries reached(%u)", MQTT_CLIENT_MAX_SEND_RETRIES);
    goto cleanup;
  }

cleanup:
  return;
}
Exemplo n.º 5
0
MqttReturnCode  mqttClient_start2(AJBMqttClient *client,MqttConfigure config,MqttDispatcher dispatcher){
    newAJBMqttClient(client,config.username, config.password, config.clientid,config.cleansession);
    
    client->keepAlive = config.keepAlive;    //default is 20s
    client->qos = 2;                      //default is QOS2
    client->timout_ms = config.timeout_ms;   //default is 2000ms
    client->aliveAttr = config.aliveAttr;
    //    MqttLog("%d-%d-%d-%d",client->aliveAttr.auto_con,client->aliveAttr.recon_int,client->aliveAttr.recon_max,client->aliveAttr.reconnecting);
    
    //    setWill(&client, "c/test1234567890/info", "this is a will");
    client->dispatcher = dispatcher;
    client->dispatcher.shouldReSubscribe = NULL;
    
    
    mqttClient_setDispatcher(client,dispatcher);
    
    int raw = client->keepworking;
    client->keepworking = 1;
    mqttClient_connect(client,config.host,config.port);
    client->keepworking = raw;
    
    char topic[MAX_TOPIC_LEN]={};
    getSuggestTopic(topic, client->clientId);
    if ((!config.disable_subscribe) || (client->cleanSession!=0)) {
        mqttClient_subscribe(client, topic, 2);
    }
    else{
        MqttLog("[SUB %s] skip subscribe",client->clientId);
    }
    
    //    mqttClient_subscribe(client, "c/lixiao-0612/info", 2);
    dispatcher.shouldReSubscribe = dispatcher.shouldReSubscribe;
    //    client->keepRunning(client);
    
    return 0;
}
Exemplo n.º 6
0
MqttReturnCode mqttClient_reconnect(AJBMqttClient *client){
    logToLocal(client->indexTag,log_erro_path,"[CONNECT reconnect] %s:%d ---> %s",client->host,client->port,client->clientId);
    return mqttClient_connect(client, client->host, client->port);
}
Exemplo n.º 7
0
static int mqttClient_startSession(mqttClient_t* clientData)
{
  int rc = LE_OK;

  LE_ASSERT(clientData);

  memcpy(&clientData->session.config, &clientData->config, sizeof(clientData->config));

  clientData->session.connTimer = le_timer_Create(MQTT_CLIENT_CONNECT_TIMER);
  if (!clientData->session.connTimer)
  {
    LE_ERROR("le_timer_Create() failed");
    rc = LE_BAD_PARAMETER;
    goto cleanup;
  }

  rc = le_timer_SetHandler(clientData->session.connTimer, mqttClient_connExpiryHndlr);
  if (rc)
  {
    LE_ERROR("le_timer_SetHandler() failed(%d)", rc);
    goto cleanup;
  }

  rc = le_timer_SetMsInterval(clientData->session.connTimer, MQTT_CLIENT_CONNECT_TIMEOUT_MS);
  if (rc)
  {
    LE_ERROR("le_timer_SetMsInterval() failed(%d)", rc);
    goto cleanup;
  }  

  rc = le_timer_SetContextPtr(clientData->session.connTimer, clientData);
  if (rc)
  {
    LE_ERROR("le_timer_SetContextPtr() failed(%d)", rc);
    goto cleanup;
  } 

  clientData->session.cmdTimer = le_timer_Create(MQTT_CLIENT_COMMAND_TIMER);
  if (!clientData->session.cmdTimer)
  {
    LE_ERROR("le_timer_Create() failed");
    rc = LE_BAD_PARAMETER;
    goto cleanup;
  }

  rc = le_timer_SetHandler(clientData->session.cmdTimer, mqttClient_cmdExpiryHndlr);
  if (rc)
  {
    LE_ERROR("le_timer_SetHandler() failed(%d)", rc);
    goto cleanup;
  }

  rc = le_timer_SetMsInterval(clientData->session.cmdTimer, MQTT_CLIENT_CMD_TIMEOUT_MS);
  if (rc)
  {
    LE_ERROR("le_timer_SetMsInterval() failed(%d)", rc);
    goto cleanup;
  }  

  rc = le_timer_SetContextPtr(clientData->session.cmdTimer, clientData);
  if (rc)
  {
    LE_ERROR("le_timer_SetContextPtr() failed(%d)", rc);
    goto cleanup;
  } 

  clientData->session.pingTimer = le_timer_Create(MQTT_CLIENT_PING_TIMER);
  if (!clientData->session.pingTimer)
  {
    LE_ERROR("le_timer_Create() failed");
    rc = LE_BAD_PARAMETER;
    goto cleanup;
  }

  rc = le_timer_SetHandler(clientData->session.pingTimer, mqttClient_pingExpiryHndlr);
  if (rc)
  {
    LE_ERROR("le_timer_SetHandler() failed(%d)", rc);
    goto cleanup;
  }

  rc = le_timer_SetMsInterval(clientData->session.pingTimer, clientData->session.config.keepAlive * 1000);
  if (rc)
  {
    LE_ERROR("le_timer_SetMsInterval() failed(%d)", rc);
    goto cleanup;
  }  

  rc = le_timer_SetRepeat(clientData->session.pingTimer, 0);
  if (rc)
  {
    LE_ERROR("le_timer_SetRepeat() failed(%d)", rc);
    goto cleanup;
  }  

  rc = le_timer_SetContextPtr(clientData->session.pingTimer, clientData);
  if (rc)
  {
    LE_ERROR("le_timer_SetContextPtr() failed(%d)", rc);
    goto cleanup;
  } 

  LE_INFO("connect(%s:%d)", clientData->session.config.brokerUrl, clientData->session.config.portNumber);
  rc = mqttClient_connect(clientData); 
  if (rc)
  {
    LE_ERROR("mqttClient_connect() failed(%d)", rc);
    goto cleanup;
  }

cleanup:
  if (rc)
  {
    LE_INFO("start session failed");
    mqttClient_SendConnStateEvent(false, rc, -1);
  }

  return rc;
}