1

次のコードでスキャンをトリガーします

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 のペイロードに格納されます。よろしいですか?

4

1 に答える 1

0

NL80211_CMD_TRIGGER_SCAN を送信してスキャンを開始します。(次から次へと失敗します) 送信後、NL80211_CMD_NEW_SCAN_RESULTS を取得したときにスキャンが完了するのをリッスンします。結果を求める NL80211_CMD_GET_SCAN コマンド。見つかったステーションごとに 1 つのメッセージが返されるため、複数のメッセージを処理できるようにしておいてください。

  • スキャンする NL80211_CMD_TRIGGER_SCAN
  • NL80211_CMD_NEW_SCAN_RESULTS を聞く
  • 結果を求める NL80211_CMD_GET_SCAN コマンド
  • 見つかったステーションごとに 1 つのメッセージが返されるはずです
于 2015-06-19T09:09:14.900 に答える