关于蓝牙的安全机制

时间:2019-05-14 03:44:09下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《关于蓝牙的安全机制》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《关于蓝牙的安全机制》。

第一篇:关于蓝牙的安全机制

关于蓝牙的安全机制

蓝牙技术提供短距离的对等通信,它在应用层和链路层上都采取了保密措施以保证通信的安全性,所有蓝牙设备都采用相同的认证和加密方式。在链路层,使用4个参数来加强通信的安全性,即蓝牙设备地址BD_ADDR、认证私钥、加密私钥和随机码RAND。

蓝牙设备地址是一个48位的IEEE地址,它唯一地识别蓝牙设备,对所有蓝牙设备都是公开的;认证私钥在设备初始化期间生成,其长度为128比特;加密私钥通常在认证期间由认证私钥生成,其长度根据算法要求选择8~128比特之间的数(8的整数倍),对于目前的绝大多数应用,采用64比特的加密私钥就可保证其安全性;随机码由蓝牙设备的伪随机过程产生,其长度为128比特。

一、随机码生成

每个蓝牙设备都有一个伪随机码发生器,它产生的随机数可作为认证私钥和加密私钥。在蓝牙技术中,仅要求随机码是不重复的和随机产生的。“不重复”是指在认证私钥生存期间,该随机码重复的可能性极小,如日期/时间戳;“随机产生”是指在随机码产生前不可能预测码字的实际值。

二、密钥管理

加密私钥的长度是由厂商预先设定的,用户不能更改。为防止用户使用不允许的密钥长度,蓝牙基带处理器不接受高层软件提供的加密私钥。

若想改变连接密钥,必须按基带规范的步骤进行,其具体步骤取决于连接密钥类型。

1.密钥类型

连接密钥是一个128比特的随机数,它由两个或多个成员共享,是成员间进行安全事务的基础,它本身用于认证过程,同时也作为生成加密私钥的参数。

连接密钥可以是半永久的或临时的。半永久连接密钥保存在非易失性存储器中,即使当前通话结束后也可使用,因此,它可作为数个并发连接的蓝牙设备间的认证码。临时连接密钥仅用于当前通话。在点对多点的通信中,当主设备发送广播信息时,将采用一个公共密钥临时替换各从设备当前的连接密钥。为适应各种应用,定义如下密钥类型:

组合密钥KAB:设备密钥KA;临时密钥Kmaster;初始密钥Kinit。

此外,Kc表示加密私钥。任何时候执行连接管理器(LM)命令进行加密时,加密私钥就会自动改变。

对蓝牙设备而言,KAB和KA在功能上没有区别,只是生成方法不同而已。KA由设备自身生成,且保持不变;KAB由设备A和设备B提供的信息共同生成,只要有两个设备产生一个新的连接,就会生成一个KAB。

究竟采用KA或KAB,取决于具体应用。对于存储容量较小的蓝牙设备或者对于处于大用户群中的设备,适合采用KA,此时只需存储单个密钥。对于要求较高安全级别的应用,适宜采用KAB,但要求设备拥有较大的存储空间。

Kmaster仅用于当前通话,它可以临时替换连接密钥。

Kinit在初始化期间用作连接密钥,以保证初始化参数的安全传送,它由一个随机数、PIN码的低8位及BD_ADDR生成。

PIN码可以是蓝牙设备提供的一个固定码,也可以由用户任意指定,但两个设备中的PIN码必须匹配。在两个设备中采用用户指定的PIN码比采用设备自身提供的PIN码更安全;即使采用固定的PIN码方式,也应该允许能够改变PIN码,以防止获得该PIN码的用户重新初始化设备。如果找不到可用的PIN码,则使用缺省值0。短PIN码可以满足许多具体应用的安全性要求,但存在不确定的非安全因素;过长的PIN码不利于交换,需要应用层软件的支持。因而,在实际应用中,常采用短的数据串作为PIN码,其长度一般不超过16字节。

2.密钥生成及初始化

蓝牙设备必须生成各种连接密钥,以便认证例程使用。连接密钥有保密性要求,因而不能象设备地址那样公开查询。进行认证和加密的两个设备在初始化阶段单独地交换密钥,初始化过程包括以下5个部分:生成kinit;认证;生成连接密钥;交换连接密钥;各自生成加密私钥。

