我们暂时还没有现成采用AltBeacon形式的Beacon,但手上有不少蓝牙开发板。蓝牙开发板是具有智能蓝牙功能的微控制器(MCU),其内部一般都内置了蓝牙协议栈。由于开发板一般都具有丰富的外设接口和引线,因此开发板通常用来搭建产品的原型可以将编译生成的固件直接烧入到开发板当中,甚至可以直接做成产品功能展示,或是单纯用于试验或学习。我决定用自己手上既有的几块开发板来创建Beacon应用,然后测试一下安卓博物馆导览APP。
我使用的是Bluegiga DKBluetooth Low Energy开发套件和英特尔Edison开发板。Bluegiga开发板的编程采用BGScript脚本语言。英特尔Edison运行的是则Linux,编程语言有多项选择。我习惯用由JavaScript框架驱动的Node.js,这样能找到适用的智能蓝牙的功能包或是库文件。
Bluegiga变身AltBeacon
Bluegiga的BGScript脚本语言简单易懂,且配有Bluegiga框架所提供的丰富的功能库。用BGScript创建Bluegiga应用涉及用文本编辑器创建脚本文件和其他项目配置文件。通过Bluegiga SDK中的软件更新工具,就可以直接通过USB将编译生成的固件烧入到开发板上。
脚本包括变量和数组声明、事件处理器回调函数。回调是编程模型的重要部分,调用标准Bluegiga功能函数会促发相关的回调函数。同样,框架也可以调用事件处理器,以回应脚本之外的情况。
在任何平台上实现Beacon都涉及与通用访问配置文件(Generic Access Profile, GAP)协作,要求设置广播数据包内容、配置广播参数。
Bluegiga AltBeacon实施的要素如下图:
先从变量声明开始。
图11 – 数组声明
广播的设置可以在Bluegiga标准事件处理器“system_boot”中完成,开发板接通电源或重置之后,系统会调用“system_boot”。我先设置了包含Flags字段数组,Flags字段包括许多位,从每一位都能看出Bluetooth Smart和/或Bluetooth BR/EDR的支持方式。
广播数据包中可能包含的字段称为广播数据类型(ADV data types),蓝牙核心规格附录的A部分(数据类型规格)对其有明确定义。广播数据类型的标准结构,包括一个单一字节长度字段 (它的值不包括长度字段本身占有的字节)、一个单一字节数据类型字段。GAP编号文档中定义了数据类型值。
下面是初始过程的首部分代码:
图12 –在system_boot事件处理器中定义flags广播类型
在本系列文章的第一篇中,我介绍了AltBeacon形式并解释了GAP 制造商特定数据广播字段中编码的数据。我在同一数组内的后20字节中填入了这些数据。
图13 – 定义制造商特定数据字段中的AltBeacon数据
然后为Beacon设备设置名称,这一名称今后可以显示在Central设备(主要是智能手机)返回的扫描结果中。它的值是另一个广播类型,因此我将它设立在它自己的数据里。可以看到,指定的本地名称就是AltBeacon。
图14 – 建立用于扫描响应的本地名称
配置广播参数包括调用Bluegiga的一些功能、数组。
图15 – 配置GAP 广播
这样,我的Bluegiga定制AltBeacon准备就绪。
图16 –蓝兆科技DKBLE上的AltBeacon
另一种选择:英特尔Edison上的AltBeacon
Node.js是模块化设计,有多种用途的模块供选用。对于Node.js来说,模块与库类似。“Bleno”模块能够为担任蓝牙GAP外设的应用提供诸多功能,如GATT配置文件的定义和实施。它是开源的,由Sandeep Mistry创建。SandeepMistry还创建了Noble模块,可以用来创建GAP中央模式设备的相关软件。Bleno和Noble都位于github上。
Bleno的标准分布不支持AltBeacon形式,但却支持iBeacon。因此,我复制了Noble github 仓库并改写了Bleno,这样就可以生成AltBeacon形式的GAP广播了。下面就跟大家介绍一下是怎么改写的。
我在标准的bleno.js源文件上添加了新功能,然后就可以根据node.js应用的一系列既设参数启动广播了。新功能代码就长以下这个样子:
图17 –bleno/lib/bleno.js中的新功能
这一代码基本上就是将必须的AltBeacon数据填充到缓冲区,然后调用添加至Linuxbindings.js源文件中其他功能。Bleno可以与Linux上的BlueZ蓝牙协议栈协作,当在基于Linux的平台上执行功能时,Bleno所引出的用于多种应用的功能最终被映射到针对BlueZ功能的调用。我只好对Bleno中Linux相关的部分作一些修改,这样才能支持AltBeacon。
图18 –bleno/lib/linux/bindings.js中的新功能
图19 –bleno/lib/linux/hci-ble.js中的新功能
这些功能所作的就是准备一个和Bluegiga开发板类似、包含所有必需广播数据的缓冲区,然后将其传递至、并通过Bleno API层,最终到达BlueZ的主机控制接口(Host Controller Interface,HCI)。
AltBeacon Node.js 应用
Bleno经修正之后就可以支持AltBeacon了, 剩下的就是使用新的bleno模块来创建node.js应用,然后使用AltBeacon形式开始广播。整个应用就是下图中的7行代码。
图20 –AltBeacon node.js 应用
为运行AltBeacon APP,我使用Putty通过SSH或是telnet建立了与英特尔Edison的终端会话,然后运行命令行里的node app.js。
图21 – Putty建立终端对话