- alberthink
-
38 发帖1 回复462 积分
- 私信他 + 关注
作为无线连接设备,蓝牙一直以来都被认为是智能手机附件的必备技术。对于一直在扩大影响力的低功耗蓝牙以及蓝牙5、蓝牙mesh来说,在工业以及其他非消费类应用中,如何与PC、平板、嵌入式终端打交道成了蓝牙技术应用的一个重要的议题。问题在于,各家都会说自己的设备具有蓝牙连接的能力,然而软件使能的蓝牙设备需要针对性的对不同操作系统提供基本的底层应用程序接口API:比方说硬件厂商ST或者Nordic提供了开源的蓝牙开发软件(嵌入式端和app端),但你在将这些代码放到自己的应用中的时候至少还得考虑为Android和iOS或者Windows分别准备一份应用程序:因为各家系统厂商都有他们自己的底层应用程序接口。那么究竟有没有跨平台的软件环境能够提供这种封装好的API呢?
事实上,如果你的电脑装有Chrome浏览器或者Opera浏览器,那么你很可能只需要简单的数行代码就能在浏览器页面上连接你的低功耗蓝牙/蓝牙5/蓝牙mesh设备,在你的个人电脑上,你就不需要借助dongle或者什么cable来访问你的蓝牙设备获取传感器数据或者发送控制指令,这难道不是很令人兴奋的一件事吗?再比方说,蓝牙血糖仪可以将每天的血糖数据上传智能手机app然后再云端可以访问,可是如果我是一个不用智能手机的老古董,我可能就只好用我的个人电脑来上传数据--步骤通常是插上USB线然后balabala。可是如果我们有Web蓝牙的页面和硬件资源(后面会讲到),那么无论何时,我只要访问页面,通过蓝牙将数据导入到Web服务器上,这是不是很方便呢?
蓝牙组织Bluetooth SIG在他的官方网站上有培训资源,其中有一个分类叫做Web Bluetooth Study Guide 和Web Bluetooth Tutorial Series。大家可以到SIG的网站上自行免费下载。我花了一些时间研究学习了一下,然后就完成了一个基本Web Bluetooth的应用。这里我尽可能把我遇到的问题和解决方法记录下来,希望给爱蓝牙的你一些帮助。
首先,我们需要确保有可以使用的蓝牙设备硬件。
PC端WINDOW10以后的电脑的通信芯片组应当都是可以支持低功耗蓝牙的(WINDOW7的设备应当也可以,但我没有官方数据所以各位可以按照本教程做尝试。运行macOS的设备大多都有完备的蓝牙支持,运行Linux的系统可以检查相关的硬件列表和驱动)。
嵌入式端的话,任何一家主推低功耗蓝牙的厂家的开发板或者具有开发接口的demo应当都是可以用来搭建的。我的硬件是:
-
惠普笔记本,操作系统为WINDOWs 10,硬件资源是基于Intel无线芯片组的Bluetooth LE枚举器。
-
BBC Micro:bit,具体的硬件资源可以参考本系列的前述文章,下面有文章的链接。
第二步,为了确保Web浏览器(主要是Chrome)能够顺利访问到电脑的蓝牙硬件,请确认一下电脑主板的蓝牙驱动是否已经是最新的(之前),控制面板中蓝牙是否已经打开,Chrome的版本是否已经是最新的。如果一切就绪,你应当可以在Chrome的浏览器中键入Chrome://Bluetooth-internals看到浏览器正在工作的状态:
如果这些都已经准备妥当,那么我们就可以着手软件的开发了。
在此之前,让我们回顾一下整个蓝牙连接的建立过程。具体连接建立的流程,可以参考Ellisys蓝牙BLE培训视频系列-connections(链接放在这里http://club.digiic.com/Forum/PostDetail/p-10926.html)。
在开发Web脚本前,我们需要确认一下从设备的情况,以Micro:bit为例,代码很简单:
在makecode中为:
bluetooth.onBluetoothConnected(function () {
basic.showLeds(`
. # # # .
# . . . .
# . . . .
# . . . .
. # # # .
`)
})
bluetooth.onBluetoothDisconnected(function () {
basic.showLeds(`
# # # . .
# . . # .
# . . # .
# . . # .
# # # . .
`)
})
bluetooth.startLEDService()
bluetooth.startAccelerometerService()
为方便起见,在makeCode编程选项中勾选Justworks配对(网页编辑器的默认选项就是Justworks自动配对的),避免输入密码的麻烦。
如果是C/C++中编写代码为一下的部分:
#include "MicroBit.h"
MicroBit uBit;
void onConnected(MicroBitEvent)
{
uBit.display.print("C");
}
void onDisconnected(MicroBitEvent)
{
uBit.display.print("D");
}
int main()
{
// Initialise the micro:bit runtime.
uBit.init();
uBit.display.print("X");
uBit.messageBus.listen(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_CONNECTED, onConnected);
uBit.messageBus.listen(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_DISCONNECTED, onDisconnected);
// services: note that the device information service is included by default
// see config.json property microbit-dal.bluetooth. device_info_service
new MicroBitAccelerometerService(*uBit.ble, uBit.accelerometer);
new MicroBitLEDService(*uBit.ble, uBit.display);
release_fiber();
}
代码做了四件事:1.上电初始化时显示“X”;2.准备建立连接(开始广播自己的存在,等待主设备发起连接),显示“D”;3.连接建立完成(主设备发起连接请求后,microbit完成连接建立的过程),显示”C“;4.在microbit(C/S结构中的server端)创建GATT加速度计服务和LED服务。有关microbit以及runtime关于蓝牙连接和服务的建立以及参数调用请参考系列文章http://club.digiic.com/Forum/PostDetail/p-11845.html以及microbit的官方服务网站。
在PC端,我们需要建立web服务,我选择设置我的IIS服务器,从而在https://localhost:8080/访问我的蓝牙服务脚本。注意,蓝牙组织推荐采用加密的网页https来实现Web Bluetooth运用,为了使网页浏览和服务更加安全稳定,我们应当尽可能使用https网页。
下一节,我们就将针对主设备上蓝牙设备发现和建立连接进行脚本的开发。下图是开发完成的界面展示:
该页面可以实现按需扫描、发起、建立与microbit的蓝牙连接,并发现GATT server的服务和属性。在服务/属性发现完成后,可以读取指定的属性值,比如名称服务下的设备名称属性值,或者通过LED服务发送随机LED阵列的样式到microbit,亦或者,注册加速度计Bluetooth服务通知,从而在传感器数据更新时获得实时数据并将它们显示在web页面中。像是这样:
怎样,要不要加入我一起来创建属于你自己蓝牙设备的web Bluetooth页面?
<未完待续>
- 0000000000000000
-
1888 发帖7917 回复34980 积分
- 私信他 +关注
回复于 2019-08-15 2#
厉害了,刚刚试了下,成功搜索并发送数据。我曾经想过在HTML5上与BLE通信,然后实现网页,手机APP使用一套代码。
感觉现在距离想法又近了一步。
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