首页 > 代码库 > Arduino101学习笔记(十一)—— 蓝牙BLE

Arduino101学习笔记(十一)—— 蓝牙BLE

一、BLE技术简介

1、特性:

      BLE设备无法向下兼容(无法与蓝牙2.0\2.1\3.0通信),仅能与BLE设备通信。从Curie datasheet获知,curie的蓝牙芯片型号为NRF5182

2、BLE角色

      在BLE协议中,有两个角色:中心设备(Central)外围设备(Periphery)

       A、中心设备可以扫描附近的外围设备,而外围设备可以发出广播让中心设备扫描;
       B、BLE连接中必须同时存在这两种角色的设备,同角色设备间不能相连;
       C、中心设备可以同时连接多个外围设备,而外围设备同一时刻只能链接一个中心设备;
       D、现在的很多可穿戴设备都是作为周边(Periphery)存在,而手机作为中央(Central)存在。从例程看,Arduino 101/Genuino 101/intel Curie 只能作为 周边(Periphery) 使用。也就是说,两个101之间是不能直接连接的,但你可以把多个101连接到手机或者其他 中央(Central) 设备。

3、GATT协议

      当BLE连接建立后,两个设备间通信将使用GATT协议进行。GATT协议中也有两种角色——GATT服务端(server) & GATT客户端(client)但是不管是Periphery还是Central都是可以实现 GATT server 和 GATT client去传输数据,但是无法同时都是。这两种角色取决于BLE连接成功后,两个设备间通信的方式。

4、标准蓝牙和BLE比较

    BLE技术在小数据低速率以及低功耗上进行的优化,并设计成可在纽扣电池驱动的设备上使用。与标准的蓝牙不同的是,标准蓝牙基本上是基于异步串行接口(UART)进行数据交换

    而BLE有下面两种情况:

    (1)当BLE设备为外围设备时,此时BLE设备就像小区公告栏,与之链接的电脑就是围观群众,

    (2)当BLE设备为核心设备时,与之相反。

 

二、UUID介绍

1、定义

       UUID的含义是通用唯一识别码 (Universally Unique Identifier),其目的是让分布式系统中的所有元素都有唯一识别的资讯,每个人都可以建立与其他人不冲突的UUID,并且还要保证在同一时空中所有机器都是唯一的。

2、组成

