Android BLE开发: BLE Peripheral开发流程

2024-06-03 17:58

本文主要是介绍Android BLE开发: BLE Peripheral开发流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android从lolipop开始支持了BLE Peripheral开发。网上也有关于Framework的文章。真的关于应用开发的确不多,google官网也只给出了一个Central的Demo。之前做了一个BLE Peripheral的Demo,这里将Peripheral开发的一些流程简单整理一下。不多说,直接上代码。

初始化

//初始化BluetoothManager和BluetoothAdapter
if(mBluetoothManager == null)mBluetoothManager = (BluetoothManager) mActivity.getSystemService(Context.BLUETOOTH_SERVICE);if (mBluetoothManager != null && mBluetoothAdapter == null) {mBluetoothAdapter = mBluetoothManager.getAdapter();
}//打开蓝牙的套路
if ((mBluetoothAdapter == null) || (!mBluetoothAdapter.isEnabled())) {Toast.makeText(mActivity, R.string.bt_unavailable, Toast.LENGTH_SHORT).show();Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);mActivity.startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

开始广播

//获取BluetoothLeAdvertiser,BLE发送BLE广播用的一个API
if (mBluetoothAdvertiser == null) {mBluetoothAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
}
//创建BluetoothGattServerCallback,
//MockServerCallBack这个类继承自BluetoothGattServerCallback
//后面会贴出MockServerCallBack这个类的代码
//BluetoothGattServerCallback这个回调类主要是一些BLE读写的接口
//关于BLE读写的操作都在这个Callback中完成
if (mBluetoothAdvertiser != null) {mMockServerCallBack = new MockServerCallBack(mActivity);//打开BluetoothGattServermGattServer = mBluetoothManager.openGattServer(mActivity, mMockServerCallBack);if(mGattServer == null){Log.d(TAG , "gatt is null");}try{mMockServerCallBack.setupServices(mGattServer);//创建BLE Adevertising并且广播mBluetoothAdvertiser.startAdvertising(createAdvSettings(true, 0), createFMPAdvertiseData(),mAdvCallback);}catch(InterruptedException e){Log.v(TAG, "Fail to setup BleService");}
}

创建Advertising

public static AdvertiseSettings createAdvSettings(boolean connectable, int timeoutMillis) {AdvertiseSettings.Builder builder = new AdvertiseSettings.Builder();//设置广播的模式,应该是跟功耗相关builder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED);builder.setConnectable(connectable);builder.setTimeout(timeoutMillis);builder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);return builder.build();
}//设置一下FMP广播数据
public static AdvertiseData createFMPAdvertiseData() {AdvertiseData.Builder builder = new AdvertiseData.Builder();builder.setIncludeDeviceName(true);AdvertiseData adv = builder.build();return adv;
}//发送广播的回调,onStartSuccess/onStartFailure很明显的两个Callback
private AdvertiseCallback mAdvCallback = new AdvertiseCallback() {public void onStartSuccess(android.bluetooth.le.AdvertiseSettings settingsInEffect) {if (settingsInEffect != null) {Log.d(TAG, "onStartSuccess TxPowerLv="+ settingsInEffect.getTxPowerLevel()+ " mode=" + settingsInEffect.getMode()+ " timeout=" + settingsInEffect.getTimeout());} else {Log.d(TAG, "onStartSuccess, settingInEffect is null");}}public void onStartFailure(int errorCode) {Log.d(TAG, "onStartFailure errorCode=" + errorCode);};
};

BLE需要的BluetoothGattServerCallback

