Example #1
0
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++;
}
Example #2
0
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;
}
Example #3
0
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);
}
Example #4
0
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++;
}
Example #5
0
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));
    }
}
Example #6
0
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));
}