(1) 当前的时间(如果现在生成一个UUID后,过几秒又生成一个UUID,则第一个部分不同,其他相同。

(2)时钟序列

(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡获取mac地址,没有就从其他地方获取。

       在curie中,一个BLE外设在提供服务,进而提供特征,也可以定制自己的特征。标准服务是一个16位的UUID,而定制服务是一个128位的UUID,这个也取决于你使用的无线方式和固件。

 

三、一些API

1、BLEPeripheral 类库成员函数

BLEPeripheral

功能:给BLE外围设备命名。

语法:BLEPeripheral yourBlePeripheralName

参数:无

返回值:无

/*************************begin() ************************/
// 功能:初始化BLE所有功能。
// 语法:yourBlePeripheralName.begin()
// 参数:无
// 返回值:初始化成功返回真,否则返回假。
/***********************************************************/
begin() 


/*************************end() ************************/
// 功能:关闭所有BLE外设功能。
// 语法:yourBlePeripheralName.end()
// 参数:无
// 返回值:初始化成功返回真,否则返回假。
/***********************************************************/          
end()


/*************************setAdvertisedServiceUuid() ************************/
// 功能:设置广播服务UUID。
// 语法:yourBlePeripheralName.setAdvertisedServiceUuid(const char*advertisedServiceUuid)
// 参数:advertisedServiceUuid: TBD
// 返回值:无。
/************************************************************************************/          
setAdvertisedServiceUuid()
   

/*************************setLocalName()************************/
// 功能:设置BLE外设的本地名。
// 语法:yourBlePeripheralName.setLocalName(const char* localName)
// 参数:localName: the name to be set
// 返回值:无。
/*********************************************************************/    
setLocalName()


/*************************setDeviceName()************************/
// 功能:设置BLE外设的设备名称。
// 语法:yourBlePeripheralName.setLocalName(const char* deviceName)
// 参数:localName: the name to be set
// 返回值:无。
/*********************************************************************/  
setDeviceName()


/************************setAppearance()************************/
// 功能:待定。
// 语法:yourBlePeripheralName.setAppearance(unsigned int appearance)
// 参数:appearance: 待定
// 返回值:无。
/*********************************************************************/  
setAppearance()

/************************setEventHandler()************************/
// 功能:设置回掉函数与触发事件的关系。
// 语法:yourBlePeripheralName.begin()
//参数:event: the chosen matching event. It can assume one of the followingvalues:
//                                                                  BLEConnected
//                                                                  BLEDisconnected
//                                                                  BLEPeripheralEventLast
//                                                                  callback:the name of the function to call in case of match
// 返回值:无。
/*********************************************************************/  
setEventHandler()


/************************addAttribute()***********************/
//功能:添加外围设备的属性。
//语法:yourBlePeripheralName.addAttribute(BLEAttribute attributeName)
//参数:attributeName: 要添加的特征或服务的名称作为属性
// 返回值:无。
/****************************************************************/  
addAttribute()


/************************disconnect()***********************/
//功能:断开连接。
//语法:yourBlePeripheralName.disconnect()
//参数:五
//返回值:true/false
/****************************************************************/   
disconnect();


/************************central()***********************/
//功能:检查中心连接是否工作。
//语法:yourBlePeripheralName.central()
//参数:五
//返回值:true/false
/****************************************************************/ 
central()

/************************connected()***********************/
//功能:检查设备是否连接。
//语法:yourBlePeripheralName.connected()
//参数:五
//返回值:true/false
/****************************************************************/ 
connected()

 

2、BLEDescriptor 类库成员函数

特征值的描述以及定义

/************************BLEDescriptor()***********************/
//功能:描述特征值的属性。
//语法:BLEDescriptor(const char* uuid, const unsigned charvalue[],unsigned char valueSize);
//           BLEDescriptor(constchar* uuid, const char* value);  
//参数: UUID: standard 16-bit characteristic UUID
//           properties: what remote clients will be able to getnotifications if this characteristic changes. It can //                             assume the followingvalues:BLERead
//                                                                         BLEWrite
//                                                                         BLENotify
//           uuid: UUID of descriptor
//           value: value data
//           valueLength: length of value data in bytes

//返回值:无
/****************************************************************/ 
BLEDescriptor()

 

3、BLECentral 类库成员函数

BLECentral ()
//功能:BLE中心设备通常访问外围设备的数据。
//语法:BLECentral yourBleCentralName
//参数:无
//返回值:无

connected()
//功能: 检查设备是否连接
//语法:yourBleCentralName.connected()
//参数:/
//返回值:连接成功返回true,否则返回false

address()
//功能:返回中心设备的地址
//语法:yourBleCentralName.address()
//参数:无
//返回值:中心设备地址

disconnect()
//功能:断开连接
//语法:yourBleCentralName.disconnect()
//参数:如果成功则返回true,否则返回false
//返回值:无

 

4、BLECharacteristic 类库成员函数

BLECharacteristic
//功能: 特征包至少包含两个属性:一个特征声明,其中包含有关数据的元数据,和特征值,其中包含数据本身
//特征:   names
//              UUIDs
//              values
//              read/write/notifyproperty

//下面提供众多的构造函数,可以根据计划使用这些特性。
//语法:

·     BLEBoolCharacteristic yourCharacteristicName(UUID, properties, maxLen)

·     BLECharCharacteristic yourCharacteristicName(UUID, properties, maxLen)

·     BLEUnsignedCharCharacteristic yourCharacteristicName(UUID, properties, maxLen)

·     BLEShortCharacteristic yourCharacteristicName(UUID, properties, maxLen)

·     BLEUnsignedShortCharacteristic yourCharacteristicName(UUID, properties, maxLen)

·     BLEIntCharacteristic yourCharacteristicName(UUID, properties, maxLen)

·     BLEUnsignedIntCharacteristic yourCharacteristicName(UUID, properties, maxLen)

·     BLELongCharacteristic yourCharacteristicName(UUID, properties, maxLen)

·     BLEUnsignedLongCharacteristic yourCharacteristicName(UUID, properties, maxLen)

·     BLEFloatCharacteristic yourCharacteristicName(UUID, properties, maxLen)

·     BLEDoubleCharacteristic yourCharacteristicName(UUID, properties, maxLen)

//参数:

//-UUID:标准的16bit的UUID

//-Properties:如果特征值改变,远程客户端就能得到通知。

//可以采用以下值:

//BLERead

//BLEWrite

//BLENotify

 

5、BLEService 类库成员函数BLEService

功能:可使用BLE服务创建由BLE设备显示的服务

语法:BLEService (const char* uuid)

参数:UUID(由BLE定义的标准16bit或128bit的)

返回值:无

 

四、一个Demo

1、下载一个App

      nRF Master Control Panel (BLE) forAndroid and iOS

2、电路原理

技术分享

       将电位器中间的引脚连接到101的模拟输入I/O空A0上,使用Arduino 101的AD功能对电位器的电压值采样模拟电池电压的变化

3、Code思路

        101嵌入了一个低功耗蓝牙模块,因此它是足够的板连接到计算机,并使用串行监视器读取由草图发送的消息。电位计被连接到3.3V,GND和A0至模拟电池的充电。这部分代码实现了标准的BLE电池检测功能

在setup()中,初始化13脚为输出来驱动板载LED,blePeripheral用来初始化板子的外设,如果多个板子运行这个代码,需要修改本地名,这样两者可以被区分,例如:

blePeripheral.setLocalName(“BatteryMonitorSketch”) 改为  blePeripheral.setLocalName(“BatteryMonitorSketch1”);

         在主循环中,成功连接中心设备后打开LED,每200ms进行一次连接测试,如果是正常的,updateBatteryLevel被调用。当连接丢失,LED会被关闭

Arduino101学习笔记(十一)—— 蓝牙BLE