void umqtt_ping(struct umqtt_connection *conn) { uint8_t packet[] = { umqtt_build_header(UMQTT_PINGREQ, 0, 0, 0), 0 }; umqtt_circ_push(&conn->txbuff, packet, sizeof(packet)); conn->nack_ping++; }
void umqtt_connect(struct umqtt_connection *conn, uint16_t kalive, char *cid, char *usrnm, char *passwd) { int cidlen = strlen(cid), usrlen=strlen(usrnm), passwdlen=strlen(passwd), payloadlen=cidlen + usrlen + passwdlen; uint8_t fixed; uint8_t remlen[4]; uint8_t variable[12]; uint8_t payload[6 + payloadlen]; fixed = umqtt_build_header(UMQTT_CONNECT, 0, 0, 0); variable[0] = 0; /* UTF Protocol name */ variable[1] = 6; variable[2] = 'M'; variable[3] = 'Q'; variable[4] = 'I'; variable[5] = 's'; variable[6] = 'd'; variable[7] = 'p'; variable[8] = 3; /* Protocol version */ variable[9] = 0b11000010; /* Clean session flag */ variable[10] = kalive >> 8; /* Keep Alive timer */ variable[11] = kalive & 0xff; payload[0] = cidlen >> 8; payload[1] = cidlen & 0xff; memcpy(&payload[2], cid, cidlen); payload[2+cidlen] = usrlen >> 8; payload[3+cidlen] = usrlen & 0xff; memcpy(&payload[4+cidlen], usrnm, usrlen); payload[14] = 0; payload[15] = 3; memcpy(&payload[16],passwd, 3); umqtt_circ_push(&conn->txbuff, &fixed, 1); umqtt_circ_push(&conn->txbuff, remlen, umqtt_encode_length(sizeof(variable) + sizeof(payload), remlen)); umqtt_circ_push(&conn->txbuff, variable, sizeof(variable)); umqtt_circ_push(&conn->txbuff, payload, sizeof(payload)); conn->state = UMQTT_STATE_CONNECTING; }
void umqtt_publish(struct umqtt_connection *conn, char *topic, uint8_t *data, int datalen) { int toplen = strlen(topic); uint8_t fixed; uint8_t remlen[4]; uint8_t len[2]; fixed = umqtt_build_header(UMQTT_PUBLISH, 0, 0, 0); umqtt_circ_push(&conn->txbuff, &fixed, 1); umqtt_circ_push(&conn->txbuff, remlen, umqtt_encode_length(2 + toplen + datalen, remlen)); len[0] = toplen >> 8; len[1] = toplen & 0xff; umqtt_circ_push(&conn->txbuff, len, sizeof(len)); umqtt_circ_push(&conn->txbuff, (uint8_t *) topic, toplen); umqtt_circ_push(&conn->txbuff, data, datalen); }
void umqtt_subscribe(struct umqtt_connection *conn, char *topic) { int topiclen = strlen(topic); uint8_t fixed; uint8_t remlen[4]; uint8_t messageid[2]; uint8_t payload[2 + topiclen + 1]; fixed = umqtt_build_header(UMQTT_SUBSCRIBE, 0, 1, 0); umqtt_insert_messageid(conn, messageid); payload[0] = topiclen >> 8; /* String length */ payload[1] = topiclen & 0xff; memcpy(&payload[2], topic, topiclen); payload[2 + topiclen] = 0; /* QoS */ umqtt_circ_push(&conn->txbuff, &fixed, 1); umqtt_circ_push(&conn->txbuff, remlen, umqtt_encode_length(sizeof(messageid) + sizeof(payload), remlen)); umqtt_circ_push(&conn->txbuff, messageid, sizeof(messageid)); umqtt_circ_push(&conn->txbuff, payload, sizeof(payload)); conn->nack_subscribe++; }
static inline void _mqttclient_handle_new_data(void) { enum umqtt_client_state previous_state = _mqtt.state; umqtt_circ_push(&uip_conn->appstate.conn->rxbuff, uip_appdata, uip_datalen()); umqtt_process(uip_conn->appstate.conn); /* Check for connection event. */ if (previous_state != UMQTT_STATE_CONNECTED && _mqtt.state == UMQTT_STATE_CONNECTED) { /* Signal established connection. */ _mqttclient_signal_connected(); /* Send presence message. */ umqtt_publish(&_mqtt, MQTT_NODE_PRESENCE_TOPIC, (uint8_t *) MQTT_NODE_PRESENCE_MSG_ONLINE, sizeof(MQTT_NODE_PRESENCE_MSG_ONLINE), _BV(UMQTT_OPT_RETAIN)); } }
void umqtt_disconnect(struct umqtt_connection *conn) { uint8_t packet[] = { umqtt_build_header(UMQTT_DISCONNECT, 0, 0, 0), 0 }; umqtt_circ_push(&conn->txbuff, packet, sizeof(packet)); }