PROCESS_THREAD(mqtt_sn_process, ev, data)
{
  struct mqtt_sn_connection *mqc;

  PROCESS_BEGIN();

  connack_event = process_alloc_event();
  disconnect_event = process_alloc_event();
  receive_timeout_event = process_alloc_event();
  send_timeout_event = process_alloc_event();

  while(1) {
    PROCESS_WAIT_EVENT();
    mqc = (struct mqtt_sn_connection *)data;
    if(ev == connack_event) {
      //if connection was succesful, set and or start the ctimers.
      if (mqc->last_connack.return_code == 0x00 && mqc->stat == MQTTSN_WAITING_CONNACK){
        mqc->stat = MQTTSN_CONNECTED;
        if (mqc->keep_alive > 0){
          ctimer_set(&mqc->receive_timer, mqc->keep_alive * 2, receive_timer_callback, mqc);
          ctimer_set(&mqc->send_timer,mqc->keep_alive / 2,send_timer_callback, mqc);
        }
      }
    }
    else if (ev == disconnect_event){
      //stop the timers
      if (mqc->keep_alive > 0){
        ctimer_stop(&(mqc->receive_timer));
        ctimer_stop(&(mqc->send_timer));
      }
      mqc->stat = MQTTSN_DISCONNECTED;
    }
    else if (ev == receive_timeout_event){
      //if last receive has expired we need to stop and disconnect
      printf("receive timeout event");
      mqtt_sn_send_disconnect(mqc);
      if(mqc->mc->keepalive_timeout != NULL) {
        mqc->mc->keepalive_timeout(mqc);
      }
    }
    else if (ev == send_timeout_event){
      //if last send has expired, we need to send a pingreq
      mqtt_sn_send_pingreq(mqc);
    }
  }

  PROCESS_END();
}
Example #2
0
void* mqtt_sn_wait_for(uint8_t type, int sock)
{
    while(TRUE) {
        time_t now = time(NULL);
        int ret;

        // Time to send a ping?
        if (keep_alive > 0 && (now - last_transmit) >= keep_alive) {
            mqtt_sn_send_pingreq(sock);
        }

        ret = mqtt_sn_select(sock);
        if (ret < 0) {
            break;
        } else if (ret > 0) {
            char* packet = mqtt_sn_receive_packet(sock);
            if (packet) {
                switch(packet[1]) {
                    case MQTT_SN_TYPE_PUBLISH:
                        mqtt_sn_print_publish_packet((publish_packet_t *)packet);
                        break;

                    case MQTT_SN_TYPE_REGISTER:
                        mqtt_sn_process_register(sock, (register_packet_t*)packet);
                        break;

                    case MQTT_SN_TYPE_PINGRESP:
                        // do nothing
                        break;

                    case MQTT_SN_TYPE_DISCONNECT:
                        if (type != MQTT_SN_TYPE_DISCONNECT) {
                            log_warn("Received DISCONNECT from gateway.");
                            exit(EXIT_FAILURE);
                        }
                        break;

                    default:
                        if (packet[1] != type) {
                            log_warn(
                                "Was expecting %s packet but received: %s",
                                mqtt_sn_type_string(type),
                                mqtt_sn_type_string(packet[1])
                            );
                        }
                    break;
                }

                // Did we find what we were looking for?
                if (packet[1] == type) {
                    return packet;
                }
            }
        }

        // Check for receive timeout
        if (keep_alive > 0 && (now - last_receive) >= (keep_alive * 1.5)) {
            log_err("Keep alive error: timed out while waiting for a %s from gateway.", mqtt_sn_type_string(type));
            exit(EXIT_FAILURE);
        }
    }

    return NULL;
}