背景
我和我的团队曾经开发过一款基于蓝牙连接的智能家居产品,但由于市场的原因,这个产品和项目已经停止了。最近,想用手上剩下的存货做一些使用电脑与硬件连接应用实验。
然后发现在电脑平台下进行蓝牙开发,远远没有在 Andorid / iOS 上简单。主要问题如下:
- 蓝牙硬件
我所使用的开发电脑并没有蓝牙,于是我在网上买了一个USB蓝牙适配器,但收到货以后,装上后的确是免驱动的,可以传文件,连接蓝牙耳机,但却不能和我的设备进行通讯。搜索了一下资料,发现 Window 自带的蓝牙开发比较复杂,对于没 Window 开发经验的我,Window 蓝牙那套 Api 简直天书一样,到这里是第一次放弃。 - Linux / MacOS 的 Gatttool 工具
后来有一段时间使用 Ubuntu 做开发。然后无意中发现那个 USB蓝牙适配器在 Ubuntu 下也是免驱的,然而系统有一个hcitool
的工具,可以比较轻松的完成与蓝牙设备的搜索、连接、传输数据。并且使用pygatt
库可以完成我的大部分需求,但是,在 Window 下并没有这个工具,而且,使用 Python 编写 GUI 也不是太方便,使用 Web 作为 GUI,又涉及到部署,不方便转移,到这里,我完成了设备的指令代码封装就又一次搁浅了。 - noble 再三尝试
Node.js 有一个库叫 Electron,可以通过 JavaScript、HTML、CSS 比较简单的构建跨平台的桌面应用。所以想如果能用 Node.js 去完成这个需求,那也是不错。于是就找到了 noble 这个库。然而,这个库在 Window 上也是没能简单的使用,却在树莓派上成功安装了。这由回到了上面的问题,不能做成桌面应用,就不大方便了,于是再一次搁浅。
新进展
最近有新的需求,需要使用 Electron ,于是最近有研究一下 Node.js,然后又开始心痒痒去研究下这个 noble 库。然后发现之前在 Window 平台上安装,并没有按照它的介绍先去安装依赖以及替换 USB 蓝牙适配器的驱动,所以才会造成安装失败。
然后经过我仔细看说明,然后尝试了一番,终于可以完成 noble 的安装,以及能正常使用。以下是一个搜索的 Demo:
图中可以看到,可以正常使用 noble 搜索到我附近的设备,其中 Upots 是我的设备,另外一个是手上的小米手环3。
依赖安装
noble 在 Linux 和 MacOS 上的安装还是比较简单的,所以可以参考 noble/github 上的介绍就可以了。以下着重演示以下 Window10 下的依赖安装和驱动替换。
首先,我们需要安装的是 node-gyp / github。
在 WIndow 下安装,需要先使用管理员权限打开 powershell 或者 CMD命令行工具,这里推荐使用 powershell。打开后,输入以下命令:
npm install --global --production windows-build-tools
等待安装完成后即可。
然后,我们需要继续安装 (node-bluetooth-hci-socket / github)[https://github.com/noble/node-bluetooth-hci-socket#windows] 库,在安装之前,我们需要先替换我们的 USB蓝牙适配器驱动。这里要注意的是,当我们替换掉驱动以后,我们就不能在 Window 设置里面使用蓝牙了,如果想要恢复,可以通过 设备管理器-打开设备-更新驱动
把驱动替换回来。
替换驱动我们需要使用一个 Zadig 的工具,下载后,打开软件,然后选择 Option - List All Devices
,再在下拉菜单中选中我们的设备,我这款绿联的USB蓝牙适配器的名称是 CSR8510 A10,关于这个蓝牙的名称,可以在 设置 - 蓝牙和其他设备
中查看。
选择好以后,选择 Reinstall Diver
,等待片刻即可。
完成上面的替换驱动操作后,再使用下面的代码安装 node-bluetooth-hci-socket 即可:
npm install bluetooth-hci-socket
最后,我们再把 (noble / github)[https://github.com/noble/noble] 安装好即可:
npm install noble
测试
接下来,我们可以测试一下我们的安装和配置是否成功。scan.js / tigoe github 这是在 Github 上的一个 noble 扫描设备的 Demo,可以下载这个程序,测试一下,如果安装正确,就能看到能搜索出来我们周边的蓝牙设备。
后续
到这里为止,我仅仅是完成了这个库的配置和基本的搜索测试,接下来,将继续研究一下内容:
- 连接设备
- 发送指令
- Electron 结合开发桌面应用
参考资料
tigoe/BluetoothLE-Examples
noble/noble
nodejs/node-gyp
noble/node-bluetooth-hci-socket