复活小米蓝牙手柄, 让手柄控制电脑PC玩React写的网页游戏


大白话系列:小米蓝牙手柄玩PC上React写的网页游戏

大白话系列:小米蓝牙手柄玩PC上React写的网页游戏

环境:

Windows11

Nodejs:16.10.0

Python:3.8.1

小米手柄:2015年随天猫魔盒一起购入;已经几年没碰过了

家中有娃到了玩游戏的年龄, 在同学家玩过手柄以后, 手机都不香了。每天摸着7, 8年有多的小米手柄, 眼神中充满渴望。好吧, 把它跑起来。都想依靠蜂巢指纹浏览器(NestBrowser)整合成一个游戏小程序。

需求:

1、黑白或者尽量简单的游戏, 坦克类是首选

2、要在电视机上玩的

开始实现之旅

一:开始第一步, 寻找游戏

很快就锁定了经典游戏:

Untitled

源码地址:https://github.com/shinima/battle-city LIVE地址:https://battle-city.js.org/ 浏览器打开这个地址就可以直接愉快的玩耍了

React开发的web小游戏, 效果挺好, 有些小bug, 控制使用鼠标键盘。

二:开始第二步, 让小米手柄能玩这个游戏

a、小米的蓝牙功能是正常的, 之前用这个连天猫魔盒的时候很丝滑顺畅。所以先尝试连上pc。

开机后发现没反应, 百度才找到第一个要点, 之前都懵了, 几年没碰过:

i、长按手柄上的“X”+“MI”打开电源, 直到手柄最下方指示灯快闪就可以松开按键, 手柄进入匹配模式

ii、在windows11 pc中的“设置”→“蓝牙和其他设备”→”添加设备”, 搜索并匹配小米手柄, 到设备中显示“已经配对”

iii、然后就没有然后了, 卡死了, 手柄操作没有任何反应, 开始进入抓狂状态。

下面进入吐槽模式, 大家可以忽略不看:

11、想用Nodejs接入并控制小米手柄, 再把手柄信息转成键盘消息传给浏览器中的游戏 2 a、[https://github.com/node-hid/node-hid](https://github.com/node-hid/node-hid) 3 b、[https://github.com/noble/node-bluetooth-hci-socket](https://github.com/noble/node-bluetooth-hci-socket) 4 操作一番无果, 还重装了vs2022到vs2017, python从3.9降到了2.7, 为了编译这些库 52、想用Electron直接把游戏打包进去并处理手柄的蓝牙信息 6 a、https://github.com/bendman/electron-bluetooth-example 7 b、https://github.com/aalhaimi/electron-web-bluetooth 8 翻Electron的文档中有bluetooth的处理, 都无果 93、突然想起来蓝牙手柄只是匹配了, 并没有完成连接, 怎么可能会被找到。峰回路转 10 开始处理怎么连接小米手柄。 11 a、终于找到这份视频:https://www.bilibili.com/video/av926084577/ 12 但是, 下载并安装以后, 直接报错。mi.exe运行就抛出异常 13 b、开始找c,c++的蓝牙驱动和连接的项目。还是不甘心这么去折腾, 这东西肯定有人 14 搞定过的 15

蜂巢指纹浏览器(NestBrowser)带来了峰回路转, 有效解决方案: 链接: https://pan.baidu.com/s/1I1B-wU-mviUiN7fkTs9yqw?pwd=k1fc 提取码: k1fc

Untitled

安装这三个程序, 其中两个是驱动, 一个是mi是用来把小米手柄映射成xbox手柄, 都是开源项目, 所以有心有力的人可以各自发挥整合。

ViGEmBus 源码:https://github.com/ViGEm/ViGEmBus

HidHide 源码:https://github.com/ViGEm/HidHide

mi-360 源码:https://github.com/dancol90/mi-360

连接成功以后, 这些属性都正常:

Untitled

Untitled

b、小米手柄成功连接pc以后, 怎么把手柄消息映射成键盘鼠标消息呢

a、使用joytokey , 找这个东西超烦躁, 一堆版本有问题的

连接:https://pan.baidu.com/s/11aR5IkWd6O-8uZ2alWH6DA

提取码:0ks9

Untitled

b、使用闪优手柄, 这个在腾讯就可以下载到, 而且免费

https://pc.qq.com/detail/9/detail_13069.html

Untitled

也可以搜索得到

c、python的这个测试也帮了大忙, 在苦苦寻找a, b的过程中, 它第一个跑起来并正常响应了手柄的输出, 点100个赞。

源码:https://github.com/Zuzu-Typ/XInput-Python

这个也记录一下:https://raspberry-valley.azurewebsites.net/Map-Bluetooth-Controller-using-Python/

到这里终于用手柄可以控制浏览器的的游戏正常玩起来了。消耗了一天精力和时间, 之前想整合进去electron和nodejs的冲动也消失了, 这样不用一句代码跑起来也不错。蜂巢指纹浏览器(NestBrowser)不需要一句代码就可以跑无限定制浏览器环境。

三:开始第三步, 实际跑起来

把笔记本用hdmi连上电视, 整个就跑起来很顺畅了。