添加蓝牙权限

特性请求

值为true则指定设备必须带BLE才能安装该应用程序

值为false则不论设备是否带BLE都可以安装应用程序(但运行时必须判断设备是否支持该特性

判断设备是否支持BLE(如果特性请求指定为true,则不需要判断)

if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {

Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();

}

获取本地蓝牙适配器(即本地的蓝牙功能模块)

final BluetoothManager bluetoothManager =

(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);

mBluetoothAdapter = bluetoothManager.getAdapter();

后面一切关于蓝牙的内容都要从BluetoothAdapter开始

判断蓝牙是否开启以及请求启动蓝牙

if (!mBluetoothAdapter.isEnabled()) {

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

//请求启动蓝牙

startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

}

下面开始扫描设备

首先要实现以下接口:

android.bluetooth.BluetoothAdapter.LeScanCallback

我在这里通过Activity直接implements这个接口,所以在使用时直接传入this就可以了:

public void onLeScan(BluetoothDevice device, int rssi, byte[] arg2) {

// TODO Auto-generated method stub

final String name = device.getName();

final String addr = device.getAddress();

}

启动/停止扫描

private synchronized void startScan()

{

gapUtil.btAdapter.startLeScan(this);//传入扫描回调方法

handler.postDelayed(scanTimingTask, 10000);       //10秒后取消扫描

}

private synchronized void stopScan()

{

gapUtil.btAdapter.stopLeScan(this);

handler.removeCallbacks(scanTimingTask);

}

//扫描超时任务

private Runnable scanTimingTask = new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

isScaning = false;

stopScan();

}

};

因为扫描设备时是很耗电的,所以一定要设置扫描的时间(这是设置为10s)

扫描到设备后,会触发上面的扫描回调方法,可以在该方法中添加设备信息到列表中,也可直接发起链接,但是不要在这里更新UI,因为回调方法的调用不在UI线程中,如果需要更新UI,请使用handler.post()或者runOnUiThread();

实现设备的链接

先获取远程设备的引用,然后通过该引用发起链接。

BluetoothDevice btDevice = btAdapter.getRemoteDevice(addr);//远程设备

BluetoothGatt    btGatt = btDevice.connectGatt(mContext, false, btCallback);//传入gatt回调方法

这里的connectGatt()方法第三个参数需要传入Gatt层的回调函数,为此我们要先实现该回调方法,但设备链接成功后,会触发该回调方法的onConnectionStateChange()方法:

BluetoothGattCallback btCallback = new BluetoothGattCallback() {

@Override

//当设备通过Notification发送数据过来时,回调该方法

public void onCharacteristicChanged(BluetoothGatt gatt,

BluetoothGattCharacteristic characteristic) {

// TODO Auto-generated method stub

super.onCharacteristicChanged(gatt, characteristic);

}

@Override

//链接状态改变时回调该方法

public void onConnectionStateChange(BluetoothGatt gatt, int status,

int newState) {

// TODO Auto-generated method stub

super.onConnectionStateChange(gatt, status, newState);

}

@Override

//发现service时回调该方法

public void onServicesDiscovered(BluetoothGatt gatt, int status) {

// TODO Auto-generated method stub

super.onServicesDiscovered(gatt, status);

}

};

寻找Service

当设备建立链接成功后,可对设备进行Service搜索:

switch (newState)

{

case BluetoothGatt.STATE_CONNECTED:

BluetoothGatt. discoverServices();//执行该方法寻找Service,成功后,会触发onServicesDiscovered()被调用

break;

default:break;

}

获取Service列表

Service搜索完毕,会触发gatt回调方法的onServicesDiscovered()方法被调用,在这里我们可以获取设备的Service列表

BluetoothGatt.getServices()

获取指定Service下的Characteristic列表

BluetoothGattService.getCharateristics();

获取Characteristic的属性

BluetoothGattCharateristic.getProperties();

属性类型包括:

PROPERTY_INDICATE=0x20;                               //可接收Indication

PROPERTY_NOTIFY=0x10;                                   //可接收Notification

PROPERTY_READ=0x02;                                     //可读

PROPERTY_WRITE=0x08;                                    //可写

PROPERTY_WRITE_NO_RESPONSE=0x04;          //可无回应的写

PROPERTY_SIGN_WRITE=0x40;                          //认证可写(配对)

通过获取Characteristic的属性可以用来判断特征值是否可读?可写?可Notify...

发送数据

BluetoothGattCharateristic.setValue(byte[]);

BluetoothGatt.writeCharateristic(BluetoothGattCharateristic);

使能Notification及Indication

BluetoothGattDescriptor = BluetoothGattCharateristic.getDescriptor(UUID.fromString());

BluetoothGatt.setCharacteristicNotification(BluetoothGattCharateristic,boolean);

BluetoothGattDescriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);

接收数据

接收收据包括读回调,及Notification回调

通常用的比较多的是Notification,因为这种数据传输方法无需确认,速度快。

当收到Notifiation数据时,会触发Gatt回调方法的onCharacteristicChanged()方法被调用

所以可以在这里读取数据

final byte[] buf = characteristic.getValue();

最后当退出时别忘了请求断开链接

BluetoothGatt.close();

BluetoothGatt = null;

