蓝牙4.0蓝牙协议栈源码里怎么配置寄存器

技术小站:
厂商活动:
地点:北京
时间:10月14日 13:00 - 17:30
地点:北京
时间:10月16日 14:00 - 17:00
地点:武汉
时间:10月19日 9:00 - 18:00
地点:深圳
时间:11月8日 13:00 - 17:30
零基础快速成为Android项目开发工程师
ARM裸机开发实战(第1期加强版)
张飞硬件设计与开发视频教程
从0到1自己动手写嵌入式操作系统
张飞电子视频全套共十部
移入鼠标可放大二维码
由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(2) - 全文
来源:本站整理 作者:ONeal日 09:32
[导读] 本文将结合TI推出的CC254x SoC 系列,讲解从环境的搭建到蓝牙4.0协议栈的开发来深入学习蓝牙4.0的开发过程。##第七节 :独立按键之中断方式。##第八节:CC254x内部温度传感器温度采集。##第九节:五向按键。##第十节:蜂鸣器。
  本系列教程将结合推出的CC254x SoC 系列,讲解从环境的搭建到蓝牙4.0协议栈的开发来深入学习蓝牙4.0的开发过程。教程共分为六部分,本文为第二部分:
  第二部分知识点:
  第六节 独立按键之查询方式
  第七节 独立按键之中断方式
  第八节 CC254x内部温度传感器温度采集
  第九节 五向按键
  第十节 蜂鸣器
  有关 的CC254x芯片介绍,可点击下面链接查看:
  同系列资料推荐:
  有关本文的工具下载,大家可以到以下这个地址:
  第六节 独立按键之查询方式
  在MT254xboard上有一个独立按键KEY1,如图 ,独立按键和复位键在整个班子的左上角。按键通过P0.0口和CPU连接,在没有按键时为高电平,按下后为低电平。下面我们通过LCD来显示独立按键的状态。
  其对应的原理图如下:
  我们先用查询的方式读取按键的状态。因为按键接入在P0.0口,所以我们读取P0.0口的电平即可知道按键的状态。
  uint8 KeyValue(void) // 读取按键状态
  if((P0&0X01) == 0X00 ) // 按下为低电平
  return KEY_DOWN;
  return KEY_UP;
  这里我们在while循环中不断的读取按键状态,并且判断是否改变,如果改变则改变LCD的显示。
  int main(void)
  uint8 OldKeyValue = 0;
  uint8 NewKeyValue = 0;
  SysStartXOSC();
  LCD12864_Init();
  LCD12864_DisStr(1, & Key Test&);
  // 按键初始化
  P0SEL &= ~0X01; // 设置为 IO功能
  P0DIR &= ~0X01; // 设置为输入功能
  while(1)
  NewKeyValue = KeyValue(); // 读取按键状态
  if(OldKeyValue != NewKeyValue) // 按键状态改变
  OldKeyValue = NewKeyV // 保存当前按键状态
  if(OldKeyValue == KEY_DOWN)
  LCD12864_DisStr(3, & Key Down &);
  LCD12864_DisStr(3, & Key Up &);
  return 0;
  运行程序,效果如图所示:
  第七节 独立按键之中断方式
  复制Key工程,重命名为KeyInterrupt。刚刚我们用查询的方式读取按键的状态。但是这种方式在实际的工程中没有实际的应用价值,下面我们采用外部中断的方式来读取按键的状态,每当按键按下时就会触发一次外部中断。为了P0.0口能够触发中断,我们需要进行如下配置:
  P0IEN |= 0X01; // P00 设置为中断方式
  PICTL &=~ 0X01; // 下降沿触发
  IEN1 |= 0X20; // 允许P0口中断
  P0IFG = 0x00; // 清除中断标志位
  EA = 1; // 开总中断
  然后就需要编写中断服务函数了。这里注意一点,在IAR中的中断函数有点特殊,格式为:
  #pragma vector = 中断向量
  __interrupt 函数
  所以我们的中断函数为:
  #pragma vector = P0INT_VECTOR
  __interrupt void P0_ISR(void)
  if(0x01&P0IFG)
  NewKeyValue = KEY_DOWN; // 记录按键按下
  P0IFG = 0; //清中断标志
  P0IF = 0; //清中断标志
  在中断中我们记录按键按下,等待应用程序处理。而在主函数中我们需要处理按键按下事件,主函数中我们对按键计数并且通过LCD显示。
  int main(void)
  char LCDBuf[21]={0}; // 显存
  int KeyCnt = 0;
  SysStartXOSC();
  LCD12864_Init();
  LCD12864_DisStr(1, & Key Test&);
  P0SEL &= ~0X01; // 设置为IO功能
  P0DIR &= ~0X01; // 设置为输入功能
  P0IEN |= 0X01; // P0.0 设置为中断方式
  PICTL |= 0X01; // 下降沿触发
  IEN1 |= 0X20; // 允许P0口中断
  P0IFG = 0x00; // 清除中断标志位
  EA = 1; // 开总中断
  sprintf(LCDBuf, & Key Count : %d&, KeyCnt++); // 按键计数
  LCD12864_DisStr(3, LCDBuf);
  while(1)
  if(KEY_DOWN == NewKeyValue) // 按键按下
  SoftWaitUs(25000); // 延时防抖
  if((P0&0X01) == 0X00) // 再次确认按键是否按下
  sprintf(LCDBuf, & Key Count : %d&, KeyCnt++); // 按键计数
  LCD12864_DisStr(3, LCDBuf);
  NewKeyValue = KEY_UP; // 按键松开
  return 0;
  每按一次按键计数加1,效果如图所示:
  第八节 CC254x内部温度传感器温度采集
  CC254x内部有一个温度传感器,我们这节使用这个传感器来采集芯片的温度,此传感器精度不高。不适合用于实际的工程中,这里只为演示AD采样。要使用内部的温度采集我们需要使用AD采样,所以我们需要先来了解CC254x的AD功能。在后续课程有对ADC的详细说明。
  ADC结构图如下所示:
  ADC控制寄存器1如下图所示:
  我们使用手动触发的方式进行AD采样,所以STSEL = 11B,最低两位始终为1,最终ADCCON1=0x33。
  ADC控制寄存器3如图所示:
  ADC参考电压使用内部电压,采用12位精度采集。采集温度通道。所以ADCCON3= 0x3E。这里注意一点,ADCCON2和ADCCON3的配置是一样的,我们这里用ADCCON3来配置。
  uint16 ADC_Read (uint8 channel)
  int16 reading = 0;
  uint8 adcChannel = 0x01《《
  int16 Result = 0;
  if (channel 《= 7) // 通道0-7需要通过P0.0-P0.7输入
  ADCCFG |= adcC
  uint8 i=0;
  ADCCON3 = channel | 0x20; // 12位精度,启动转换
  while (!(ADCCON1 & 0x80)); // 等待转换完成
  // 读取采样结果
  reading = (int16)(ADCL);
  reading |= (int16)(ADCH 《《 8);
  reading 》》= 4; // 丢弃低位
  Result += // 累加
  }while(i++ 《 10); // 连续采样10次
  if (channel 《= 7)
  ADCCFG &= (adcChannel ^ 0xFF);
  return (Result/10);
  在读取温度值前,我们还需要使能温度传感器。
  int main(void)
  float temp=0;
  char LCDBuf[21] = {0};
  SysStartXOSC(); // 启动外部晶振
  LCD12864_Init(); // LCD初始化
  // 打开温度传感器
  TR0 = 0x01;
  ATEST = 0x01;
  while(1)
  temp = (ADC_Read(TEMP_ADC_CHANNEL) - 1340) /10.0;
  sprintf(LCDBuf, & temp : %0.1f&, temp); //
  LCD12864_DisStr(3, LCDBuf);
  SoftWaitUs(100000);
  return 0;
  采集的温度显示在LCD上,可以看到温度在跳动,这是由于AD的误差太大导致的,这里只做一个简单的实验,如果需要工程应用,建议外接温度传感器。把手放在芯片上可以看到温度在上升。温度采集结果如下图所示:
  第九节 五向按键
  五向按键,也就是我们平常所见的摇杆内部构造,五向按键有上下左右和中间五个按键值,MT254xboard上的五向按键检测电路由馒头科技自主设计,而不是的设计,采用一个外部中断和一个AD检测口来完成按键的检测。
  由原理图可知当我们按下不同的键值时在JOY_CHK将会产生一个上升沿,并且在JOY_AD口有不同的电压。我们只需要在JOY_CHK的外部中断中读取JOY_AD的电压即可识别不同的按键。
  外部中断和AD采用在前面已经讲过了,这里只需要拿来用就可以了。JOY_CHK连接在P0.7脚,JOY_AD连接在P0.6脚。我们将按键值显示在LCD上。
  int main(void)
  uint8 KeyValue = 0;
  SysStartXOSC();
  LCD12864_Init();
  LCD12864_DisStr(1, & JoySck Test&);
  P0INP |= 0X40; // P0.6 三态
  P0SEL &= ~0X80; // 设置为IO功能
  P0DIR &= ~0X80; // 设置为输入功能
  P0IEN |= 0X80; // P0.7 设置为中断方式
  PICTL &= ~0X80; // 上升沿触发
  IEN1 |= 0X20; // 允许P0口中断
  P0IFG = 0x00; // 清除中断标志位
  EA = 1; // 开总中断
  while(1)
  if(KeyStat) // 按键按下
  KeyValue = GetKeyValue();
  switch ( KeyValue )
  case KEY_UP :
  sprintf(LCDBuf, &\tUP&);
  case KEY_DOWN :
  sprintf(LCDBuf, &\tDown&);
  case KEY_LEFT :
  sprintf(LCDBuf, &\tLeft&);
  case KEY_CENTER :
  sprintf(LCDBuf, &\tCenter&);
  case KEY_RIGHT :
  sprintf(LCDBuf, &\tRight&);
  default:
  KeyStat =0;
  LCD12864_DisStr(3, LCDBuf);
  return 0;
  按键的检测通过电压来区分。
  uint8 GetKeyValue(void)
  uint16
  uint8 ksave0 = 0;
  adc = ADC_Read (JOY_AD_CHANNEL);
  if ((adc 》= 800) && (adc 《= 1100))
  ksave0 = KEY_RIGHT;
  else if ((adc 》= 1200) && (adc 《= 2000))
  ksave0 = KEY_CENTER;
  else if ((adc 》= 2050) && (adc 《= 2150))
  ksave0 = KEY_UP;
  else if ((adc 》= 2200) && (adc 《= 2230))
  ksave0 = KEY_LEFT;
  else if ((adc 》= 2240) && (adc 《= 2500))
  ksave0 = KEY_DOWN;
  return ksave0;
  使用五向按键效果如下所示:
  第十节 蜂鸣器
  蜂鸣器是一种常用的报警设备,常用的蜂鸣器有无源和有源两种类型,无源蜂鸣器需要用一定频率的方波驱动,从而发出不同频率的声音。而有源蜂鸣器只需要通电就会发出固定频率的声音,MT254xboard开发板上的蜂鸣器用的是无源蜂鸣器,因此我们需要用一定频率的方波来驱动。
  硬件驱动方面,我们这里使用了PNP三极管来驱动蜂鸣器,BUZZ引脚为芯片的P2.0。对照IO复用表可知,此IO可以作为定时器4的匹配通道1输出。所以我们需要把定时器配置为PWM匹配输出模式:
  PERCFG |= (0x01《《4); // 选择定时器4匹配功能中的第2种IO口
  P2DIR |= 0x01; // p2.0 输出
  P2SEL |= 0x01; // p2.0 复用功能
  T4CTL &= ~0x10; // Stop timer 3 (if it was running)
  T4CTL |= 0x04; // Clear timer 3
  T4CTL &= ~0x08; // Disable Timer 3 overflow interrupts
  T4CTL |= 0x03; // Timer 3 mode = 3 - Up/Down
  T4CCTL0 &= ~0x40; // Disable channel 0 interrupts
  T4CCTL0 |= 0x04; // Ch0 mode = compare
  T4CCTL0 |= 0x10; // Ch0 output compare mode = toggle on compare
  这里仅仅是配置为匹配输出,具体输出什么样的波形还需要我们再通过计算得出。
  void Buzzer_Start(uint16 frequency)
  P2SEL |= 0x01; // p2.0 复用功能
  uint8 prescaler = 0;
  // Get current Timer tick divisor setting
  uint8 tickSpdDiv = (CLKCONSTA & 0x38)》》3;
  // Check if frequency too low
  if (frequency 《 (244 》》 tickSpdDiv)){ // 244 Hz = 32MHz / 256 (8bit counter) / 4 (up/down counter and toggle on compare) / 128 (max timer prescaler)
  Buzzer_Stop(); // A lower tick speed will lower this number accordingly.
  // Calculate nr of ticks required to achieve target frequency
  uint32 ticks = (8000000/frequency) 》》 tickSpdD // 8000000 = 32M / 4;
  // Fit this into an 8bit counter using the timer prescaler
  while ((ticks & 0xFFFFFF00) != 0)
  ticks 》》= 1;
  prescaler += 32;
  // Update registers
  T4CTL &= ~0xE0;
  T4CTL |=
  T4CC0 = (uint8)
  // Start timer
  T4CTL |= 0x10;
  这个函数是通过传入参数的形式,使P2.0口发出指定频率的方波。
  void Buzzer_Stop(void)
  T4CTL &= ~0x10; // Stop timer 3
  P2SEL &= ~0x01;
  P2_0 = 1;
  这个函数是使蜂鸣器停止,主要有三个动作,停止定时器,将P2.0配置为IO功能并且输出高电平,因为我们使用的是PNP三极管。
  我们在按键的程序上加上蜂鸣器的控制,当按下按键时,蜂鸣器响。松开后停止响。
  int main(void)
  char LCDBuf[21]={0}; // 显存
  int KeyCnt = 0;
  SysStartXOSC();
  LCD12864_Init();
  LCD12864_DisStr(1, & Buzzer Test&);
  Buzzer_Init();
  P0SEL &= ~0X01; // 设置为IO功能
  P0DIR &= ~0X01; // 设置为输入功能
  P0IEN |= 0X01; // P0.0 设置为中断方式
  PICTL |= 0X01; // 下降沿触发
  IEN1 |= 0X20; // 允许P0口中断
  P0IFG = 0x00; // 清除中断标志位
  EA = 1; // 开总中断
  sprintf(LCDBuf, & Key Count : %d&, KeyCnt++); // 按键计数
  LCD12864_DisStr(3, LCDBuf);
  while(1)
  if(KEY_DOWN == NewKeyValue) // 按键按下
  SoftWaitUs(25000); // 延时防抖
  if((P0&0X01) == 0X00) // 再次确认按键是否按下
  sprintf(LCDBuf, & Key Count : %d&, KeyCnt++); // 按键计数
  LCD12864_DisStr(3, & Buzzer Start&);
  Buzzer_Start(2000);
  NewKeyValue = KEY_UP; // 按键松开
  Buzzer_Stop();
  LCD12864_DisStr(3, & Buzzer Stop&);
  return 0;
  按下按键后可以看到LCD显示Buzzer Start,听到蜂鸣器响,如果你有示波器,还能测到P2.0口有一个2KHz的方波。
蓝牙BLE相关文章
蓝牙BLE相关下载
协议栈相关文章
协议栈相关下载
蓝牙4.0相关文章
蓝牙4.0相关下载
国际大厂IDT无线接收端芯片出货量达到了3000万颗,随着iPhone8支持无线充电功能,无线充电市场全面启动时间到来。易冲无线推出的无线充电接收端EC4016芯...
厦门新页无线充电芯片的核心优势是什么?新页为何与华强芯城强强联合?华强芯城如何助力新页的市场推进?9月22日,厦门新页董事长林桂江博士和华强...
创新实用技术专题
供应链服务
商务及广告合作
Jeffery Guo
关注我们的微信
供应链服务 PCB/IC/PCBA
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-Android Bluetooth蓝牙开发\蓝牙协议\蓝牙通信例子_Android支持蓝牙4.0版本_BLE开发 - bluetooth-ble-android - ITkeyowrd
Android Bluetooth蓝牙开发\蓝牙协议\蓝牙通信例子_Android支持蓝牙4.0版本_BLE开发
分类: Android的原生应用分析
21:44 7827人阅读 评论(37) 收藏 举报 bluetooth 4.2.2源码 android 目录()[+] 代码分布 整
一、Android Bluetooth现状
在android官网可以了解到android4.2新增了部分新功能,但是对于BT熟悉的人或许开始头疼了,那就是Android4.2引入了一个新的蓝牙协议栈针。谷歌和Broadcom之间的合作,开发新的蓝牙协议栈,取代了基于堆栈的Bluez。因此市场上出现了老设备的兼容问题,很多蓝牙设备在android4.2手机上不能使用。
New Bluetooth stack Android 4.2 introduces a new Bluetooth stack optimized for use with Android devices. The new Bluetooth stack developed in collaboration between Google and Broadcom replaces the stack based on BlueZ and provides improved compatibility and reliability
(1)Android2.2版 支持的蓝牙核心版本是Bluetooth 2.0 + EDR。
(2)Android 的蓝牙 使用了BlueZ协议栈,但只实现了Handset/Handfree和A2DP/AVRCP等Profile。
(一些常用的Profile(如HID/DUN/SPP/OPP/FTP/PAN等)在现在的Android2.2版中并没有实现。需要自己在Android中实现Profile)。
(3)目前版本(Android2.2) 只支持 绑定设备(bonded devices)之间通信,而不支持ad-hoc网络通信。
(4)目前版本(Android2.2) emulator(仿真器、模拟器)不支持蓝牙的调试,只能通过LOG和BlueZ带的工具来调试。
(5)Android2.0 API level5 之后的版本才支持Bluetooth。
(6)Android 的Bluetooth通信API是BlueZ 的RFCOMM的封装。
RfcommSocket 在 API level7 之后的版本才提供Bluetooth 的通信
RfcommSocket 使用JAVA 的IputStream 和OutputStream对象
二、Android Bluetooth 架构
1、面向库的架构视图
2、面向进程的架构视图
LinuxKernel层:
bluez协议栈、uart驱动, h4协议, hci,l2cap, sco, rfcomm
Library层:
libbluedroid.so 等
Framework层:
实现了Headset /Handsfree 和 A2DP/AVRCP profile,但其实现方式不同Handset/Handfree是直接 在bluez的RFCOMM Socket上开发的,没有利用bluez的audio plugin,而A2DP/AVRCP是在bluez的audio plugin基础上开发的,大大降低了实现的难度。
三、 BlueZ介绍
(详见http://www.bluez.org/):
BlueZ 是Linux OS开放的bluetooth 协议栈主要包括IBM公司的BlueDrekar, Nokia公司的Affix, Axis公司的OpenBT和官方的协议栈BlueZ.
Bluetooth协议栈BlueZ分为两部分:内核代码和用户态程序及工具集。
内核代码:由BlueZ核心协议和驱动程序组 成;Bluetooth协议实现在内核源代码 /net/bluetooth中。包括hci,l2cap,hid,rfcomm,sco,SDP,BNEP等协议的实现。驱动程序放在 /driver/bluetooth中,包含Linux kernel对各种接口的Bluetooth device的驱动。例如:USB接口,串口等。
用户态程序及工具集:包括应用程序接口和BlueZ工具集。BlueZ提供函数库以及应用程序接口,便于程序员开发bluetooth应用程序。BlueZ utils是主要工具集,实现对bluetooth设备的初始化和控制。
四、几个术语:
HFP(Hands-free Profile)耳机模式:
让蓝牙设备可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要视蓝牙耳机及电话是否支持。
HSP(Handset Profile)耳机模式
用于支持蓝牙耳机与移动电话之间使用
HID() 人机接口设备配置文件
HID 配置文件定义了 Bluetooth HID(如键盘、指向设备、游戏设备及远程监视设备)使用的协议、程序及功能
拨号网络配置文件 (DUN)
DUN 提供了通过 Bluetooth 无线技术接入 Internet 和其它拨号服务的标准。最常见的情况是在手机上拨号,从膝上型计算机以无线方式接入 Internet。
个人局域网配置文件 (PAN)
PAN 描述了两个或更多个 Bluetooth 设备如何构成一个即时网络,以及如何使用同一机制通过网络接入点接入远程网络。配置文件角色包括网络接入点、组即时网络及个人局域网用户。
SDP( Service Discovery Protocol )服务发现协议
提供应用程序在蓝牙环境中发现哪个服务可用和决定那些可用服务的特征。
GAP(Generic Access Profile)通用访问应用
一般访问应用规范定义了蓝牙设备如何发现和建立与其他设备的安全(或不安全)连接。它处理一些一般模式的业务(如询问、命名和搜索)和一些安全性问题(如担保),同时还处理一些有关连接的业务(如链路建立、信道和连接建立)。GAP规定的是一些一般性的运行任务。因此,它具有强制性,并作为所有其它蓝牙应用规范的基础。
三、蓝牙协议栈
蓝牙技术规范的目的是使符合该规范的各种应用之间能够实现互操作。互操作的远端设备需要使用相同的协议栈,不同的应用需要不同的协议栈。但是,所有的应用都要使用蓝牙技术规范中的数据链路层和物理层。
完整的蓝牙协议栈如图1所示,不是任何应用都必须使用全部协议,而是可以只使用其中的一列或多列。图1显示了所有协议之间的相互关系,但这种关系在某些应用中是有变化的。
蓝牙协议体系中的协议
蓝牙协议体系中的协议按SIG的关注程度分为四层:
核心协议:BaseBand、LMP、L2CAP、SDP;
电缆替代协议:RFCOMM;
电话传送控制协议:TCS-Binary、AT命令集;
选用协议:PPP、UDP/TCP/IP、OBEX、WAP、vCard、vCal、IrMC、WAE。
除上述协议层外,规范还定义了主机控制器接口(HCI),它为基带控制器、连接管理器、硬件状态和控制寄存器提供命令接口。在图1中,HCI位于L2CAP的下层,但HCI也可位于L2CAP上层。
蓝牙核心协议由SIG制定的蓝牙专用协议组成。绝大部分蓝牙设备都需要核心协议(加上无线部分),而其他协议则根据应用的需要而定。总之,电缆替代协议、电话控制协议和被采用的协议在核心协议基础上构成了面向应用的协议。
1.蓝牙核心协议
基带和链路控制层确保微微网内各蓝牙设备单元之间由射频构成的物理连接。蓝牙的射频系统是一个跳频系统,其任一分组在指定时隙、指定频率上发送。它使用查询和分页进程同步不同设备间的发送频率和时钟,为基带数据分组提供了两种物理连接方式,即面向连接(SCO)和无连接(ACL),而且,在同一射频上可实现多路数据传送。ACL适用于数据分组,SCO适用于话音以及话音与数据的组合,所有的话音和数据分组都附有不同级别的前向纠错(FEC)或循环冗余校验(CRC),而且可进行加密。此外,对于不同数据类型(包括连接管理信息和控制信息)都分配一个特殊通道。
可使用各种用户模式在蓝牙设备间传送话音,面向连接的话音分组只需经过基带传输,而不到达L2CAP。话音模式在蓝牙系统内相对简单,只需开通话音连接就可传送话音。
连接管理协议(LMP)
该协议负责各蓝牙设备间连接的建立。它通过连接的发起、交换、核实,进行身份认证和加密,通过协商确定基带数据分组大小。它还控制无线设备的电源模式和工作周期,以及微微网内设备单元的连接状态。
逻辑链路控制和适配协议(L2CAP)
该协议是基带的上层协议,可以认为它与LMP并行工作,它们的区别在于,当业务数据不经过LMP时,L2CAP为上层提供服务。L2CAP向上层提供面向连接的和无连接的数据服务,它采用了多路技术、分割和重组技术、群提取技术。L2CAP允许高层协议以64k字节长度收发数据分组。虽然基带协议提供了SCO和ACL两种连接类型,但L2CAP只支持ACL。
&&& &服务发现协议(SDP)
发现服务在蓝牙技术框架中起着至关紧要的作用,它是所有用户模式的基础。使用SDP可以查询到设备信息和服务类型,从而在蓝牙设备间建立相应的连接。
2.电缆替代协议(RFCOMM)
RFCOMM是基于ETSI-07.10规范的串行线仿真协议。它在蓝牙基带协议上仿真RS-232控制和数据信号,为使用串行线传送机制的上层协议(如OBEX)提供服务。
3.电话控制协议
二元电话控制协议(TCS-Binary或TCSBIN)
该协议是面向比特的协议,它定义了蓝牙设备间建立语音和数据呼叫的控制信令,定义了处理蓝牙TCS设备群的移动管理进程。基于ITU TQ.931建议的TCSBinary被指定为蓝牙的二元电话控制协议规范。
AT命令集电话控制协议
&&&&&& SIG定义了控制多用户模式下移动电话和调制解调器的AT命令集,该AT命令集基于ITU TV.250建议和GSM07.07,它还可以用于传真业务。
4.选用协议
点对点协议(PPP)
在蓝牙技术中,PPP位于RFCOMM上层,完成点对点的连接。
TCP/UDP/IP
该协议是由互联网工程任务组制定,广泛应用于互联网通信的协议。在蓝牙设备中,使用这些协议是为了与互联网相连接的设备进行通信。
对象交换协议(OBEX)
&&&&&& IrOBEX(简写为OBEX)是由红外数据协会(IrDA)制定的会话层协议,它采用简单的和自发的方式交换目标。OBEX是一种类似于HTTP的协议,它假设传输层是可靠的,采用客户机/服务器模式,独立于传输机制和传输应用程序接口(API)。
电子名片交换格式(vCard)、电子日历及日程交换格式(vCal)都是开放性规范,它们都没有定义传输机制,而只是定义了数据传输格式。SIG采用vCard/vCal规范,是为了进一步促进个人信息交换。
无线应用协议(WAP)
该协议是由无线应用协议论坛制定的,它融合了各种广域无线网络技术,其目的是将互联网内容和电话传送的业务传送到数字蜂窝电话和其他无线终端上。
用户模式及协议栈
&&&&&& 1.文件传输模式
文件传输模式提供两终端间的数据通信功能,可传输后缀为.xls、.ppt、.wav、.jpg和.doc的文件(但并不限于这几种),以及完整的文件夹、目录或多媒体数据流等,提供远端文件夹浏览功能。文件传输协议栈如图2所示。
&&&&&& 2.因特网网桥模式
这种用户模式可通过手机或无线调制解调器向PC提供拨号入网和收发传真的功能,而不必与PC有物理上的连接。拨号上网需要两列协议栈(不包括SDP),如图3所示。AT命令集用来控制移动电话或调制解调器以及传送其他业务数据的协议栈。传真采用类似协议栈,但不使用PPP及基于PPP的其他网络协议,而由应用软件利用RFCOMM直接发送。
&&&&&& 3.局域网访问模式
该用户模式下,多功能数据终端(DTs)经局域网访问点(LAP)无线接入局域网,然后,DTs的操作与通过拨号方式接入局域网的设备的操作一样,其协议栈如图4所示。
&&&&&& 4.同步模式
同步用户模式提供设备到设备的个人资料管理(PIM)的同步更新功能,其典型应用如电话簿、日历、通知和记录等。它要求PC、蜂窝电话和个人数字助理(PDA)在传输和处理名片、日历及任务通知时,使用通用的协议和格式。其协议栈如图5所示,其中同步应用模块代表红外移动通信(IrMC)客户机或服务器。
&&&&&& 5.一机三用电话模式
手持电话机有三种使用方法:第一,接入公用电话网,作为普通电话使用;第二,作为不计费的内部电话使用;第三,作为蜂窝移动电话使用。无线电话和内部电话使用相同的协议栈;语音数据流直接与基带协议接口,不经过L2CAP层,如图6所示。
推荐:分类:
Android的原生应用分析
2268人阅读
举报 bluetooth 蓝牙 startScanning Android 4.2源码
接上篇打开蓝牙继
&&&&&& 6.头戴式设备模式
使用该模式,用户打电话时可自由移动。通过无线连接,头戴式设备通常作为蜂窝电话、无线电话或PC的音频输入输出设备。头戴式设备协议栈如图7所示,语音数据流不经过L2CAP层而直接接入基带协议层。头戴式设备必须能收发并处理AT命令。
完整的协议栈包括蓝牙专用协议(如连接管理协议LMP和逻辑链路控制应用协议L2CAP)以及非专用协议(如对象交换协议OBEX和用户数据报协议UDP)。设计协议和协议栈的主要原则是尽可能利用现有的各种高层协议,保证现有协议与蓝牙技术的融合以及各种应用之间的互操作,充分利用兼容蓝牙技术规范的软硬件系统。蓝牙技术规范的开放性保证了设备制造商可以自由地选用其专用协议或习惯使用的公共协议,在蓝牙技术规范基础上开发新的应用。
蓝牙系统分为四个层次,内核层、BlueZ库、BlueTooth的适配库、BlueTooth的JNI部分、Java框架层、应用层。下面先来分析Android的蓝牙协议栈。
Android的蓝牙协议栈采用BlueZ来实现,BlueZ分为两部分:内核代码和用户态程序及工具集。
内核代码主要由BlueZ核心协议和驱动程序组成;蓝牙协议实现在内核源代码net/bluetooth中,驱动程序位于内核源代码目录 driver/bluetooth中。用户态程序及工具集主要包括应用程序接口和BlueZ工具集,位于Android源代码目录externel /bluetooth(注:Android版本不一样,有的在externel/bluez目录下)中。
1、蓝牙协议栈
蓝牙协议栈的体系结构由底层硬件模块、中间协议层和高端应用层三部分组成。
一、底层硬件模块
链路管理协议(Link ManagerProtocol,LMP);
基带(Base Band,BB);
射频(Radio Frequency,RF)。
射频(RF)通过2.4GHz的ISM频段实现数据流的过滤和传输。
基带(BB)提供两种不同的物理链路,即同步面向连接链路(Synchronous Connection Oriented,SCO)和异步无连接链路(AsynchronousConnection Less,ACL),负责跳频和蓝牙数据,及信息帧的传输,且对所有类型的数据包提供不同层次的前向纠错码(Frequency Error Correction,FEC)或循环冗余度差错校验(CyclicRedundancy Check,CRC)。
链路管理协议(LMP)负责两个或多个设备链路的建立和拆除,及链路的安全和控制,如鉴权和加密、控制和协商基带包的大小等,它为上层软件模块提供了不同的访问入口。
主机控制器接口(HostController Interface,HCI)是蓝牙协议中软硬件之间的接口,提供了一个调用下层BB、LMP、状态和控制寄存器等硬件的统一命令,上下两个模块接口之间的消息和数据的传递必须通过HCI的解释才能进行。
二、中间协议层
逻辑链路控制和适配协议(LogicalLink Control and Adaptation Protocol,L2CAP);
服务发现协议(ServiceDiscovery Protocol,SDP);
串口仿真协议(或称线缆替换协议RFCOMM);
二进制电话控制协议(TelephonyControlprotocol Spectocol,TCS)。
L2CAP位于基带(BB)之上,向上层提供面向连接的和无连接的数据服务,它主要完成数据的拆装、服务质量控制、协议的复用、分组的分割和重组,及组提取等功能。
SDP是一个基于客户/服务器结构的协议,它工作在L2CAP层之上,为上层应用程序提供一种机制来发现可用的服务及其属性,服务的属性包括服务的类型及该服务所需的机制或协议信息。
RFCOMM是一个仿真有线链路的无线数据仿真协议,符合ETSI标准的TS07.10串口仿真协议,它在蓝牙基带上仿真RS-232的控制和数据信号,为原先使用串行连接的上层业务提供传送能力。
TCS定义了用于蓝牙设备之间建立语音和数据呼叫的控制信令(Call Control Signalling),并负责处理蓝牙设备组的移动管理过程。
三、高端应用层
点对点协议(Point-to-PointProtocol,PPP);
传输控制协议/网络层协议(TCP/IP);
用户数据包协议(UserDatagram Protocol,UDP);
对象交换协议(ObjectExchang Protocol,OBEX);
无线应用协议(WirelessApplication Protocol,WAP);
无线应用环境(WirelessApplication Environment,WAE);
PPP定义了串行点对点链路应当如何传输因特网协议数据,主要用于LAN接入、拨号网络及传真等应用规范。
TCP/IP、UDP定义了因特网与网络相关的通信及其他类型计算机设备和外围设备之间的通信。
OBEX支持设备间的数据交换,采用客户/服务器模式提供与HTTP(超文本传输协议)相同的基本功能。可用于交换的电子商务卡、个人日程表、消息和便条等格式。
WAP用于在数字蜂窝电话和其他小型无线设备上实现因特网业务,支持移动电话浏览网页、收取电子邮件和其他基于因特网的协议。
WAE提供用于WAP电话和个人数字助理(PersonalDigital Assistant,PDA)所需的各种应用软件。
2、android与蓝牙协议栈的关系
蓝牙系统的核心是BlueZ,因此JNI和上层都围绕跟BlueZ的沟通进行。JNI和android应用层,跟BlueZ沟通的主要手段是D- BUS,这是一套被广泛采用的IPC通信机制,跟Android框架使用的Binder类似。BlueZ以D-BUS为基础,给其他部分提供主要接口。
四、蓝牙各种版本区别
& 蓝牙目前暂时共有四个版本&V1.1/1.2/2.0/2.1。以通讯距离来在不同版本可再分为&Class A(1)/Class B(2)。
&&&&&1)蓝牙目前暂时共有四个版本&V1.1/1.2/2.0/2.1。
&&  2)以通讯距离来在不同版本可再分为&Class A(1)/Class B(2)。
&&  3)版本的区别
&&&&&&&& 1.1为最早期版本,传输率约在748~810kpbs8,因是早期设计,容易受到同频率之产品所干扰下影响通讯质量。
&&  1.2&同样是只有&748~810kpbs&的传输率,但在加上了(改善&Software)抗干扰跳频功能。(太深入之技术理论不再详述!)。
&&&  &&4)通讯距离版本
&&  a)Class A&是用在大功率/远距离的蓝芽产品上,但因成本高和耗电量大,不适合作个人通讯产品之用(手机/蓝牙耳机/蓝牙&Dongle&等等),故多用在部份商业特殊用途上,通讯距离大约在&80~100M&距离之间。
&&  b)Class B&是目前最流行的制式,通讯距离大约在&8~30M&之间,视乎产品的设计而定,多用于手机内/蓝牙耳机/蓝牙&Dongle&的个人通讯产品上,耗电量和体积较细,方便携带。
&&  5)无论&1.1/1.2&版本的蓝牙产品,本身基本是可以支持&Stereo&音效的传输要求,但只能够作(单工)方式工作,加上音带频率响应不太足够,并未算是最好之&Stereo&传输工具。
&&  6)版本&2.0&是&1.2&的改良提升版,传输率约在&1.8Mpbs~2.1Mpbs,可以有(双工)的工作方式。即一面作语音通讯,同时亦可以传输档案/高质素图片,台湾有部份蓝牙&Dongle&已经有在市面发售,但在手机内有支持蓝牙&2.0&版本则是很少。蓝牙耳机能够真正使用的亦不多,部份蓝牙产品自称是&2.0&版本,但仍然要利用外加配件才能达到。&2.0&版本当然也支持&Stereo&运作。
&&  7)稍后蓝牙&2.0&版本的芯片,是有机会加入了&Stereo&译码芯片,则连&A2DP(Advanced Audio Distribution Profile)也可以不需要了。 &
蓝牙,是一种支持设备短距离通信(一般10m内)的技术。能在包括移动电话、PDA、无线耳机、、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而变得更加迅速高效,为拓宽道路。蓝牙采用结构以及快跳频和短包技术,支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(即工业、科学、医学)。其数据速率为1Mbps。采用传输方案实现。
低耗电蓝牙相关规范
   技术规范 典型的蓝牙 低耗电的蓝牙 无线电频率 2.4 GHz 2.4 GHz 距离 10米 10米 空中数据速率 1-3 Mb/s 1 Mb/s 应用吞吐量 0.7-2.1 Mb/s 0.2 Mb/s Nodes/Active slaves 7-16,777,184 无限 安全 64/128-bit及用户自定义的应用层 128-bitAES及用户自定义的应用层 鲁棒性 自动适应快速跳频,FEC,快速 ACK 自动适应快速跳频 延迟(非连接状态)
