Bluetooth LE(低功耗蓝牙) - 第四部分

回顾

     在本系列前几篇文章中我们完成了BLE设备的发现 , 为我们的app通过BLE显示从TI SensorTag设备中获取到环境温度和湿度的工作打下了基础。在这篇文章中我们将着眼于连接到我们所发现的SensorTag设备。

与BLE设备建立连接

     每一个熟悉传统蓝牙的开发者都将注意到蓝牙配置信息。对于那些蓝牙开发的新手来说,配置文件是一个用于规范行为的准则。例如, Advanced Audio Distribution Profile   (A2DP 高级音频分发配置[我怎么感觉翻译成"协议"会更好一点呢?]允许支持A2DP规范的两个设备以流的形式向另一个设备传输音频信息

     在BLE中有一个标准的配置文件,称为 Generic ATTribute Profile(简称为GATT, 通用属性配置文件),它提供了一种通过BLE有效地共享原子数据的标准化机制。在本系列文章的后面我们将深入讨论GATT协议,但我们将要连接的运行BLE的任何传感器都将包含GATT服务器以便我们的设备与传感器交换数据。

     连接到GATT服务器实际上是一个二阶段过程。首先我们必须创建和打开一个代表了GATT服务器的本地代理实例的连接,然后我们必须将这个代理连接到传感器上的GATT服务器。为了创建代理实例,我们需要调用已发现的蓝牙设备BluetoothDevice 实例的connectGatt()  方法 。该方法接收三个参数。第一个是 Context ; 二是一个名为 autoConnect 的布尔值;第三是一个BluetoothGattCallback  的实例。最后一个参数表示调用该方法是异步的,从UI线程调用是安全的,因为网络操作将在后台线程上自动执行,一旦执行完成将执行 BluetoothGattCallback  的回调。 connectGatt() 的返回值是一个BluetoothGatt的实例,通过这个本地的代理对象我们就可以与传感器上的GATT服务器通信了

     如果我们在调用 connectGatt()方法是将autoConnect参数设置为 FALSE ,它将返回一个BluetoothGatt 对象,但是当连接到GATT服务器的时候不会接受回调。这也是预料中的,因为在这时我们只创建了本地代理。我们需要调用BluetoothGatt  对象的方法connect() 将本地代理连接到远程GATT服务器上,并且一旦完成,我们将接收到回调信息。只有这一个远程连接是异步的,因为它是唯一的一个阻塞式的网络调用

    有关GATT服务器,理解本地和远程组件是非常重要的,但是现在我们已经了解,有一个简单的连接方式。如果我们将autoConnect  参数设置为TRUE,那么它会自动连接到传感器上的GATT服务器。connectGatt()方法将很快返回,一旦远程连接完成我们随后会收到一个回调。关于autoConnect 的另一个好处是,如果和传感器失去连接,本地代理将试图恢复连接而对我们没有任何提示。我们要做的就是监控当前连接状态只有当与传感器有交互时,才表示已经连接上了

private BluetoothGatt mGatt = null;

public void connect(String macAddress) {
	BluetoothDevice device = mDevices.get(macAddress);
	if(device != null) {
		mGatt = device.connectGatt(this, true, mGattCallback);
	}
}
     现在我们需要添加必要的回调以响应连接状态的变化。在  BluetoothGattCallback 中还有一些 其他的 回调方法我们将在以后讨论 但现在我们 只需要关心  连接 / 断开  状态的变化

	private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
		@Override
		public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
			super.onConnectionStateChange(gatt, status, newState);
			Log.v(TAG, "Connection State Changed: " + (newState == BluetoothProfile.STATE_CONNECTED ? "Connected" : "Disconnected"));
			if(newState == BluetoothProfile.STATE_CONNECTED) {
				setState(State.CONNECTED);
			} else {
				setState(State.IDLE);
			}
		}
	};

     再次说明 我不去关心 我们 的UI中做了什么因为本文的 重点是BLE 但是当BleService中的设备状态变化时 一个 消息 被发送到Activity使Activity 可以 相应地更新 UI

下期预告

     一旦我们接受到与传感器已经连接的回调信息时,我们就可以与传感器进行通信了。我们将在下一篇文章中讨论这点。

     本文的源代码可以在这里 找到。

-----------------------------------------------------不怎么华丽的分割线----------------------------------------------------------------------

原文链接:http://blog.stylingandroid.com/archives/2436

© 2014, Mark Allison. All rights reserved. This article originally appeared on Styling Android.

Portions of this page are modifications based on work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License   


  第四篇了,继续努力,周末就可以完事了。。。



  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
低功耗蓝牙(BLE)模块及协议V2.21U 目录 目录 6  概述 8  工作模式示意图 12  封装尺寸脚位定义 14  CC2540A1版(双面板工艺) 14  BM-S01版v1.1(BQB认证,四层板工艺) 18  BM-S02版(BQB认证,四层板工艺) 21  BM-S0A版(BGA) 23  串口透传协议说明(桥接模式) 27  串口AT指令: 30  连接间隔设定 30  模块重命名 30  波特率设定 31  获取物理地址MAC 31  模块复位 31  广播周期设定 31  附加自定义广播内容 32  定义产品识别码 32  发射功率设定 32  数据延时设定 33  广播数据设置 35  系统复位与恢复 36  IOS APP编程参考 37  BLE协议说明(APP接口) 39  蓝牙数据通道【服务UUID:0xFFE5】 39  串口数据通道【服务UUID:0xFFE0】 39  PWM输出(4路) 【服务UUID:0xFFB0】 40  ADC输入(2路) 【服务UUID:0xFFD0】 43  可编程IO (8路) 【服务UUID:0xFFF0】 44  定时翻转输出 (2路) 【服务UUID:0xFFF0】 46  电平脉宽计数 (2路) 【服务UUID:0xFFF0】 48  防劫持密钥【服务UUID:0xFFC0】 50  电池电量报告【服务UUID:0x180F】 52  RSSI报告【服务UUID:0xFFA0】 53  模块参数设置【服务UUID:0xFF90】 54  设备信息【服务UUID:0x180A】 60  端口定时事件配置【服务UUID:0xFE00】 61  用APP测试透传功能 72  用USB Dongle及Btool测试 75  连接BLE模块 75  测试直驱功能 76  测试透传功能 82  主机参考代码(透传) 87  联系我们 88 附录A:信驰达BLE模块协议对比表 89 附录B:BLE模块原理图 91 附录C:BLE模块应用方案提示 94 附录D:FCC认证 95 附录E:RoHS认证 96 附录F:End Product Listing 97

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值