初始化后,设备间可继续通信,也可断开连接。若想对信息加密,则利用当前连接密钥生成的加密私钥,采用E0算法(此文中提到的E0、E

21、E22和E3等算法,均作为名词使用,而不给出具体的公式)进行加密。在两个设备间建立新的连接时,则使用公共连接密钥代替Kinit进行认证。在进行一次新的加密时,将由特定的连接密钥生成一个新的加密私钥。如果没有连接密钥有效,LM将自动开始一个初始化过程。

(1)初始密钥Kinit生成

初始化期间使用的连接密钥称之为Kinit,其长度为128比特,由E22算法生成,算法的输入参数为申请连接的设备地址BD_ADDR、PIN码、PIN码的长度及随机数IN_RAND。Kinit用于连接密钥生成期间的密钥交换和未登记连接密钥的两设备间的认证,它在连接密钥交换完成后废弃。

Kinit生成后,PIN码将会随着申请设备的BD_ADDR而增长。算法要求PIN码的长度最大不超过16字节,以便确保只有特定的设备才能连接上。非法用户需要试验大量的PIN码,而且每次都必须使用不同的BD_ADDR,否则进行下一次实验需等待的时间间隔将按指数增长,这样可以减小入侵者对合法用户的威胁。

(2)认证

如果两个设备未曾联系过,它们将把Kinit作为连接密钥。在每次认证期间,都会产生一个新的认证随机数AU_RANDA。相互认证时,首先进行单向认证,再进行反方向认证。

当认证成功时,就会计算出一个辅助参数--认证加密偏移量ACO。在相互认证时,一般保留第二次认证时计算出的ACO,如果认证事件在两个设备中同时发生,则两个设备都将使用主设备产生的ACO。

(3)设备密钥KA的生成

KA在蓝牙设备首次工作时由E21算法生成并保存在非易失性存储器中,以后基本不变。初始化后,若KA发生了变化,则此前已初始化的设备保存的连接密钥将是错误的。初始化期间,应用程序一般选择存储能力较小的设备的KA作为连接密钥。

(4)组合密钥KAB的生成

组合密钥在初始化期间由设备A和B分别产生的随机数合成。首先,设备A、B分别产生随机数LK_RANDAL和LK_RANDB;然后,设备A、B采用如下算法再分别生成随机数LK_KA和LK_KB,即: LK_KA = E21 LK_KB = E21LK_RANDA,BD_ADDRA,EQ21LK_RANDA,BD_ADDRB ;

EQ2接着,设备A、B分别计算CA=LK_RANDA K和CB=LK_RANDB K(在初始化时,K=Kinit)并交换计算结果;之后,设备A、B分别计算LK_KB(EQQ22)和LK_KA(EQ21);最后,设备A、B通过异或运算分别生成128比特的组合密钥KAB和KBA,两者是相等的。

(5)加密私钥Kc的生成

加密私钥Kc由当前的连接密钥、96比特的加密偏移量(COF)、128比特的随机数通过E3算法生成。其中:

COF=BD_ADDR串联BD_ADDR链路密钥为Kmaster时 ACO其它(EQ23)

每当LM激活加密进程时,设备都将采用E3算法自动改变加密私钥Kc。

(6)点对多点通信

使用加密方式进行点对多点的通信时,主设备可以使用不同的加密私钥与每一个从设备进行通信。如果某个应用要求从设备接收广播信息,从设备却是单独收发信息的,将造成网络通信容量的减小。另外,蓝牙从设备不支持两个或多个密钥的实时交换,因而在蓝牙技术中,主设备通知各从设备采用一个公用密钥Kmaster接收加密的广播信息。对于多数应用来说,此密钥只具有临时意义。

主设备在确认所有从设备都能成功接收后,就发送一条指令,让各从设备用Kmaster替换它们当前的连接密钥。进行加密之前,主设备将产生并分发一个公共的随机数EN_RAND给所有从设备,从设备就使用Kmaster和EN_RAND产生新的加密私钥。

当所有从设备都得到了必要的数据后,主设备将使用新的加密私钥在网络中进行通信联系。显然,拥有Kmaster的从设备不仅能获得发送给自己的信息,还能获取所有加密的广播信息。如有必要,主设备可令所有从设备同时恢复使用以前的连接密钥。

(7)连接密钥的修改

