自组织网络设计和开发


前言

  1. 功能
    正常组网都是需要人工在各个节点上输入 SSID、密码、信道完成组网的;如果是远距离基站组网,那么用的设备数量就会比较少,但是距离遥远,每个站点都需要人工控制;如果是短距离组网,就意味着节点数量多,那么人工操作就会繁琐。如果可以将设备安置好位置后,一键上电,设备会自动连接,那么就可以避免繁琐重复的人工操作。
  2. 前置模块
    wpa_supplicant、libev
    wpa_supplicant 是开源项目,是 wifi 驱动的标配工具,用于管理 wifi 的所有功能。
    libev 也是一个开源项目,通过 libev 可以实现异步事件的任务框架,但是 libev 的实现实际上也用到了多线程。
  3. 工具源码
    wpa_supplicant 移植:https://blog.csdn.net/eastcnme/article/details/90701368
    libev 源码包:​http://dist.schmorp.de/libev/​

一、软件设计

主函数

在这里插入图片描述
接收广播事件是 libev 的核心操作,根据不同的广播回调不同的任务,因为多线程有很多缺陷,而且任务太多了不好维护,不符合设计模式的理念,使用事件驱动可以避免了使用多线程;但是多线程在不违背设计模式的时候是非常常用的,前提是线程处理内容一定不能复杂,不能存在多重回调。
master 模式:两个无线网卡都是 AP
client 模式:两个无线网卡分为 AP 和 STA
master 用于首尾防止网络回环,产生网络风暴。

AP 事件回调实现

在这里插入图片描述
AP 要处理的事件并不多,主要是记录消息,如果需要对接入的 STA 做其他操作,也可以根据 80211.h 文件中的事件和属性来继续添加。

STA事件回调实现

在这里插入图片描述
STA 事件回调注册了4个事件通知。4个事件就是 wifi 连接流程的顺序。其中在扫描事件结果中,通过 wpa_cli 的源码接口来控制 wifi 连接。

定时器任务

在这里插入图片描述
STA 定时器任务很重要,检查是否已经有连接,如果没有连接,才会执行通知内核发起扫描事件。内核发出扫描事件后,STA 事件监听模块通过 netlink 监听到事件才会发起扫描、检查扫描结果、筛选AP、发起连接。

二、wpa_cli 工具

wpa_cli 是 STA 的控制工具,可以控制 STA 连接/断开 AP。

  1. 设置无线网口信息:
wpa_cli -i wlan0 set_network 0 ssid '"name"'
wpa_cli -i wlan0 set_network 0 key_mgmt NONE

只要 AP 和 STA 的 name 相同,那么 STA 就会连接 AP。
key_mgmt NONE 表示不使用密码,如果要使用密码,可以执行下面这句:

wpa_cli_prs -i wlan0 set_network 0 psk '"psk"'

psk 表示密码,长度要求至少 8 位。

  1. 分配ip/netmask/gateway/dns
udhcpc -i wlan0 -s /etc/udhcpc.script -q

执行完毕,就可以连接网络了。

  1. 连接 AP

连接第1个保存的连接

wpa_cli -i wlan0 select_network 0

使能第1个保存的连接

wpa_cli -i wlan0 enable_network 0
  1. 断开 AP
wpa_cli -i wlan0 disable_network 0

wpa_cli 的命令远不止这些,但是项目中主要就用这些接口。我们可以通过 system 函数来执行 wpa_cli,但是这样有进程的开销,对于一个追求极限性能的无线通信设备来说还有一些小小的不划算。那么可以剥离 wpa_cli 的源码,直接将 wpa_cli 的主要主要接口封装到项目代码中。程序健壮性,接口隔离原则一下子就全有了,后期维护也会比较轻松。

wpa_cli 源码分析参考:https://blog.csdn.net/eastcnme/article/details/90728347

UCI 接口

因为采用的文件系统是 openWrt,无线配置是通过 uci 接口设置的。同样可以通过 system 函数创建进程,但是我们依然不采用 system。uci 本身也是 openWrt 的一个模块,是个模块就有它的源码。通过拆解 uci 的源码一样可以做到代码中设置无线配置。

UCI 接口使用教程:https://blog.csdn.net/qq_41453285/article/details/102527800

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值