嵌入式技术论坛
直播中

abdkjshd

8年用户 1053经验值
擅长:可编程逻辑
私信 关注
[问答]

请问如何在main里面判断lwip何时完成?

我试着跑kawaii_mqtt的demo
用自动生成的代码,在main里面初始化mqtt并且连接服务器
运行代码发现, kawaii在尝试连接server的时候失败, 抓包发现,arp探测server的ip时,板子自己的ip为0.0.0.0, 应该是lwip还没有初始化完成
我改为添加一个mqtt的命令,在shell中手动调用,就可以了。。

请问如何在main里面判断lwip何时完成。。

谢谢

回帖(6)

jsqueh

2023-5-17 10:35:48
可以在mqtt connect之前判断网卡的link status。

如果网卡的link status为link up,再去连接mqtt broker。如:

struct netdev *netdev;
netdev = netdev_get_by_name("your_netdev_name");
/* 如果是内网,则判断flag为 NETDEV_FLAG_LINK_UP 即可 */
while ( 0 == ( netdev->flags & NETDEV_FLAG_INTERNET_UP ) )
{
    rt_thread_delay(1000);
}
mqtt_connect(client);
.....
举报

abdkjshd

2023-5-17 10:36:51
1.jpg
举报

jsqueh

2023-5-17 10:36:56
你目前遇到的问题应该是能发不能收。

你是不是自行在内网搭建的MQTT Broker?
如果是EMQ,可以用自带的WebSocket工具测试一下。

在PC上利用自带的WebSocket创建一个client,然后订阅你的设备topic,应该是能收到数据的;但是,你大概率是无法收到来自PC下发的数据。

这个问题我有解决方案。
举报

abdkjshd

2023-5-17 10:37:09
收发都不行。。。
我发现 ret = mqtt_connect(client); 返回值为-4
mqtt_publish_handle1(client); 返回 -14.

我wireshark抓包发现 确实有 mqtt connect command
1.jpg
mqtt_connect 不是阻塞的吗? 我发现mqtt_connect会很快返回 -4, 然后等一会shell里面会打印
.. mqtt connect success…[43809] D/main: loop…..
举报

jsqueh

2023-5-17 10:37:21
-4在kawaii mqtt内部,对应KAWAII_MQTT_CONNECT_FAILED_ERROR。

mqtt_connect在设计时是阻塞的,但是实际上,根据底层网络的具体实现,也可能会让出CPU。

你抓到的包,应该是设备发出的;Broker应该没有给Client发CONACK吧,我是这么认为的。

mqtt connect success的log打印在mqtt_connect_with_results函数中,只是表示tcp部分成功了,还没有向外发connect帧呢。

不过,我有些疑惑,为什么是先返回-4,再从shell中打印的?从你刚刚的回复来看,我猜测,你应该是开启了ulog,异步在优先级为30的任务中输出的吧?这样才是可以解释通过的。
举报

abdkjshd

2023-5-17 10:37:28
确实开了ulog..

感谢耐心指导。。刚刚发现换了个broker就好了
举报

更多回帖

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