在某些情况下,需要修改基于设备密钥的连接密钥。设备密钥在设备首次使用时创建,由于多个设备可能共享作为连接密钥的同一个设备密钥,因此,一旦创建几乎不再更改,否则将重新初始化所有试图连接的设备。在某些应用中这样做是必要的,如拒绝以前访问过的设备接入。

如果密钥的更改涉及到组合密钥,只需将当前的组合密钥作为连接密钥。这一更改密钥的过程可以在认证和加密开始后的任何时侯进行,其实组合密钥可以在每次连接建立时更改,这还有利于提高系统的安全性。

(8)Kmaster的生成

创建Kmaster时,需要如下步骤.。

1)主设备采用E22算法,将128比特的随机数RAND1、RAND2作为输入参数,生成新的连接密钥Kmaster= E22(RAND1,RAND2,16)

2)主设备将另一个随机数RAND发送给从设备,用当前连接密钥K和RAND作为E22算法的输入参数,然后主、从设备都计算出一个128比特掩码OVL=E22(K,RAND,16)3)主设备将掩码与当前连接密钥进行异或运算,并将运算结果C=OVL从设备重新计算Kmaster=OVL

Kmaster发送给从设备,4)为确保交换成功,主、从设备将使用新的连接密钥进行认证,所有接收新的连接密钥的从设备都将重复此认证过程,由于在主设备恢复以前的连接密钥时还需要当前的ACO计算密文密钥,因此从相关身分认证过程得到的ACO值不能替代当前ACO 5)各从设备重新计算新的加密私钥Kc=E3(Kmaster

EN_RAND,COF)

三、加密

采用加密方式可以保护用户信息,但接入码和报头不加密。在蓝牙技术中,用序列加密算法E0加密用户信息。

序列加密算法E0由三部分组成,即载荷密钥生成、密钥比特流生成、加/解密运算。载荷密钥发生器按一定顺序组合输入比特流,并将它们移入密钥比特流发生器的线性反馈移位寄存器(LFSRs);密钥比特流发生器是序列加密体系的核心部分,它采用Massey和Rueppel提出的组合序列密码发生器,该方法已通过全面论证,其性能优异。尽管组合序列密码发生器在抗相干攻击方面存在缺陷,但采用频繁同步的方法可瓦解相干攻击。

1.加密私钥长度协商

每一个蓝牙设备都有参数Lmax,它定义了设备所允许的最大密钥长度,1≤Lmax≤16字节;参数Lmin则定义了某个特定应用中可接受的最小密钥长度。在产生加密私钥前,所有相关设备必须协商密钥的实际长度,其协商过程如下: 1)主设备发送一个建议值Lm

sug给从设备,初始时,建议值设为Lm

max,如果Ls

min≤Lmsug且从设备支持建议长度,则从设备确认该长度并将它作为连接中密钥长度。2)若两个条件都不满足,则从设备发送一个新的建议值Ls同的测试。

3=重复上述过程,直到主、从设备达成协议或一方放弃时结束。若协商失败,就不能进行连接加密。

由应用程序本身决定是否接受建议值,就不一定能建立起安全连接,但这是十分必要的防范措施,它可以防止非法设备使用短密钥入侵。

2.加密方式

sug<Lm

sug给主设备,主设备进行相 如果从设备拥有半永久连接密钥,即组合密钥或设备密钥,则它只能在指定的时隙收发加密信息。

如果从设备接收到了Kmaster主密钥,将有三种可能的加密组合方式。

主设备通过发送一条LM命令可以让从设备恢复以前的连接密钥,不管从设备处于何种状态,它们都将返回到未加密方式。

3.加密过程

序列加密算法的加密过程就是将数据流与密钥比特流进行异或运算。对每一分组的有效载荷的加密是单独进行的,它发生在CRC校验之后,FEC编码之前。

加密算法E0的输入参数为主设备地址、时钟CLK26-1和Kc。时钟CLK26-1按时隙递增,在任两次发送中,CLK26-1至少有一位是不同的,因此在每次初始化后都将产生新的密钥流。对占用多个时隙的分组来说,CLK26-1为分组所占的第一个时隙的时钟值。

算法E0产生的密钥流Kcipher与数据流异或产生密文。由于加密是对称的,加/解密使用完全相同的密钥。

4.加密算法

加密机采用了四个线性反馈移位寄存器(LFSR),依次为LFSR1、LFSR2、LFSR3、LFSR4,其长度分别为25、31、33、39比特。

