任天堂 3DS 可以利用 AP 來當作擦身中繼站,但是同一個 AP 的 MAC Address 限制每次擦身都要相隔八小時,那我們不斷的換 MAC Address 總可以吧 XD
1. 使用 ssh 連上 AP:
$ ssh root@192.168.1.1
2. 以 root 登入 OpenWrt 之後,於 /usr/bin
建立 Shell Script 檔案:
$ vim /usr/bin/homepass
這邊參考〈OpenWrt实现3DS的StreetPass Relay擦肩HomePass〉的範例:
#!/usr/bin/lua
require("uci")
c = "wireless"
s = "attwifi"
m = "XX:XX:XX:XX:XX:XX" --Your 3DS MAC Address
-- HomePass for OpenWrt
-- By Demon
-- http://demon.tw
x = uci.cursor()
if not x:get(c, "3ds") then
x:set(c, "3ds", "wifi-iface")
x:set(c, "3ds", "device", "radio0")
x:set(c, "3ds", "network", "lan")
x:set(c, "3ds", "mode", "ap")
x:set(c, "3ds", "ssid", s)
x:set(c, "3ds", "encryption", "none")
x:set(c, "3ds", "macfilter", "allow")
x:set(c, "3ds", "maclist", {m})
x:set(c, "3ds", "profile", "0")
end
a = {}
for i = 0, 255 do
table.insert(a, string.format("4E:53:50:4F:4F:%02X", i))
end
i = x:get(c, "3ds", "profile")
i = i and tonumber(i) or 1
i = i + 1
i = (i > #a) and 1 or i
print("Setting profile " .. tonumber(i) ..
". Using ssid " .. s .. " for mac " .. a[i])
x:set(c, "3ds", "profile", tostring(i))
x:set(c, "3ds", "macaddr", a[i])
x:commit(c)
os.execute("wifi reload radio0")
記得要把自己的 3DS MAC Address 填入,限制只讓 3DS 連線。
SSID 已改用「attwifi」(實際測試過「NZ@McD1」、「NZ@McD」皆無法正常擦身)。
3. 儲存後,必須修改權限讓檔案可被讀取及執行:
$ chmod 755 /usr/bin/homepass
4. 再將腳本加入排程中定時執行:
$ crontab -e
加入每隔兩分鐘就執行一次的設定:
*/2 * * * * /usr/bin/homepass | logger -t homepass
5. 最後啟用排程:
$ /etc/init.d/cron start
$ /etc/init.d/cron enable
現在闔蓋待機的 3DS 就會自動透過擦身中繼 AP 和全世界的玩家擦身囉~