Bluetooth程序设计(三)低功耗蓝牙
BLE——低功耗蓝牙(BluetoothLowEnergy)

BLE——低功耗蓝⽛(BluetoothLowEnergy)1、简介以下蓝⽛协议特指低功耗蓝⽛协议。
蓝⽛协议是由SIG制定并维护的通信协议,蓝⽛协议栈是蓝⽛协议的具体实现。
各⼚商都根据蓝⽛协议实现了⾃⼰的⼀套函数库——蓝⽛协议栈,所以不同⼚商的蓝⽛协议栈之间存在差别,但都遵循制定的蓝⽛协议。
蓝⽛技术的实质是建⽴通⽤⽆线接⼝及其控制软件的标准,使移动通信与计算机⽹络之间能实现⽆缝连接。
蓝⽛通讯最初设计初衷是⽅便移动电话(⼿机)与配件之间进⾏低成本、低功耗⽆线通信连接。
通俗地说,蓝⽛最初就是为了替代串⼝,实现⽆线串⼝的功能。
蓝⽛4.1就是⼀个⼤杂烩:BR/EDR沿⽤旧的蓝⽛规范,LE抄袭802.15.4,AMP直接使⽤802.11。
以上操作的⽬的是为了提⾼蓝⽛的兼容性和易⽤性,但是需要在功耗和传输速率之间取得平衡,整体来说,这个设计并不⼗分优雅,只是存在即合理。
标准号:IEEE 802.15.1核⼼:低功耗技术,即Low EnergyRF规格⼯作频段:2.4GHz~2.4835GHz,ISM(Industrial,Scientific and Medical)频段;⼯作频道:40个频道,每个频道2MHz的间隔,3个⼴播信道(37-2402MHz,38-2426MHz,39-2480MHz),37个数据信道,⼴播报⽂还是数据报⽂由信道决定;调制⽅式:GFSK,调制指数为0.5中⼼频率容限:±150kHz功耗功耗限制:-20dBm~10dBm特性可靠性:⾃适应跳频,保证在⽆⼲扰信道上通信;安全性:认证、绑定、配对,配对绑定在⼀些⼿机上可能存在兼容性问题,慎⽤;数据速率:PHY层1Mbps,4.2及以上⽀持PHY2Mbps;传输距离:⼀般认为在30m以内,可靠通信距离最好保持在15m以内,穿墙会⼤幅降低传输距离;蓝⽛5协议中的coded技术可以增加蓝⽛传输距离;BLE优势在于低功耗、低成本、有⼿机作为强⼤的后盾,安全,应⽤⼴泛。
低功耗(BLE)蓝牙跳频通信技术原理

低功耗(BLE)蓝牙跳频通信技术原理BLE蓝牙跳频通信技术可以将可用频点扩展开来,可以容纳更多的设备量,另外还能大大的提高保密性能,其中的3个绿色信道是用来搜索设备的时候广播用的,另外剩下的37个信道主要用于数据通信。
它的数据传输间隔从7.5mS到4S即0.25Hz到133.3Hz之间,一般情况下用0.25到1s 的间隔,这个范围比其他同类通信无线技术要大很多。
BLE蓝牙主机和从机会先进行“交流”,共同商议一个双方都认可的连接间隔,这样可以使发射与接收同步进行,从而降低电量和带宽的损耗。
通信频率是2402MHz到2480MHz区间,其中有3个广播信道,37个数据信道,跳频通信在前面提到了,这种方式可以有效提高传输抗干扰能力和空间内同时容纳的设备数量,同时加强了传输保密性能。
识别不同设备的方式是采用48位共可以编号2的48次方即281474976710656,即10的14.45次方个设备而不重号。
打个比喻,比如厚度1cm的心率传感器,叠起来可以从太阳到地球跑9个来回。
也有人大致算过可以给地球上每一粒沙子都编上号还可以用。
这个地址是蓝牙芯片生产厂商预先刻录在芯片里面的,所以是不会存在重号的情况。
所以,在低功耗蓝牙通信这块,基本可以总结出以下结论:BLE蓝牙的跳频技术在抗干扰性、容纳相同设备同时通信、数据安全性方面具有非常好的性能。
此外,在当前BLE蓝牙最新版本中可以实现多对多连接。
扩展到BLE蓝牙模块中也是一样的,如今蓝牙5.0技术已经非常成熟,应用也非常广泛,众多蓝牙模块厂家都已应用上最新蓝牙技术,如云里物里的蓝牙模块MS50SFB就是采用的蓝牙5.0技术。
低功耗蓝牙的优势极为明显,在保密性,数据传输,功耗,主机控制,拓扑结构等等表现都不错。
基于蓝牙技术受众面广,在未来不论是智能家居还是可穿戴设备或是消费电子,都会实现互联互通,创造更多的智能化服务,这也是物联网发展的新趋势。
BluetoothLE(低功耗蓝牙)

