BLE自定义的 characteristic line包含的数据最大可以为多少

72蓝牙4.0 BLE
协议栈的研究 TI CC2540 CC2541 OSAL
上亿文档资料,等你来发现
72蓝牙4.0 BLE
协议栈的研究 TI CC2540 CC2541 OSAL
1.蓝牙:;a是一种支持短距离通讯的无线技术,主要工作在2.;1.2,2.0,3.0,4.0(4.1),现在市;b蓝牙4.0由传统蓝牙,高速蓝牙和蓝牙低功耗三种;c蓝牙4.0中的BLE(蓝牙低功耗Bluetoo;速度:支持1Mbps数据传输率下的超短数据包;跳频:蓝牙规范自适应跳频技术;主控制:更加智能,可以休眠更长时间,只在需要执行;延迟:可在3ms内实现
是一种支持短距离通讯的无线技术,主要工作在2.4GHz频带。至今分为五个版本1.1,1.2,2.0,3.0,4.0(4.1),现在市面上流行三种设备传统蓝牙(Bluetooth简称BR),低功耗蓝牙(bluetoothSmart即是Bluetooth Low Energy简称BLE,蓝牙4.0(BluetoothSmartReady即是BR+BLE))b
蓝牙4.0由传统蓝牙,高速蓝牙和蓝牙低功耗三种规范合成。其中常用的有两种模式(单模-&支持(BLE)和双模-&支持(BLE+BR))。我们用的CC2540是单模芯片。c
蓝牙4.0中的BLE(蓝牙低功耗Bluetooth Low Energy)定义了两个频段2.4Ghz(16个信道896/915MHz(896M一个信道915M十个信道),共27个信道。速度:支持1Mbps数据传输率下的超短数据包。所有连接都使用蓝牙2.1加入的减速呼吸模式(sniff
subrating)来达到超低工作循环跳频:蓝牙规范自适应跳频技术主控制:更加智能,可以休眠更长时间,只在需要执行动作的时候才唤醒。延迟:可在3ms内实现连接并设置数据传输。范围:提高调制指数,最大范围可到100m健壮性:所有数据包都经过24bitCRC校验。确保最大程度抵御干扰。安全:使用AES128 CCM加密算法进行数据包加密和认证。拓扑:每个数据包的每次接收都是用32位寻址,理论上可连接十亿台设备。针对一对一连接,并支持新型拓扑的一对多连接。d
蓝牙4.0总共40个信道,都分布在2.4GHz,其中0.12.39三个信道用来广播信息。e
蓝牙4.0的引起超低的功耗而备受瞩目。是3.0的升级版,较3.0更加省电,成本更低,3ms低延迟,超长有效连接距离,AES-128加密; 2.BLEa.蓝牙4.0规范中的一种,其中master最多有7个外设,低功耗,低延迟,低吞吐量。 b.六种设备状态待机状态(standby):设备没有传输和发送数据,并且没有连接到任何设备广播状态(Advertiser):周期性广播状态扫描状态(Scanner):主动寻找正在广播的设备发起链接状态(Initiator):主动向扫描设备发起连接。主设备(Master):作为主设备连接到其他设备。从设备(Slave):作为从设备连接到其他设备。五种工作状态准备(standby),广播(advertising),监听扫描(Scanning),发起连接(Initiating),已连接(Connected)四种设备类型Cnetral主机(常作为client端):如手机,PCPeripheral从机(常作为Service端):如心率计,血糖计Observer观察者:Broadcast广播者:连接过程:Peripheral开启广播--&Central扫描从机广播--&Peripheral接收到Central的扫描请求,Peripheral向Central发送扫描回应数据--&Central向Peripheral发起连接--&开始通信。c.BLE中的连接参数(ConnectionEvent==确认连接应答信号--&设备大多数情况下都在Sleep状态下,每个ConnectionEvent都由Master发起包,在由Slaver回复)参数1:Connection Interva--&l两个ConnectionEvent之间的空闲值,单位为1.25ms,最小7.5ms,最大4s。参数2:Slave Latency--&Slaver设备没有数据要发时,跳过一定数目的ConnectionEvent的值,Rang:0-499.参数3:Supervision Timeout--&超时时间,就是两个设备在连接的这段时间没有发生通讯而导致连接自动断开的值。Range(10ms-----32s)但是必须满足以下条件参数3&=参数1*(参数2+1)。d. 兼容性 BLE协议结构 a. 结构可分为三大层(控制层(controller)?(HCI、LL、PHY))协议层(Host)?(L2CAP、SM、ATT、GATT、GAP)应用层(App)?(GATT Profile和GAP Role/Security Profiles)b. 各层单元逻辑PHY ?物理层:主要是射频和电路部分LL ?链路控制层:通过计算器的设置来控制物理层HCI ?通讯层:向host和controller提供一个标准化接口,该层可以由软件api实现或者用硬件接口UART SPI USB 来控制L2CAP?逻辑链路控制和适配层:负责逻辑链路的连接以及事件的分发,位于基带协议之上。 L2CAP向上层提供面向连接的和无连接的数据服务。它的功能包括:协议的复用能力、分组的分割和重新组装以及数据组提取。L2CAP允许高层协议和应用发送和接受高达64Byte的数据分组SM?安全服务层:提供配对密匙的发放,实现安全链接和数据交换ATT?属性层:是BLE中一个很重要的一层,所有的数据都要经过这层,展示属性的称为服务器,与之配对的称为客户端。主机设备可以是服务器也可以是客户端规定了Client和Server两个角色,数据存在Service端,以Attribute形式存在,Client则以读或写的方式来对Server端数据进行操作GATT?定义使用ATT的服务框架GATT规定了配置文件(profile)结构。在BLE中所有的profile或者服务用到的数据块都称为“特性”characteristic,基于ATT层更加细化的根据性质把传输的数据分成特定的类并标上UUID(每类ATT也有一个独特的UUID) GAP?主要用于设备查找,连接建立,广播发送接收的一些控制APP层:Profile定义的是特定的一个使用环境,相同的也有个UUIDc. 名词解释Profile:可以理解成是一种规范,蓝牙组织规定了一系列的profile,如心率计,防丢器等。每个Profile中都会包含多个ServiceService:可以理解成一个服务,在ble从机中,通过多个服务(如电量信息服务,系统信息服务等),每个Service里面包含多个Characteristic特征值。Characteristic特征值才是bel的主体,(如:点量80%。会通过电量的Characteristic特征值存在从机的profile里,这样主机可以通过这个Characteristic来读取80%这个数据。)Characteristic:Characteristic特征值,主从机的通讯全是通过Characteristic来实现的,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容UUID:统一识别码我们刚才提到的Service和Characteristic,都需要一个唯一的UUID来标识。 CC2540a. 芯片特性内部由一个51内核和基本外设构成,时钟频率可达32MHz,机器周期为一个时钟周期, 拥有内部阻容振荡器,8KBRAM,256KBFlash5通道DMA,1个16位,两个8位定时器,红外生成电路,32KHz有捕捉功能睡眠定时器数字信号强度指示器(RSSI),电池监视和温度感应器,8通道12位ADC,2个UART,USB 拥有SmartReadyBlueTooth两个模式,CC2541支持(BR和BLE模式)传输速率:低于100kbpsb. 引脚分配c. 最小系统包含各类专业文献、应用写作文书、高等教育、中学教育、各类资格考试、外语学习资料、幼儿教育、小学教育、72蓝牙4.0 BLE
协议栈的研究 TI CC2540 CC2541 OSAL等内容。 
 CC2540 BLE PeripheralBroadcaster Example(蓝牙4.0从...[+] 实验环境: 蓝牙版本:TI CC2540 协议栈:1.2...(0,&KEY1\n&,5); /// osal_start_timerEx( ...  BLE 协议栈简介 第十四节 OSAL 工作原理 第十五节...主流蓝牙 BLE 控制芯片详解(1):TI CC2540 同系列...CC2541 器件可以单芯片实现 BLE 蓝牙协议栈结构图的...  17 4.2 4.3 4.4 操作系统抽象层 OSAL ......本次设计采用的是以 TI 公司的 CC2540 芯片为核心...4.4 配置文件层蓝牙 4.0 BLE 协议栈的配置文件...  BLE4.0蓝牙概述_信息与通信_工程科技_专业资料。BLE...OSAL 来调用的,因此需要了解 OSAL 的基本原理:任务...TI 公司的 CC2540 芯片的 BLE 协议栈中,首先将...  TI 单模式蓝牙(BLE)片上系统 CC2540低能耗 的内幕一、概述 1、BLE 蓝牙协议栈结构 附图6 BLE 蓝牙协议栈结构图 分为两部分:控制器和主机。对于 4.0 以前的...  TI 的这款 CC2540 器件可以单芯片实现 BLE 蓝牙...BLE 协议栈的各层都是以 OSAL 任务方式实现,由于 ...便开始在阅读 TI 的 cc2541 的 BLE Stack 源码,...  蓝牙4.0协议栈按键流程分析_计算机软件及应用_IT/计算机_专业资料。BLE4.0,CC...CC2540 上的操作系统,说操作系统还不能算,TI 的 OSAL 只实现了任务切换和...  BLE4.0蓝牙经典问答_计算机硬件及网络_IT/计算机_专业...12. 问:OSAL 是一个操作系统吗? 答:OSAL(...TI 公司的 CC2540 芯片的 BLE 协议栈中,首先将...  BLE 学习应用笔记 1 OSAL 学习笔记 1-OSAL.C * ...“2.4GHz”下选择“CC2540” 5.下载程序:SmartRF ...蓝牙4.0演讲PPT 87页 免费 CC2540 模块资料 7页...Android 蓝牙4.0 BLE调试 - 小九的专栏
- 博客频道 - CSDN.NET
21654人阅读
配备低功耗蓝牙的可穿戴式设备应该是未来的一大趋势。
继IOS去年支持蓝牙BLE之后,Android最新的4.3版本也有了官方的支持。
受软硬件限制,目前的尝试基于第三方SDK。
Host端:支持蓝牙4.0的GS4手机,配合三星的蓝牙BLE开发包&
Device端:支持蓝牙BLE的单片机CC2540,配合TI开发板&
目标:手机监测CC2540的距离和方向
1. 设备匹配
与普通蓝牙设备的匹配类似,区别在于要判断是否是BLE设备。
2. 使能Service
要取得与设备的蓝牙通信,必须先Configure该数据类型的Service Profile。
3. 获取数据
参考资料:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:403338次
积分:4869
积分:4869
排名:第2423名
原创:31篇
转载:288篇
评论:103条
(1)(2)(1)(1)(9)(12)(5)(6)(6)(15)(12)(1)(8)(10)(9)(16)(24)(4)(1)(7)(23)(5)(12)(1)(2)(3)(2)(1)(1)(3)(3)(1)(1)(3)(4)(9)(2)(4)(2)(2)(7)(2)(3)(2)(11)(4)(11)(11)(9)(25)BLE4.0&Client发送数据给Server
发送数据给Server
使用的器件:USBdongle+MiniDK + usb转串口
功能:通过串口发送数据给USBDongle,触发USBDongle发送数据给MiniDK
使用例程:SimpleBLEPeripheral与,SimpleBLECentral
在SimpleBLEPeripheral中添加自定义特性值6
修改simpleGATTprofile.c,simpleGATTprofile.h
添加可读写的20个字节的SIMPLEPROFILE_CHAR6
在center中,一旦与simplePeripheral建立连接,就可获取到所有ServerUUID,并能得到相应
特性值的Handle,
获取特性值Handle
GATT_WriteCharValue&&&&&&&&(&&&&&&&&uint16
&&&&&&&&connHandle,
attWriteReq_t *
&&&&&&&&pReq,
&&&&&&&&taskId&&&&&&&&
)&&&&&&&&&&&&&&&&&&&&&&&&
只有当Client端(USBDongle)知道Server端(MiniDK)相应characteristic value 的Handle.
并且已经连接上才能写入成功
Parameters:
connHandle
connection to use
pointer to request to be sent
task to be notified of response
Request was sent successfully.
INVALIDPARAMETER: Invalid connection handle or request field.
MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
bleNotConnected: Connection is down.
blePending: A response is pending with this server.
bleMemAllocError: Memory allocation error occurred.
bleTimeout: Previous transaction timed out.
&&&&&&&&&&&&&&
//!& 要写入的characteristic value 的Handle
&&&&&&&&&&&&&&&&&&
//!& 写入数据的长度
& uint8 value[ATT_MTU_SIZE-3];
//!&&/span&数据内容
&&&&&&&&&&&&&&&&&&
//!& Authentication Signature status (not included (0), valid
(1), invalid (2))
&&&&&&&&&&&&&&&&&&
//!& Command Flag(暂不知这两个参数用途)
attWriteReq_t;
-----------------------------------------------------------------------------------------------------------------
uint8 state = 0;
uint8 ch[] =
"abcdef1234";&&
//最大20个字节。
&attWriteReq_
&req.handle =
0x0035;&&&&&&&&&&&
//特性值6handle
req.len = 19;
osal_memcpy(req.value,ch,19);
req.sig = 0;
req.cmd = 0;
GATT_WriteCharValue(simpleBLEConnHandle,&req,simpleBLETaskId)
if( state == SUCCESS)&
--------------------------------------------------------------------------------------------------------------------
在center中通过串口控制来向从机发送数据,
由于simpleperipheral中的characteristic中的内容改变了,会触发相应的CallBack函数
在simpleperipheral中
static void
simpleProfileChangeCB( uint8 paramID )为charasteristic值改变的回调函数paramID为
charasteristic的uuid
通过switch(paramID)查找到对应的characteristic通过
SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR6, newChar
);&&&&&&&&&&&&&&&&&&
就能得到所接收到的数据。不过数据最大长度只有20个字节。
& case SIMPLEPROFILE_CHAR6:
SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR6, newChar );
SimpleProfile_GetParameter直接将char6的内容复制给了newChar,这样就得到了center发送过来的数据了。
& case SIMPLEPROFILE_CHAR6:
VOID osal_memcpy( value, simpleProfileChar6,
SIMPLEPROFILE_CHAR6_LEN );
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Broadcom WICED Sense Kit使用评测 - mars4zhu的日志 -
电子工程世界-论坛 -
Broadcom WICED Sense Kit使用评测
已有 904 次阅读 14:43
|个人分类:
Broadcom WICED Sense Kit使用评测
文档编号TR-0001-A0关键字Broadcom, 博通, WICED Sense Kit, WICED Smart, BLE摘要本文简要记录了Broadcom公司的WICED Sense Kit使用过程中的体验,分析了该Kit的内部软硬件结构和,并初步介绍了WICED Smart开发平台的使用。
表格索引 错误!未找到目录项。
1 使用体验WICED Sense Kit是Boradcom(博通)公司采用其最新的Bluetooth Smart(又称为Bluetooth Low Energy,简称BLE)技术的新一代创意性开发套件,基于WICED Smart模块(BCM20737S),并在套件中集成了多种传感器,可以作为通用的传感器标签(Sensor Tag)使用,也可以作为开发平台,让开发人员可以在其基础上开发更多的创意性功能。1.1. 上手使用WICED Sense Kit包含如下部件:l WICED Sensel USB A-MicroB数据线l 快速启动指南(Quick Start Guide) 图 11&&WICED Sense Kit包含的部件1.2. 使用智能手机与WICED Sense通讯按照《Quick Start Guide》,下载app安装后,进入App界面,点击扫描按钮,可以扫描到WICED Sense Kit。 图 12&&WICED Sense Kit的App界面App从WICED Sense Kit中获取传感器数据,并进行相应的显示。可以看到有陀螺仪,电子罗盘、加速度(采用水平尺界面显示)、温度、压力和湿度数据。同时可以查看设备的版本信息等。1.3. 使用BLE Scanner测试WICED Sense Kit为了进一步探究WICED Sense Kit,手机安装BLE Scanner进行测试,如下图: 图 13&&BLE Scanner测试WICED Sense Kit从左边可以看出WICED Sense Kit的Service,点击每一个Service,可以列举出该Service下具有的Characteristic,点击每一个Characteristic,可以Read、Write、Notification等操作,右边是Device Name和Battery Level的值。1.4. 使用BLE设备监听器测试WICED Sense Kit为了从BLE技术层面深入挖掘WICED Sense Kit的内部,采用T公司的BLE设备监听器软件及其对应的BLE USB-Dongle。截取的BLE GATT数据如下: 图 14&&BLE设备监听器测试WICED Sense Kit的GATT数据表格(注:以上图片及其图注为笔者自行理解或推测,未确切证实)可见具备了常用的设备名称与外观、生产厂商与版本、电池电量等标准服务,也提供了传感器数据、固件升级的服务。1.5. 使用体验评价WICED Sense Kit集成的众多传感器、利用BLE无线跟手机通讯、App精美的显示,的确让用户(主要是开发者)感受到WICED Smart芯片技术的强大。开发者可以在此基础上,实现各种不同的创意。在使用过程中,WICED Sense Kit经常莫名其妙地进入休眠、App断开连接的情况时有发生。哪怕是采用BLE Scanner或者BLE设备监听器做测试,也出现连接断开、Characteristic读取验证错误等情况。这在笔者使用T公司、S公司等BLE产品时并未出现。WICED Sense Kit作为开发者的参考设计和技术产品开发的第一个试用体验,有待在这方面进行加强。同时,作为面向主要用户是开发者的开发平台,Kit只有一个设备,BLE点对点通讯的另一端,必须是智能手机来进行测试,让用户(主要是开发者)感到一定的不方便,何况要开发BLE,要对很多BLE协议内部参数进行配置,比如connection interval/slave latency,智能手机等都不提供这些底层功能的。建议在Kit里面加入一个USB-Dongle,并提供对应的软件,以便进一步详细的测试WICED Smart的BLE开发(比如LL连接参数设定、Pair/Bond、HCI命令发送等)。2 软硬件资源WICED Sense Kit采用的是BCM20737S模块,也就是集成了BLE芯片(BCM20737)、晶振、阻抗匹配网络馈线、天线的一个模块。这样硬件设计大大简化,特别是无线射频系统中最难的天线及其阻抗匹配网络部分,完全不用硬件工程师伤神费脑去做测试。同时WICED Sense Kit集成了众多传感器。开发者可直接使用该Kit进行开发评估。Broadcom公司的物联网系列芯片统称为WICED (Wireless Internet Connectivity for Embedded Devices),其BLE物联网芯片则成为WICED Smart,取WICED和Bluetooth Smart的合成。WICED Smart芯片提供了较多的硬件资源,同时博通提供SDK给注册开发真论坛用户下载。可以较快速的完成软硬件开发。2.1. WICED Sense Kit的传感器WICED Sense Kit采用的是5个意法半导体(STMicroelectronics)公司的传感器,在《Quick Start Guide》中给出了说明和文档连接,包括如下:ST Microelectronics Devices used in the WICED Smart Kit,():l Gyroscope (L3GD20) – ...FM89/SC1288/PF252443 l Accelerometer (LIS3DSH) – ...FM89/FM89/SC444/PF252716 l eCompass (LSM303D) – ...FM89/SC1449/PF253884 l Pressure sensor (LPS25H) – ...FM89/SC1316/PF255230 l Humidity Temperature sensor (HTS221) – ...FM89/SC1718/PF260067这些传感器都采用I2C接口,接到BCM20737S的I2C总线上。 图 21&&WICED Sense Kit的传感器WICED Sense Kit出厂的固件将Sensor数据采用Notification的形式发送到手机。通过前文中的“BLE设备监听器测试WICED Sense Kit的GATT数据表格”中的“传感器数据”Characteristic的Notification发送。数据格式如下: 图 21&&WICED Sense Kit的传感器数据格式2.2. BLE芯片硬件资源BCM20737芯片架构如下图: 图 22&&BCM20737芯片架构图从上图中可以看到,该芯片由一个ARM Cortex-M3作为内核,内部集成了众多的数字、模拟、串行通讯、电源等外设,以及最重要的BLE无线射频基带。简要功能介绍如下:2.2.1 MCU和存储ARM Cortex-M3内核,主频最高可达24MHz,集成JTAG和ICE-RT调试接口。并集成了ROM:320KB和60KB的RAM。其中ROM包括了启动代码(Boot ROM)、,其中Boot ROM在启动时,可以根据外部EEPROM或者外部Flash配置成不同的HID应用。同时ROM也包括了BLE协议栈的底层。外部EEPROM通过芯片的BSC接口(与I2C兼容,只是不支持多个I2C主机功能),外部Flash通过芯片的SPI接口。这两种外部存储提供用户应用配置信息、应用代码、配对等信息。2.2.2 数字外设(1)GPIO提供14个GPIO接口,具备可编程的上拉和下拉电阻,并且11个GPI驱动能力为2mA而P26、P27、P28这三个GPIO驱动能力高达16mA!(2)PWM提供4个PWM通道,每一个通道有初始值寄存器、触发值寄存器和PWM计数寄存器。同时4个PWM公用一个配置寄存器来配置PWM的时钟、相位等。(3)红外发送与红外接收/学习BCM20737具备硬件支持红外发送与红外接收/学习功能。可发送或接收调制前的原始信号或调制后的载波信号。同时可以对接收到的红外信号(10kHz~500kHz,注:常用的红外遥控信号为38kHz)进行检测学习。同时固件甚至可以解码红外信号。2.2.3 模拟外设(1)ADC具备9个输入通道的16bit-ADC(实际有效位为10),最大转换率为187kHz。(2)Clock具备24MHz的晶振接口,提供给RF、CPU、通讯接口等的时钟。具备3kHz的晶振接口,提供RTC、低功耗休眠的时钟。但是需要外部10MΩ的反馈电阻。具备内部集成的低功耗RC振荡器时钟,用于片内集成外设,每个外设可单独开启或关闭各自的时钟。(3)电源具备内部集成的LDO,将外部1.425~3.63V的电源输入转成内部的1.2V电压,可提供最大30mA的负载,需要外部1.2V引脚连接对地的解耦电容。同时支持直接从1.2V引脚电源输入。内部集成电源管理功能,可动态开启、关闭RF电源。具备多种低功耗模式。具备上电复位POR。2.2.4 串行通讯外设SoC除了芯片本身提供众多功能之外,最重要的就是通过通讯接口与外部的芯片、传感器等进行通讯,因此BCM20737提供了众多的串行通讯接口(1)BSC接口1个BSC接口为博通自行开发的兼容I2C标准(不支持多主机功能)的接口。可通过BSC读取外部EEPROM、I2C传感器等通讯。支持100kHz、400kHz、800kHz和1000kHz等不同的通讯速率。(2)SPI接口BCM20737提供2个SPI接口,一个只能作为master,而另一个可配置为master或者slave,每个接口支持最高12MHz的通讯频率。并具备16字节的接收缓存和16字节的发送缓存。(3)UART接口1个UART接口,支持kbps等常见的各种波特率。并可以使用UART HCI命令来选择波特率。2.2.5 无线射频基带BCM20737的无线射频基带,支持BLE规范要求的时序要求。具备调频生成器、E0加密、LL、自适应调频等功能。同时通过一个直接测试(Direct Test)UART接口,可以直接控制基带。2.3. 软件开发资源2.3.1 WICED Smart SDKWICED SDK在Broadcom开发者论坛(需企业或学校邮箱注册,公共大众邮箱不行)下载,包括BLE协议栈、芯片内部驱动、应用范例Demo、开发文档、编译器等都在SDK里面。以下为SDK的目录结构。 图 23&&WICED Smart SDK目录结构2.3.2 WICED Smart IDEWICED Smart IDE为基于Eclipse的集成开发环境。具备工程项目管理、代码编辑、编译、调试等功能。同时提供WICED Smart Designer等插件,帮助开发WICED Smart App。
3 WICED Smart SDK/IDE开发初体验3.1. 可视化GATT数据库创建使用WICED Smart IDE的WICED Smart Designer,开发者可以采用图形化界面设置BLE的GATT数据库,如下图,可自定义插入Service、Characteristic、以及设置Characteristic的Permission、Description、Configuration等信息。非常直观方便快捷。简化了开发者的工作量。 图 31&&WICED Smart Designer构建GATT数据库最终点击Generate Code后,生成了对应的GATT数据库初始化代码。如下图,可见可视化配置的GATT数据库中的各个Service、Characteristic都自动生成对应的代码,放在gatt_database数组里面。
图 32&&WICED Smart Designer生成的GATT数据库初始化代码4 结论通过对WICED Sense Kit的使用、体验,开发资料的收集、阅读,开发环境的安装、试用。结合平常开发的一些理解和经验,笔者总结WICED Smart系列产品如下特点:(1)BLE规范全支持,提供多种GATT-Profile的支持以及API,可与市面上的BLE智能手机通讯。提供手机监测、控制等H2M(Human To Machine人对机)应用,比如移动健康监测、运动数据管理、手机遥控、防丢提醒等BLE针对的大众市场。(2)BLE低功耗,可单电池运行更长时间。特别是支持1.2V低电压输入,可采用单节AAA电池或纽扣电池,有效提高产品竞争力。(3)单芯片提供了MCU、RF、多种数字、模拟、通讯、电源管理接口,并且在ROM中提供协议,开发BLE的BOM成本低。特别是借助BCM2073xS的模块,硬件设计的RF部分都已经不需要考虑,大大降低了BLE开发难度。目前BLE芯片市场竞争者较多,比较流行的有T公司、N公司、C公司(已被Q公司收购)、S公司等,以及更多的BLE市场竞争者。对比上述竞争者产品,求同存异对比之后,Broadcom的WICED Smart系列产品所独特的片内资源、SDK和IDE、电源特性等,也具备自己独特的竞争优势。
版本历史(Revision History) 版本号发布时间内容A0初次编写。
作者的其他最新日志
评论 ( 个评论)
Powered by页面导航:
→ 正文内容 Android提高之Android手机与BLE终端通信
Android提高之Android手机与BLE终端通信
这篇文章主要介绍了Android手机与BLE终端通信的方法,有很大的实用价值,需要的朋友可以参考下
最近穿戴设备发展得很火,把相关技术也带旺了,其中一项是BLE(Bluetooth Low Energy)。BLE是蓝牙4.0的核心Profile,主打功能是快速搜索,快速连接,超低功耗保持连接和传输数据,弱点是数据传输速率低,由于BLE的低功耗特点,因此普遍用于穿戴设备。Android 4.3才开始支持BLE API,所以请各位客官把本文代码运行在蓝牙4.0和Android 4.3及其以上的系统,另外本文所用的BLE终端是一个蓝牙4.0的串口蓝牙模块。
注:笔者的i9100刷了4.4系统后,竟然也能跟BLE蓝牙模块通信。
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 4.3 Sample的BluetoothLeGatt,把冗余代码去掉,获取的BLE设备信息都通过Log,还有一些必要的读写蓝牙方法,应该算是简化到大家一看就可以懂了。本文完整代码可以点击此处。
接下来贴出本文运行的结果,首先是连接BLE设备后,枚举出设备所有Service、Characteristic、Descriptor,并且手机会往Characteristic uuid=0000ffe1-00-fb写入“send data-&”字符串,BLE终端收到数据通过串口传到PC串口助手:
04-21 18:28:25.465: E/DeviceScanActivity(12254): --&service type:PRIMARY
04-21 18:28:25.465: E/DeviceScanActivity(12254): --&includedServices size:0
04-21 18:28:25.465: E/DeviceScanActivity(12254): --&service uuid:0-805f9b34fb
04-21 18:28:25.465: E/DeviceScanActivity(12254): ----&char uuid:0-805f9b34fb
04-21 18:28:25.465: E/DeviceScanActivity(12254): ----&char permission:UNKNOW
04-21 18:28:25.465: E/DeviceScanActivity(12254): ----&char property:READ
04-21 18:28:25.465: E/DeviceScanActivity(12254): ----&char uuid:0-805f9b34fb
04-21 18:28:25.470: E/DeviceScanActivity(12254): ----&char permission:UNKNOW
04-21 18:28:25.470: E/DeviceScanActivity(12254): ----&char property:READ
04-21 18:28:25.470: E/DeviceScanActivity(12254): ----&char uuid:0-805f9b34fb
04-21 18:28:25.470: E/DeviceScanActivity(12254): ----&char permission:UNKNOW
04-21 18:28:25.470: E/DeviceScanActivity(12254): ----&char property:READ|WRITE|
04-21 18:28:25.470: E/DeviceScanActivity(12254): ----&char uuid:0-805f9b34fb
04-21 18:28:25.470: E/DeviceScanActivity(12254): ----&char permission:UNKNOW
04-21 18:28:25.475: E/DeviceScanActivity(12254): ----&char property:READ|WRITE|
04-21 18:28:25.475: E/DeviceScanActivity(12254): ----&char uuid:0-805f9b34fb
04-21 18:28:25.475: E/DeviceScanActivity(12254): ----&char permission:UNKNOW
04-21 18:28:25.475: E/DeviceScanActivity(12254): ----&char property:READ
04-21 18:28:25.475: E/DeviceScanActivity(12254): --&service type:PRIMARY
04-21 18:28:25.475: E/DeviceScanActivity(12254): --&includedServices size:0
04-21 18:28:25.475: E/DeviceScanActivity(12254): --&service uuid:0-805f9b34fb
04-21 18:28:25.480: E/DeviceScanActivity(12254): ----&char uuid:0-805f9b34fb
04-21 18:28:25.480: E/DeviceScanActivity(12254): ----&char permission:UNKNOW
04-21 18:28:25.480: E/DeviceScanActivity(12254): ----&char property:INDICATE
04-21 18:28:25.480: E/DeviceScanActivity(12254): --------&desc uuid:0-805f9b34fb
04-21 18:28:25.480: E/DeviceScanActivity(12254): --------&desc permission:UNKNOW
04-21 18:28:25.480: E/DeviceScanActivity(12254): --&service type:PRIMARY
04-21 18:28:25.480: E/DeviceScanActivity(12254): --&includedServices size:0
04-21 18:28:25.480: E/DeviceScanActivity(12254): --&service uuid:0000ffe0-00-fb
04-21 18:28:25.480: E/DeviceScanActivity(12254): ----&char uuid:0000ffe1-00-fb
04-21 18:28:25.480: E/DeviceScanActivity(12254): ----&char permission:UNKNOW
04-21 18:28:25.480: E/DeviceScanActivity(12254): ----&char property:READ|WRITE_NO_RESPONSE|NOTIFY|
04-21 18:28:25.490: E/DeviceScanActivity(12254): --------&desc uuid:0-805f9b34fb
04-21 18:28:25.490: E/DeviceScanActivity(12254): --------&desc permission:UNKNOW
04-21 18:28:25.490: E/DeviceScanActivity(12254): --------&desc uuid:0-805f9b34fb
04-21 18:28:25.490: E/DeviceScanActivity(12254): --------&desc permission:UNKNOW
<span style="color: #ff 18:28:26.025: E/DeviceScanActivity(12254): onCharRead BLE DEVICE read 0000ffe1-00-fb -& 00
这里红字是由BluetoothGattCallback的onCharacteristicRead()回调而打出Log
以下Log是PC上的串口工具通过BLE模块发送过来,由BluetoothGattCallback的 onCharacteristicChanged()打出Log
04-21 18:30:18.260: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-00-fb -& send data to phone
04-21 18:30:18.745: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-00-fb -& send data to phone
04-21 18:30:19.085: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-00-fb -& send data to phone
04-21 18:30:19.350: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-00-fb -& send data to phone
04-21 18:30:19.605: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-00-fb -& send data to phone
04-21 18:30:19.835: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-00-fb -& send data to phone
04-21 18:30:20.055: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-00-fb -& send data to phone
04-21 18:30:20.320: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-00-fb -& send data to phone
04-21 18:30:20.510: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-00-fb -& send data to phone
04-21 18:30:20.735: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-00-fb -& send data to phone
04-21 18:30:21.000: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-00-fb -& send data to phone
接下来贴出本文核心代码:
public class DeviceScanActivity extends ListActivity {
private final static String TAG = DeviceScanActivity.class.getSimpleName();
private final static String UUID_KEY_DATA = "0000ffe1-00-fb";
private LeDeviceListAdapter mLeDeviceListA
/**搜索BLE终端*/
private BluetoothAdapter mBluetoothA
/**读写BLE终端*/
private BluetoothLeClass mBLE;
private boolean mS
private Handler mH
// Stops scanning after 10 seconds.
private static final long SCAN_PERIOD = 10000;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActionBar().setTitle(R.string.title_devices);
mHandler = new Handler();
// 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();
// Initializes a Bluetooth adapter. For API level 18 and above, get a reference to
// BluetoothAdapter through BluetoothManager.
final BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
// Checks if Bluetooth is supported on the device.
if (mBluetoothAdapter == null) {
Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();
//开启蓝牙
mBluetoothAdapter.enable();
mBLE = new BluetoothLeClass(this);
if (!mBLE.initialize()) {
Log.e(TAG, "Unable to initialize Bluetooth");
//发现BLE终端的Service时回调
mBLE.setOnServiceDiscoverListener(mOnServiceDiscover);
//收到BLE终端数据交互的事件
mBLE.setOnDataAvailableListener(mOnDataAvailable);
protected void onResume() {
super.onResume();
// Initializes list view adapter.
mLeDeviceListAdapter = new LeDeviceListAdapter(this);
setListAdapter(mLeDeviceListAdapter);
scanLeDevice(true);
protected void onPause() {
super.onPause();
scanLeDevice(false);
mLeDeviceListAdapter.clear();
mBLE.disconnect();
protected void onStop() {
super.onStop();
mBLE.close();
protected void onListItemClick(ListView l, View v, int position, long id) {
final BluetoothDevice device = mLeDeviceListAdapter.getDevice(position);
if (device == null)
if (mScanning) {
mBluetoothAdapter.stopLeScan(mLeScanCallback);
mScanning =
mBLE.connect(device.getAddress());
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
public void run() {
mScanning =
mBluetoothAdapter.stopLeScan(mLeScanCallback);
invalidateOptionsMenu();
}, SCAN_PERIOD);
mScanning =
mBluetoothAdapter.startLeScan(mLeScanCallback);
mScanning =
mBluetoothAdapter.stopLeScan(mLeScanCallback);
invalidateOptionsMenu();
* 搜索到BLE终端服务的事件
private BluetoothLeClass.OnServiceDiscoverListener mOnServiceDiscover = new OnServiceDiscoverListener(){
public void onServiceDiscover(BluetoothGatt gatt) {
displayGattServices(mBLE.getSupportedGattServices());
* 收到BLE终端数据交互的事件
private BluetoothLeClass.OnDataAvailableListener mOnDataAvailable = new OnDataAvailableListener(){
* BLE终端数据被读的事件
public void onCharacteristicRead(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic, int status) {
if (status == BluetoothGatt.GATT_SUCCESS)
Log.e(TAG,"onCharRead "+gatt.getDevice().getName()
+characteristic.getUuid().toString()
+Utils.bytesToHexString(characteristic.getValue()));
* 收到BLE终端写入数据回调
public void onCharacteristicWrite(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
Log.e(TAG,"onCharWrite "+gatt.getDevice().getName()
+" write "
+characteristic.getUuid().toString()
+new String(characteristic.getValue()));
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
runOnUiThread(new Runnable() {
public void run() {
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
private void displayGattServices(List&BluetoothGattService& gattServices) {
if (gattServices == null)
for (BluetoothGattService gattService : gattServices) {
//-----Service的字段信息-----//
int type = gattService.getType();
Log.e(TAG,"--&service type:"+Utils.getServiceType(type));
Log.e(TAG,"--&includedServices size:"+gattService.getIncludedServices().size());
Log.e(TAG,"--&service uuid:"+gattService.getUuid());
//-----Characteristics的字段信息-----//
List&BluetoothGattCharacteristic& gattCharacteristics =gattService.getCharacteristics();
for (final BluetoothGattCharacteristic gattCharacteristic: gattCharacteristics) {
Log.e(TAG,"----&char uuid:"+gattCharacteristic.getUuid());
int permission = gattCharacteristic.getPermissions();
Log.e(TAG,"----&char permission:"+Utils.getCharPermission(permission));
int property = gattCharacteristic.getProperties();
Log.e(TAG,"----&char property:"+Utils.getCharPropertie(property));
byte[] data = gattCharacteristic.getValue();
if (data != null && data.length & 0) {
Log.e(TAG,"----&char value:"+new String(data));
//UUID_KEY_DATA是可以跟蓝牙模块串口通信的Characteristic
if(gattCharacteristic.getUuid().toString().equals(UUID_KEY_DATA)){
//测试读取当前Characteristic数据,会触发mOnDataAvailable.onCharacteristicRead()
mHandler.postDelayed(new Runnable() {
public void run() {
mBLE.readCharacteristic(gattCharacteristic);
//接受Characteristic被写的通知,收到蓝牙模块的数据后会触发mOnDataAvailable.onCharacteristicWrite()
mBLE.setCharacteristicNotification(gattCharacteristic, true);
//设置数据内容
gattCharacteristic.setValue("send data-&");
//往蓝牙模块写入数据
mBLE.writeCharacteristic(gattCharacteristic);
//-----Descriptors的字段信息-----//
List&BluetoothGattDescriptor& gattDescriptors = gattCharacteristic.getDescriptors();
for (BluetoothGattDescriptor gattDescriptor : gattDescriptors) {
Log.e(TAG, "--------&desc uuid:" + gattDescriptor.getUuid());
int descPermission = gattDescriptor.getPermissions();
Log.e(TAG,"--------&desc permission:"+ Utils.getDescPermission(descPermission));
byte[] desData = gattDescriptor.getValue();
if (desData != null && desData.length & 0) {
Log.e(TAG, "--------&desc value:"+ new String(desData));
感兴趣的读者可以动手测试一下代码的运行情况,希望能对大家的Android项目开发有所帮助。
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910

我要回帖

更多关于 characteristic可数吗 的文章

 

随机推荐