Android Kotlin&BLE(低功耗蓝牙) 笔记

目录

  • BLE 与经典蓝牙的区别

  • BLE 的 Kotlin 下实践

  • 经典蓝牙(Classic Bluetooth)& 低功耗蓝牙(Bluetooth Low Energy)

  • 经典蓝牙可以用与数据量比较大的传输,如语音,音乐,较高数据量传输等。

  • BLE 特点就如其名,功耗更低的同时,对数据包做出了限制。所以适用于实时性要求比较高,但是数据速率比较低的产品,如鼠标,键盘,传感设备的数据发送等。

蓝牙 4.0 支持单模和双模两种部署方式,其中单模即是我们说的 BLE,而双模指的是 Classic Bluetooth + BLE 。
实际上,BLE 和经典蓝牙的使用等各方面都像是没有关联的两个东西,甚至因为 BLE 的通讯机制不同,所以是不能向下兼容的;经典蓝牙则可以兼容到蓝牙 3.0 / 2.1。

经典蓝牙

参考官方文档(https://developer.android.com/guide/topics/connectivity/bluetooth.html?hl=zh-cn#TheBasics),因为有中文文档,所以只要看这一篇文档就可以应付一般的开发了。

最重要的是这一次项目里的硬件貌似不能支持经典蓝牙,所以并没有实践的机会。

BLE

同样,有条件一定要去看官方文档,然而这一次并没有中文版,或许可以找一些国内大佬们翻译的版本。
还有就是大佬 JBD 写的 Android BLE 蓝牙开发入门  http://www.jianshu.com/p/3a372af38103,而且还用 RxJava 封装成一个库可以直接调用:RxBLE  https://github.com/Belolme/RxBLE,是真的厉害,不妨去学习学习。

  • 概念与常用 API

UUID:每个服务和特征都会有唯一的 UUID ,由硬件决定。
服务(Service):蓝牙设备中可以定义多个服务,相当于功能的集合。
特征(Characteristic):一个服务可以包含多个特征,可以通过 UUID 获取到对应的特征的实例,通过这个实例就可以向蓝牙设备发送 / 读取数据。

BluetoothDeivce:调用 startLeScan()获取该实例,用于连接设备。
BluetoothManager:蓝牙管理器,调用 getSystemService() 获取,用于获取蓝牙适配器和管理所有和蓝牙相关的东西。
BluetoothAdapter:蓝牙适配器,通过 BluetoothManager 获取,用于打开蓝牙、开始扫描设备等操作。
BluetoothGatt:通用属性协议, 定义了BLE通讯的基本规则,就是通过把数据包装成服务和特征的约定过程。
BluetoothGattCallback:一个回调类,非常重要而且会频繁使用,用于回调 GATT 通信的各种状态和结果。
BluetoothGattService:服务,通过 BluetoothGatt 实例调用 getService(UUID) 获取
BluetoothGattCharacteristic:特征,通过 BluetoothGattService 实例调用 getCharacteristic(UUID) 获取,是 GATT 通信中的最小数据单元。
BluetoothGattDescriptor:特征描述符,对特征的额外描述,包括但不仅限于特征的单位,属性等。

  • 声明权限

  • 初始化

  • 扫描设备与停止扫描

其实 startLeScan() 已经被声明为过时,所以开始扫描还有其他的方法:

  • 连接蓝牙设备
    此时已经获取到了蓝牙设备的实例:mDevice,开始连接

关于 connectGatt() 的几个参数:

第二个参数,autoConnect 为 true 时,如果设备断开了连接将会不断的尝试连接。
第三个 BluetoothGattCallback 是一个接受回调的对象,也是这一部分的重点。
先看一下完整的 BluetoothGattCallback:

首先是 onConnectionStateChange(gatt,status,newState)
这个方法在成功连接、断开连接等状态改变的时候回调,所以一开始会先进入这个方法。
参数中, newState 代表当前设备的连接的状态:

所以当 newState 为 2 的时候就是刚连上设备的时候,这时候可以调用
gatt.discoverServices() 开始异步的查找蓝牙服务:

执行了discoverServices()后,若找到可用的服务,系统又会回调 mBluetoothGattCallback 里的onServicesDiscovered() 方法,所以添加:

如果成功写入数据,系统回调 mBluetoothGattCallbackonCharacteristicWrite() 方法:

上面的代码可以成功往硬件发送数据,但是不能接受硬件返回的数据。
如果想要接受硬件返回的数据,需要在 onServicesDiscovered(),也就是连上服务后,先不发送数据而是设置硬件返回数据的开关:

实际上向硬件写入数据这一段代码有时候是可以省略的,只需要打开 Android 段的开关即可接收到返回的数据,可能是和硬件有关。
这样一来,就不能继续在 onServicesDiscovered() 执行写入数据的代码,改为在 onDescriptorWrite() 中执行。

总结

如果写过经典蓝牙的就知道,如果说两者的搜索操作还差不多的话,连接操作和写入操作就是完全不同的东西了。

经典蓝牙可以获取到一个类似 TCP 中 Socket 的对象,然后获取 InputStream 和OutputStream,二者分别通过套接字以及 getInputStream()和 getOutputStream()来处理数据传输。

而 BLE 中需要通过不同的 UUID 获取对应的服务、特征才可以写入数据。

以上就是 BLE 最简单的实现,进一步的封装等就去看上面介绍的 RxBLE 吧。

还有就是用 Kotlin 写的 MainActivity 部分(主要代码):

BLE 相关的代码是写在了 Service 中,通过绑定时返回的 mBinder 来调用 Service 中的方法。

关键词:code小生

(0)

相关推荐

  • 蓝牙协议千千万,如何选择最合适?

    本文作者:美信Samantha Morehead 从BLE BR / EDR到BLE再到蓝牙5,蓝牙通信技术经历了多种变化,以满足不同的需求.他们之间到底有什么区别? 从手机到音箱,从耳机到车载,不同 ...

  • 无线通信技术:蓝牙主从模块串口数据透传

    在物联网领域,没有任何一种技术可以完全主导这个市场.由于不同的市场需求点,许多技术都有其必要性,它们相互补充,相互配合.但是,仍然可以通过我们的最新调查数据了解蓝牙技术的重要性.目前,在所有物联网技术 ...

  • 【低功耗蓝牙BLE】连接事件和相关参数

    低功耗蓝牙连接相关的知识 1.连接事件 在一个连接当中,主设备会在每个连接事件里向从设备发送数据包.一个连接事件是指主设备和从设备之间相互发送数据包的过程.连接事件的进行始终位于一个频率,每个数据包会 ...

  • 低功耗蓝牙技术:什么是BLE蓝牙模组主机和从机模式?

    低功耗蓝牙是一项强大的技术,它不像传统蓝牙那样具有预定义的一组官方配置文件供您选择;尽管蓝牙协会指定了预定义(也称为"已采用") 配置文件,但这些只是冰山一角,是您可以通过BLE实 ...

  • 了解低功耗蓝牙SOC芯片应用需求

    评估低功耗蓝牙SOC芯片时考虑应用需求是很重要的.大多数供应商都试图以负责任的态度来展示他们器件的数值,但是对于一个可能要支持多种不同应用的器件而言,所提供的数值显然不可能适合所有应用案例.在这种情况 ...

  • 如何检查Mac电脑是否支持低功耗蓝牙?

    如何检查您的Mac是否支持低功耗蓝牙 点击苹果徽标菜单,选择"关于本机" 点击"系统报告"按钮 在侧边栏的"硬件"部分中,选择"蓝 ...

  • AirBuddy技巧:如何检查Mac是否支持低功耗蓝牙?

    hello,大家好-今天小编想说一下 如何检查Mac电脑是否支持低功耗蓝牙?,就像在 iPhone 或 iPad 上一样.只需点击一下,即可连接并将 Mac 的音频播放到 AIrPods.AIrBud ...

  • 低功耗蓝牙单芯片为物联网助力

    物联网已然成为一个商业事实,各种传感器通过无线技术将现实世界的数据传输到物联网上,而低功耗蓝牙技术(BLE)则是其中一项重要的无线技术.现在各种可穿戴设备发展推动了低功耗蓝牙芯片技术的广泛应用.   ...

  • 低功耗蓝牙方案在太阳能电池管理系统中的应用

    太阳能电池是一种利用太阳光直接发电的光电半导体薄片,通过光电效应或者光化学效应直接把光能转化成电能的装置. 当天然气.煤炭.石油等不可再生能源频频告急,能源问题日益成为制约国际社会经济发展的瓶颈时,越 ...

  • 高通发布新款低功耗蓝牙音频芯片:支持降噪技术,TWS耳机好搭档

    高通于今天早些时候发布了旗下QCC蓝牙音频芯片的新款,分别是QCC514x和QCC304x两个系列,前者面向高端市场,而后者是面向入门级/中端市场的芯片,两款芯片均支持降噪技术. TWS(True W ...

  • kotlin实战!带你一起探究Android事件分发机制,知乎上转疯了!

    开头 金九银十就快到了,很多有求职.跳槽打算的人最近都在完善更新自己的简历,打算趁此机会换到心仪的环境. 程序员相较其它工作岗位略有不同,最注重的就是技术.所以很多程序员会产生一个误区,觉得自己技术强 ...