蓝牙UUID格式

UUID格式包括16bit格式及128bit格式

其中16bit格式的UUID会在Android自动转换为128bit的UUID格式,其转换方式为:

"0000"+uuid+"-"+uuid_base;

uuid就是我们的16bit 的UUID值

uuid_base为“0000-1000-8000-00805F9B34FB"

所以假设设备上有FFF0的16bit的UUID,则转换为128bit的UUID值为

0000FFF0-0000-1000-8000-00805F9B34FB

蓝牙4.0android开发,Android蓝牙4.0开发相关推荐

  1. 谈谈几个月以来开发android蓝牙4.0 BLE低功耗应用的感受

    谈谈几个月以来开发android蓝牙4.0 BLE低功耗应用的感受 谈谈几个月以来开发android蓝牙4.0 BLE低功耗应用的感受,注明下时间:2012-10-17写的博客,后期更新的也注明了时间 ...

  2. 开发android蓝牙4.0 BLE低功耗应用的感受

    文章转自: http://www.cnblogs.com/zdz8207/archive/2012/10/17/bluetooth_ble_android.html 谈谈几个月以来开发android蓝 ...

  3. Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例)

    Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例) 标签: 注册登录Android开发servlet 2017-04-18 20:34  454人阅读  评论(1) ...

  4. android中蓝牙的使用方法,Android蓝牙开发教程(一)

    Android蓝牙功能的开发一直是很多新手头疼的问题,网上虽然也有很多教程贴,但大多都写得不全面,不能让我们真正掌握蓝牙开发的基本知识.本教程主要讲解搜索蓝牙设备.蓝牙设备之间的连接和蓝牙之间的通讯三 ...

  5. android 蓝牙hf编程,基于Android蓝牙Inband ring功能实现.doc

    基于Android蓝牙Inband ring功能实现 基于Android蓝牙Inband ring功能实现 [摘要] 蓝牙作为一种短距无线数据与语音传输的开放性全球规范,目前在整个世界范围内都得到了很 ...

  6. 用c#开发Android应用(一)——搭建开发环境

    自从有了Android后就一直想尝试下为Android开发些小应用玩玩.但是我日常主要工作是用C#来完成的,JAVA放下也有些年头了所以这事就就一直拖着没干.后来听说有了Mono for Androi ...

  7. android锁屏软件开发,Android一键锁屏开发全过程

    一.项目简介: 项目:<Android 一键锁屏> 开发周期:4天 代码量:100行 二.项目流程: 三.项目代码 1.主程序代码: 1.private DevicePolicyManag ...

  8. android 蓝牙ble调试助手,Android蓝牙调试助手源码分享

    package com.example.android.BluetoothChat; /** * 描述:蓝牙服务核心类 */ import java.io.IOException; import ja ...

  9. android 蓝牙ble 133,java – Android蓝牙错误133

    我正在尝试连接到 Android上的蓝牙设备.我在onClientConnectionState处理程序中收到状态133.我并不总是得到这个错误 – 有时连接很好.我无法指出触发问题的原因.重新启动设 ...

最新文章

  1. Learn OpenGL (二):三角形
  2. 如何管理好自己的性格?
  3. 从零开始学安全(三)●黑客常用的windows端口
  4. 计算机应用基础本科常见问题讨论,《计算机应用基础》(本科)2017年6月期末考试指导.pdf...
  5. 无人驾驶之入门(车联网和5G)
  6. 【Laravel】使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能
  7. stm32中断 抢占优先级 和 响应优先级 有什么区别
  8. javascript设计模式_JavaScript设计模式:命令模式(通俗易懂)
  9. kindle刷机ttl_摔一下变砖了,ttl刷机没效果,谁帮看看最后三行那个error什么意...
  10. DLL编写中extern “C”和__stdcall的作用
  11. 电脑计算机睡眠和休眠模式区别,电脑休眠和睡眠的区别?
  12. 保利威视收购CuPlayer,视频云竞争大幕已然拉开
  13. kali下载速度慢_kali Linux 2020.1最新安装教程,绝对能帮你安装好!不是root、没有桌面、中文乱码、下载太慢、ssh链接等问题!...
  14. 第二集 第一魂环 第十章
  15. 在windows的命令行窗口打开.ipynb文件
  16. python习题答案集
  17. jeeplus ani 文档路径
  18. C++实现简单电话通讯录
  19. 找不到该项目,请确认该项目的位置
  20. 为什么我从Flutter转投Electron的怀抱?

热门文章

  1. 直流电机H桥驱动电路
  2. Kotlin 资源大全
  3. 工业自动化源代码防泄密用什么加密软件
  4. 2021-11-29 AndroidR WiFi可以上网,但是Settings里提示“No Internet”的问题的一个解决方法,通过ping一个网站确认网络的情况。java ping 网络的代码。
  5. div背景图片或颜色不显示的解决办法
  6. pandownload 替代品_解除百度云网速限制方法(pandownload替代品)
  7. 网易大数据平台HDFS性能优化实践
  8. 谷歌浏览器缩略图消失问题解决
  9. python for i in 字符串_Python for循环中的in
  10. 【短临预报系列第一篇】Convolutional LSTM Network: A Machine LearningApproach for Precipitation Nowcasting