My original 2.4ghz script that i posted here was incomplete and as such I have taken it down. In its stead is a 5Ghz script that I am pretty sure has only one flaw and that is if another 5ghz router has channels with 5mhz or 10mhz channel width it wont read through it properly. as it is not possible to set 5mhz or 10mhz channel width in mikrotik routers I can not write it to look for them. I know I have seen 5mhz channels before on a scan with one of my outdoor antennas before though.
so if you are able to get a scan with 5mhz or 10mhz widths please post the file on here so i can alter the script to accommodate for them.
by default the channel exclusion list found three times(one for 20mhz, one for 40mhz, one for 80mhz) in the end section is set for canada country. you must change this setting to comply with your countries frequency regulations
this script requires you to have 5ghz interface named as "wlan2" for people with triband audiences this will only work on 1 of your 5ghz interfaces.
How to use:
1. Select Desired Channel width on wlan2 interface. must be ce or ceee for 40mhz or 80mhz channels respectively
2. /interface wireless wlan2 scan duration=30s save-file=Scan5.rsc
3. Edit Script Exclusions (last part of script) to match your countries frequency regulations.
3. Execute Script.
tested 6.48 (Hapac3)
Code: Select all
{
:local Scan
:local ScanLine
:local LineEnd
:local Scans [:toarray ""]
:local ScansSignal
:local CurrentChannel value=0
:local Channel [:toarray {5180;5200;5220;5240;5260;5280;5300;5320;5340;5360;5380;5400;5420;5440;5480;5500;5520;5540;5560;5580;5600;5620;5640;5660;5680;5700;5720;5745;5765;5785;5805;5825}]
:local HighestSignal [:toarray {-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100;-100}]
:local BestChannel
:local z value=0
:local i value=0
#Set Array Of Scanned AP's CurrentChannel and signal
:set $Scan value=[/file get Scan5-test.rsc contents]
while ($z = 0) do={
:set $LineEnd value=[find $Scan "\n"]
:set $ScanLine value=[pick $Scan 0 $LineEnd]
foreach y in={"802.11";"nstreme";"nv2"} do={
foreach x in={"/ac";"/an/";"/a/";"/a("} do={
if ($ScanLine~"$y" && $ScanLine~"$x") do={
:set ($Scans->$i) value=[:pick $ScanLine ([find $ScanLine ",5"] + 1) [find $ScanLine "$x"]]
:set $ScansSignal value=[:pick $ScanLine [find $ScanLine ",-"] ([find $ScanLine "$y"] -1)]
}
}
}
:set ($Scans->$i) value=[($Scans->($i) . ($ScansSignal))]
:set $Scan value=[:pick $Scan ($LineEnd +1) 999999999]
if ([:len $Scan] > 20) do={
:set $i value=($i + 1)
} else={
:set $z value=1
}
}
#Find HighestSignal On each channel based on channel width, loops twice to account for newly added channels
:set $z value=(0)
while ($z < 2) do={
foreach k,v in=$Scans do={
#For Ceee Channels
if ([:pick [($Scans->$k )] 0 4] = ($Channel->$CurrentChannel) && ([:pick ($Scans->$k) 8 12] = "Ceee")) do={
if (([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > -100) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->$CurrentChannel)) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel + 1))) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel + 2))) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel + 3))) \
) do={
:set ($HighestSignal->$CurrentChannel) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel + 1)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel + 2)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel + 3)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
}
}
#for eCee
if ([:pick [($Scans->$k )] 0 4] = ($Channel->$CurrentChannel) && ([:pick ($Scans->$k) 8 12] = "eCee")) do={
if (([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > -100) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->$CurrentChannel)) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel - 1))) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel + 1))) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel + 2))) \
) do={
:set ($HighestSignal->$CurrentChannel) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel - 1)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel + 1)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel + 2)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
}
}
#for eeCe
if ([:pick [($Scans->$k )] 0 4] = ($Channel->$CurrentChannel) && ([:pick ($Scans->$k) 8 12] = "eeCe")) do={
if (([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > -100) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->$CurrentChannel)) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel - 1))) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel - 2))) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel + 1))) \
) do={
:set ($HighestSignal->$CurrentChannel) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel - 1)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel - 2)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel + 1)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
}
}
#for eeeC
if ([:pick [($Scans->$k )] 0 4] = ($Channel->$CurrentChannel) && ([:pick ($Scans->$k) 8 12] = "eeeC")) do={
if (([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > -100) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->$CurrentChannel)) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel - 1))) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel - 2))) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel - 3))) \
) do={
:set ($HighestSignal->$CurrentChannel) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
set ($HighestSignal->($CurrentChannel - 1)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel - 2)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel - 3)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
}
}
#For Ce
if ([:pick [($Scans->$k )] 0 4] = ($Channel->$CurrentChannel) && ([:pick ($Scans->$k) 8 12] = "Ce,-")) do={
if (([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > -100) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->$CurrentChannel)) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel + 1))) \
) do={
:set ($HighestSignal->$CurrentChannel) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel + 1)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
}
}
#For eC
if ([:pick [($Scans->$k )] 0 4] = ($Channel->$CurrentChannel) && ([:pick ($Scans->$k) 8 12] = "Ce,-")) do={
if (([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > -100) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->$CurrentChannel)) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->($CurrentChannel - 1 ))) \
) do={
:set ($HighestSignal->$CurrentChannel) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
:set ($HighestSignal->($CurrentChannel + 1)) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
}
}
#For 20MHZ Wide Channels
if ([:pick [($Scans->$k )] 0 4] = ($Channel->$CurrentChannel) && ([:pick ($Scans->$k) 5 8] = "20,")) do={
if (([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > -100) \
&& ([:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20] > ($HighestSignal->$CurrentChannel)) \
) do={
:set ($HighestSignal->$CurrentChannel) value=[:pick ($Scans->$k) ([find ($Scans->$k) ",-"] +1) 20]
}
}
}
if (([:len $Channel] -1) = $CurrentChannel) do={
[:set $z value=($z + 1)]
:set $CurrentChannel value=0
} else={
:set $CurrentChannel value=[($CurrentChannel +1)]
}
}
#Select Best Channel Based on Signal, Automatically chooses channelwidth based off of currently set channel width
#Default Setting is for Canada country setting, Skipping DFS Channels but you can change the excluded channels lists to fit your needs
#You must change the excluded channel in whichever channel-width you want to suit your needs in the script below, or all three.
:local Bool
if ([/interface wireless get wlan2 channel-width] = "20mhz") do={
foreach k,v in=$HighestSignal do={
set $Bool value="true"
foreach x,i in=$Channel do={
# add Exclusion Channels on second line from here ie."&& $k != 1" 0=5180 1=5200...etc
if (($v <= ($HighestSignal->$x))&& ($Bool = "true") \
&& ($k != 7 && $k != 8 && $k != 9 && $k != 10 && $k != 11 && $k != 12 && $k != 13 && $k != 14 && $k != 15 && $k != 16 && $k != 17 && $k != 18 && $k != 19 && $k != 20 && $k != 21 && $k != 22 && $k != 23 && $k != 24 && $k != 25 && $k != 26) \
) do={
:set $Bool value="true"
} else={
:set $Bool value="false"
}
}
if ($Bool = "true") do={
:log warning message=($Channel->$k)
:set $BestChannel value=($Channel->$k)
}
}
/interface wireless set wlan2 frequency=$BestChannel
}
if ([/interface wireless get wlan2 channel-width] = "20/40mhz-Ce") do={
foreach k,v in=$HighestSignal do={
:set $Bool value="true"
foreach x,i in=$Channel do={
# add Exclusion Channels on second line from here ie "&& $k != 1" 0=5180 1=5200...etc
if (($v <= ($HighestSignal->$x)) && (($HighestSignal->($k + 1)) <= ($HighestSignal->$x)) && ($Bool = "true") \
&& ($k != 7 && $k != 8 && $k != 9 && $k != 10 && $k != 11 && $k != 12 && $k != 13 && $k != 14 && $k != 15 && $k != 16 && $k != 17 && $k != 18 && $k != 19 && $k != 20 && $k != 21 && $k != 22 && $k != 23 && $k != 24 && $k != 25 && $k != 26 && $k != 31) \
) do={
:set $Bool value="true"
} else={
:set $Bool value="false"
}
}
if ($Bool = "true") do={
:log warning message=($Channel->$k)
:set $BestChannel value=($Channel->$k)
}
}
/interface wireless set wlan2 frequency=$BestChannel
}
if ([/interface wireless get wlan2 channel-width] = "20/40/80mhz-Ceee") do={
foreach k,v in=$HighestSignal do={
:set $Bool value="true"
foreach x,i in=$Channel do={
# add Exclusion Channels on second line from here ie "&& $k != 1" 0=5180 1=5200...etc
if (($v <= ($HighestSignal->$x)) && (($HighestSignal->($k + 1)) <= ($HighestSignal->$x)) && (($HighestSignal->($k + 2)) <= ($HighestSignal->$x)) && (($HighestSignal->($k + 3)) <= ($HighestSignal->$x)) && ($Bool = "true") \
&& ($k != 5 && $k != 6 && $k != 7 && $k != 8 && $k != 9 && $k != 10 && $k != 11 && $k != 12 && $k != 13 && $k != 14 && $k != 15 && $k != 16 && $k != 17 && $k != 18 && $k != 19 && $k != 20 && $k != 21 && $k != 22 && $k != 23 && $k != 24 && $k != 25 && $k != 26 && $k != 29 && $k != 30 && $k != 31) \
) do={
:set $Bool value="true"
} else={
:set $Bool value="false"
}
}
if ($Bool = "true") do={
:log warning message=($Channel->$k)
:set $BestChannel value=($Channel->$k)
}
}
/interface wireless set wlan2 frequency=$BestChannel
}
}