加密机把四个LFSRs的输出结果输入到一个有限状态机中,经有限状态机的组合运算输出密钥流序列,若在初始化阶段则输出一个随机的初始化值。加密算法将使用Kc、BD_ADDR、主时钟CLK26-1及RAND。

5.LFSR初始化

加密机的LFSRs的初始值源于加密算法的四个输入参数,即Kc、RAND,BD_ADDR及主时钟CLK26-1,其过程较为复杂,本文不作介绍。

6.密钥流序列

当初始化完成后,有限状态机的输出就是加/解密使用的密钥流序列。

四、认证

在蓝牙技术中,认证采用口令-应答方式。验证方要求申请者鉴别随机数AU_RAND及认证码E1并返回计算结果SRES,若双方的计算结果相等则认证成功。

在蓝牙技术中,不要求验证方一定是主设备,而是由应用本身指明需要认证的设备,且在某些应用中只须单向认证。在对等通信中,采用相互认证方式,由LM控制认证的方向,相互认证。当设备A成功认证设备B后,设备B将AU_RANDB(不同于AU_RANDA)发送给设备A,设备B、A使用新的AU_RANDB、AU_RANDA和连接密钥分别计算出SRES和SRES',若两者相等,则认证成功,并保留ACO值。

若某次认证失败,则必须等待一定的时间间隔才能进行再次认证。如果使用同一BD_ADDR重复认证,则等待的时间间隔将按指数方式增长到最大值;若在一段时间内,所有认证都是成功的,则两次认证间的时间间隔将按指数方式减小到最小值,此方式可以阻止试图使用不同的密钥以重复认证方式登录的入侵者。蓝牙设备保留了每一个已接入设备的认证时间间隔表,以减少遭到攻击的可能性。

总之,蓝牙安全机制的目的在于提供适当级别的安全保护。如果用户有更高级别的保密要求,可采用更有效的传输层和应用层安全机制。

第二篇:蓝牙通信原理

蓝牙耳机的工作原理:

关于音频流的蓝牙传输可以通过两个方式:

1)通过PCM接口来传送

2)通过模拟UART来传送

下面分别来讲述:

1)通过PCM接口来传送

通过音频播放器(eg: Media Player)来打开音频文件,调用Audio驱动,音频文件通过解码后,由PCM输出到Host端蓝牙模块的PCM输入端,接着,经过蓝牙模块的处理后,由RF无线模块发送给Client 端蓝牙设备。

Client 端蓝牙设备经由无线接收模块后,滤波,稳压,经微处理芯片处理后,直接由Speaker播放。

2)通过模拟UART来传送

通过设置注册表【HKEY_LOCAL_MACHINEServicesBTAGSVC】IsEnabled =1 使得系统引导时自动加载语音网关(AG)服务。

首先,通过手动配置建立Host端蓝牙设备与Client端蓝牙设备ACL链接(面向无连接的异步链路),接着在Applicaiton或Audio Driver中调用

IOCTL_AG_OPEN_AUDIO,重新建立Host端蓝牙设备与Client端蓝牙设备SCO链接(面向连接的同步链路),接着AG自动发送

waveOutMessage((HWAVEOUT)i, WODM_BT_SCO_AUDIO_CONTROL, 0, TRUE);从而建立了Audio至蓝牙芯片之间的通道,也即,实现了音频流到蓝牙模块的传送。

然后,经由主机端蓝牙模块将音频流打包经由RF模块发送出去。

客户端蓝牙耳机接收到无线音频包后,滤波,稳压,经微处理芯片处理后,由PCM传送给音频编解码器芯片,最后,由Speaker播放。

第三篇:蓝牙工程师岗位职责

1.蓝牙产品原理图,PCB图设计(新产品设计)。

2.样机调试。

3.工程文件的拟定。

4.产品试产、量产的跟进及问题分析处理。

第四篇:HC05蓝牙模块学习心得

第一步:打开蓝牙测试软件

进入软件界面

注:配置蓝牙模块时,模块的TX引脚连接

模块的RX引脚,单片机TX引脚 连接

单片机RX引脚

操作界面步骤如图所示

再对右侧栏中需要更改的数据进行修改,修改完毕后按住模块上的按键不放,并点击

配置主机时,一般都会配置绑定地址,绑定的地址是从机的

当led连续快闪两下,灭一秒,再快闪两下,则说明已配对连接

注:当要实现蓝牙配对连接,发送接收数据时,模块的TX引脚连接

