Android蓝牙通信-2016-05-30

近来工作做了很多Android手机对接蓝牙设备的工作,记录一下。

场景

需要对接蓝牙设备,发送或者获取数据,比如蓝牙打印机、蓝牙体脂称、蓝牙电子血压计、蓝牙血糖仪、蓝牙身高尺等等。大致的过程就是手机跟设备互相连接认证,互传数据的过程。当然,对接不同的设备,会有不同的交互流程,同一类设备,针对不同厂商,也需要遵循不同厂商定制的SDK的相关协议。但都离不开蓝牙的核心协议,下面分经典蓝牙2.0以及低功耗蓝牙4.0(BLE)。

经典蓝牙2.0

比较传统的设备只支持蓝牙2.0,SPP协议、HDP协议
过程:扫描,配对,连接,通信

参考:Android 蓝牙开发基本流程

1、通用UUID:
private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
2、配对,反射设置密码(如果需要设置的话)
Method removeBondMethod = btClass.getDeclaredMethod("setPin",  new Class[] { byte[].class }); 
return value = (Boolean) removeBondMethod.invoke(bluetoothDevice,  new Object[] { password.getBytes() });
3、配对,反射调用绑定方法
Method createBondMethod = btClass.getMethod("createBond");
Boolean value = (Bovolean) createBondMethod.invoke(btDevice);
4、连接,根据不同SDK方式

问题:getBluetoothService() called with no BluetoothManagerCallback

int sdk = Build.VERSION.SDK_INT;
if (sdk >= 10) {
    socket = mDevice.createInsecureRfcommSocketToServiceRecord(SPP_UUID);
} else {
    socket = mDevice.createRfcommSocketToServiceRecord(SPP_UUID);
}

低功耗蓝牙4.0技术(BLE)

注意:从Android4.3(API-18)开始支持BLE,但只支持作为中心设备模式Central,也就是只支持Android设备主动扫描连接外围设备Peripheral,在Android5.0(API-21)两种模式都支持。蓝牙4.0将三种规格集一体,包括传统蓝牙技术、高速技术和低耗能技术
参考:最全最详细的蓝牙版本介绍包含蓝牙4.0和4.1
过程:扫描,连接,发现服务,通信

1、获取BluetoothAdapter
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
2、判断是否支持蓝牙,并打开蓝牙(利用系统Intent的方式请求打开蓝牙)
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
3、搜索BLE设备
mBluetoothAdapter.startLeScan(mLeScanCallback);
BluetoothAdapter.LeScanCallback // 搜索回调

注意:搜索时,你只能搜索传统蓝牙设备或者BLE设备,两者完全独立,不可同时被搜索。
实际使用:使用经典蓝牙搜索方式startDiscovery()能同时搜索到百捷2.0和百捷4.0的设备

4、连接GATT Server
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
BluetoothGattCallback // 连接回调
5、连接成功。BluetoothGatt常规用到的几个操作示例
connect(); // 连接远程设备。
discoverServices(); // 搜索连接设备所支持的service。
disconnect(); // 断开与远程设备的GATT连接。
close(); // 关闭GATT Client端。
readCharacteristic(characteristic); // 读取指定的characteristic。
setCharacteristicNotification(characteristic, enabled); // 设置当指定characteristic值变化时,发出通知。
getServices(); // 获取远程设备所支持的services。

一些实践心得

关于蓝牙硬件

对接蓝牙设备,一方面由于蓝牙设备的多样性,另一方面Android手机硬件、系统的多样性,会遇到比较多的问题就是蓝牙连接的稳定性问题。关于这个问题也是尝试了很多种方法去避免,分析其中一个原因就是:由代码驱动蓝牙硬件的过程,需要一定的时间,一定的时间等待,会带来极大稳定性的提高。比如启动蓝牙后延迟300ms在执行其他操作。另一个就是可以采用线程轮询判断一个状态是否已经启动,比如循环5次,每隔1秒执行判断操作。

关于优化

必要时,考虑采用服务Service去获取设备的数据,或者设置单例模式。

如有错误,欢迎拍砖!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,914评论 25 707
  • Guide to BluetoothSecurity原文 本出版物可免费从以下网址获得:https://doi.o...
    公子小水阅读 7,945评论 0 6
  • 公司的项目最近需要用到蓝牙开发的相关内容,因此特地查阅了Google官方文档的内容并进行二次整理,希望能对需要学习...
    Chuckiefan阅读 32,433评论 44 123
  • 前言: 本文主要描述Android BLE的一些基础知识及相关操作流程,不牵扯具体的业务实现,其中提供了针对广播包...
    幻影宇寰阅读 5,322评论 6 19
  • 1.时间不受控。 48个人的时间、空间同时对上,可能性为零。即使三分之一的人相聚也变得难上加难。 这是二十年后渐渐...
    高小花0218阅读 251评论 0 0