BluetoothLE(低功耗蓝⽛)回顾在本系列的前两篇⽂章中,我们已经了解了⼀些关于Bluetooth LE的背景并建⽴⼀个简单的Activity / Service框架。
在这篇⽂章中,我们将探讨Bluetooth LE的细节以及蓝⽛设备查找的⼀些问题。
扫描并发现蓝⽛设备蓝⽛设备的发现是⼗分简单的,它是⼀个在蓝⽛可见范围内查找设备的过程。
⾸先我们要做的就是在Manifest中添加必要的权限,否则我们将在⼀开始就碰壁。
我们需要的权限是android.permission.BLUETOOTH(⼀般蓝⽛使⽤)和android.permission.BLUETOOTH_ADMIN(额外的任务,如蓝⽛发现)。
在我们深⼊之前,值得说明的是BleService 将作为⼀个状态机,在不同的状态执⾏不同的任务。
这些状态中,我们⾸先要考虑的是扫描状态。
当BleService 接收到⼀个MSG_START_SCAN消息后进⼊扫描状态:private static class IncomingHandler extends Handler {@Overridepublic void handleMessage(Message msg) {BleService service = mService.get();if (service != null) {switch (msg.what) {...case MSG_START_SCAN:service.startScan();Log.d(TAG, "Start Scan");break;default:super.handleMessage(msg);}}}}startScan()⽅法开始扫描:public class BleService extends Service implementsBluetoothAdapter.LeScanCallback {private final Map<String,BluetoothDevice> mDevices =new HashMap<String, BluetoothDevice>();public enum State {UNKNOWN,IDLE,SCANNING,BLUETOOTH_OFF,CONNECTING,CONNECTED,DISCONNECTING}private BluetoothAdapter mBluetooth = null;private State mState = State.UNKNOWN;...private void startScan() {mDevices.clear();setState(State.SCANNING);if (mBluetooth == null) {BluetoothManager bluetoothMgr = (BluetoothManager)getSystemService(BLUETOOTH_SERVICE);mBluetooth = bluetoothMgr.getAdapter();}if (mBluetooth == null || !mBluetooth.isEnabled()) {setState(State.BLUETOOTH_OFF);} else {mHandler.postDelayed(new Runnable() {@Overridepublic void run() {if (mState == State.SCANNING) {mBluetooth.stopLeScan(BleService.this);setState(State.IDLE);}}}, SCAN_PERIOD);mBluetooth.startLeScan(this);}}}⾸先,我们需要确保⼿机上的蓝⽛已启⽤,如果没有则提⽰⽤户打开它。
qt低功耗(BLE)蓝牙demo外围设备代码示例Periphral

