⑴ android 蓝牙BLE 该怎么搞,我是想搞个中心和周边 ,推送消息
Android4.3 规范了BLE的API,但是直到目前的4.4,还有些功能不完善。
在BLE协议中,有两个角色,周边(Periphery)和中央(Central);周边是数据提供者,中央是数据使用/处理者;在iOS SDK里面,可以把一个iOS设备作为一个周边,也可以作为一个中央;但是在Android SDK里面,直到目前最新的Android4.4.2,Android手机只能作为中央来使用和处理数据;那数据从哪儿来?从BLE设备来,现在的很多可穿戴设备都是用BLE来提供数据的。
一个中央可以同时连接多个周边,但是一个周边某一时刻只能连接一个中央。
大概了解了概念后,看看Android BLE SDK的四个关键类(class):
a)BluetoothGattServer作为周边来提供数据;BluetoothGattServerCallback返回周边的状态。
b)BluetoothGatt作为中央来使用和处理数据;BluetoothGattCallback返回中央的状态和周边提供的数据。
因为我们讨论的是Android的BLE SDK,下面所有的BluetoothGattServer代表周边,BluetoothGatt代表中央。
一.创建一个周边(虽然目前周边API在Android手机上不工作,但还是看看)
a)先看看周边用到的class,蓝色椭圆
⑵ android ble开发 怎么在后台 进入ble范围自动提醒
目前在开发android
ble
方面,想要实现程序在后台运行,进入ble设备范围就给用户发送通知。我是通过把connectGatt(Context
context,
boolean
autoConnect,
BluetoothGattCallback
callback)
的自动连接参数设成true来判断
⑶ android ble 自定义characteristic怎么解析
本文将介绍BLE设备之间的数据传输,首先是数据的发送。数据的发送通过Characteristic完成,发送数据的Characteristic必须拥有写权限,即BluetoothGattCharacteristic类中的mProperties属性必须为以下两者中之一:
[java] view plain
/**
* 写权限:不需要响应
*/
public static final int PROPERTY_WRITE_NO_RESPONSE = 0x04;
/**
* 写权限:需要响应
*/
public static final int PROPERTY_WRITE = 0x08;
在BLE的连接过程中,连接成功后会返回一个BluetoothGatt类型变量(见上一篇文章的2.7步骤),该类封装了BLE主要的操作。发送数据所需的Characteristic在BLE设备连接成功后的获取Service的过程中获得(见上一篇文章的2.10步骤),因此BLE的数据发送可以如下所示:
[java] view plain
@Override
public boolean writeCharacteristic(ICharacteristicBle chrBle) {
return mBleGatt.writeCharacteristic((BluetoothGattCharacteristic)chrBle);
⑷ android ble有哪些开源框架
你是用tcp还是http与服务器通讯,tcp的话可以用socket,哪有 什么框架,你要是用http的话 是你描述的那样,我写过一点用socket通讯的应用,但是没有xml,struts,json什么的东东,那些没有用过
⑸ android ble为什么要用service
BLE分为三部分Service、Characteristic、Descriptor,这三部分都由UUID作为唯一标示符。一个蓝牙4.0的终端可以包含多个Service,一个Service可以包含多个Characteristic,一个Characteristic包含一个Value和多个Descriptor,一个Descriptor包含一个Value。一般来说,Characteristic是手机与BLE终端交换数据的关键,Characteristic有较多的跟权限相关的字段,例如PERMISSION和PROPERTY,而其中最常用的是PROPERTY,本文所用的BLE蓝牙模块竟然没有标准的Characteristic的PERMISSION。Characteristic的PROPERTY可以通过位运算符组合来设置读写属性,例如READ|WRITE、READ|WRITE_NO_RESPONSE|NOTIFY,因此读取PROPERTY后要分解成所用的组合(本文代码已含此分解方法)。
⑹ android ble搜到一个蓝牙怎么跟特征值通信的
Generic Attribute Profile (GATT)
通过BLE连接,读写属性类小数据的Profile通用规范。现在所有的BLE应用Profile都是基于GATT的。
Attribute Protocol (ATT)
GATT是基于ATT Protocol的。ATT针对BLE设备做了专门的优化,具体就是在传输过程中使用尽量少的数据。每个属性都有一个唯一的UUID,属性将以characteristics and services的形式传输。
Characteristic
Characteristic可以理解为一个数据类型,它包括一个value和0至多个对次value的描述(Descriptor)。
Descriptor
对Characteristic的描述,例如范围、计量单位等。
Service
Characteristic的集合。例如一个service叫做“Heart Rate Monitor”,它可能包含多个Characteristics,其中可能包含一个叫做“heart rate measurement"的Characteristic。
二、角色和职责:
Android设备与BLE设备交互有两组角色:
中心设备和外围设备(Central vs. peripheral);
GATT server vs. GATT client.
Central vs. peripheral:
中心设备和外围设备的概念针对的是BLE连接本身。Central角色负责scan advertisement。而peripheral角色负责make advertisement。
GATT server vs. GATT client:
这两种角色取决于BLE连接成功后,两个设备间通信的方式。
举例说明:
现 有一个活动追踪的BLE设备和一个支持BLE的Android设备。Android设备支持Central角色,而BLE设备支持peripheral角 色。创建一个BLE连接需要这两个角色都存在,都仅支持Central角色或者都仅支持peripheral角色则无法建立连接。
当 连接建立后,它们之间就需要传输GATT数据。谁做server,谁做client,则取决于具体数据传输的情况。例如,如果活动追踪的BLE设备需要向 Android设备传输sensor数据,则活动追踪器自然成为了server端;而如果活动追踪器需要从Android设备获取更新信息,则 Android设备作为server端可能更合适。
三、权限及feature:
和经典蓝牙一样,应用使用蓝牙,需要声明BLUETOOTH权限,如果需要扫描设备或者操作蓝牙设置,则还需要BLUETOOTH_ADMIN权限:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
除了蓝牙权限外,如果需要BLE feature则还需要声明uses-feature:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
按时required为true时,则应用只能在支持BLE的Android设备上安装运行;required为false时,Android设备均可正常安装运行,需要在代码运行时判断设备是否支持BLE feature:
// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
finish();
}
四、启动蓝牙:
在使用蓝牙BLE之前,需要确认Android设备是否支持BLE feature(required为false时),另外要需要确认蓝牙是否打开。
如果发现不支持BLE,则不能使用BLE相关的功能。如果支持BLE,但是蓝牙没打开,则需要打开蓝牙。
打开蓝牙的步骤:
1、获取BluetoothAdapter
BluetoothAdapter是Android系统中所有蓝牙操作都需要的,它对应本地Android设备的蓝牙模块,在整个系统中BluetoothAdapter是单例的。当你获取到它的示例之后,就能进行相关的蓝牙操作了。
获取BluetoothAdapter代码示例如下:
// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
注:这里通过getSystemService获取BluetoothManager,再通过BluetoothManager获取BluetoothAdapter。BluetoothManager在Android4.3以上支持(API level 18)。
2、判断是否支持蓝牙,并打开蓝牙
获取到BluetoothAdapter之后,还需要判断是否支持蓝牙,以及蓝牙是否打开。
如果没打开,需要让用户打开蓝牙:
private BluetoothAdapter mBluetoothAdapter;
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
五、搜索BLE设备:
通过调用BluetoothAdapter的startLeScan()搜索BLE设备。调用此方法时需要传入 BluetoothAdapter.LeScanCallback参数。
因此你需要实现 BluetoothAdapter.LeScanCallback接口,BLE设备的搜索结果将通过这个callback返回。
由于搜索需要尽量减少功耗,因此在实际使用时需要注意:
1、当找到对应的设备后,立即停止扫描;
2、不要循环搜索设备,为每次搜索设置适合的时间限制。避免设备不在可用范围的时候持续不停扫描,消耗电量。
搜索的示例代码如下:
/**
* Activity for scanning and displaying available BLE devices.
*/
public class DeviceScanActivity extends ListActivity {
private BluetoothAdapter mBluetoothAdapter;
private boolean mScanning;
private Handler mHandler;
// Stops scanning after 10 seconds.
private static final long SCAN_PERIOD = 10000;
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}, SCAN_PERIOD);
mScanning = true;
mBluetoothAdapter.startLeScan(mLeScanCallback);
} else {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}
}
如果你只需要搜索指定UUID的外设,你可以调用 startLeScan(UUID[], BluetoothAdapter.LeScanCallback)方法。
其中UUID数组指定你的应用程序所支持的GATT Services的UUID。
BluetoothAdapter.LeScanCallback的实现示例如下:
private LeDeviceListAdapter mLeDeviceListAdapter;
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
}
};
注意:搜索时,你只能搜索传统蓝牙设备或者BLE设备,两者完全独立,不可同时被搜索。
六、连接GATT Server:
两个设备通过BLE通信,首先需要建立GATT连接。这里我们讲的是Android设备作为client端,连接GATT Server。
连接GATT Server,你需要调用BluetoothDevice的connectGatt()方法。此函数带三个参数:Context、autoConnect(boolean)和BluetoothGattCallback对象。调用示例:
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
函数成功,返回BluetoothGatt对象,它是GATT profile的封装。通过这个对象,我们就能进行GATT Client端的相关操作。BluetoothGattCallback用于传递一些连接状态及结果。
BluetoothGatt常规用到的几个操作示例:
connect() :连接远程设备。
discoverServices() : 搜索连接设备所支持的service。
disconnect():断开与远程设备的GATT连接。
close():关闭GATT Client端。
readCharacteristic(characteristic) :读取指定的characteristic。
setCharacteristicNotification(characteristic, enabled) :设置当指定characteristic值变化时,发出通知。
getServices() :获取远程设备所支持的services。
等等。
注:
1、某些函数调用之间存在先后关系。例如首先需要connect上才能discoverServices。
2、 一些函数调用是异步的,需要得到的值不会立即返回,而会在BluetoothGattCallback的回调函数中返回。例如 discoverServices与onServicesDiscovered回调,readCharacteristic与 onCharacteristicRead回调,setCharacteristicNotification与 onCharacteristicChanged回调等。
⑺ Android 手机可以通过 BLE 被扫描到吗
5.0以后可以了。之前不可以的。只能当主机。
Android在4.2的时候可以使用一些第三方的SDK尝试着使用Ble当主机。
Android在4.3以后官方可以当主机的角色,也就是楼上说的central,不能作为peripheral。
刚刚发布的5.0已经完美解决了这个问题。主从机都可以了。
开启蓝牙 并且开启蓝牙发现功能 原则上是可以的。
⑻ Android ble 接收数据
由于最近学校组织了一个移动APP(安卓)设计大赛,自己也学习安卓有一段时间了,就跟同学商量一起去参加试试,一拍即合,然后我们就开始想idea,因为最近可穿戴设备比较火,我们也就想试试。经过商量,我负责Android上位机的开发,同学负责下位机的开发。
上位机的开发主要是低功耗蓝牙BLE的开发,然后就开始找资料,各种找,最后谷歌官方提供的demo还有其他网友基于官方demo修改的demo,结合网上的博客对demo进行理解。刚开始是觉得看起来有点费劲,各种广播,跳来跳去的,刚开始就晕菜了。但是经过三四天的理解,算是把官方的demo理解了。
代码基本上都是官方的demo,只是通过修改获得自己想要的结果,下面就简单介绍一下自己的理解。
一、扫描BLE设备activity
检查该设备是否支持BLE设备,谷歌在Android4.3才开始支持BLE设备(晕死,很长一段时间都没有一台4.3的设备,看着程序修改了也不能测试!)。
详细
⑼ android ble 蓝牙 谁是主机
GenericAttributeProfile(GATT)通过BLE连接,读写属性类小数据的Profile通用规范。现在所有的BLE应用Profile都是基于GATT的。AttributeProtocol(ATT)GATT是基于ATTProtocol的。ATT针对BLE设备做了专门的优化,具体就是在传输过程中使用尽量少的数据。每个属性都有一个唯一的UUID,属性将以characteristicsandservices的形式传输。CharacteristicCharacteristic可以理解为一个数据类型,它包括一个value和0至多个对次value的描述(Descriptor)。Descriptor对Characteristic的描述,例如范围、计量单位等。ServiceCharacteristic的集合。例如一个service叫做“HeartRateMonitor”,它可能包含多个Characteristics,其中可能包含一个叫做“heartratemeasurement"的Characteristic。二、角色和职责:Android设备与BLE设备交互有两组角色:中心设备和外围设备(Centralvs.peripheral);GATTservervs.GATTclient.Centralvs.peripheral:中心设备和外围设备的概念针对的是BLE连接本身。Central角色负责scanadvertisement。而peripheral角色负责makeadvertisement。GATTservervs.GATTclient:这两种角色取决于BLE连接成功后,两个设备间通信的方式。举例说明:现有一个活动追踪的BLE设备和一个支持BLE的Android设备。Android设备支持Central角色,而BLE设备支持peripheral角色。创建一个BLE连接需要这两个角色都存在,都仅支持Central角色或者都仅支持peripheral角色则无法建立连接。当连接建立后,它们之间就需要传输GATT数据。谁做server,谁做client,则取决于具体数据传输的情况。例如,如果活动追踪的BLE设备需要向Android设备传输sensor数据,则活动追踪器自然成为了server端;而如果活动追踪器需要从Android设备获取更新信息,则Android设备作为server端可能更合适。三、权限及feature:和经典蓝牙一样,应用使用蓝牙,需要声明BLUETOOTH权限,如果需要扫描设备或者操作蓝牙设置,则还需要BLUETOOTH_ADMIN权限:除了蓝牙权限外,如果需要BLEfeature则还需要声明uses-feature:按时required为true时,则应用只能在支持BLE的Android设备上安装运行;required为false时,Android设备均可正常安装运行,需要在代码运行时判断设备是否支持BLEfeature://.Then//youcanselectivelydisableBLE-relatedfeatures.if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){Toast.makeText(this,R.string.ble_not_supported,Toast.LENGTH_SHORT).show();finish();}四、启动蓝牙:在使用蓝牙BLE之前,需要确认Android设备是否支持BLEfeature(required为false时),另外要需要确认蓝牙是否打开。如果发现不支持BLE,则不能使用BLE相关的功能。如果支持BLE,但是蓝牙没打开,则需要打开蓝牙。打开蓝牙的步骤:1、获取是Android系统中所有蓝牙操作都需要的,它对应本地Android设备的蓝牙模块,在整个系统中BluetoothAdapter是单例的。当你获取到它的示例之后,就能进行相关的蓝牙操作了。获取BluetoothAdapter代码示例如下://InitializesBluetoothadapter.=(BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);mBluetoothAdapter=bluetoothManager.getAdapter();注:这里通过getSystemService获取BluetoothManager,再通过BluetoothManager获取BluetoothAdapter。BluetoothManager在Android4.3以上支持(APIlevel18)。2、判断是否支持蓝牙,并打开蓝牙获取到BluetoothAdapter之后,还需要判断是否支持蓝牙,以及蓝牙是否打开。如果没打开,需要让用户打开蓝牙:;//.Ifnot,//.if(mBluetoothAdapter==null||!mBluetoothAdapter.isEnabled()){IntentenableBtIntent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT);}五、搜索BLE设备:通过调用BluetoothAdapter的startLeScan()搜索BLE设备。调用此方法时需要传入BluetoothAdapter.LeScanCallback参数。因此你需要实现BluetoothAdapter.LeScanCallback接口,BLE设备的搜索结果将通过这个callback返回。由于搜索需要尽量减少功耗,因此在实际使用时需要注意:1、当找到对应的设备后,立即停止扫描;2、不要循环搜索设备,为每次搜索设置适合的时间限制。避免设备不在可用范围的时候持续不停扫描,消耗电量。搜索的示例代码如下:/***.*/{;privatebooleanmScanning;privateHandlermHandler;//Stopsscanningafter10seconds.privatestaticfinallongSCAN_PERIOD=10000;privatevoidscanLeDevice(finalbooleanenable){if(enable){//Stopsscanningafterapre-definedscanperiod.mHandler.postDelayed(newRunnable(){@Overridepublicvoidrun(){mScanning=false;mBluetoothAdapter.stopLeScan(mLeScanCallback);}},SCAN_PERIOD);mScanning=true;mBluetoothAdapter.startLeScan(mLeScanCallback);}else{mScanning=false;mBluetoothAdapter.stopLeScan(mLeScanCallback);}}}如果你只需要搜索指定UUID的外设,你可以调用startLeScan(UUID[],BluetoothAdapter.LeScanCallback)方法。其中UUID数组指定你的应用程序所支持的GATTServices的UUID。BluetoothAdapter.LeScanCallback的实现示例如下:;//Devicescancallback.privateBluetoothAdapter.LeScanCallbackmLeScanCallback=newBluetoothAdapter.LeScanCallback(){@OverridepublicvoidonLeScan(finalBluetoothDevicedevice,intrssi,byte[]scanRecord){runOnUiThread(newRunnable(){@Overridepublicvoidrun(){mLeDeviceListAdapter.addDevice(device);mLeDeviceListAdapter.notifyDataSetChanged();}});}};注意:搜索时,你只能搜索传统蓝牙设备或者BLE设备,两者完全独立,不可同时被搜索。六、连接GATTServer:两个设备通过BLE通信,首先需要建立GATT连接。这里我们讲的是Android设备作为client端,连接GATTServer。连接GATTServer,你需要调用BluetoothDevice的connectGatt()方法。此函数带三个参数:Context、autoConnect(boolean)和BluetoothGattCallback对象。调用示例:mBluetoothGatt=device.connectGatt(this,false,mGattCallback);函数成功,返回BluetoothGatt对象,它是GATTprofile的封装。通过这个对象,我们就能进行GATTClient端的相关操作。BluetoothGattCallback用于传递一些连接状态及结果。BluetoothGatt常规用到的几个操作示例:connect():连接远程设备。discoverServices():搜索连接设备所支持的service。disconnect():断开与远程设备的GATT连接。close():关闭GATTClient端。readCharacteristic(characteristic):读取指定的characteristic。setCharacteristicNotification(characteristic,enabled):设置当指定characteristic值变化时,发出通知。getServices():获取远程设备所支持的services。等等。注:1、某些函数调用之间存在先后关系。例如首先需要connect上才能discoverServices。2、一些函数调用是异步的,需要得到的值不会立即返回,而会在BluetoothGattCallback的回调函数中返回。例如discoverServices与onServicesDiscovered回调,readCharacteristic与onCharacteristicRead回调,setCharacteristicNotification与onCharacteristicChanged回调等。
⑽ android ble 和ios ble的区别
iBeacon
在ios 中ibeacon是基于地理位置的微定位技术,虽然借助手机蓝牙进行接收Majro、Minor,但是在开发工程中没有任何关系。
ios 在ble、ibeacon 开发过程中与Android 的区别
在ios 中所有的数据都是通过API获取的,也就是说在IOS中不会看到蓝牙模块的裸数据,只能拿到苹果公司提供的极个别的API中的数据。
ble、ibeacon各使用各自的API,之间没有任何对应关系。如果想使用ble就不可能获取到ibeacon的major、minor、uuid 等信息,如果使用ibeacon,没有办法发起链接请求获取服务。
在ios中ibeacon通信数据只有六个属性,就是苹果提供的几个表示距离的属性,是一个float类型数据。