单片机RX引脚 模块的RX引脚

发送AT指令时,记得要一直按住按键,如果还没响应,就重启软件,重新给模块上电,必要时进入AT模式(上电前,先按着按键,再上电,进入AT模式后,放开按键即可)

连接 单片机TX引脚

第五篇:蓝牙知识小结

蓝牙协议知识总结

蓝牙设备 和 主机进行连接和数据通信的 流程如下:外部设备发出广告(带有UUID信息等其他信息); 主机(集中器设备)收到广告信息,进而发送扫描请求;表示我扫描到你的信息; 3 外部设备收到扫描请求后,返回扫描回应,表示我知道你扫描到我的信息; 4 主机进而发送连接请求信息,表示主机要跟设备建立无线连接; 5 设备收到连接请求后,发送相应请求回应;表示已经建立连接;

数据读写流程如下进一步(在建立连接的基础上): 主机发送主服务UUID(设备的广告UUID)给设备;

服务发现 7 设备收到后回应服务信息; 主机发送特性UUID;

特性发现 9 设备收到后回应特性值句柄;(类似于存储设备的地址)主机发送特性值句柄;

读信息 11 设备收到后回应特性值; 主机发送特性值句柄和要写入值;

写信息 13 设备回应写入成功响应;

在睡眠状态,耗电只有1微安(uA),而在连接事件中最高的是10几个毫安

连接建立之后,再进行安全密钥的交换配对,进而进行数据的读写;

主机和从机绑定之后,断开连接后,可以快速的建立连接并进行加密读写,而不需要再次配对; 特点 低功耗蓝牙速度只有100bps,传统蓝牙有3Mbps 2 低功耗蓝牙不需要IOS 的MFI 认证,传统蓝牙必须; 3 低功耗蓝牙能纽扣电池能用1年多,传统蓝牙不行;

频道:

2.4G – 2.48G 总共40个频段,每2M 一个频段;

其中 37(2.40G),38(2.426G),39(2.48G)为 3个广播频道;这3个频道避开了wifi 常用的频道,与wifi可以共存; 其他37个为连接频道;

1、BLE中主从机建立连接,到配对和绑定的过程如下图。

正如上图所示,最简单一次蓝牙通信需要以上相关步骤,包括discovery device,connect,pairing,bond等4个主要部分。

1)广播:广播包可以包含广播数据,广播包可以无指定或者对指定的设备发送。可以声明该器件是可连接的还是不可连接的。在一次广播中,广播包可以在三个广播通道中同时发送。

广播类型 :1 未指定可连接 2 指定可连接 3 未指定 不可见 4 未指定不可连接 #define GAP_ADTYPE_ADV_IND

0x00 //!< Connectable undirected advertisement #define GAP_ADTYPE_ADV_DIRECT_IND 0x01 //!< Connectable directed advertisement #define GAP_ADTYPE_ADV_DISCOVER_IND

0x02 //!< Discoverable undirected advertisement #define GAP_ADTYPE_ADV_NONCONN_IND

0x03 //!< Non-Connectable undirected advertisement #define GAP_ADTYPE_SCAN_RSP_IND

0x04 //!< Only used in gapDeviceInfoEvent_t 在peripheral.c中

GAPRole_Init(taskID++);进行了初始化设置

还有有以下函数bStatus_t GAPRole_SetParameter(uint16 param, uint8 len, void *pValue)GAPRole_GetParameter(…..)可以调用进行设置。2)scanning 1)被动扫描: 扫描者监听广播频道的广播包,收到后将其上传到host层

2)主动扫描:扫描者监听广播频道的广播包,当收到广播包后扫描者发送一个scan Request包,广播设备回应一个scan reponse包

3)Connection 在扫描设备扫描到一个可连接的广播消息后,扫描设备可以通过发送 connection reequst 包给广播设备从而成为连接的发起者

Connection resqust 包含从机链路层一系列的参数,这些参数声明连接时的通道及时序要求。建立连接

GAPCentralRole_EstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,DEFAULT_LINK_WHITE_LIST,addrType, peerAddr);广播设备接收了连接请求,就进入了连接状态,发起者成了主机,广播设备成了从机。两个已连接的设备的所有通信发生在连接事件中,连接事件周期性的发生,周期由连接间隔参数决定。

