Tech

Linux设置iBeacon支持微信摇一摇

今年微信的摇一摇开始支持iBeacon了,淘宝上冒出一堆卖iBeacon基站的店铺,价格也比之前便宜许多。只是在开发测试阶段,直接用现有的设备会更简单,手头有一个USB蓝牙适配器,于是用Linux机器改造成iBeacon基站了,本文记录设置的步骤。前两年iBeacon刚发布的时候,有篇很火的文章指导如何用Raspberry搭建iBeacon基站(DIY Beacon with a Raspberry Pi),本文有参考那篇文章,只想实现iBeacon基站,不关注微信设置,也建议直接看原文。

蓝牙设备需要支持BLE(Bluetooth Low Energy,低功耗蓝牙)且是4.0版,我买的这个是CSR8510芯片,淘宝价格30元以内。以下设置在Ubuntu 14.04,Openwrt(ZTE Q7+r47026)和Raspbian(cb799af)中测试通过。一些APP(例如beacon-toolkit)和脚本(例如linux-ibeacon)可以简化配置。

微信设置

首页进入微信摇一摇后台(https://zb.weixin.qq.com/nearby/index.xhtml),点击左侧『页面管理』进入页面点击,点击『添加页面』按钮新增一个页面,跳转到dmyz.org:
Add page

然后到设备管理中新增设备(建议用Chrome操作,Firefox开发版点击『新增设备』按钮有JS错误):
Add device

弹出的引导共3步,依次填写『我还没有购买设备』、『备注』(备注可以随意填写之后能修改),第3步提示设备添加成功:
Add page

添加成功后回到设备列表,在『未激活的设备』可以看到badge,点进去在列表中可以看到刚才新增的设备,再点击『查看』:

在弹出窗口中获得UUID、Major、Minor,这3个值就是接下来要设置的了。

设备配置

首先在系统中安装需要的模块/包:

//Openwrt
opkg update
//Bluez提供hcitool和hciconfig
opkg install kmod-bluetooth bluez-libs bluez-utils
//如果是USB接口需要安装相应模块
opkg install kmod-usb-core kmod-usb-uhci kmod-usb2 usbutils

//Ubuntu/Raspbian,不需要图形界面(GTK)可以省略blueman
sudo apt-get install bluetooth bluez-utils blueman

安装完成后执行hciconfig查看是否正常识别蓝牙设备,将其设置为不可连接且关闭扫描:

sudo hciconfig hci0
//如果显示状态为DOWN则执行下一条命令将它设置UP
sudo hciconfig hci up
sudo hciconfig hci0 leadv 3
sudo hciconfig hci0 noscan

最关键的一步,设置UUID、Major、Minor。UUID是128bit,其他两个是16bit。

//处理UUID
echo FDA50693-A4E2-4FB1-AFCF-C6EB07XXXXXX | sed ‘s/-//g’ | sed ‘s/../& /g’
//处理Major/Minor
printf ‘%x’ 10024 |sed ‘s/../& /g’ && printf ‘%x’ 12438 |sed ‘s/../& /g’

sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 FD A5 06 93 A4 E2 4F B1 AF CF C6 EB 07 XX XX XX 27 28 30 96 C9 00

  • 0x08 0x0008: LE Controllers对应的ogf和ocf;
  • 1E 02 01 1A 1A FF 4C 00 02 15: 用来打开iBeacon;
  • FD A5 06 93 A4 E2 4F B1 AF CF C6 EB 07 XX XX XX: 微信的UUID,去掉连字符;
  • 27 28 30 96: Major和Minor;
  • C9: 发射功率,16进制表示,范围0~255。

测试

设置完成后,打开手机蓝牙,进入微信-摇一摇,左下角会出现『周边』,进行摇一摇操作后点击激活设备:

回到设备列表,可以看到新增的设备已经出现在列表中,点击『编辑』:

最后通过『新增页面』,把之前创建的动漫驿站页面添加进去,再次进行摇一摇操作就完成了:

Leave a Reply

Your email address will not be published. Required fields are marked *