android BLE Peripheral 做外设模拟设备,供ios、android 连接通讯。

为了能让其它设备可以发现其设备,先启动特定广播。看自己需要什么广播格式。

android 对外发出广播,都一样,只是更改其中的方法:

android BLE Peripheral 模拟 ibeacon 发出ble 广播

开始广播: 增加使用BluetoothGattServer

 1 public void startAdvertising(MockServerCallBack callBack) {
 2         //获取BluetoothLeAdvertiser,BLE发送BLE广播用的一个API
 3         if (mBluetoothAdvertiser == null) {
 4             mBluetoothAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
 5         }
 6         //创建BluetoothGattServerCallback,
 7         // MockServerCallBack这个类继承自BluetoothGattServerCallback
 8         // BluetoothGattServerCallback这个回调类主要是一些BLE读写的接口
 9         // 关于BLE读写的操作都在这个Callback中完成
10         if (mBluetoothAdvertiser != null) {
11             mMockServerCallBack = callBack;
12             //打开BluetoothGattServer
13             mGattServer = mBluetoothManager.openGattServer(mActivity, mMockServerCallBack);
14             if (mGattServer == null) {
15                 Log.e(TAG, "gatt is null");
16             }
17             try {
18                 mMockServerCallBack.setupServices(mActivity, mGattServer);
20                 mBluetoothAdvertiser.startAdvertising(createAdvSettings(true, 0)
21                         , createAdvertiseData(BluetoothUUID.bleServerUUID), mAdvCallback);
22             } catch (Exception e) {
23                 Log.v(TAG, "Fail to setup BleService");
24             }
25         }
26
27         isAdvertising = true;
28     }

创建广播,添加serviceUuid,广播内容,自行决定。

addServiceUuid(ParcelUuid serviceUuid) 的作用。

广播数据加入serviceUuid , 当其它设备扫描时,就可以根据此serviceUuid进行特定扫描.

扫描BLE设备的时候:启动扫描时,有可选参数,传入uuid数组。

BluetoothAdapter
public boolean startLeScan(final UUID[] serviceUuids, final LeScanCallback callback);

使用该函数启动扫描的,会根据所传入的uuid,去扫描过滤,只返回符合条件的设备。

注意:部分手机可能设置uuid后,扫描不到设备,可能底层扫描问题。

 1  public static AdvertiseData createAdvertiseData(UUID proximityUuid) {
 2     AdvertiseData.Builder builder = new AdvertiseData.Builder();
 4     builder.addManufacturerData(0x0301, new byte[]{0x01, 0x03});
 5     builder.addServiceUuid(ParcelUuid.fromString(BluetoothUUID.bleServerUUID.toString())
 7     AdvertiseData adv = builder.build();
10     return adv;
11  }

BluetoothGattServerCallback:服务事件的回调

打开notification 对应的value为 BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE

打开indication 对应的value为 BluetoothGattDescriptor.ENABLE_INDICATION_VALUE

关闭notification 对应的value均为BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE

服务事件响应过程:

(1) 当客户端开始写入数据时: 触发回调方法 onDescriptorWriteRequest

(2) 在 onDescriptorWriteRequest 方法中,执行下面的方法表示 写入成功 BluetoothGatt.GATT_SUCCESS

1 bluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, value);
2 // 执行 sendResponse后,会触发回调方法 onCharacteristicWriteRequest

(3) 在 onCharacteristicWriteRequest方法中:

1 public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId
2 , BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean responseNeeded, int offset, byte[] requestBytes) {
3        // 这个里可以获得 来自客户端发来的数据 requestBytes
4 }

(4) 处理响应内容

