openwrt开启无线漫游/802.11r/mesh
文章目录
所谓无线漫游简单理解就是多个路由器,多个wifi. 当手机信号差的时候自动切换信号强的wifi.可以做到无感知切换.
从WIFI覆盖问题说起
单个路由器很难做到家里都覆盖.
那么有两个方案.
1,加大路由器WIFI功率.比如购买大功率的AP或者大功率的路由器.
2,加路由器数量.比如每个房间放一个.
原来是设置相同WIFI,相同密码.这样,也会切换WIFI,但是要在信号差到手机自动断开的时候才会切换另外的.
802.11r就完美解决这个问题(这不是新鲜玩意.很多年前的标准了.)
它使得WIFI之间切换平滑,无感知. 它可以叫做 "无缝漫游".
从17年开始,openwrt的luci已经带这个功能了,而且设置很简单.
软件包
wpad (1907版好像看不到这个包了,应该是默认集成了)
wpad-mesh-openssl 或者 其他ssl
路由器基本设置
我家是客厅 主路由器,
书房 和主卧各一个.
3个路由都是大麦的DW33D. (并不要求同一个型号路由器,我是图烧录固件方便.而且这个路由器便宜.)
通过有线链接. (房间埋了网线,)当然用无线桥接也可以,不过意义不大.
主路由
基本宽带拨号,其他暂时不需要设置.
(我自己改了子网掩码.不作说明)
IP我设置为192.168.2.1
二级路由
关闭DHCP(建议操作) :
网络--接口--lan(编辑)--DHCP服务器--勾选 忽略此接口
DHCP的 IPV6设置中继模式
修改二级路由器IP,我两个二级路由器.分别设置LAN口IP
192.168.2.5
192.168.2.4
网关ip指向主路由器(非必须)
网络--接口--lan(编辑)--常规设置--IPV4网关
如果关闭了DHCP,那么用网线 连接二级路由的LAN 口和主路由Lan口. (也就是路由器当交换机的用法.)
漫游设置
我这里以2.4G为例子,5G的无线漫游方式相同.
前面准备
复制三个路由器无线的2.4G网络mac值.(要组5G网络漫游就复制5G的)
有几个路由器就复制几个.
自己新建一个文档存起来.
比如我的是
主
14:3D:F2:CA:33:04
二级
14:3D:F2:CB:E8:6C
14:3D:F2:CD:08:2C
整理下
第一行是mac,
第二行是去掉了冒号的mac
第三行是mac进行MD5计算得到的32位值(这个可以自己弄个随机32位值)我觉得还是MD5方便点.正好32位长.
主
14:3D:F2:CA:33:04
143DF2CA3304
DB0B9F1219D167C9F2BC3B4158881C91
二级路由
①
14:3D:F2:CB:E8:6C
143DF2CBE86C
A8B47AC7692C3B5B9ED28733793A0160
②
14:3D:F2:CD:08:2C
143DF2CD082C
3CC605EFAAF35407887B0C2C12339E7D
NAS ID和R1 密钥持有者
每个路由器都不一样
这两个值都填自己路由wifi的mac值(去掉冒号的)
外部 R0KH 列表
这里所有路由器填写内容都一样.
有多少个路由器,就添加多少行.
每行分别是每个路由器的.
mac,不带冒号mac,mac的MD5值
用英文逗号分隔
14:3D:F2:CA:33:04,143DF2CA3304,DB0B9F1219D167C9F2BC3B4158881C91
外部 R1KH 列表
这里也是,所有路由填写内容都一样.
有多少个路由器,就添加多少行.
每行分别是每个路由器的.
mac,mac,mac的MD5值
用英文逗号分隔
14:3D:F2:CA:33:04,14:3D:F2:CA:33:04,DB0B9F1219D167C9F2BC3B4158881C91
R1 推送PMK
这个请务必勾选,如果不勾选,有些设备不会自动切换.
wifi名字和密码
所有路由器wifi名字相同密码相同,加密方式相同.
信道
暂时我所有信道都是一样.
不过之前看到一种说法要错开信道.
这个待验证后再补充.
漫游测试
丢包是因为我两个二级路由器都是没有天线的,
裸板路由器.没有外壳没有天线的路由器.
因为淘宝买来更便宜. 50包邮两个DW33D(仅主板,要自己配电源,配天线)
天线我准备自己画.
我参考网上的图,自己画了几个PCB天线.
打板中,过几天看看那种天线效果好.
更新
打好了天线的PCB板子了.
准备把天线加上去.试试效果
测试效果
不丢包了.
补充
- 多个路由器,产品型号不一定要一个.只要刷了支持802.11r的都可以.
- 如果已经配置好了,如果有个路由器不想用,可以关掉,不影响其他路由器漫游功能.
- 如果还要添加,要所有路由器里面都加上去.
弱信号踢出
我原来是ZTE AXON 7手机,自己刷了linage os安卓9系统,能自动切换.
后面我换了LG 某个手机,也是安卓9, 发现无法自动切换.除非信号差的非常厉害.才会.
然后就需要用到弱信号踢出了.这样手机会再次自动连接比较强的节点.
脚本
原作者的链接--> https://github.com/smallerxie/wifi-kickout/blob/master/kickout.sh
下面是完整搬运过来的
有个 -75dBm的阀值,
里面也有白名单mac,
同时支持2.4G和5G网络.
#!/bin/sh
### kickout.sh #####
# threshold (dBm), always negative
thr=-75
# mode (string) = "white" or "black", always minuscule !
# black: only the clients in the blacklist can be kicked out.
# white: kick out all the clients except those in the whitelist.
mode="white"
# In "black" mode, only the clients in the blacklist can be kicked out.
blacklist="00:00:00:00:00:00 00:00:00:00:00:00"
# In "white" mode, the clients in the whitelist will not be kicked out.
whitelist="00:00:00:00:00:00 00:00:00:00:00:00"
# Specified logfile
logfile="/tmp/kickout-wifi.log"
datetime=`date +%Y-%m-%d_%H:%M:%S`
if [[ ! -f "$logfile" ]]; then
echo "creating kickout-wifi logfile: $logfile"
echo "$datetime: kickout-wifi log file created." > $logfile
fi
# function deauth
function deauth ()
{
mac=$1
wlan=$2
rssi=$3
echo "kicking $mac with $rssi dBm (thr=$thr) at $wlan" | logger
echo "$datetime: kicking $mac with $rssi dBm (thr=$thr) at $wlan" >> $logfile
ubus call hostapd.$wlan del_client \
"{'addr':'$mac', 'reason':5, 'deauth':true, 'ban_time':3000}"
# "ban_time" prohibits the client to reassociate for the given amount of milliseconds.
}
# wlanlist for multiple wlans (e.g., 5GHz/2.4GHz)
wlanlist=$(ifconfig | grep wlan | grep -v sta | awk '{ print $1 }')
#loop for each wlan
for wlan in $wlanlist
do
maclist=""; maclist=$(iw $wlan station dump | grep Station | awk '{ print $2 }')
#loop for each associated client (station)
for mac in $maclist
do
echo "$blacklist" | grep -q -e $mac
inBlack=$? #0 for in Blacklist!
echo "$whitelist" | grep -q -e $mac
inWhite=$? #0 for in Whitelist!
if [ $mode = "black" -a $inBlack -eq 0 ] || [ $mode = "white" -a $inWhite -ne 0 ]
then
rssi=""; rssi=$(iw $wlan station get $mac | \
grep "signal avg" | awk '{ print $3 }')
if [ $rssi -lt $thr ]
then
##skip wlan if necessary
#if [ $wlan = wlan0 ];then
# echo "ignored $mac with $rssi dBm (thr=$thr) at $wlan" | logger
# echo "$datetime: ignored $1 with $rssi dBm (thr=$thr) at $wlan" >> $logfile
# continue
#fi
##
deauth $mac $wlan $rssi
fi
fi
####
done
done
####
# sleep 10s and call itself.
#sleep 10; /bin/sh $0 &
###
定时任务
每1分钟运行一次
crontab -e编辑计划任务
*/1 * * * * /bin/sh /root/kickout.sh
我脚本文件是保存在 /root/kickout.sh ,如果每分钟无法满足可以自己再写过一些脚本,实现多少秒级别的延时.
参考
https://post.smzdm.com/p/ar07p90z/pic_13/
http://www.wifizoo.net/archives/517
https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=337083&extra=&ordertype=1&mobile=no