1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
static int mqtt_client_login(mqtt_client_t* cli) { int len = 2 + 1 + 1 + 2 + 2; unsigned short cid_len = 0, will_topic_len = 0, will_payload_len = 0, username_len = 0, password_len = 0; unsigned char conn_flags = 0;
len += cli->protocol_version == MQTT_PROTOCOL_V31 ? 6 : 4; if (*cli->client_id) { cid_len = strlen(cli->client_id); } else { cid_len = 20; hv_random_string(cli->client_id, cid_len); hlogi("MQTT client_id: %.*s", (int)cid_len, cli->client_id); } len += cid_len; if (cid_len == 0) cli->clean_session = 1; if (cli->clean_session) { conn_flags |= MQTT_CONN_CLEAN_SESSION; } if (cli->will && cli->will->topic && cli->will->payload) { will_topic_len = cli->will->topic_len ? cli->will->topic_len : strlen(cli->will->topic); will_payload_len = cli->will->payload_len ? cli->will->payload_len : strlen(cli->will->payload); if (will_topic_len && will_payload_len) { conn_flags |= MQTT_CONN_HAS_WILL; conn_flags |= ((cli->will->qos & 3) << 3); if (cli->will->retain) { conn_flags |= MQTT_CONN_WILL_RETAIN; } len += 2 + will_topic_len; len += 2 + will_payload_len; } } if (*cli->username) { username_len = strlen(cli->username); if (username_len) { conn_flags |= MQTT_CONN_HAS_USERNAME; len += 2 + username_len; } } if (*cli->password) { password_len = strlen(cli->password); if (password_len) { conn_flags |= MQTT_CONN_HAS_PASSWORD; len += 2 + password_len; } } mqtt_head_t head; memset(&head, 0, sizeof(head)); head.type = MQTT_TYPE_CONNECT; head.length = len; int buflen = mqtt_estimate_length(&head); unsigned char* buf = NULL; HV_STACK_ALLOC(buf, buflen); unsigned char* p = buf; int headlen = mqtt_head_pack(&head, p); p += headlen; if (cli->protocol_version == MQTT_PROTOCOL_V31) { PUSH16(p, 6); PUSH_N(p, MQTT_PROTOCOL_NAME_v31, 6); } else { PUSH16(p, 4); PUSH_N(p, MQTT_PROTOCOL_NAME, 4); } PUSH8(p, cli->protocol_version); PUSH8(p, conn_flags); PUSH16(p, cli->keepalive); PUSH16(p, cid_len); if (cid_len > 0) { PUSH_N(p, cli->client_id, cid_len); } if (conn_flags & MQTT_CONN_HAS_WILL) { PUSH16(p, will_topic_len); PUSH_N(p, cli->will->topic, will_topic_len); PUSH16(p, will_payload_len); PUSH_N(p, cli->will->payload, will_payload_len); } if (conn_flags & MQTT_CONN_HAS_USERNAME) { PUSH16(p, username_len); PUSH_N(p, cli->username, username_len); } if (conn_flags & MQTT_CONN_HAS_PASSWORD) { PUSH16(p, password_len); PUSH_N(p, cli->password, password_len); } int nwrite = mqtt_client_send(cli, buf, p - buf); HV_STACK_FREE(buf); return nwrite < 0 ? nwrite : 0; }
|