BluetoothGattServerCallback :

  1 public class MockServerCallBack extends BluetoothGattServerCallback {
  2
  3 public void setupServices(Context context, BluetoothGattServer gattServer) throws InterruptedException {
  4         if (gattServer == null) {
  5             throw new IllegalArgumentException("gattServer is null");
  6         }
  7         mGattServer = gattServer;
  8         // 设置一个GattService以及BluetoothGattCharacteristic
  9         BluetoothGattService service = new BluetoothGattService(BluetoothUUID.bleServerUUID,
 10                 BluetoothGattService.SERVICE_TYPE_PRIMARY);
 11
 12         BluetoothGattService service2 = new BluetoothGattService(BluetoothUUID.bleServerUUID2,
 13                 BluetoothGattService.SERVICE_TYPE_PRIMARY);
 14
 15         //add a read characteristic.
 16         // 当是ios设备连接过来时,需添加BluetoothGattCharacteristic.PROPERTY_INDICATE进行兼容。
 17         mCharacteristicRead = new BluetoothGattCharacteristic(BluetoothUUID.readDataUUID
 18                 , BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_INDICATE
 19                 , BluetoothGattCharacteristic.PERMISSION_READ);
 20         //add a descriptor
 21         BluetoothGattDescriptor descriptor = new BluetoothGattDescriptor(BluetoothUUID.CLIENT_CHARACTERISTIC_CONFIG
 22                 , BluetoothGattCharacteristic.PERMISSION_WRITE);
 23         mCharacteristicRead.addDescriptor(descriptor);
 24         service.addCharacteristic(mCharacteristicRead);
 25
 26         BluetoothGattCharacteristic write = new BluetoothGattCharacteristic(
 27                 BluetoothUUID.writeDataUUID,
 28                 BluetoothGattCharacteristic.PROPERTY_WRITE | BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_INDICATE,
 29                 BluetoothGattCharacteristic.PERMISSION_WRITE);
 30
 31         service.addCharacteristic(write);
 32
 33         if (mGattServer != null && service != null) {
 34             mGattServer.addService(service);
 35             mGattServer.addService(service2);
 36         }
 37
 38     }
 39
 40     //当添加一个GattService成功后会回调改接口。
 41     public void onServiceAdded(int status, BluetoothGattService service) {
 42         super.onServiceAdded(status, service);
 43         if (status == BluetoothGatt.GATT_SUCCESS) {
 44             Log.d(TAG, "onServiceAdded status=GATT_SUCCESS service=" + service.getUuid().toString());
 45         } else {
 46             Log.d(TAG, "onServiceAdded status!=GATT_SUCCESS");
 47         }
 48     }
 49
 50     //BLE设备连接状态发生改变后回调的接口
 51     public void onConnectionStateChange(android.bluetooth.BluetoothDevice device, int status,
 52                                         int newState) {
 53         super.onConnectionStateChange(device, status, newState);
 54         Log.e(TAG, String.format("1.onConnectionStateChange:device name = %s, address = %s"
 55                 , device.getName(), device.getAddress()));
 56         Log.d(TAG, "onConnectionStateChange status=" + status + "->" + newState);
 57         if (newState == BluetoothProfile.STATE_DISCONNECTED) {
 58             btClient = null; // 移除连接设备
 59         }
 60     }
 61
 62     //当有客户端来读数据时回调的接口
 63
 64     /**
 65      * 特征被读取。当回复响应成功后,客户端会读取然后触发本方法,
 66      */
 67     public void onCharacteristicReadRequest(android.bluetooth.BluetoothDevice device,
 68                                             int requestId, int offset, BluetoothGattCharacteristic characteristic) {
 69         super.onCharacteristicReadRequest(device, requestId, offset, characteristic);
 70         characteristic.setValue(new byte[]{0x03, 0x01});
 71         Log.e(TAG, String.format("1.onCharacteristicReadRequest:device name = %s, address = %s"
 72                 , device.getName(), device.getAddress()));
 73         Log.e(TAG, String.format("onCharacteristicReadRequest:requestId = %s, offset = %s", requestId, offset));
 74         boolean result = mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, characteristic.getValue());
 75
 76         Log.e(TAG, "read request send response:" + result);
 77     }
 78
 79     //当有客户端来写数据时回调的接口
 80
 81     /**
 82      * 接受具体数据字节 85      */
 86     @Override
 87     public void onCharacteristicWriteRequest(android.bluetooth.BluetoothDevice device,
 88                                              int requestId, BluetoothGattCharacteristic characteristic, boolean preparedWrite,
 89                                              boolean responseNeeded, int offset, byte[] value) {
 90         super.onCharacteristicWriteRequest(device, requestId, characteristic, preparedWrite, responseNeeded, offset, value);
 91
 92         mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, null);
 93
 94         // 处理其它设备写进来的数据
 95         value.  // 处理数据 byte[] value,记住连接设备
 96
 97     }
 98
 99     //描述被写入时,在这里执行bluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS...) 时,触发onCharacteristicWriteRequest
100     @Override
101     public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
102         super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value);
103
104         Log.d(TAG, "onDescriptorWriteRequest:" + Arrays.toString(value));
105         // now tell the connected device that this was all successfull
106         mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, value);
107     }
108
109 }
时间: 2024-10-12 13:14:54

android BLE Peripheral 做外设模拟设备,供ios、android 连接通讯。的相关文章

android BLE Peripheral 手机模拟设备发出BLE广播 BluetoothLeAdvertiser

