1357|2

126

帖子

0

资源

一粒金砂(中级)

SensorTile.box 蓝牙连接 [复制链接]

本帖最后由 tinnu 于 2020-6-21 23:06 编辑

一个蓝牙设备能发送多个服务(支持多个service UUID),每个服务(service UUID)能有多个特征(Characteristic UUID),下面还可以扩展多个属性(Property)

 

(一)使用安卓APP蓝牙调试器查看 SensorTile.box 蓝牙服务

我把 SensorTile.box 开发包里面的例程烧录入板卡,初始化后出现BBS_110的蓝牙设备。

安卓设备不能够直接匹配该设备,必须使用专门的蓝牙调试器。

蓝牙调试器监听空气中的2.4G蓝牙信号,找到五个服务(service)UUID,每个服务UUID都有多个特征(Characteristic)UUID

经过测试,00000000-0001-11e1-9ab4-0002a5b5c51b 这个服务(service)UUID是发送数据使用的,其下有三个特征UUID,分别是发送电池电量、环境传感器、运动传感器数据的

Screenshot_2020-06-21-22-27-33.png 上图为环境传感器UUID:

Screenshot_2020-06-21-14-48-22.png

 

(二)从源码分析数据格式

从初始化出分析

Init_BlueNRG_Custom_Services 函数 BlueNRG 的三个应用:
Add_HW_SW_ServW2ST_Service
Add_ConsoleW2ST_Service
Add_ConfigW2ST_Service
其中 Add_HW_SW_ServW2ST_Service 里面定义了 AccGyroMagCharHandle 这个 charhandle,蓝牙的UUID就是在这里定义的。

AccGyroMag即运动学相关传感器UUID信息:COPY_ACC_GYRO_MAG_W2ST_CHAR_UUID(uuid);
环境传感器:COPY_ENVIRONMENTAL_W2ST_CHAR_UUID(uuid);
电池传感器:COPY_BAT_W2ST_CHAR_UUID(uuid);

 

从每次发送分析:
1-调用 AccGyroMag_Update(&ACC_Value,&GYR_Value,&MAG_Value); 
2-里面使用 ACI_GATT_UPDATE_CHAR_VALUE 即 aci_gatt_update_char_value(这是 BlueNRG 协议栈API)发送
3-发送的内容是2+3*3*2的buff,也就是一次信息20位,
  STORE_LE_16(buff   ,(HAL_GetTick()>>3));

  STORE_LE_16(buff+2 ,Acc->x);
  STORE_LE_16(buff+4 ,Acc->y);
  STORE_LE_16(buff+6 ,Acc->z);

  Gyro->x/=100;
  Gyro->y/=100;
  Gyro->z/=100;

  STORE_LE_16(buff+8 ,Gyro->x);
  STORE_LE_16(buff+10,Gyro->y);
  STORE_LE_16(buff+12,Gyro->z);

  STORE_LE_16(buff+14, Mag->x);
  STORE_LE_16(buff+16, Mag->y);
  STORE_LE_16(buff+18, Mag->z);
组织方式,前两位是时间戳,后是传感器信息。
小端模式
 

依次分析后发现:

电池信息是9个字节一次

环境信息是10个字节一次:uint8_t buff[2+4/*Press*/+2/*Hum*/+2/*Temp*/];

运动学传感器是20个字节一次:uint8_t buff[2+3*3*2];

 

(三)linux下开发蓝牙接收软件

N年前学的安卓和JAVA,只会写个界面,想来想去还是在linux下开发

找了点资料,发现linux下都是基于bluez框架的,整个linux驱动都用它。

如果是命令行交互的话,bluez有一系列工具,包括gatttool、hcitool、bluetoothctl等,但其余都是过时软件,只有 bluetoothctl 是最新的,因此首先使用 bluetoothctl 进行开发

1-命令行输入 bluetoothctl 进入交互

2-power on

3-agent on

4-Defaultagent

5-scan on

6-pair <SensorTile.box mac>

但是这里遇到了问题,无论如何配对,都是超时,修改了/etc/bluetooth/main.conf 里面配对的方式

ControllerMode = bredr

三个方式都试过,都不行。

 

咨询了一些从事BLE开发的前辈,说是 bluetoothctl 工具只针对几个简单的 service UUID,类似 keyboard 这类大众化的UUID才能匹配成功,ST SENSOR的都是自定义的UUID,无法被识别。

 

至于编程接口,bluez的编程接口在V4.xx之后都是通过dbus,这个编程难度非常高,我把源码的一个工程提取出来跑了一遍,蓝牙访问被禁止了,使用了sudo也不行,束手无策,看来只能写到TF卡里面再拿出来了。


回复

1万

帖子

2854

资源

管理员

谢谢分享

扫一扫,关注 EEWORLD 微信订阅号

行业资讯、电子趣闻、技术干货、精彩活动……尽可掌握~


回复

1万

帖子

21

资源

版主

linux没弄过 如果解决不了可以转战android可以参考官方源码
https://github.com/STMicroelectronics-CentralLabs/STBlueMS_Android

回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表