void mqtt_sn_send_publish(int sock, uint16_t topic_id, uint8_t topic_type, const void* data, int8_t qos, uint8_t retain) { size_t data_len = strlen(data); publish_packet_t packet; memset(&packet, 0, sizeof(packet)); if (data_len > sizeof(packet.data)) { log_err("Payload is too big"); exit(EXIT_FAILURE); } packet.type = MQTT_SN_TYPE_PUBLISH; packet.flags = 0x00; if (retain) packet.flags += MQTT_SN_FLAG_RETAIN; packet.flags += mqtt_sn_get_qos_flag(qos); packet.flags += (topic_type & 0x3); packet.topic_id = htons(topic_id); packet.message_id = htons(next_message_id++); strncpy(packet.data, data, sizeof(packet.data)); packet.length = 0x07 + data_len; log_debug("Sending PUBLISH packet..."); return mqtt_sn_send_packet(sock, &packet); }
uint16_t mqtt_sn_send_subscribe(struct mqtt_sn_connection *mqc, const char* topic_name, uint8_t qos) { subscribe_packet_t packet; size_t topic_name_len = strlen(topic_name); packet.type = MQTT_SN_TYPE_SUBSCRIBE; packet.flags = 0x00; packet.flags += mqtt_sn_get_qos_flag(qos); if (topic_name_len == 2) { packet.flags += MQTT_SN_TOPIC_TYPE_SHORT; } else { packet.flags += MQTT_SN_TOPIC_TYPE_NORMAL; } packet.message_id = uip_htons(mqc->next_message_id++); strncpy(packet.topic_name, topic_name, sizeof(packet.topic_name)); packet.topic_name[sizeof(packet.topic_name)-1] = '\0'; packet.length = 0x05 + topic_name_len; if (debug){ printf("Sending SUBSCRIBE packet...\n"); } send_packet(mqc, (char*)&packet, packet.length); return packet.message_id; }
uint16_t mqtt_sn_send_publish(struct mqtt_sn_connection *mqc, uint16_t topic_id, uint8_t topic_type, const char* data, uint16_t data_len, int8_t qos, uint8_t retain) { publish_packet_t packet; if (data_len > sizeof(packet.data)) { printf("Error: payload is too big\n"); return 0; } packet.type = MQTT_SN_TYPE_PUBLISH; packet.flags = 0x00; if (retain) packet.flags += MQTT_SN_FLAG_RETAIN; packet.flags += mqtt_sn_get_qos_flag(qos); packet.flags += (topic_type & 0x3); packet.topic_id = uip_htons(topic_id); packet.message_id = uip_htons(mqc->next_message_id++); strncpy(packet.data, data, sizeof(packet.data)); packet.length = 0x07 + data_len; if (debug){ printf("Sending PUBLISH packet...\n"); if (ctimer_expired(&(mqc->receive_timer))){ printf("receive timer has already expired...\n"); } } send_packet(mqc, (char*)&packet, packet.length); return packet.message_id; }
void mqtt_sn_send_subscribe_topic_id(struct mqtt_sn_connection *mqc, uint16_t topic_id, uint8_t qos) { subscribe_packet_t packet; packet.type = MQTT_SN_TYPE_SUBSCRIBE; packet.flags = 0x00; packet.flags += mqtt_sn_get_qos_flag(qos); packet.flags += MQTT_SN_TOPIC_TYPE_PREDEFINED; packet.message_id = htons(mqc->next_message_id++); packet.topic_id = htons(topic_id); packet.length = 0x05 + 2; if (debug) fprintf(stderr, "Sending SUBSCRIBE packet...\n"); return send_packet(sock, (char*)&packet, packet.length); }
void mqtt_sn_send_subscribe_topic_id(int sock, uint16_t topic_id, uint8_t qos) { subscribe_packet_t packet; memset(&packet, 0, sizeof(packet)); packet.type = MQTT_SN_TYPE_SUBSCRIBE; packet.flags = 0x00; packet.flags += mqtt_sn_get_qos_flag(qos); packet.flags += MQTT_SN_TOPIC_TYPE_PREDEFINED; packet.message_id = htons(next_message_id++); packet.topic_id = htons(topic_id); packet.length = 0x05 + 2; log_debug("Sending SUBSCRIBE packet..."); return mqtt_sn_send_packet(sock, &packet); }
void mqtt_sn_send_subscribe_topic_name(int sock, const char* topic_name, uint8_t qos) { size_t topic_name_len = strlen(topic_name); subscribe_packet_t packet; memset(&packet, 0, sizeof(packet)); packet.type = MQTT_SN_TYPE_SUBSCRIBE; packet.flags = 0x00; packet.flags += mqtt_sn_get_qos_flag(qos); if (topic_name_len == 2) { packet.flags += MQTT_SN_TOPIC_TYPE_SHORT; } else { packet.flags += MQTT_SN_TOPIC_TYPE_NORMAL; } packet.message_id = htons(next_message_id++); strncpy(packet.topic_name, topic_name, sizeof(packet.topic_name)); packet.topic_name[sizeof(packet.topic_name)-1] = '\0'; packet.length = 0x05 + topic_name_len; log_debug("Sending SUBSCRIBE packet..."); return mqtt_sn_send_packet(sock, &packet); }