发送数据的总时间 100 m/s &6 m/s 政府监管 全球 全球 认证机构 蓝牙技术联盟(Bluetooth SIG) 蓝牙技术联盟(Bluetooth SIG) 语音能力 有 没有 网络拓扑 分散网 Star-bus 耗电量 1(作为参考) 0.01至0.5(视符使用情况) Peak current consumption &30 mA &15 mA (最高运行时为15 mA) Service discovery 有 有 简介概念 有 有 主要用途 手机,游戏机,耳机,stereo audio streaming,&
汽车和PC等 手机,游戏机,PC,表,体育和健身,医疗保健,&
汽车,家用电子,自动化和工业等
虽然制造商对各种设备实施的特定因设备而异,但首次连接两个设备的一些基本步骤是相同的。用户应保持在安全环境下进行配对。
  设备充电
  如果设备是新的 Bluetooth 设备,确保在进行连接或打开前已充电。尤其是 Bluetooth 耳机,使用前必须充电。
  设备开机
  打开需要配对设备的电源。对于某些设备,如 Bluetooth 无线耳机,设备开机的同时即启动配对过程。
  开启 Bluetooth 功能
  在您收到设备时,该设备的 Bluetooth 功能可能已经开启,也可能尚未开启。对于多数计算机,用户需要从控制面板或系统首选项中开启 Bluetooth 射频功能。
  将设备设置为可见
  作为,某些设备可将 Bluetooth 功能设置为关闭、隐藏或可见。尝试连接设备时,用户应将设备设置为可见,这样才能为彼此所发现。完成设备配对后,如果用户担心设备会被其它设备发现,可以将设备设置为隐藏。
  将两个设备设为连接模式
  两个设备都充好电后,打开设备电源并开启 Bluetooth 功能,每个设备都需要初始化通信会话。通常,在两个设备之间连接时,一个设备会作为“”,而另一个设备则作为“访客”。主机设备是具有用户界面的设备,多数连接设置都将从此进行。一个设备可以是另一个设备的主机,也可以作为其它设备的访客。例如,手机与无线耳机配对时,该手机就是主机。但是,手机与膝上型计算机配对时,膝上型计算机就是主机。
  输入密码
  设备彼此发现对方后,用户将被要求在一个或两个设备中输入密码。某些情况下,如连接无线耳机时,密码是由制造商为耳机指定的固定密码。此时,用户需要在主机设备中输入此指定的密码。用户可在用户手册中找到此密码。在其它情况下,用户可输入他/她自己的密码。在这些情况下,用户将在两个设备中输入密码各一次。强烈建议用户为一次配对过程设定 8 位字母数字字符密码。输入密码后,设备将彼此验证并完成建立信任连接。
  删除或断开与信任设备的连接
  用户应何时删除或断开与信任设备的连接?如果您的其中一个 Bluetooth 设备丢失或被偷,您应取消以前与该设备配对的所有设备的配对设置。
  如何取消配对或删除信任设备?对于手机或计算机之类设备,用户应进入设备的连接设置,然后查找信任设备列表。用户随后便能选择添加新设备或删除信任设备。突出显示需要删除的设备,然后按删除按钮。键盘或鼠标之类设备只有一个按钮或作为用户接口,因此每次只能连接到一个设备。要删除其原来的信任设备,只需将鼠标或键盘连接到新设备。
Android的原生应用分析
4660人阅读
举报 bluetooth 4.2.2源码 android 目录()[+]
前段时间在 网上看了
一、Android Bluetooth现状 在android官网可以了解到android4.2新增了部分新功能,但是对于BT熟悉的人或许开始头疼了,那就是Android4.2引入了一个新的蓝牙协议栈针。谷歌和Broadcom之间的合作
相关阅读排行
相关内容推荐
请激活账号
为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。
您的注册邮箱:
如果您没有收到激活邮件,请注意检查垃圾箱。}

我要回帖

更多关于 stm32 开源蓝牙协议栈 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信