qt低功耗(BLE)蓝⽛demo外围设备代码⽰例Periphral qt蓝⽛⽹上找到的⼤部分是central的代码,我这⾥分享⼀个外围的代码驱动(之前发过⼀版,有bug)bledevicetool.h#ifndef BLEDEVICETOOL_H#define BLEDEVICETOOL_H#include <QObject>#include<QBluetoothDeviceDiscoveryAgent>#include<QBluetoothDeviceInfo>#include<QBluetoothUuid>#include<QBluetoothServiceInfo>#include<QLowEnergyController>#include<QLowEnergyService>#include<QLowEnergyDescriptor>#include <QLowEnergyServiceData>#include <QLowEnergyCharacteristicData>//⼴播要⽤的两个类#include <QLowEnergyAdvertisingParameters>#include <QLowEnergyDescriptorData>#include <QLowEnergyAdvertisingData>class BleDeviceTool : public QObject{Q_OBJECTpublic:explicit BleDeviceTool(QObject *parent = nullptr);void send(QString &msg);signals:void sigStatueChanged(QString msg = "");//private slots:// void on_pushButton_clicked();// void on_pushButton_2_clicked();// void on_pushButton_3_clicked();// void on_pushButton_4_clicked();// void on_pushButton_5_clicked();// void on_pushButton_7_clicked();// void on_pushButton_6_clicked();// void on_pushButton_8_clicked();private:QLowEnergyController *m_controlerPeripheral; //单个蓝⽛设备控制器QLowEnergyService *m_service; //服务对象实例QLowEnergyCharacteristicData *character;//全局对象QLowEnergyCharacteristic sendInfoLoad;QLowEnergyAdvertisingData advertisingData;QLowEnergyServiceData service;};#endif// BLEDEVICETOOL_Hbledevicetool.cpp#include "bledevicetool.h"#include <QDebug>#include <QtBluetooth/qlowenergyadvertisingdata.h>#include <QtBluetooth/qlowenergyadvertisingparameters.h>#include <QtBluetooth/qlowenergycharacteristic.h>#include <QtBluetooth/qlowenergycharacteristicdata.h>#include <QtBluetooth/qlowenergydescriptordata.h>#include <QtBluetooth/qlowenergycontroller.h>#include <QtBluetooth/qlowenergyservice.h>#include <QtBluetooth/qlowenergyservicedata.h>#include <QtCore/qbytearray.h>#ifndef Q_OS_ANDROID#include <QtCore/qcoreapplication.h>#else#include <QtGui/qguiapplication.h>#endif#include <QtCore/qlist.h>#include <QtCore/qloggingcategory.h>#include <QtCore/qscopedpointer.h>#include <QtCore/qtimer.h>BleDeviceTool::BleDeviceTool(QObject *parent) : QObject(parent){m_controlerPeripheral = QLowEnergyController::createPeripheral(this);character = new QLowEnergyCharacteristicData();character->setUuid(QBluetoothUuid(quint16(0xFF10)));character->setValue(QString("Peripheral chat test\n").toUtf8());//这个character设置为可读可写//character->setProperties(QLowEnergyCharacteristic::PropertyType::Read|QLowEnergyCharacteristic::PropertyType::Write|QLowEnergyCharacteristic::Notify); character->setProperties(QLowEnergyCharacteristic::Notify);QLowEnergyDescriptorData clientConfig;clientConfig.setUuid(QBluetoothUuid::ClientCharacteristicConfiguration);character->addDescriptor(clientConfig);service.setUuid(QBluetoothUuid(quint16(0xFF00)));//设置为这个模式不添加其他的serviceservice.setType(QLowEnergyServiceData::ServiceType::ServiceTypePrimary);service.addCharacteristic(*character);m_service = m_controlerPeripheral->addService(service);//m_service->setProperty()//发送消息的载体sendInfoLoad = m_service->characteristic(QBluetoothUuid(quint16(0xFF10)));connect(m_service,&QLowEnergyService::characteristicChanged,this,[this](const QLowEnergyCharacteristic &c,const QByteArray &value){ //sendInfoLoad = info;qDebug() << "Peripheral characteristicChanged::" <<c.uuid();qDebug() << "Peripheral value length::" << value.length();qDebug() << "Peripheral value length::" << value;//ui->dataShow->insertPlainText("\ncharacteristicChanged->"+QString(value));//QLowEnergyService *s = m_controlerPeripheral->createServiceObject(QBluetoothUuid(quint16(0xFF00)));//QLowEnergyCharacteristic characteristic = s->characteristic(QBluetoothUuid(quint16(0xFF10)));//Q_ASSERT(characteristic.isValid());//s->writeCharacteristic(characteristic,QString(value).toLatin1(),QLowEnergyService::WriteWithoutResponse);//m_service->writeCharacteristic(c,QString("\ncharacteristicChanged Peripheral receiveed: "+QString(value)).toUtf8());//qDebug()<<"properties"<<m_service->error()<<endl;});connect(m_service,&QLowEnergyService::characteristicWritten, this,[this](QLowEnergyCharacteristic c,QByteArray value) {qDebug() << "Peripheral characteristicWritten::";//m_service->writeCharacteristic(c,QString("\ncharacteristicWritten Peripheral receiveed: "+QString(value)).toUtf8());});connect(m_service,&QLowEnergyService::characteristicRead, this,[this](QLowEnergyCharacteristic c,QByteArray value) {//sendInfoLoad = c;qDebug() << "Peripheral characteristicRead::" <<c.uuid();});connect(m_controlerPeripheral,&QLowEnergyController::stateChanged,this,[this](){//sendInfoLoad = m_controlerPeripheral->qDebug()<<"QLowEnergyController::stateChanged------------------------------------"<<endl;//ui->dataShow->insertPlainText(QString("QLowEnergyController::stateChanged"));//on_pushButton_clicked();});connect(m_controlerPeripheral,&QLowEnergyController::connectionUpdated,this,[this](){//sendInfoLoad = m_controlerPeripheral->qDebug()<<"QLowEnergyController::connectionUpdated------------------------------------"<<endl;//ui->dataShow->insertPlainText(QString("QLowEnergyController::connectionUpdated"));//on_pushButton_clicked();});// connect(m_controlerPeripheral,&QLowEnergyController::,this,[this](){////sendInfoLoad = m_controlerPeripheral->// qDebug()<<"QLowEnergyController::connectionUpdated------------------------------------"<<endl;// ui->dataShow->insertPlainText(QString("QLowEnergyController::connectionUpdated"));////on_pushButton_clicked();// });connect(m_controlerPeripheral,&QLowEnergyController::disconnected,this,[this](){//sendInfoLoad = m_controlerPeripheral->qDebug()<<"QLowEnergyController::disconnected------------------------------------"<<endl;emit sigStatueChanged("Controller::disconnected");//ui->dataShow->insertPlainText(QString("\nQLowEnergyController::disconnected"));//on_pushButton_clicked();});connect(m_controlerPeripheral,&QLowEnergyController::connected,this,[this](){//sendInfoLoad = m_controlerPeripheral->qDebug()<<"QLowEnergyController::connected------------------------------------"<<endl;emit sigStatueChanged("Controller::connected");//ui->dataShow->insertPlainText(QString("\nQLowEnergyController::connected___"));//on_pushButton_clicked();});//尝试开启⼴播advertisingData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral);advertisingData.setIncludePowerLevel(true);advertisingData.setLocalName("BLEPeriphralServer");advertisingData.setServices(QList<QBluetoothUuid>() << QBluetoothUuid::HeartRate);m_controlerPeripheral->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData,advertisingData);/////////////////////////////////////////////////////////////////}void BleDeviceTool::send(QString &msg){qDebug()<<"interface,,,,,send:"+msg<<endl;int packSize = 100;int lenStr = msg.length();if(lenStr<=packSize){qDebug()<<"interface,,,,,send package =: "<<0<<"--------------------->"<<msg<<endl;//QLowEnergyService *s = m_controlerPeripheral->createServiceObject(QBluetoothUuid(quint16(0xFF00))); QLowEnergyCharacteristic characteristic = m_service->characteristic(QBluetoothUuid(quint16(0xFF10)));Q_ASSERT(characteristic.isValid());m_service->writeCharacteristic(characteristic,msg.toLatin1());}else{//计算共有多少包数据int packageCount = lenStr%packSize==0?lenStr/packSize:lenStr/packSize+1;for(int i=0;i<packageCount;i++){QString temstr = msg.mid(i*packSize,i==(packageCount-1)?(lenStr-i*packSize):packSize);qDebug()<<"interface,,,,,send package : "<<i<<"--------------------->"<<temstr<<endl;//QLowEnergyService *s = m_controlerPeripheral->createServiceObject(QBluetoothUuid(quint16(0xFF00))); QLowEnergyCharacteristic characteristic = m_service->characteristic(QBluetoothUuid(quint16(0xFF10))); Q_ASSERT(characteristic.isValid());m_service->writeCharacteristic(characteristic,temstr.toLatin1());}}}注意点: character->setProperties(QLowEnergyCharacteristic::Notify);。
低功耗蓝牙(BLE)学习记录

