07-p2p-first-scan
Wi-Fi Direct 教程 07:第一次 P2P Scan 如何真正发出——WPS/P2P IE、radio work 与 driver request 摘要:追踪 P2P Probe Request、radio work 与 nl80211 扫描提交,解释 no-CCK 速率约束及 Generic Netlink 的用户态/内核态边界。 @[toc]P2P Core 已经请求第一轮 scan。本文从 wpas_p2p_scan() 开始,解释 P2P Wildcard SSID、WPS IE、P2P IE、频段分类与 radio work queue,并继续沿 wpa_drv_scan()、driver_nl80211_scan2()、wpa_driver_nl80211_scan() 追到 NL80211_CMD_TRIGGER_SCAN 被提交给 Linux kernel。进入 nl80211 backend 后,还需要回答两个直接影响调用链理解的问题:p2p_probe 为什么会禁用 2.4 GHz 的 802.11b legacy rat...
06-p2p-find-to-core
Wi-Fi Direct 教程 06:P2P_FIND 进入 P2P Core——Social Channels、P2P_SEARCH 与第一轮扫描决策 摘要:从 p2p_ctrl_find() 追踪 P2P_FIND 参数、wpas_p2p_find()、p2p_find()、扫描模式与 P2P_SEARCH,直到 Core 请求第一轮 scan。 @[toc]control parser 已经识别 P2P_FIND。本文从 p2p_ctrl_find() 开始:先把文本参数转换为 wpas_p2p_find() 的结构化参数,再进入 P2P Core 的 p2p_find(),解释 Social Channels、P2P_FIND_START_WITH_FULL、enum p2p_scan_type 与 P2P_SEARCH 状态怎样共同决定第一轮扫描请求。 这里关注的是“P2P Core 为什么决定要 scan”,而不是 driver 如何执行 scan。 1. p2p_ctrl_find():把 P2P_FIND 的文本参数变成 wpas_p2p_find() ...
05-ctrl-iface-eloop
Wi-Fi Direct 教程 05:control socket 与 eloop——P2P_FIND 怎样进入 wpa_supplicant 命令解析器 摘要:从 interface 初始化后的运行阶段追踪 AF_UNIX control socket、eloop 唤醒、recvfrom() 与 P2P_FIND 命令分发。 @[toc]wpa_supplicant 的 interface 初始化完成后,进程进入事件驱动阶段。本文只追踪 control server:配置中的 ctrl_interface 怎样变成 AF_UNIX/SOCK_DGRAM socket,socket fd 怎样注册进 eloop,以及 wpa_cli 发出的 P2P_FIND datagram 怎样被唤醒、读取并进入 command parser。 ATTACH 也属于这个本地 control interface:它只让 control client 订阅异步事件,与空口 Probe Request、WPS IE、P2P IE 的发送无关。 1. control socket ...
04-interface-protocol-init
Wi-Fi Direct 教程 04:Interface 协议子系统初始化——WPA/EAPOL、WPS、DPP/NAN、GAS 与 P2P callback 摘要:继续 wpa_supplicant_init_iface(),解释 WPA/EAPOL、WPS、DPP/NAN、GAS/ANQP 与 P2P Core callback 的初始化。 @[toc]driver backend 已经选定后,wpa_supplicant_init_iface() 还要继续建立真正的协议运行环境。本文集中解释这部分:association/EAPOL 相关状态为什么要准备,L2/TKIP/PMKID 分别承担什么,WPS、DPP、NAN、EAP_PROXY、GAS/ANQP 是什么,以及 wpas_p2p_init() 在哪里绑定 P2P Core callbacks。 1. wpa_supplicant_init_wpa():建立 WPA/RSN 状态机wpas_init_driv...
03-wpa-supplicant-startup-driver
Wi-Fi Direct 教程 03:wpa_supplicant 启动到 driver 就绪——main、Interface 对象与 nl80211 backend 摘要:从 main() 追踪 global/eloop、interface 对象与 driver backend 选择,明确 nl80211 userspace backend 和 mac80211_hwsim 的层次。 @[toc]本文从 wpa_supplicant main() 开始,只追踪启动骨架:命令行参数如何形成 interface 配置,global/eloop 如何建立,struct wpa_supplicant 怎样创建,以及 -Dnl80211 最终怎样选中 wpa_driver_nl80211_ops。 需要特别区分两层“driver”:driver_nl80211.c 是 wpa_supplicant userspace backend;当前实验真正运行在 Linux kernel 中的无线驱动是 mac80211_hwsim。 1. 从 wpa_supplic...
02-wpa-cli-to-p2p-find
Wi-Fi Direct教程 02:从 wpa_cli main() 到 P2P_FIND——用源码注释追踪 CLI 控制命令发送 摘要:沿 wpa_supplicant 2.12 的 wpa_cli 实际执行路径,用连续源码片段和行内注释说明参数解析、eloop、UNIX datagram control socket、命令分发以及 P2P_FIND 的发送与同步回复。 @[toc]上一篇已经完成双 mac80211_hwsim radio、双 wpa_supplicant 2.12 实例和独立 control interface。本篇只追踪下面这条命令在 wpa_cli 进程内部如何执行: 1234sudo wpa_cli-2.12 \ -p /run/wpa_supplicant-p2p-a \ -i wlan0 \ p2p_find 目标是回答: 1234567891011Shell 输入 p2p_find ↓wpa_cli 如何解析 -p / -i / p2p_find ↓如何建立本地 control socket ↓p2p...
ROS学习笔记系列
ROS学习笔记系列 1. 01:搭建 ROS1 Noetic Docker 开发环境 (个人博客链接) 2. 02:创建 catkin Workspace、Package 与第一个 ROS1 C++ Node (个人博客链接) (CSDN链接) 3. 03:让 Node 真正通信——Topic、Parameter、日志与 roslaunch (个人博客链接) (CSDN链接) 4. 04:使用 VS Code Remote-SSH 与 Dev Container 建立 ROS1 开发工作流 (个人博客链接) (CSDN链接) 5. 05:阅读 roscpp 源码,并用 F12、F5、GDB 进入 (个人博客链接) (CSDN链接) 6. 06_ROS1_Node启动与生命周期 (个人博客链接) 7. ROS教程07:从 ros-start 顺着源码读懂 Master、XML-RPC 与 Topic 注册发现 (个人博客链接) (CSDN链接) 8. ROS教程08:从 TransportTCP (个人博客链接) 9. ROS教程09:从 CallbackQueue 追到 Spin...
01-wifi-direct-lab
Wi-Fi Direct教程 01:在 Ubuntu 搭建双 mac80211_hwsim + wpa_supplicant 2.12 摘要:Ubuntu Host 提供双 mac80211_hwsim radio,Docker 固化 wpa_supplicant 2.12 源码、构建依赖和 F12/F5 调试环境,并说明 nl80211/Netlink 边界。 @[toc]实验环境固定分成两层:Ubuntu Host 负责 Linux kernel 与 mac80211_hwsim,Docker 负责 wpa_supplicant 2.12 userspace、源码、编译依赖和调试工具。本文固定使用下面的工程路径: 12Ubuntu Host: /home/wdfk/share/wifi-directContainer: /workspace 12345678910111213141516Ubuntu x86 VM│├── Linux kernel│ └── mac80211_hwsim radios=2│ ├── virtua...
ROS教程17:Navigation move_base 从定位、Costmap、Planner 到 cmd_vel
ROS教程17:Navigation / move_base——从定位、Costmap、Planner 到 cmd_vel 摘要:把 AMCL、TF、里程计和激光观测接入 move_base,理解 global/local costmap、Navfn、DWA 与 cmd_vel 的真实数据依赖,并完成阶段 C 的 AGV 导航闭环。 @[toc]第 13~16 章已经分别建立了移动机器人导航上游最关键的几条数据链: 1234567891011121314第 13 章:TF / tf2map -> odom -> base_link -> sensor第 14 章:URDF + robot_state_publisherbase_link -> laser_link / imu_link / wheel_link第 15 章:robot_localization/odom/raw + /imu/data_raw -> /odometry/filtered -> odom -> base...
ROS教程16:SLAM 与定位——从激光雷达到地图、AMCL 与 map→odom
摘要:从激光测距、扫描角度和多线 3D 雷达出发,串联 LaserScan、GMapping、OccupancyGrid、AMCL 与 map→odom,建立 ROS1 建图和已有地图定位的完整数据链。 @[toc]第 15 章已经把轮式里程计与 IMU 接入 robot_localization,并让状态估计器稳定提供: 1odom -> base_link 这条变换适合描述机器人连续的局部运动,但 odom 允许随着时间积累漂移。真正进入移动机器人全局定位时,还需要回答另一个问题: 1机器人现在位于整张地图的什么位置? 第 16 章从激光雷达开始,把这个问题拆成一条完整链路: 12345678激光如何得到距离 -> 一帧扫描为什么是“角度 + 距离” -> 2D 单平面与 3D 多线雷达有什么区别 -> /scan 怎样与 TF / odom 结合 -> SLAM 为什么能一边定位一边建图 -> /map 与 map frame 为什么不是一回事 -> AMCL 为什么已有地图后只做定...







