制作 iBeacon for Linux 版本

制作 iBeacon for Linux 版本

iOS7之后,apple提出一个室内定位的解决方案iBeacon,它利用蓝牙低功耗(BLE)的通讯方式,进行接收讯号,经过讯号强度来办别距离,所以iBeacon可以达成趋近侦测定位的功能,间接解决当初Apple未加入NFC时,产生的一些疑问。 但iBeacon究竟是怎么完成的?其实它只是在蓝牙发射的封包做一些结构,当收到封包时将它解成有义意的资讯。以下为iBeacon封包的结构,我们会在Linux制作出相容的封包完成iBeacon的功能,

蓝牙Dongle

准备一支有支援Bluetooth LE功能的蓝牙USB装置,而且必需要相容Linux的Bluez Stack,这建议使用Broadcom的产品,经过实验,使用CSR的蓝牙4.0 Dongle似乎有些问题存在。

Bluez

Bluez是在Linux上使用的Bluetooth Stack,所以Dongle有支援Bluez就能正常使用蓝牙的功能,首先要确认一下您的环境是否有安装 Bluez Stack,我们执行相关命令来判断:

sudo hciconfig

这是查询蓝牙周边的命令,安装正确就能列出Bluetooth Dongle

hci0:   Type: BR/EDR  Bus: USB
    BD Address: 00:02:xx:DC:xx:4F  ACL MTU: 1021:8  SCO MTU: 64:1
    UP RUNNING
    RX bytes:1144 acl:0 sco:0 events:71 errors:0
    TX bytes:1173 acl:0 sco:0 commands:71 errors:0

Linux允许你可以安装多个Bluetooth Dongle,在命名上类似网卡一样有前缀字,这里的是hci开头,使用时只要指定名称就能对Bluetooth Dongle操作。

准备工作

下载iOS APP

这次实作后需要使用到iOS上的APP来检查iBeacon是否有正常运作,直接到itunes store下载Locate for iBeacon

安装iBeacon For Linux执行程式

iOS APP都准备好时,到GitHub下载iBeacon For Linux,里面是利用Script组成,直接对于Bluez Statck下蓝牙的命令。

开始测试

开启iOS APP

开启之前下载安装好的Locate for iBeacon

Radius Networks的APP功能蛮多的,这是一家极力推广iBeacons的公司,APP本身自已也可以变成一个iBeacon周边,如果你有2台装置可以配合测试使用,因为我们现阶段已经选择另一个方式的iBeacon,所以我我们选择Locate iBeacons功能,这功能目的是要侦测周边的iBeacon状态。

下面这画面是还未侦测到iBeacon周边的讯息状态,下阶段我们开启Linux上的iBeacon就可以看到变化

执行Linux程式

首先,先到Linux环境中到刚刚下载并解压好的程式看一下:

pi@raspberrypi ~/iBeaconForLinux-master $ ls -l
total 20
-rwxr-xr-x 1 pi   pi    151 Mar 26 10:54 ibeacon.conf
-rwxr-xr-x 1 pi   pi    989 Mar 26 10:54 README.md
-rwxr-xr-x 1 pi   pi    415 Mar 26 10:58 start.sh
-rwxr-xr-x 1 pi   pi    132 Mar 26 10:58 stop.sh
drwxr-xr-x 5 root root 4096 Mar 26 09:38 tools
pi@raspberrypi ~/iBeaconForLinux-master $

其中有start.shstop.sh分别为启动与停止功能,我们先下命令启动iBeacon功能:

./start.sh

结果:

pi@raspberrypi ~/iBeaconForLinux-master $ ./start.sh
[Bluetooth-Startup Bluetooth]
[iBeacon-Setting iBeacon]
LE set advertise enable on hci0 returned status 12
< HCI Command: ogf 0x08, ocf 0x0008, plen 44
  1E 02 01 1A 1A FF 4C 00 02 15 E2 C5 6D B5 DF FB 48 D2 B0 60
  D0 F5 A7 10 96 E0 00 00 00 00 C9 00 00 00 00 00 00 00 00 00
  00 00 00 00
> HCI Event: 0x0e plen 4
  01 08 20 00
iBeacon-iBeacon is working
pi@raspberrypi ~/iBeaconForLinux-master $

代表已经运作成功,要停止功能可以执行

./stop.sh

结果:

pi@raspberrypi ~/iBeaconForLinux-master $ ./stop.sh
 iBeacon-Disabling iBeacon
-Stopped.

iOS运作画面

当前面操作都完成并且启动iBeacon时,可以回到iDevice上看一下APP的讯息,整个过程有成功时能在APP上看到已有侦测到iBeacon的讯息,

上图已经显示卡现iBeacon状置,直接点选可以看细节内容,

内容有显示讯号(RSSI)、准确性、距离(Accuracy)…等讯息,以上就是iBeacon在Linux上的操作。

进阶设定

先前所写的内容都是直接操作,但其实细节上有部分是可以设定的,设定的功能是定义在ibeacon.conf,我们cat一下内容:

pi@raspberrypi ~/iBeaconForLinux-master $ cat ibeacon.conf
export BLUETOOTH_DEVICE=hci0
export UUID="e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0"
export MAJOR="00 00"
export MINOR="00 00"
export POWER="c9"
pi@raspberrypi ~/iBeaconForLinux-master $

这些都是可以自行设定的功能,解说一下设定内容:

  • BLUETOOTH_DEVICE Bluetooth的名称,以hci开头,第一个周边名称为hci0,有多个就hci0hci1以此类推
  • UUID 12bit的UUID,也就是扫描到iBeacon可以看到的UUID,这通常代表的就是你iBeacon的类型
  • MAJOR 16bit表示这组iBeacon的ID
  • MINOR 16bit表示这组内的某个特定的ID
  • POWER 讯号强度,这个经过计算后会成为RSSI的值

我们可以经过ibeacon.conf设定档去自由的设定这些值,但要要注意的是参数POWER,此参数必需要经过调整与测试,如果设定的不是很正确时,在接收iBeacon的APP或是装置可能对于距离的计算会产生误差,以上设定值都设定完成后,要重新启动(停止、启动)才会生效。