蓝牙4.0android开发,Android蓝牙4.0开发
添加蓝牙权限
特性请求
值为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开发相关推荐
- 谈谈几个月以来开发android蓝牙4.0 BLE低功耗应用的感受
谈谈几个月以来开发android蓝牙4.0 BLE低功耗应用的感受 谈谈几个月以来开发android蓝牙4.0 BLE低功耗应用的感受,注明下时间:2012-10-17写的博客,后期更新的也注明了时间 ...
- 开发android蓝牙4.0 BLE低功耗应用的感受
文章转自: http://www.cnblogs.com/zdz8207/archive/2012/10/17/bluetooth_ble_android.html 谈谈几个月以来开发android蓝 ...
- Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例)
Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例) 标签: 注册登录Android开发servlet 2017-04-18 20:34 454人阅读 评论(1) ...
- android中蓝牙的使用方法,Android蓝牙开发教程(一)
Android蓝牙功能的开发一直是很多新手头疼的问题,网上虽然也有很多教程贴,但大多都写得不全面,不能让我们真正掌握蓝牙开发的基本知识.本教程主要讲解搜索蓝牙设备.蓝牙设备之间的连接和蓝牙之间的通讯三 ...
- android 蓝牙hf编程,基于Android蓝牙Inband ring功能实现.doc
基于Android蓝牙Inband ring功能实现 基于Android蓝牙Inband ring功能实现 [摘要] 蓝牙作为一种短距无线数据与语音传输的开放性全球规范,目前在整个世界范围内都得到了很 ...
- 用c#开发Android应用(一)——搭建开发环境
自从有了Android后就一直想尝试下为Android开发些小应用玩玩.但是我日常主要工作是用C#来完成的,JAVA放下也有些年头了所以这事就就一直拖着没干.后来听说有了Mono for Androi ...
- android锁屏软件开发,Android一键锁屏开发全过程
一.项目简介: 项目:<Android 一键锁屏> 开发周期:4天 代码量:100行 二.项目流程: 三.项目代码 1.主程序代码: 1.private DevicePolicyManag ...
- android 蓝牙ble调试助手,Android蓝牙调试助手源码分享
package com.example.android.BluetoothChat; /** * 描述:蓝牙服务核心类 */ import java.io.IOException; import ja ...
- android 蓝牙ble 133,java – Android蓝牙错误133
我正在尝试连接到 Android上的蓝牙设备.我在onClientConnectionState处理程序中收到状态133.我并不总是得到这个错误 – 有时连接很好.我无法指出触发问题的原因.重新启动设 ...
最新文章
- Learn OpenGL (二):三角形
- 如何管理好自己的性格?
- 从零开始学安全(三)●黑客常用的windows端口
- 计算机应用基础本科常见问题讨论,《计算机应用基础》(本科)2017年6月期末考试指导.pdf...
- 无人驾驶之入门(车联网和5G)
- 【Laravel】使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能
- stm32中断 抢占优先级 和 响应优先级 有什么区别
- javascript设计模式_JavaScript设计模式:命令模式(通俗易懂)
- kindle刷机ttl_摔一下变砖了,ttl刷机没效果,谁帮看看最后三行那个error什么意...
- DLL编写中extern “C”和__stdcall的作用
- 电脑计算机睡眠和休眠模式区别,电脑休眠和睡眠的区别?
- 保利威视收购CuPlayer,视频云竞争大幕已然拉开
- kali下载速度慢_kali Linux 2020.1最新安装教程,绝对能帮你安装好!不是root、没有桌面、中文乱码、下载太慢、ssh链接等问题!...
- 第二集 第一魂环 第十章
- 在windows的命令行窗口打开.ipynb文件
- python习题答案集
- jeeplus ani 文档路径
- C++实现简单电话通讯录
- 找不到该项目,请确认该项目的位置
- 为什么我从Flutter转投Electron的怀抱?
热门文章
- 直流电机H桥驱动电路
- Kotlin 资源大全
- 工业自动化源代码防泄密用什么加密软件
- 2021-11-29 AndroidR WiFi可以上网,但是Settings里提示“No Internet”的问题的一个解决方法,通过ping一个网站确认网络的情况。java ping 网络的代码。
- div背景图片或颜色不显示的解决办法
- pandownload 替代品_解除百度云网速限制方法(pandownload替代品)
- 网易大数据平台HDFS性能优化实践
- 谷歌浏览器缩略图消失问题解决
- python for i in 字符串_Python for循环中的in
- 【短临预报系列第一篇】Convolutional LSTM Network: A Machine LearningApproach for Precipitation Nowcasting