蓝牙API介绍及基本功能实现
来源:互联网 发布:安卓pad应用推荐 知乎 编辑:程序博客网 时间:2024/05/01 08:44
ONE,传统蓝牙
- BluetoothAdapter:本地蓝牙设备适配器,用于管理蓝牙的开启/关闭、重命名、扫描、配对、连接
- BluetoothClass:蓝牙设备类,用于描述蓝牙设备类型
- BluetoothDevice:远程蓝牙设备类
- BluetoothSocket:与tcpSocket类似,进行蓝牙连接
- BluetoothServerSocket:与tcpServerSocket类似,等待连接
获取本地蓝牙适配器
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
打开/关闭本地蓝牙
adapter.enable();//打开蓝牙adapter.disable();//关闭蓝牙adapter.isEnabled();//蓝牙是否处于开启状态adapter.getState();//获取本机蓝牙状态
通过监听BluetoothAdapter.ACTION_STATE_CHANGED监听蓝牙状态的改变
mAdapter.setName(name);//本地蓝牙重命名mAdapter.getName();//获取本机蓝牙名
通过监听BluetoothAdpater.ACTION_LOCAL_NAME_CHANGED监听本机蓝牙名称的改变
有两种方案,
首先第一种实现,简单但对可检测时间有限制
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);//默认可检测时间为120秒,调用该方法最高可设置300秒intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);startActivity(intent);
第二种实现方案,就是Android源码中的实现方案,可以任意规定可检测时长,甚至永不超时均可(参考Android4.42源码)
/***mode有三种取值*BluetoothAdapter.SCAN_MODE_CONNECTABLE:对已配对设备可见,具有扫描功能*BluetoothAdapter.SCAN_MODE_NONE:对所有设备不可见,不具有扫描功能*BluetoothAdapter.SCAN_MODE_CONNECTABLE_*DISCOVERABLE:对所有设备可见,具有扫描功能*duration为扫描时长*/mAdapter.setScanMode(mode, duration);//设置alarm,当timeout结束时就关闭蓝牙的可检测性BluetoothDiscoverableTimeoutReceiver.setDiscoverableAlarm(mContext, endTimestamp);这是源码中的实现方案,但是BluetoothAdapter.setScanMode()没有办法去调用,只能利用反射
获取已配对设备列表
List<BluetoothDevice> list = (List<BluetoothDevice>) adapter.getBondedDevices();
开启扫描/关闭扫描
adapter.startDiscovery();//开启蓝牙扫描功能adapter.cancelDiscovery();//关闭蓝牙扫描功能
在扫描到设备时系统会发送BluetoothDevice.ACTION_FOUND的广播,通过监听该广播可以获取到设备信息
获取到设备后调用如下方式进行连接
BluetoothSocket _BluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
获取到socket后可以获取到输入输出流,这里的uuid可以在网页的uuid生成器在线生成,remotedevice和本机蓝牙设备的uuid必须相同
TWO,BLE低功耗蓝牙
获取蓝牙适配器的步骤同上,扫描ble设备的方法如下:
//开启蓝牙扫描mBluetoothAdapter.startLeScan(mLeScanCallback);//结束蓝牙扫描mBluetoothAdapter.stopLeScan(mLeScanCallback);
其中mlLeScanCallback为BluetoothAdapter.LeScanCallback对象,
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 。。。 //扫描到设备后回调}
扫描到设备后可以进行连接,方法如下
mBluetoothGatt = mBluetoothDevice.connectGatt(BluetoothCODAService.this, false, mGattCallback);
其中mGattCallback为BluetoothGattCallback对象
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {if(newState == BluetoothProfile.STATE_CONNECTED){ //连接成功回调}else if(newState == BluetoothProfile.STATE_DISCONNECTED){ //连接失败回调 } public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { // 0 //搜索到服务回调 } else { //未搜索到服务回调 } } @Override // Result of a characteristic read operation public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { //接收到数据回调 } } @Override public void onCharacteristicWrite(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, int status) { //发送数据回调 } @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { } @Override public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { } @Override public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { } @Override public void onReliableWriteCompleted(BluetoothGatt gatt, int status) { } }; }
连接成功后如果要进行通信还必须搜索服务
mBluetoothGatt.discoverServices();
搜索服务后会回调onServicesDiscovered方法。
至此,就可以进行读写数据了
//读数据mBluetoothGatt.readCharacteristic(characteristic);//写数据 mBluetoothGatt.writeCharacteristic(characteristic,value);
关于低功耗蓝牙的理论知识可以参考 Android蓝牙BLE低功耗相关简单总结
鉴于多人私信我要蓝牙demo,索性直接上传资源,我整理了一篇低功耗相关的,连接设备并读取数据,附上demo的下载地址,供大家参考
http://download.csdn.net/detail/zrf1335348191/9525847
11 0
- 蓝牙API介绍及基本功能实现
- 蓝牙API介绍
- TextFile Filter 基本功能完成 介绍及感想
- angularJS初识--介绍基本功能及用法
- 蓝牙基本功能源码解析
- SocketRocket的导入及基本功能实现
- JS中数组API的原理及基本功能
- 百度API基本功能
- SDK及API介绍
- 【二叉树】二叉树遍历及基本功能实现
- c语言实现单链表的及各项基本功能
- Mantis基本功能介绍
- Trac 基本功能介绍
- Layout基本功能介绍
- tree基本功能介绍
- window基本功能介绍
- OpenStack:Nova基本功能介绍
- QTP的基本功能介绍
- 日期计算
- DirectMemory(堆外(Off-Heap)缓存BigMemory的一个实现)
- 24. Swap Nodes in Pairs-节点交换|指针
- 调查问卷生成json字符串
- 1——Introduction to Microservices
- 蓝牙API介绍及基本功能实现
- Android 中 RegistrantList消息处理机制 以android 5.0 MT为例
- struts2 spring集成时struts.xml文件中action的class属性值意义
- git常用命令
- Visual Attention
- 友盟消息推送SDK集成
- 读取网络图片和本地sd卡图片文件 解析为空 SkImageDecoder::Factory returned null
- 数列分段
- Binary Search Tree Iterator