连接间隔:使用调频的间隔;两个连接事件之间的时间间隔,蓝牙传数据是在一个频段发送数据后,然后跳到另一个频段再传数据,从一个频道另一个频段的时间间隔就是连接间隔;即使没有数据发送,也要调频切换测试包是否连接断开;所以,连接间隔是定时的存在;可以认为是一个固定的时序;每隔一段时间就自动调到另一个频道的去建立连接;这个时间中,是很少功耗的,基本没有;

单位是1.25毫秒;范围是 6----3200个单位;也就是1.25ms到4s的范围 不同的应用 时间间隔不一样,时间间隔长,功耗就低,传输数据慢; 时间间隔短,功耗就高,传输数据就快。

从机延时: 从机如果没有数据发送,可以跳过连接间隔,不用频繁的定时去建立连接,从而过一段较长时间再去建立连接;这个时间就是从机延时时间;从而功耗降低很多;单位是和连接间隔一样;范围是 0---499

管理超时

超过这个时间,还没有建立连接,则认为是连接丢失,断开。回到未连接状态;

单位是10ms,范围是 10(100ms)-----3200(32s)。超时值必须比有效连接间隔大;有效连接间隔= 连接间隔×(1+从机延时)

如果从机不想使用当前的连接参数,可以向主机发送连接更新请求,从机设备可以在任何时候发送连接更新请求,使得从机可以动态的调整连接参数。

GAPCentralRole_UpdateLink(simpleBLEConnHandle,DEFAULT_UPDATE_MIN_CONN_INTERVAL,DEFAULT_UPDATE_MAX_CONN_INTERVAL,DEFAULT_UPDATE_SLAVE_LATENCY,DEFAULT_UPDATE_CONN_TIMEOUT);无论主机还是从机,都可以无条件的终止当前连接,一方请求终止,另一方必须在断开连接状态之前响应。

连接还可以由超时而终止。超时时间小于32s,大于有效连接间隔(连接间隔×(1+从机延时))

终止连接函数:

GAPCentralRole_TerminateLink(simpleBLEConnHandle);主机和从机保存各自的超时计时器,每次收到数据包就清零,一旦达到超时数值,就认为连接已经丢失就会断开连接。

连接超时判断,终止连接在程序中还没找到。

2.BLE中的GAP和GATT GAP个人认为就是监控上图中的交互状态,比如从广播变成连接,到配对等。

GATT通俗理解为用于主从机之间的客户端和服务器端的数据交互,以Attribute Table来体现。

GAP Role Profile:在GAP所处的4个角色:广播Advertise,主机central,从机Peripheral,观察者Observer。GATT Attribute:通用属性配置文件。

GAP作为Peripheral Role需要设置的核心参数如下 GAPROLE_ADVERT_ENABLED:广播使能。GAPROLE_ADVERT_DATA:广播时的参数,GAPROLE_SCAN_RSP_DATA:从机扫描响应,返回的数据包

GAPROLE_MIN_CONN_INTERVAL:处于连接状态后的设备,都会有个hop,一段时间内进行数据交互,以保证两者是连接的。当前后两次交互时,需要等待的最小间隔时间 GAPROLE_MAX_CONN_INTERVAL:...需要等待的最大间隔时间

GAPROLE_SLAVE_LATENCY:处于连接后,从机可以做出不响应连接请求的间隔数目,即跳过n个交互的连接。

GAPROLE_TIMEOUT_MULTIPLIER:从上次成功连接到这次连接成功的最大允许延时。如果规定时间内未成功则认为本次连接失败,丢弃。该值必须比有效连接的间隔大。GAPROLE_PARAM_UPDATE_ENABLE:请求主机更新参数,主机可以接受也可以拒绝。.GATT Server的相关设置函数。

// Initialize GATT attributes GGS_AddService(GATT_ALL_SERVICES);// GAP Service GATTServApp_AddService(GATT_ALL_SERVICES);// GATT attributes DevInfo_AddService();// Device Information Service SimpleProfile_AddService(GATT_ALL_SERVICES);// Simple GATT Profile 通常一个GATT中GAP server和GATT server是必须强制存在的,还有设备信息服务以及自己设计的profile server.SimpleProfile_AddService就是添加自己设计的profile server 在SimpleProfile_AddService函数中调用了如下函数

GATTServApp_RegisterService(simpleProfileAttrTbl, GATT_NUM_ATTRS(simpleProfileAttrTbl),&simpleProfileCBs);

} simpleProfileCBs 的函数定义如下:

CONST gattServiceCBs_t simpleProfileCBs = { simpleProfile_ReadAttrCB,// Read callback function pointer

simpleProfile_WriteAttrCB, // Write callback function pointer

NULL

// Authorization callback function pointer };实际上就是底层读写数据的函数,主机读数据时从机会调用simpleProfile_ReadAttrCB函数,写数据时从机会调用simpleProfile_WriteAttrCB函数。这两个函数在simpleGaatprofile.c 中实现。

注意在simpleProfile_WriteAttrCB,函数中有如下语句 if((notifyApp!= 0xFF)&& simpleProfile_AppCBs && simpleProfile_AppCBs->pfnSimpleProfileChange)

{

simpleProfile_AppCBs->pfnSimpleProfileChange(notifyApp);

} 注意函数指针的用法,实际是在接收到主机数据发过来的数据后调用simpleProfileChangeCB函数来处理接收到的数据。这个函数在初始化时注册,下面会讲到。作为GATT的server和client,主要通过Attribute来进行交互,当client请求server读取数据时,通过如下注册的回调函数来进行访问。

// Register callback with SimpleGATTprofile

VOID SimpleProfile_RegisterAppCBs(&simpleBLEPeripheral_SimpleProfileCBs);//给应用注册回调函数,这个函数非常重要 在回调函数中对数据做出处理。

static simpleProfileCBs_t simpleBLEPeripheral_SimpleProfileCBs = {

simpleProfileChangeCB

// Charactersitic value change callback };

在SimpleProfile_RegisterAppCBs 函数中赋值。simpleProfile_AppCBs = simpleProfileChangeCB

在simpleProfileChangeCB函数中可以启动定时器来给主机发送Notification数据

发送数据函数为GATT_Notification(noti_cHandle,&pReport,FALSE);

如下:

{ static attHandleValueNoti_t pReport;//声明attHandleValueNoti_t这个结构体

uint16 noti_cHandle;//存放handle

pReport.handle = simpleProfileAttrTbl[11].handle;//读取notification对应的handle

GAPRole_GetParameter(0x30E, ¬i_cHandle);//获取Connection Handle

pReport.len = 1;//数据长度

pReport.value[0] = 0x03;//赋值

GATT_Notification(noti_cHandle,&pReport,FALSE);}

主机使能Notification:

这个handle应该是相应的characteristic value的handle的后面一个, 就是characteristic value的handle加 1.例子: { attWriteReq_t writeReq;writeReq.handle =;writeReq.len = 2;writeReq.value[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY);

这里是 0x01 writeReq.value[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY);

这里是 0x00 writeReq.sig = 0;writeReq.cmd = 0;GATT_WriteCharValue(simpleBLEConnHandle, &writeReq, simpleBLETaskId);}

这两个值目的是打开Notification功能.CCC的参数有两个, 一个Notification, 一个indication.value[0]就是打开关闭notification, value[1]是打开关闭indication.主机数据处理:

simpleBLECentral.c 这个文件, 里面有个函数:simpleBLECentralProcessGATTMsg()这个函数就是处理各种从peripheral过来的数据.但是在示例代码中并没有加入通知, 就是notification的接收, 所以你得自己添加代码.很简单, 类似 if((pMsg->method == ATT_READ_RSP)||........), 添加 else if((pMsg->method == ATT_HANDLE_VALUE_NOTI)||......)就可以处理从机Notification的数据。

value 被写的时候首先 simpleProfile_WriteAttrCB()会被调到.最后才会调用 simpleProfileChangeCB()

GAP通过在启动设备事件的任务处理中启动设备,其实主要是向GAP中注册回调函数,让系统在发现自身运行状态变化时,调用该函数,方便应用层进行相关操作。if(events & SBP_START_DEVICE_EVT)

{

// Start the Device VOID GAPRole_StartDevice(&simpleBLEPeripheral_PeripheralCBs);//启动设备,注册回调函数,用于监督设备的状态变化:广播、连接、配对、绑定等。

// Start Bond Manager VOID GAPBondMgr_Register(&simpleBLEPeripheral_BondMgrCBs);} simpleBLEPeripheral_PeripheralCBs函数定义如下

static gapRolesCBs_t simpleBLEPeripheral_PeripheralCBs = {

peripheralStateNotificationCB, // Profile State Change Callbacks

NULL

// When a valid RSSI is read from controller(not used by application)};static void peripheralStateNotificationCB(gaprole_States_t newState)//传入参数由GPA自己输入,内部调用回调函数给用户,处理连接状态的改变 simpleBLEPeripheral_BondMgrCBs函数定义如下: static gapBondCBs_t simpleBLEPeripheral_BondMgrCBs = {

ProcessPasscodeCB,// 生成配对密码,发送给主机

ProcessPairStateCB

//主机密码的校验处理。配对状态管理 };

一、修改广播功率 { #define LL_EXT_TX_POWER_MINUS_23_DBM

0 //-23dbm 功率 最小 #define LL_EXT_TX_POWER_MINUS_6_DBM

//-6dbm

#define LL_EXT_TX_POWER_0_DBM

// 0dbm

#define LL_EXT_TX_POWER_4_DBM // +dbm 功率 最大

HCI_EXT_SetTxPowerCmd(gTxPower);

更新广播内容

GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID, TRUE, sizeof(advertData_Ex), advertData_Ex);}

二、数据加密解密 { uint8 key[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

// 需要加密的数据

uint8 plaintextData[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

// 加密后数据存放区

uint8 encryptedData[16];

// 解密后数据存放区

uint8 deccryptedData[16];

// 开始加密

LL_Encrypt(key, plaintextData, encryptedData);

// 开始解密

LL_EXT_Decrypt(key, encryptedData, deccryptedData);}

三、设置从机广播时间 1)、广播模式必须是Limited Discoverable mode 在advertData 中加入此AD string: 0x02, GAP_ADTYPE_FLAGS, GAP_ADTYPE_FLAGS_LIMITED| GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED 2)、设置时间

//Maximum time to remain advertising, when in Limited Discoverable mode.unit is seconds #define USER_DEF_ADV_TIMEOUT

GAP_SetParamValue(TGAP_LIM_ADV_TIMEOUT, USER_DEF_ADV_TIMEOUT);

下载关于蓝牙的安全机制word格式文档
下载关于蓝牙的安全机制.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    改装车载蓝牙(五篇材料)

    大众途安专用改装车载蓝牙 专业派诺特蓝牙免提改装 派诺特车载蓝牙免提的品牌影响力是众所周知的,如何用最少的钱实现最完美的效果,靠脑力生存的今天,借助于我们的专业性,我们帮......

    蓝牙音箱市场行情分析

    蓝牙音箱市场行情分析 不可否认的是,一种新型的高科技产品,必将改变我们每一代人的生活方式。从第一次的科技革命,再到当今的数字信息化时代,科技改变世界的力量不容置疑,而能改......

    基于蓝牙的智能项链

    基于Bluetooth Smart的智能项链 CSR公司日前宣布推出一款基于其最新Bluetooth Smart解决方案的智能项链。该智能型吊坠项链内置电子产品,使佩戴者能够根据自身的心情或特定服......

    蓝牙问题解决方案[精选五篇]

    蓝牙问题解决方案对于蓝牙不稳定的问题的整体解决方案如下: 一、由我们公司技术人员自己解决: 在确保硬件没问题的情况下:(因为硬件问题比较容易解决,可以买最好和最稳定的蓝牙和......

    蓝牙~科技文英语翻译

    什么是"蓝牙"? 蓝牙是一个频率为2.45GHz的通用无线电通信接口,它通过一个特殊的网络可以在各种便携设备之间建立起无线连接并进行短程通信。在一个微微网中,每个单元都能同时......

    Android蓝牙连接总结

    蓝牙连线时首先会定义一个专门用来连接的函数体BtconnectDevice,当按下Btconnect(为一个Buttton名时)时,程序会判断此时Btconnect键是什么状态,当Btconnect键为连接状态时,因为按......

    Android蓝牙开发小结

    学习之前先了解两个基本概念: 一、RFCOMM协议: 一个基于欧洲电信标准协会ETSI07.10规程的串行线性仿真协议。此协议提供RS232控制和状态信号,如基带上的损坏,CTS以及数据信号......

    蓝牙耳机市场调查问卷

    蓝牙耳机市场调查问卷 您好!感谢您用宝贵的时间参与这份问卷调查。为了更好地了解蓝牙耳机在 大学生中的市场情况,设计一款更适合您的蓝牙耳机,需要您真诚的帮助和真实的回答,您......