android 从4.3系统开始可以连接BLE设备,这个大家都知道了.iOS是从7.0版本开始支持BLE. android 进入5.0时代时,开放了一个新功能,手机可以模拟设备发出BLE广播, 这个新功能其实是 对标于 iOS系统的手机模拟iBeacon设备. 先介绍一下BLE的广播, BLE设备之所以能被手机扫描到,是因为 BLE设备一直在每隔 一段时间广播一次,这个广播里面包含很多数据. 手机扫描BLE设备代码如下: public void startScan(){ bluetoothAda

Android BLE与终端通信(三)——client与服务端通信过程以及实现数据通信

Android BLE与终端通信(三)--client与服务端通信过程以及实现数据通信 前面的终究仅仅是小知识点.上不了台面,也仅仅能算是起到一个科普的作用.而同步到实际的开发上去,今天就来延续前两篇实现蓝牙主从关系的client和服务端了.本文相关链接须要去google的API上查看,须要FQ的 Bluetooth Low Energy:http://developer.android.com/guide/topics/connectivity/bluetooth-le.html 可是我们依旧

android L BLE Peripheral牛刀小试

知道Android L对蓝牙对了一些改进,包括添加A2dp sink.HFP client.BLE Peripheral功能等等. 我花了一天多时间对Android L BLE Peripheral SDK进行了研究,网上的资料很少,有一个介绍的还不够清晰,所以就自己写了一个测试应用,希望可以对理解BLE Peripheral有一定的帮助. 此贴主要以讲解代码为主,我会把项目代码也传到CSDN中,帮助大家测试. 首先说明一点,并不是Android L的系统就可以支持BLE Peripheral,

Android与IOS的优缺点比较 对 Android 与 IOS 比较是个个人的问题。 就好比我来说,我两个都用。我深知这两个平台的优缺点。所以,我决定分享我关于这两个移动平台的观点。另外,然后谈谈我对新的 Ubuntu 移动平台的印象和它的优势。 IOS 的优点 虽然这些天我是个十足的 Android 用户,但我必须承认 IOS 在某些方面做的是不错。首先,苹果公司在他们的设备更新方面有更

Android与IOS的优缺点比较 对 Android 与 IOS 比较是个个人的问题. 就好比我来说,我两个都用.我深知这两个平台的优缺点.所以,我决定分享我关于这两个移动平台的观点.另外,然后谈谈我对新的 Ubuntu 移动平台的印象和它的优势. IOS 的优点 虽然这些天我是个十足的 Android 用户,但我必须承认 IOS 在某些方面做的是不错.首先,苹果公司在他们的设备更新方面有更好的成绩.这对于运行着 iOS 的旧设备来说尤其是这样.反观 Android ,如果不是谷歌亲生的 Ne

Android BLE学习笔记

个人网站:http://www.xiaoyaoyou1212.com 欢迎吐槽围观! 前言: 本文主要描述Android BLE的一些基础知识及相关操作流程,不牵扯具体的业务实现,其中提供了针对广播包及响应包的解析思路,希望对正在或即将面临Android BLE开发的伙伴们有所引导. 注:其中的单模.双模.BR.BT.BLE.蓝牙3.0.蓝牙4.0等概念混在一起可能比较难理解,不知下文描述是否清晰,如果有不理解的地方,欢迎留言交流! 一.相关介绍 1.概述 蓝牙无线技术是一种全球通用的短距离无线

BLE简介和Android BLE编程

一.BLE和BT区别 其实我知道许多程序员不太喜欢阅读除了代码以外的文档,因为有时这些过于冗长的文档对编程并没有更多的好处,有了协议,接口,demo差不多很多人就能写出很好质量的代码了.但其实更深入的编程是少了阅读的,阅读文档可以解决很多编程中遇到的困难,比如在大数据大流量情况下,很多正常的程序会表现出不可靠的一面,这已经不是够编程能解决的了,硬件的配置,服务器带宽,使用的数据库,调用的接口都有可能是瓶颈.比如BLE,同样的蓝牙,但却有着本质区别,一个表现就是不是所有蓝牙设备都支持BLE,编程如

iOS/Android 浏览器(h5)及微信中唤起本地APP

在移动互联网,链接是比较重要的传播媒质,但很多时候我们又希望用户能够回到APP中,这就要求APP可以通过浏览器或在微信中被方便地唤起. 这是一个既直观又很好的用户体验,但在实现过程中会遇到各种问题: 如何解决未安装APP时的做好引导页 如何在微信中唤醒APP 在iOS9中如何处理universal link被用户误关的情况 如何解决Android各种机型.各种第三方浏览器导致的兼容问题等 在APP未安装情况下,引导用户下载后打开APP后,如何进入之前唤起时指定的页面或内容,即如何实现场景还原 在

Android BLE开发的各种坑

这段时间在做低功耗蓝牙(BLE)应用的开发(并不涉及蓝牙协议栈).总体感觉 Android BLE 还是不太稳定,开发起来也是各种痛苦.这里记录一些杂项和开发中遇到的问题及其解决方法,避免大家踩坑.本文说的问题有些没有得到官方文档的验证,不过也有一些论坛帖子的支持,也可以算是有一定根据. Android 从 4.3(API Level 18) 开始支持低功耗蓝牙,但是只支持作为中心设备(Central)模式,这就意味着 Android 设备只能主动扫描和链接其他外围设备(Peripheral).

(插播)unity的 异常捕捉和 ios Android 崩溃信息的捕捉。

最近 做些准备性得工作和有意思的事情.所以最近做了一个适合ios和android 错误信息捕捉的unity插件. 两个功能,app崩溃也就是闪退 是开发者 很头疼的一件事,还有就是一些莫名得错误 有时候也会困扰着我们.现在,unity已经封装得挺好了,及时出现数组越界,和空对象这样严重得错误也不会崩溃,听着挺好,但是这给开发者带了很多烦恼啊.因为有时候可能出错了 你要跟就不知道 ,在什么地方出得错误啊.所以我们要想办法去解决这个问题. 我们都知道及时app崩溃,其实后台还是在运行得 只不过是 到