ST意法半导体
直播中

1123127317

8年用户 964经验值
擅长:制造/封装 接口/总线/驱动
私信 关注
[问答]

cubemx需要做哪些更改才能使用像“broker.mqttdashboard.com”这样的主机名呢?

我是 LWIP 和 MQTT 的新手。我正在尝试在 STM32f767 中使用 LWIP 使用 MQTT。我能够建立以太网连接并且 ping 也能正常工作。我使用 mqtt_client_connect 连接到服务器。功能如下:-
mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t 端口, mqtt_connection_cb_t cb, void *arg,const struct mqtt_connect_client_info_t *client_info)
{{
错误错误;
size_t 长度;
u16_t client_id_length;
/* 长度是 2+"MQTT"、协议级别、标志和保持活动状态的总和 */
u16_t 剩余长度 = 2 + 4 + 1 + 1 + 2;
u8_t flags = 0, will_topic_len = 0, will_msg_len = 0;
LWIP_ASSERT("mqtt_client_connect: client != NULL", client != NULL);
LWIP_ASSERT("mqtt_client_connect: ip_addr != NULL", ip_addr != NULL);
LWIP_ASSERT("mqtt_client_connect: client_info != NULL", client_info != NULL);
LWIP_ASSERT("mqtt_client_connect: client_info->client_id != NULL", client_info->client_id != NULL);
如果(客户端->conn_state!= TCP_DISCONNECTED){
  LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_client_connect: 已经连接nr"));
  返回 ERR_ISCONN;
}
/* 擦干净 */
memset(客户端,0,sizeof(mqtt_client_t));
客户端->connect_arg = arg;
客户端->connect_cb = cb;
client->keep_alive = client_info->keep_alive;
mqtt_init_requests(客户端->req_list);
/* 构建连接消息 */
if (client_info->will_topic != NULL && client_info->will_msg != NULL) {
  标志 |= MQTT_CONNECT_FLAG_WILL;
  标志 |= (client_info->will_qos & 3) << 3;
  如果 (client_info->will_retain) {
   标志 |= MQTT_CONNECT_FLAG_WILL_RETAIN;
  }
  len = strlen(client_info->will_topic);
  LWIP_ERROR("mqtt_client_connect: client_info->will_topic 长度溢出", len <= 0xFF, return ERR_VAL);
  LWIP_ERROR("mqtt_client_connect: client_info->will_topic length must be > 0", len > 0, return ERR_VAL);
  will_topic_len = (u8_t)len;
  len = strlen(client_info->will_msg);
  LWIP_ERROR("mqtt_client_connect: client_info->will_msg 长度溢出", len <= 0xFF, return ERR_VAL);
  will_msg_len = (u8_t)len;
  len = remaining_length + 2 + will_topic_len + 2 + will_msg_len;
  LWIP_ERROR("mqtt_client_connect: remaining_length overflow", len <= 0xFFFF, return ERR_VAL);
  剩余长度 = (u16_t)len;
}
/* 不要把事情复杂化,总是使用干净的会话连接 */
标志 |= MQTT_CONNECT_FLAG_CLEAN_SESSION;
len = strlen(client_info->client_id);
LWIP_ERROR("mqtt_client_connect: client_info->client_id 长度溢出", len <= 0xFFFF, return ERR_VAL);
client_id_length = (u16_t)len;
len = remaining_length + 2 + client_id_length;
LWIP_ERROR("mqtt_client_connect: remaining_length overflow", len <= 0xFFFF, return ERR_VAL);
剩余长度 = (u16_t)len;
如果 (mqtt_output_check_space(&client->output, remaining_length) == 0) {
  返回 ERR_MEM;
}
客户端->conn = tcp_new();
如果(客户端->conn == NULL){
  返回 ERR_MEM;
}
/* 为回调设置 arg 指针 */
tcp_arg(客户端->conn,客户端);
/* 任意本地地址,随机选择本地端口号 */
err = tcp_bind(client->conn, IP_ADDR_ANY, 0);
如果(错误!= ERR_OK){
  LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_client_connect: 错误绑定到本地 ip/端口, %dnr", err));
  转到 tcp_fail;
}
LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_client_connect: 连接到主机: %s at port:%"U16_F"nr", ipaddr_ntoa(ip_addr), port));
/* 连接到服务器 */
err = tcp_connect(client->conn, ip_addr, port, mqtt_tcp_connect_cb);
如果(错误!= ERR_OK){
  LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_client_connect: 连接到远程 ip/端口时出错,%dnr", err));
  转到 tcp_fail;
}
/* 设置错误回调 */
tcp_err(客户端->conn,mqtt_tcp_err_cb);
客户端->conn_state = TCP_CONNECTING;
/* 追加固定的头部 */
mqtt_output_append_fixed_header(&client->output, MQTT_MSG_TYPE_CONNECT, 0, 0, 0, remaining_length);
/* 添加协议字符串 */
mqtt_output_append_string(&client->output, "MQTT", 4);
/* 追加协议级别 */
mqtt_output_append_u8(&client->output, 4);
/* 附加连接标志 */
mqtt_output_append_u8(&client->output, flags);
/* 附加保活 */
mqtt_output_append_u16(&client->output, client_info->keep_alive);
/* 添加客户端 ID */
mqtt_output_append_string(&client->output, client_info->client_id, client_id_length);
/* 如果使用,追加 will 消息 */
如果((标志和 MQTT_CONNECT_FLAG_WILL)!= 0){
  mqtt_output_append_string(&client->output, client_info->will_topic, will_topic_len);
  mqtt_output_append_string(&client->output, client_info->will_msg, will_msg_len);
}
返回 ERR_OK;
tcp_fail:
tcp_abort(客户端->conn);
客户端->conn = NULL;
返回错误;
}
这里我们需要传递我们要连接的服务器的 IP 地址。我想使用主机名而不是 IP 地址。我需要做哪些更改才能使用像“broker.mqttdashboard.com”这样的主机名?
感谢您的帮助。









回帖(1)

翁齐芳

2022-12-22 10:33:45
cubemx 内存设置非常保守并保证最小功能(ICMP 和小型 tcp/udp 数据包)
尝试,作为紧急解决方法,未优化:(假设使用 CUBEMX)
将段大小 TCP_MSS 增加到 1460(这是以太网的最大值)
将 PBUF_POOL_BUFSIZE 增加到 1600 (mss+headers+etc) 发送缓冲区 (TCP_SND_BUF) 将自动增加。
和 MEM_SIZE 到 16000(这似乎太高了,但修剪是一个耗时的过程。在项目运行后进行)。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分