stm32-project/Core/Src/mqtt.c

72 lines
1.5 KiB
C
Raw Normal View History

2026-04-18 14:37:49 +00:00
/*
* mqtt.c
*
* Created on: 08/04/2026
* Author: carec
*/
#include "mqtt.h"
#include <string.h>
static uint16_t put_str(uint8_t *p, const char *s)
{
uint16_t len = strlen(s);
p[0] = len >> 8;
p[1] = len & 0xFF;
memcpy(&p[2], s, len);
return 2 + len;
}
static uint16_t enc_len(uint8_t *out, uint32_t len)
{
uint16_t i = 0;
do {
uint8_t b = len % 128;
len /= 128;
if (len > 0) b |= 0x80;
out[i++] = b;
} while (len);
return i;
}
uint16_t mqtt_build_connect(uint8_t *out,
const char *client_id,
const char *username,
const char *password,
uint16_t keepalive)
{
uint8_t tmp[256];
uint16_t i = 0;
i += put_str(&tmp[i], "MQTT");
tmp[i++] = 0x04;
uint8_t flags = 0x02;
if (username) flags |= 0x80;
if (password) flags |= 0x40;
tmp[i++] = flags;
tmp[i++] = keepalive >> 8;
tmp[i++] = keepalive & 0xFF;
i += put_str(&tmp[i], client_id);
if (username) i += put_str(&tmp[i], username);
if (password) i += put_str(&tmp[i], password);
uint16_t o = 0;
out[o++] = 0x10;
o += enc_len(&out[o], i);
memcpy(&out[o], tmp, i);
o += i;
return o;
}
bool mqtt_parse_connack(const uint8_t *buf, uint16_t len)
{
if (len < 4) return false;
if (buf[0] != 0x20) return false;
if (buf[3] != 0x00) return false;
return true;
}