Lines Matching refs:client

3  * MQTT client
5 * @defgroup mqtt MQTT client
80 * MQTT client connection states
166 * @param client MQTT client
170 msg_generate_packet_id(mqtt_client_t *client)
172 client->pkt_id_seq++;
173 if (client->pkt_id_seq == 0) {
174 client->pkt_id_seq++;
176 return client->pkt_id_seq;
533 * @param client MQTT client
537 mqtt_close(mqtt_client_t *client, mqtt_connection_status_t reason)
539 LWIP_ASSERT("mqtt_close: client != NULL", client != NULL);
542 if (client->conn != NULL) {
544 altcp_recv(client->conn, NULL);
545 altcp_err(client->conn, NULL);
546 altcp_sent(client->conn, NULL);
547 res = altcp_close(client->conn);
549 altcp_abort(client->conn);
552 client->conn = NULL;
556 mqtt_clear_requests(&client->pend_req_queue);
558 sys_untimeout(mqtt_cyclic_timer, client);
561 if (client->conn_state != TCP_DISCONNECTED) {
563 client->conn_state = TCP_DISCONNECTED;
564 if (client->connect_cb != NULL) {
565 client->connect_cb(client, client->connect_arg, reason);
573 * @param arg MQTT client
579 mqtt_client_t *client = (mqtt_client_t *)arg;
580 LWIP_ASSERT("mqtt_cyclic_timer: client != NULL", client != NULL);
582 if (client->conn_state == MQTT_CONNECTING) {
583 client->cyclic_tick++;
584 if ((client->cyclic_tick * MQTT_CYCLIC_TIMER_INTERVAL) >= MQTT_CONNECT_TIMOUT) {
587 mqtt_close(client, MQTT_CONNECT_TIMEOUT);
590 } else if (client->conn_state == MQTT_CONNECTED) {
592 mqtt_request_time_elapsed(&client->pend_req_queue, MQTT_CYCLIC_TIMER_INTERVAL);
595 if (client->keep_alive > 0) {
597 client->server_watchdog++;
599 if ((client->server_watchdog * MQTT_CYCLIC_TIMER_INTERVAL) > (client->keep_alive + client->keep_alive / 2)) {
601 mqtt_close(client, MQTT_CONNECT_TIMEOUT);
606 if ((client->cyclic_tick * MQTT_CYCLIC_TIMER_INTERVAL) >= client->keep_alive) {
608 if (mqtt_output_check_space(&client->output, 0) != 0) {
609 mqtt_output_append_fixed_header(&client->output, MQTT_MSG_TYPE_PINGREQ, 0, 0, 0, 0);
610 client->cyclic_tick = 0;
613 client->cyclic_tick++;
617 LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_cyclic_timer: Timer should not be running in state %d\n", client->conn_state));
628 * @param client MQTT client
635 pub_ack_rec_rel_response(mqtt_client_t *client, u8_t msg, u16_t pkt_id, u8_t qos)
638 if (mqtt_output_check_space(&client->output, 2)) {
639 mqtt_output_append_fixed_header(&client->output, msg, 0, qos, 0, 2);
640 mqtt_output_append_u16(&client->output, pkt_id);
641 mqtt_output_send(&client->output, client->conn);
666 * @param client MQTT client
672 mqtt_message_received(mqtt_client_t *client, u8_t fixed_hdr_len, u16_t length, u32_t remaining_length)
676 u8_t *var_hdr_payload = client->rx_buffer + fixed_hdr_len;
677 size_t var_hdr_payload_bufsize = sizeof(client->rx_buffer) - fixed_hdr_len;
680 u8_t pkt_type = MQTT_CTL_PACKET_TYPE(client->rx_buffer[0]);
683 LWIP_ASSERT("fixed_hdr_len <= client->msg_idx", fixed_hdr_len <= client->msg_idx);
688 if (client->conn_state == MQTT_CONNECTING) {
698 client->cyclic_tick = 0;
699 client->conn_state = MQTT_CONNECTED;
701 if (client->connect_cb != 0) {
702 client->connect_cb(client, client->connect_arg, res);
714 u8_t qos = MQTT_CTL_PACKET_QOS(client->rx_buffer[0]);
716 if (client->msg_idx <= MQTT_VAR_HEADER_BUFFER_LEN) {
749 client->inpub_pkt_id = ((u16_t)var_hdr_payload[after_topic] << 8) + (u16_t)var_hdr_payload[after_topic + 1];
752 client->inpub_pkt_id = 0;
764 if (client->pub_cb != NULL) {
765 client->pub_cb(client->inpub_arg, (const char *)topic, remaining_length + payload_length);
775 if (client->data_cb != NULL) {
776 client->data_cb(client->inpub_arg, var_hdr_payload + payload_offset, payload_length, remaining_length == 0 ? MQTT_DATA_FLAG_LAST : 0);
783 mqtt_msg_type_to_str(resp_msg), client->inpub_pkt_id));
784 pub_ack_rec_rel_response(client, resp_msg, client->inpub_pkt_id, 0);
797 pub_ack_rec_rel_response(client, MQTT_MSG_TYPE_PUBREL, pkt_id, 1);
801 pub_ack_rec_rel_response(client, MQTT_MSG_TYPE_PUBCOMP, pkt_id, 0);
805 struct mqtt_request_t *r = mqtt_take_request(&client->pend_req_queue, pkt_id);
835 * @param client MQTT client
840 mqtt_parse_incoming(mqtt_client_t *client, struct pbuf *p)
850 client->rx_buffer. client->msg_idx keeps track of this. */
853 if (fixed_hdr_len < client->msg_idx) {
854 /* parse header from old pbuf (buffered in client->rx_buffer) */
855 b = client->rx_buffer[fixed_hdr_len];
857 /* parse header from this pbuf and save it in client->rx_buffer in case
860 client->rx_buffer[client->msg_idx++] = b;
874 mqtt_message_received(client, fixed_hdr_len, 0, 0);
875 client->msg_idx = 0;
880 msg_rem_len = (msg_rem_len + fixed_hdr_len) - client->msg_idx;
896 pbuf_copy_partial(p, client->rx_buffer + fixed_hdr_len, cpy_len, in_offset);
899 client->msg_idx += cpy_len;
903 LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_parse_incoming: msg_idx: %"U32_F", cpy_len: %"U16_F", remaining %"U32_F"\n", client->msg_idx, cpy_len, msg_rem_len));
906 mqtt_connection_status_t res = mqtt_message_received(client, fixed_hdr_len, cpy_len, msg_rem_len);
912 client->msg_idx = 0;
925 * @param arg MQTT client
933 mqtt_client_t *client = (mqtt_client_t *)arg;
934 LWIP_ASSERT("mqtt_tcp_recv_cb: client != NULL", client != NULL);
935 LWIP_ASSERT("mqtt_tcp_recv_cb: client->conn == pcb", client->conn == pcb);
939 mqtt_close(client, MQTT_CONNECT_DISCONNECTED);
950 res = mqtt_parse_incoming(client, p);
954 mqtt_close(client, res);
957 if (client->keep_alive != 0) {
959 client->server_watchdog = 0;
969 * @param arg MQTT client
977 mqtt_client_t *client = (mqtt_client_t *)arg;
982 if (client->conn_state == MQTT_CONNECTED) {
986 client->cyclic_tick = 0;
987 client->server_watchdog = 0;
989 while ((r = mqtt_take_request(&client->pend_req_queue, 0)) != NULL) {
997 mqtt_output_send(&client->output, client->conn);
1004 * @param arg MQTT client
1010 mqtt_client_t *client = (mqtt_client_t *)arg;
1013 LWIP_ASSERT("mqtt_tcp_err_cb: client != NULL", client != NULL);
1015 client->conn = 0;
1016 mqtt_close(client, MQTT_CONNECT_DISCONNECTED);
1021 * @param arg MQTT client
1028 mqtt_client_t *client = (mqtt_client_t *)arg;
1029 if (client->conn_state == MQTT_CONNECTED) {
1031 mqtt_output_send(&client->output, tpcb);
1038 * @param arg MQTT client
1045 mqtt_client_t *client = (mqtt_client_t *)arg;
1053 client->msg_idx = 0;
1062 client->conn_state = MQTT_CONNECTING;
1065 sys_timeout(MQTT_CYCLIC_TIMER_INTERVAL * 1000, mqtt_cyclic_timer, client);
1066 client->cyclic_tick = 0;
1069 mqtt_output_send(&client->output, client->conn);
1083 * @param client MQTT client
1092 * ERR_CONN if client is disconnected
1096 mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain,
1107 LWIP_ASSERT("mqtt_publish: client != NULL", client);
1109 LWIP_ERROR("mqtt_publish: TCP disconnected", (client->conn_state != TCP_DISCONNECTED), return ERR_CONN);
1119 pkt_id = msg_generate_packet_id(client);
1129 r = mqtt_create_request(client->req_list, LWIP_ARRAYSIZE(client->req_list), pkt_id, cb, arg);
1134 if (mqtt_output_check_space(&client->output, remaining_length) == 0) {
1139 mqtt_output_append_fixed_header(&client->output, MQTT_MSG_TYPE_PUBLISH, 0, qos, retain, remaining_length);
1142 mqtt_output_append_string(&client->output, topic, topic_len);
1146 mqtt_output_append_u16(&client->output, pkt_id);
1151 mqtt_output_append_buf(&client->output, payload, payload_length);
1154 mqtt_append_request(&client->pend_req_queue, r);
1155 mqtt_output_send(&client->output, client->conn);
1163 * @param client MQTT client
1172 mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub)
1182 LWIP_ASSERT("mqtt_sub_unsub: client != NULL", client);
1194 if (client->conn_state == TCP_DISCONNECTED) {
1199 pkt_id = msg_generate_packet_id(client);
1200 r = mqtt_create_request(client->req_list, LWIP_ARRAYSIZE(client->req_list), pkt_id, cb, arg);
1205 if (mqtt_output_check_space(&client->output, remaining_length) == 0) {
1212 mqtt_output_append_fixed_header(&client->output, sub ? MQTT_MSG_TYPE_SUBSCRIBE : MQTT_MSG_TYPE_UNSUBSCRIBE, 0, 1, 0, remaining_length);
1214 mqtt_output_append_u16(&client->output, pkt_id);
1216 mqtt_output_append_string(&client->output, topic, topic_len);
1219 mqtt_output_append_u8(&client->output, LWIP_MIN(qos, 2));
1222 mqtt_append_request(&client->pend_req_queue, r);
1223 mqtt_output_send(&client->output, client->conn);
1231 * @param client MQTT client
1237 mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t pub_cb,
1241 LWIP_ASSERT("mqtt_set_inpub_callback: client != NULL", client != NULL);
1242 client->data_cb = data_cb;
1243 client->pub_cb = pub_cb;
1244 client->inpub_arg = arg;
1249 * Create a new MQTT client instance
1261 * Free MQTT client instance
1262 * @param client Pointer to instance to be freed
1265 mqtt_client_free(mqtt_client_t *client)
1267 mem_free(client);
1273 * @param client MQTT client
1282 mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t port, mqtt_connection_cb_t cb, void *arg,
1294 LWIP_ASSERT("mqtt_client_connect: client != NULL", client != NULL);
1299 if (client->conn_state != TCP_DISCONNECTED) {
1305 memset(client, 0, sizeof(mqtt_client_t));
1306 client->connect_arg = arg;
1307 client->connect_cb = cb;
1308 client->keep_alive = client_info->keep_alive;
1309 mqtt_init_requests(client->req_list, LWIP_ARRAYSIZE(client->req_list));
1360 if (mqtt_output_check_space(&client->output, remaining_length) == 0) {
1366 client->conn = altcp_tls_new(client_info->tls_config, IP_GET_TYPE(ip_addr));
1370 client->conn = altcp_tcp_new_ip_type(IP_GET_TYPE(ip_addr));
1372 if (client->conn == NULL) {
1377 altcp_arg(client->conn, client);
1379 err = altcp_bind(client->conn, IP_ADDR_ANY, 0);
1387 err = altcp_connect(client->conn, ip_addr, port, mqtt_tcp_connect_cb);
1393 altcp_err(client->conn, mqtt_tcp_err_cb);
1394 client->conn_state = TCP_CONNECTING;
1397 mqtt_output_append_fixed_header(&client->output, MQTT_MSG_TYPE_CONNECT, 0, 0, 0, remaining_length);
1399 mqtt_output_append_string(&client->output, "MQTT", 4);
1401 mqtt_output_append_u8(&client->output, 4);
1403 mqtt_output_append_u8(&client->output, flags);
1405 mqtt_output_append_u16(&client->output, client_info->keep_alive);
1406 /* Append client id */
1407 mqtt_output_append_string(&client->output, client_info->client_id, client_id_length);
1410 mqtt_output_append_string(&client->output, client_info->will_topic, will_topic_len);
1411 mqtt_output_append_string(&client->output, client_info->will_msg, will_msg_len);
1415 mqtt_output_append_string(&client->output, client_info->client_user, client_user_len);
1419 mqtt_output_append_string(&client->output, client_info->client_pass, client_pass_len);
1424 altcp_abort(client->conn);
1425 client->conn = NULL;
1433 * @param client MQTT client
1436 mqtt_disconnect(mqtt_client_t *client)
1439 LWIP_ASSERT("mqtt_disconnect: client != NULL", client);
1441 if (client->conn_state != TCP_DISCONNECTED) {
1443 client->conn_state = TCP_DISCONNECTED;
1444 mqtt_close(client, (mqtt_connection_status_t)0);
1451 * @param client MQTT client
1455 mqtt_client_is_connected(mqtt_client_t *client)
1458 LWIP_ASSERT("mqtt_client_is_connected: client != NULL", client);
1459 return client->conn_state == MQTT_CONNECTED;