void mqtt_sn_dump_packet(char* packet) { printf("%s: len=%d", mqtt_sn_type_string(packet[1]), packet[0]); switch(packet[1]) { case MQTT_SN_TYPE_CONNECT: { connect_packet_t* cpkt = (connect_packet_t*)packet; printf(" protocol_id=%d", cpkt->protocol_id); printf(" duration=%d", ntohs(cpkt->duration)); printf(" client_id=%s", cpkt->client_id); break; } case MQTT_SN_TYPE_CONNACK: { connack_packet_t* capkt = (connack_packet_t*)packet; printf(" return_code=%d (%s)", capkt->return_code, mqtt_sn_return_code_string(capkt->return_code)); break; } case MQTT_SN_TYPE_REGISTER: { register_packet_t* rpkt = (register_packet_t*)packet; printf(" topic_id=0x%4.4x", ntohs(rpkt->topic_id)); printf(" message_id=0x%4.4x", ntohs(rpkt->message_id)); printf(" topic_name=%s", rpkt->topic_name); break; } case MQTT_SN_TYPE_REGACK: { regack_packet_t* rapkt = (regack_packet_t*)packet; printf(" topic_id=0x%4.4x", ntohs(rapkt->topic_id)); printf(" message_id=0x%4.4x", ntohs(rapkt->message_id)); printf(" return_code=%d (%s)", rapkt->return_code, mqtt_sn_return_code_string(rapkt->return_code)); break; } case MQTT_SN_TYPE_PUBLISH: { publish_packet_t* ppkt = (publish_packet_t*)packet; printf(" topic_id=0x%4.4x", ntohs(ppkt->topic_id)); printf(" message_id=0x%4.4x", ntohs(ppkt->message_id)); printf(" data=%s", ppkt->data); break; } case MQTT_SN_TYPE_SUBSCRIBE: { subscribe_packet_t* spkt = (subscribe_packet_t*)packet; printf(" message_id=0x%4.4x", ntohs(spkt->message_id)); break; } case MQTT_SN_TYPE_SUBACK: { suback_packet_t* sapkt = (suback_packet_t*)packet; printf(" topic_id=0x%4.4x", ntohs(sapkt->topic_id)); printf(" message_id=0x%4.4x", ntohs(sapkt->message_id)); printf(" return_code=%d (%s)", sapkt->return_code, mqtt_sn_return_code_string(sapkt->return_code)); break; } case MQTT_SN_TYPE_DISCONNECT: { disconnect_packet_t* dpkt = (disconnect_packet_t*)packet; printf(" duration=%d", ntohs(dpkt->duration)); break; } } printf("\n"); }
uint16_t mqtt_sn_receive_suback(int sock) { suback_packet_t *packet = mqtt_sn_wait_for(MQTT_SN_TYPE_SUBACK, sock); uint16_t received_message_id, received_topic_id; if (packet == NULL) { log_err("Failed to subscribe to topic."); exit(EXIT_FAILURE); } // Check Suback return code log_debug("SUBACK return code: 0x%2.2x", packet->return_code); if (packet->return_code) { log_err("SUBSCRIBE error: %s", mqtt_sn_return_code_string(packet->return_code)); exit(packet->return_code); } // Check that the Message ID matches received_message_id = ntohs(packet->message_id); if (received_message_id != next_message_id-1) { log_warn("Message id in SUBACK does not equal message id sent"); log_debug(" Expecting: %d", next_message_id-1); log_debug(" Actual: %d", received_message_id); } // Return the topic ID returned by the gateway received_topic_id = ntohs(packet->topic_id); log_debug("SUBACK topic id: 0x%4.4x", received_topic_id); return received_topic_id; }
uint16_t mqtt_sn_receive_regack(int sock) { regack_packet_t *packet = mqtt_sn_wait_for(MQTT_SN_TYPE_REGACK, sock); uint16_t received_message_id, received_topic_id; if (packet == NULL) { log_err("Failed to connect to register topic."); exit(EXIT_FAILURE); } // Check Regack return code log_debug("REGACK return code: 0x%2.2x", packet->return_code); if (packet->return_code) { log_err("REGISTER failed: %s", mqtt_sn_return_code_string(packet->return_code)); exit(packet->return_code); } // Check that the Message ID matches received_message_id = ntohs(packet->message_id); if (received_message_id != next_message_id-1) { log_warn("Message id in Regack does not equal message id sent"); } // Return the topic ID returned by the gateway received_topic_id = ntohs(packet->topic_id); log_debug("REGACK topic id: 0x%4.4x", received_topic_id); return received_topic_id; }
uint16_t mqtt_sn_recieve_suback(int sock) { suback_packet_t *packet = recieve_packet(sock); uint16_t received_message_id, received_topic_id; if (packet == NULL) { fprintf(stderr, "Failed to subscribe to topic.\n"); return; } if (packet->type != MQTT_SN_TYPE_SUBACK) { fprintf(stderr, "Was expecting SUBACK packet but received: 0x%2.2x\n", packet->type); exit(-1); } // Check Suback return code if (debug) fprintf(stderr, "SUBACK return code: 0x%2.2x\n", packet->return_code); if (packet->return_code) { fprintf(stderr, "SUBSCRIBE error: %s\n", mqtt_sn_return_code_string(packet->return_code)); exit(packet->return_code); } // Check that the Message ID matches received_message_id = ntohs( packet->message_id ); if (received_message_id != next_message_id-1) { fprintf(stderr, "Warning: message id in SUBACK does not equal message id sent\n"); if (debug) { fprintf(stderr, " Expecting: %d\n", next_message_id-1); fprintf(stderr, " Actual: %d\n", received_message_id); } } // Return the topic ID returned by the gateway received_topic_id = ntohs( packet->topic_id ); if (debug) fprintf(stderr, "Topic ID: %d\n", received_topic_id); return received_topic_id; }
void mqtt_sn_receive_connack(int sock) { connack_packet_t *packet = mqtt_sn_receive_packet(sock); if (packet == NULL) { log_err("Failed to connect to MQTT-SN gateway."); exit(EXIT_FAILURE); } if (packet->type != MQTT_SN_TYPE_CONNACK) { log_err("Was expecting CONNACK packet but received: %s", mqtt_sn_type_string(packet->type)); exit(EXIT_FAILURE); } // Check Connack return code log_debug("CONNACK return code: 0x%2.2x", packet->return_code); if (packet->return_code) { log_err("CONNECT error: %s", mqtt_sn_return_code_string(packet->return_code)); exit(packet->return_code); } }
void mqtt_sn_recieve_connack(int sock) { connack_packet_t *packet = recieve_packet(sock); if (packet == NULL) { fprintf(stderr, "Failed to connect to MQTT-S gateway.\n"); return; } if (packet->type != MQTT_SN_TYPE_CONNACK) { fprintf(stderr, "Was expecting CONNACK packet but received: 0x%2.2x\n", packet->type); return; } // Check Connack return code if (debug) fprintf(stderr, "CONNACK return code: 0x%2.2x\n", packet->return_code); if (packet->return_code) { fprintf(stderr, "CONNECT error: %s\n", mqtt_sn_return_code_string(packet->return_code)); exit(packet->return_code); } }
uint16_t mqtt_sn_recieve_regack(int sock) { regack_packet_t *packet = recieve_packet(sock); uint16_t received_message_id, received_topic_id; if (packet == NULL) { fprintf(stderr, "Failed to connect to register topic.\n"); return; } if (packet->type != MQTT_SN_TYPE_REGACK) { fprintf(stderr, "Was expecting REGACK packet but received: 0x%2.2x\n", packet->type); exit(-1); } // Check Regack return code if (debug) fprintf(stderr, "REGACK return code: 0x%2.2x\n", packet->return_code); if (packet->return_code) { fprintf(stderr, "REGISTER error: %s\n", mqtt_sn_return_code_string(packet->return_code)); exit(packet->return_code); } // Check that the Message ID matches received_message_id = ntohs( packet->message_id ); if (received_message_id != next_message_id-1) { fprintf(stderr, "Warning: message id in Regack does not equal message id sent\n"); } // Return the topic ID returned by the gateway received_topic_id = ntohs( packet->topic_id ); if (debug) fprintf(stderr, "Topic ID: %d\n", received_topic_id); return received_topic_id; }