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(); }
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; }