完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我是 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个回答
|
|
cubemx 内存设置非常保守并保证最小功能(ICMP 和小型 tcp/udp 数据包)
尝试,作为紧急解决方法,未优化:(假设使用 CUBEMX) 将段大小 TCP_MSS 增加到 1460(这是以太网的最大值) 将 PBUF_POOL_BUFSIZE 增加到 1600 (mss+headers+etc) 发送缓冲区 (TCP_SND_BUF) 将自动增加。 和 MEM_SIZE 到 16000(这似乎太高了,但修剪是一个耗时的过程。在项目运行后进行)。 |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2465 浏览 1 评论
3162 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1727 浏览 1 评论
3549 浏览 6 评论
5912 浏览 21 评论
887浏览 4评论
1265浏览 4评论
在Linux上安装Atollic TRUEStudio的步骤有哪些呢?
530浏览 3评论
使用DMA激活某些外设会以导致外设无法工作的方式生成代码是怎么回事
1248浏览 3评论
1302浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-5 00:37 , Processed in 1.088529 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号