import android.app.Activity;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattDescriptor;
import android.bluetooth.BluetoothGattServer;
import android.bluetooth.BluetoothGattServerCallback;
import android.bluetooth.BluetoothGattService;
import android.util.Log;public class MockServerCallBack extends BluetoothGattServerCallback {private static final String TAG = "BleServer";private byte[] mAlertLevel = new byte[] {(byte) 0x00};private Activity mActivity;private HomePager mHomepager;private boolean mIsPushStatic = false;private BluetoothGattServer mGattServer;private BluetoothGattCharacteristic mDateChar;private BluetoothDevice btClient;private BluetoothGattCharacteristic mHeartRateChar;private BluetoothGattCharacteristic mTemperatureChar;private BluetoothGattCharacteristic mBatteryChar;private BluetoothGattCharacteristic mManufacturerNameChar;private BluetoothGattCharacteristic mModuleNumberChar;private BluetoothGattCharacteristic mSerialNumberChar;public void setupServices(BluetoothGattServer gattServer) throws InterruptedException{if (gattServer == null) {throw new IllegalArgumentException("gattServer is null");}mGattServer = gattServer;// 设置一个GattService以及BluetoothGattCharacteristic { //immediate alertBluetoothGattService ias = new BluetoothGattService( UUID.fromString(IMXUuid.SERVICE_IMMEDIATE_ALERT),BluetoothGattService.SERVICE_TYPE_PRIMARY);//alert level char.BluetoothGattCharacteristic alc = new BluetoothGattCharacteristic(UUID.fromString(IMXUuid.CHAR_ALERT_LEVEL),BluetoothGattCharacteristic.PROPERTY_READ |BluetoothGattCharacteristic.PROPERTY_WRITE | BluetoothGattCharacteristic.PROPERTY_NOTIFY ,BluetoothGattCharacteristic.PERMISSION_READ |BluetoothGattCharacteristic.PERMISSION_WRITE);alc.setValue("");ias.addCharacteristic(alc);if(mGattServer!=null && ias!=null)mGattServer.addService(ias);}}//当添加一个GattService成功后会回调改接口。public void onServiceAdded(int status, BluetoothGattService service) {if (status == BluetoothGatt.GATT_SUCCESS) {Log.d(TAG, "onServiceAdded status=GATT_SUCCESS service=" + service.getUuid().toString());} else {Log.d(TAG, "onServiceAdded status!=GATT_SUCCESS");}}//BLE连接状态改变后回调的接口public void onConnectionStateChange(android.bluetooth.BluetoothDevice device, int status,int newState) {Log.d(TAG, "onConnectionStateChange status=" + status + "->" + newState);}//当有客户端来读数据时回调的接口public void onCharacteristicReadRequest(android.bluetooth.BluetoothDevice device,int requestId, int offset, BluetoothGattCharacteristic characteristic) {Log.d(TAG, "onCharacteristicReadRequest requestId=" + requestId + " offset=" + offset);mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset,characteristic.getValue());}//当有客户端来写数据时回调的接口@Overridepublic void onCharacteristicWriteRequest(android.bluetooth.BluetoothDevice device,int requestId, BluetoothGattCharacteristic characteristic, boolean preparedWrite,boolean responseNeeded, int offset, byte[] value) {mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, null);}//当有客户端来写Descriptor时回调的接口@Overridepublic void onDescriptorWriteRequest (BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {btClient = device;Log.d(TAG, "onDescriptorWriteRequest");// now tell the connected device that this was all successfullmGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, value);}
}

至此,BLE Peripheral发送广播所需要的工作都完成了,并且当有Central设备读写该Peripheral设备时候也能通过BluetoothGattServerCallback回调到。

停止广播

//关闭BluetoothLeAdvertiser,BluetoothAdapter,BluetoothGattServer 
if (mBluetoothAdvertiser != null) {mBluetoothAdvertiser.stopAdvertising(mAdvCallback);mBluetoothAdvertiser = null;
}if(mBluetoothAdapter != null){mBluetoothAdapter = null;
}if (mGattServer != null) {mGattServer.clearServices();mGattServer.close();
}       

这样,Android设备就停止了BLE的广播,外部的Central设备就搜索不到该设备并且连接上它了。
BLE Peripheral的API乍一看有些多,其实仔细理一理非常简单,工作重点在于那个Callback的编写。

这篇关于Android BLE开发: BLE Peripheral开发流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1027704

相关文章

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超