【问题标题】:How to know when scan is finished如何知道扫描何时完成
【发布时间】:2023-04-06 04:31:01
【问题描述】:

我使用以下代码触发扫描

struct nl_msg *msg = nlmsg_alloc();
struct nlmsghdr *hdr;
struct genlmsghdr cmd = { .cmd = NL80211_CMD_TRIGGER_SCAN };

struct nl_sock *sock = nl_socket_alloc();

int dev = if_nametoindex("wlan0");
nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev);

hdr = nlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, NLMSG_NOOP, 0, 0);
memcpy(nlmsg_data(hdr), &cmd, sizeof(cmd));
nl_send_auto(sock, msg);

现在,我应该如何知道扫描何时完成,以及如何获取它?到目前为止,在我一直在搜索的所有地方,都有“您将收到关于“扫描”多播组的 NL80211_CMD_NEW_SCANS 通知”,我应该如何订阅它?我注册了我的回调,试过了

nl_socket_add_memberships(sock, RTN_MULTICAST);

然后在 while 中收听消息

while (1)
  nl_recvmsgs_default(sock);

但是什么也没发生,所以:如果你有足够的耐心阅读到这里,请帮我解决 2 个问题

1) 我如何知道扫描何时完成(如何订阅此通知,或阅读它们等)

2)收到通知后如何阅读消息(我理解的方法如下)

要读取扫描的数据,我需要发送类似于触发扫描的消息,但带有消息 NL80211_CMD_GET_SCAN,然后数据将存储在 nl_socket 的有效负载中,对吗?

【问题讨论】:

    标签: network-programming linux-kernel embedded-linux ioctl netlink


    【解决方案1】:

    发送 NL80211_CMD_TRIGGER_SCAN 开始扫描。 (一个接一个会失败) 发送后,当您收到 NL80211_CMD_NEW_SCAN_RESULTS 时,请等待扫描完成。 NL80211_CMD_GET_SCAN 命令询问结果。 每找到一个电台,您都会收到一条消息,因此请准备好处理多条消息。

    • NL80211_CMD_TRIGGER_SCAN 扫描关闭
    • 收听 NL80211_CMD_NEW_SCAN_RESULTS
    • NL80211_CMD_GET_SCAN 命令询问结果
    • 应该为找到的每个电台返回一条消息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2011-04-05
      • 2021-04-25
      相关资源
      最近更新 更多