低功耗蓝牙(BLE)学习记录RW_BLE_CORE记录传输信道BLE的传输信道在2.4G频段有40个channel。
包括2种物理信道:广播信道和数据信道。
数据帧中设置Access Address用于标识该信道,防止信道碰撞。
Channel MAP如下:数据帧通信蓝牙帧结构如下:Preamble:根据Access Address而定,假如AA的LSB(最右bit)bit为1,则前导便是10101010b,反之则为01010101b。
Access Address:广播帧的AA为:0x8E89BED6。
其他情况可以是一个32bit的随机数。
AA需满足以下条件·不超过连续6个1或者0。
·与广播帧的AA不同bit超过1个。
·不能4byte相同。
·0 1跳变不能超过24次·MSB 6bit 0 1跳变超过2次。
以下逐个介绍PDU。
一、Advertising Channel PDU蓝牙广播帧帧结构其中Header的帧格式如下:其中,a、广播帧类型(PDU Type)分为以下几类:• ADV_IND: connectableundirected advertising event• ADV_DIRECT_IND: connectable directed advertising event• ADV_NONCONN_IND: non-connectable undirected advertising event• ADV_SCAN_IND: scannable undirected advertising eventb、Length:3~37bytes广播帧分为很多种,其区别就是payload所代表的意义不同,以下分别对几种广播帧作分别阐释:1、ADV_INDADV_IND的payload格式如下:在广播帧帧头中的TxAdd位是广播地址的标示位:TxAdd==0:AdvA地址为公用地址;TxAdd==1:AdvA地址为随机地址。
[BLE]低功耗蓝牙介绍
![[BLE]低功耗蓝牙介绍](https://img.taocdn.com/s3/m/9100ce6026284b73f242336c1eb91a37f1113216.png)
[BLE]低功耗蓝牙介绍一、BLE的协议栈框架BLE协议栈包括两个部分,主机(Host)和控制器(Controller)。
二者通过HCI(Host Controller Interface)标准接口相互通信。
常用的单芯片单模BLE芯片有TI的CC254X、CC26xx,nordic的NRF51288,dailog的DA14580等等,双芯片的双模BT有TI的CC2564。
NRF52832吊炸天啊~~~~~协议栈整体结构图如下:主机是一个逻辑实体,定义包括应用层以下,HCI以上的配置文件(Profile)、通用访问协议(GAP)、通用属性协议(GATT)、属性协议(ATT)、安全管理协议(SMP)、逻辑链路控制适配层(L2CAP)、HCI驱动各层。
控制器也是一个逻辑实体,定义HCI层以下的HCI固件、链路层(LL),物理层(PHY)各层。
三、协议栈各层介绍1、物理层规范(PHY)射频方面,BLE工作在免费的2.4GHz ISM(Industrial Scientific Medical)频段,其频带是2400 -2483.5MHz,BLE的调制方式是高斯频移键控(GFSK),BT=0.5,而标准蓝牙技术是0.35,0.5的指数接近高斯最小频移键控(GMSK)方案,可以降低无线设备的功耗要求(这方面的原因比较复杂)。
更低调制指数还有两个好处,即提高覆盖范围和增强鲁棒性;二进制“1”和“0”分表表示正频偏和负频偏,在使用频谱仪(N9020A)测试频偏时需要提前知道其背离频率;发射功率范围在-20dBm~+10dBm之间(天线增益为0dBi情况下);误比特率为0.1%的情况下,接收灵敏度小于-70dBm;通信距离可到达100m;传输速率为1Mbps;数据包间对中心频率的偏移应当小于±150kHz,其中包括了初始的频率补偿和频率漂移;在一个数据包内,频率偏移应当小于150kHz,最大的频率偏移率不能超过400Hz/us,一般要求在±20PPM以内即可。
低功耗蓝牙方案

低功耗蓝牙方案引言低功耗蓝牙 (Low Energy Bluetooth, LE Bluetooth) 是一种专门设计用于低功耗设备之间短距离通信的无线技术。
它广泛应用于物联网设备、传感器和健康监测等领域。
本文将介绍低功耗蓝牙方案的基本原理、优势和应用。
基本原理低功耗蓝牙方案在物理层使用2.4 GHz无线频段进行通信,通过频分多路复用(Frequency Hopping Spread Spectrum, FHSS) 技术来减少与其他设备的干扰。
它采用短包和连接间隔延长的方式来降低功耗。
在链路层,低功耗蓝牙使用专门的协议来控制通信,如广播、扫描和连接等。
优势低功耗蓝牙方案相对于传统蓝牙方案有以下优势:1.低功耗:低功耗蓝牙方案专门针对低功耗设备进行优化,其功耗比传统蓝牙方案降低了很多。
这使得低功耗蓝牙在节能和延长设备电池寿命方面具有巨大优势。
2.短距离通信:低功耗蓝牙通信范围通常在几十米左右,适用于设备之间短距离通信的场景。
3.快速建立连接:低功耗蓝牙能够快速建立连接和断开连接,适用于一些对实时性要求较高的应用场景。
4.简化连接流程:低功耗蓝牙方案使用了简化的连接流程,减少了连接时间和连接过程中的功耗,提高了用户体验。
5.广播和扫描功能:低功耗蓝牙方案支持广播和扫描功能,这对于设备发现和信息交换非常有用。
应用低功耗蓝牙方案在众多领域有着广泛的应用,包括但不限于以下方面:1.健康监测:低功耗蓝牙方案被广泛应用于医疗设备、健康监测设备等领域。
它能够实时监测患者的生理数据,并将数据传输到移动设备或云端进行分析。
2.物联网设备:低功耗蓝牙方案是物联网设备中常用的通信技术之一。
它能够实现设备之间的互联互通,实现智能家居、智能城市等应用。
3.传感器网络:低功耗蓝牙方案可以将多个传感器组织成网络,实时采集环境数据,并将数据传输给中心节点进行处理和分析。
4.智能穿戴设备:低功耗蓝牙方案被广泛应用于智能手表、智能眼镜等穿戴设备中。
低功耗蓝牙同步原理

低功耗蓝牙同步原理一、低功耗蓝牙简介低功耗蓝牙(Low Energy Bluetooth,LE Bluetooth)是一种低功耗、短距离无线通信技术,旨在为物联网设备提供无线连接能力。
与传统蓝牙相比,低功耗蓝牙在功耗、传输速率和通信距离等方面进行了优化,以满足物联网设备对低功耗和长时间运行的需求。
二、低功耗蓝牙同步的意义低功耗蓝牙同步是指通过低功耗蓝牙技术实现不同设备之间的数据同步。
在物联网应用中,设备之间的数据同步是非常重要的,它可以实现设备之间的互联互通,提升用户体验和设备的智能化程度。
同时,低功耗蓝牙同步还可以减少设备之间的能耗,延长设备的使用寿命。
三、低功耗蓝牙同步原理低功耗蓝牙同步的实现主要依靠以下几个关键技术:1. 广播(Advertising)低功耗蓝牙设备可以通过广播的方式发送自己的存在和服务信息,其他设备可以通过扫描来发现并建立连接。
广播可以实现设备之间的快速发现和连接,同时也可以减少设备的能耗。
2. 连接与数据传输低功耗蓝牙设备之间的连接是通过主从架构实现的,一个设备作为主设备(Master),另一个设备作为从设备(Slave)。
主设备负责发起连接请求和控制数据传输,从设备负责响应连接请求并传输数据。
在连接建立后,设备之间可以通过GATT(通用属性配置文件)协议进行数据传输。
3. GATT协议GATT协议是低功耗蓝牙设备之间进行数据传输的核心协议。
它定义了一组服务(Service)和特征(Characteristic),通过这些服务和特征可以实现设备之间的数据交换。
每个服务包含一个或多个特征,特征可以包含读、写、通知等操作。
设备可以通过读取和写入特征的值来实现数据的同步和共享。
四、低功耗蓝牙同步的应用场景低功耗蓝牙同步广泛应用于物联网领域的各种设备中,包括智能手环、智能手表、智能家居设备等。
以下是一些常见的应用场景:1. 健康监测智能手环和智能手表可以通过低功耗蓝牙同步与手机或电脑进行数据同步,实现健康数据的记录和分析。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BluetoothGatt作为中央来使用和处理数据;BluetoothGattCallback返 回中央的状态和周边提供的数据。
第8讲 Bluetooth程序设计(三)
//连接成功,开始搜索服务,一定要调用此方法,否则获取不到服务 } };
// 这里有9个要实现的方法,看情况要实现那些,用到那些就实现那些 }
7.执行BluetoothGatt.discoverServices()后,这个方法是异步操作,在回调函数 onServicesDiscovered中得到status,通过判断status是否等于 BluetoothGatt.GATT_SUCCESS来判断查找Service是否成功。
具体编程实现
1. 启动蓝牙功能
2. 查找设备
3. 查询匹配好的设备 4. 扫描设备
5. 使能被发现
6. 连接设备
7. 服务端的连接
8. 客户端的连接
9. 管理连接
10. 权限设置
创建BLE Central(Android手机目前功能)
创建BLE Central
1.先拿到BluetoothManager:bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
5.用BluetoothDevice得到BluetoothGatt gatt = device.connectGatt(this, true, gattCallback);
创建BLE Central
6. 在回调函数private BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
// 在下面的回调方法中可以查询连接是否成功 public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState){
if (newState == BluetoothProfile.STATE_CONNECTED) { gatt.discoverServices();
手机短距离通信技术
第8讲 Bluetooth程序设计(三)
1、检查上次作业 2、检查预习题目 3、上次课程的总结 4、BLE的应用实现 5、应用示例 6、本次课的作业 7、下次课的预习内容
1、上次课的作业
编写一个蓝牙发现、扫描以及连接建立软件。
第8讲 Bluetooth程序设计(三)
1、检查上次作业 2、检查预习题目 3、上次课程的总结 4、BLE的应用实现 5、应用示例 6、本次课的作业 7、下次课的预习内容
4、BLE的应用实现
蓝牙设备之间的通信主要包括了四个步骤:
设置蓝牙设备
寻找局域网内可能或者匹配的设备
连接设备
设备之间的数据传输
};
BluetoothGattCallBack
1.notification对应onCharacteristicChanged; gatt.setCharacteristicNotification(characteristic, true); 2. readCharacteristic对应onCharacteristicRead; 3. writeCharacteristic对应onCharacteristicWrite; 4.连接蓝牙或者断开蓝牙对应onConnectionStateChange; 5. readDescriptor对应onDescriptorRead; 6. writeDescriptor对应onDescriptorWrite; 7. readRemoteRssi对应onReadRemoteRssi; 8. executeReliableWrite对应onReliableWriteCompleted; 9. discoverServices对应onServicesDiscovered。
characteristic。 setCharacteristicNotification(characteristic, enabled)
:设置当指定characteristic值变化时,发出通知。 getServices() :获取远程设备所支持的services。
BluetoothGattCallBack
Attribute Protocol (ATT)
GATT是基于ATT Protocol的。ATT每个属性都 有一个唯一的UUID,属性将以 characteristics 和services的形式传输。
Characteristic
为一个数据类型,它包括一个value和0至多个对 次value的描述(Descriptor)。
BluetoothAdapter类:代表了一个本地的蓝牙适配器。它是所有蓝牙交 互的入口点。利用它你可以发现其他蓝牙设备,查询绑定了的设备,使 用已知的MAC地址实例化一个蓝牙设备和建立一个 BluetoothServerSocket(作为服务器端)来监听来自其他设备的连接。
BluetoothDevice类:代表了一个远端的蓝牙设备,使用它请求远端蓝 牙设备连接或者获取远端蓝牙设备的名称、地址、种类和绑定状态(其 信息是封装在BluetoothSocket中)。
协议栈名词说明
1、profile 可以理解为一种规范,一个标准的通信 协议,它存在于从机中。蓝牙组织规定了一些标 准的profile
2、service 服务,在ble从机中,通过有多个服务 ,例如电量信息服务、系统信息服务等
3、characteristic 特征值,ble主从机的通信均是 通过characteristic来实现
BluetoothGattCallBack:用于已经连接上设备,对设备的某 些操作后返回的结果。
private BluetoothGattCallback gattCallback = new BluetoothGattCallback() { // 这里有9个要实现的方法,看情况要实现那些,用到那
Descriptor
对Characteristic描述,如范围、计量单位等。
Service
Characteristic集合。例如一个service叫做 “Heart Rate Monitor”,它可能包含多个 Characteristics,其中可能包含一个叫做 “heart rate measurement"的Characteristic 。
11. 然后通过BluetoothGatt.readCharacteristic(characteristic) 、 BluetoothGatt.writeCharacteristic(characteristic)、 BluetoothGatt.setCharacteristicNotification(characteristic, enabled ) 对特定characteristic进行读、写以及订阅。
些就实现那些
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState){};
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status){};
1、检查上次作业 2、检查预习题目 3、上次课程的总结 4、BLE的应用实现 5、应用示例 6、本次课的作业 7、下次课的预习内容
BLE概念
BLE指的是低功耗蓝牙(Bluetooth Low Energy )的缩写。 BLE是蓝牙4.0的一个子集, 关于蓝牙4.0描述如下:
创建BLE Central
4.从LeScanCallback中得到BluetoothDevice:public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
Android5.0之后: 从LeCallback中,通过onScanResult()把每次搜索到的设备添加到本地, 并获得BluetoothDevice。 leCallback = new ScanCallback() { onScanResult(int callbackType, ScanResult result) { … BluetoothDevice device = result.getDevice(); …}
创建BLE Central
12.以上方法对应的处理状态均在其回调方法 onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)、onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)、 onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic)中处理。
创建BLE Central
8.如果成功了,则通过BluetoothGatt.getService来获取 BluetoothGattService
9.通过BluetoothGattService.getCharacteristic获取 BluetoothGattCharacteristic