蓝牙知识小结.docx

上传人:b****6 文档编号:7720471 上传时间:2023-01-26 格式:DOCX 页数:10 大小:120.49KB
下载 相关 举报
蓝牙知识小结.docx_第1页
第1页 / 共10页
蓝牙知识小结.docx_第2页
第2页 / 共10页
蓝牙知识小结.docx_第3页
第3页 / 共10页
蓝牙知识小结.docx_第4页
第4页 / 共10页
蓝牙知识小结.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

蓝牙知识小结.docx

《蓝牙知识小结.docx》由会员分享,可在线阅读,更多相关《蓝牙知识小结.docx(10页珍藏版)》请在冰豆网上搜索。

蓝牙知识小结.docx

蓝牙知识小结

蓝牙协议知识总结

蓝牙设备和主机进行连接和数据通信的流程如下:

1外部设备发出广告(带有UUID信息等其他信息);

2主机(集中器设备)收到广告信息,进而发送扫描请求;表示我扫描到你的信息;

3外部设备收到扫描请求后,返回扫描回应,表示我知道你扫描到我的信息;

4主机进而发送连接请求信息,表示主机要跟设备建立无线连接;

5设备收到连接请求后,发送相应请求回应;表示已经建立连接;

数据读写流程如下进一步(在建立连接的基础上):

6主机发送主服务UUID(设备的广告UUID)给设备;服务发现

7设备收到后回应服务信息;

8主机发送特性UUID;特性发现

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

10主机发送特性值句柄;读信息

11设备收到后回应特性值;

12主机发送特性值句柄和要写入值;写信息

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

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

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

主机和从机绑定之后,断开连接后,可以快速的建立连接并进行加密读写,而不需要再次配对;

特点

1低功耗蓝牙速度只有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中主从机建立连接,到配对和绑定的过程如下图。

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

1)广播:

广播包可以包含广播数据 ,广播包可以无指定或者对指定的设备发送。

可以声明该器件是可连接的还是不可连接的。

在一次广播中,广播包可以在三个广播通道中同时发送。

广播类型:

1未指定可连接2指定可连接3未指定不可见4未指定不可连接

#defineGAP_ADTYPE_ADV_IND0x00//!

#defineGAP_ADTYPE_ADV_DIRECT_IND0x01//!

#defineGAP_ADTYPE_ADV_DISCOVER_IND0x02//!

#defineGAP_ADTYPE_ADV_NONCONN_IND0x03//!

#defineGAP_ADTYPE_SCAN_RSP_IND0x04//!

在peripheral.c中

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

还有有以下函数bStatus_tGAPRole_SetParameter(uint16param,uint8len,void*pValue)

GAPRole_GetParameter(…..)可以调用进行设置。

2)scanning

1)被动扫描:

扫描者监听广播频道的广播包,收到后将其上传到host层

2)主动扫描:

扫描者监听广播频道的广播包,当收到广播包后扫描者发送一个scanRequest包,广播设备回应一个scanreponse包

3)Connection

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

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

建立连接

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通俗理解为用于主从机之间的客户端和服务器端的数据交互,以AttributeTable来体现。

GAPRoleProfile:

在GAP所处的4个角色:

广播Advertise,主机central,从机Peripheral,观察者Observer。

GATTAttribute:

通用属性配置文件。

GAP作为PeripheralRole需要设置的核心参数如下

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:

请求主机更新参数,主机可以接受也可以拒绝。

.GATTServer的相关设置函数。

 //InitializeGATTattributes

 GGS_AddService(GATT_ALL_SERVICES);           //GAPService

 GATTServApp_AddService(GATT_ALL_SERVICES);   //GATTattributes

 DevInfo_AddService();                          //DeviceInformationService

 SimpleProfile_AddService(GATT_ALL_SERVICES); //SimpleGATTProfile

通常一个GATT中GAPserver和GATTserver是必须强制存在的,还有设备信息服务以及自己设计的profileserver.

SimpleProfile_AddService就是添加自己设计的profileserver

在SimpleProfile_AddService函数中调用了如下函数

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

simpleProfileCBs的函数定义如下:

CONSTgattServiceCBs_tsimpleProfileCBs=

{simpleProfile_ReadAttrCB,//Readcallbackfunctionpointer

simpleProfile_WriteAttrCB,//Writecallbackfunctionpointer

NULL//Authorizationcallbackfunctionpointer

};

实际上就是底层读写数据的函数,主机读数据时从机会调用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读取数据时,通过如下注册的回调函数来进行访问。

 //RegistercallbackwithSimpleGATTprofile

 VOIDSimpleProfile_RegisterAppCBs(&simpleBLEPeripheral_SimpleProfileCBs);//给应用注册回调函数,这个函数非常重要

在回调函数中对数据做出处理。

staticsimpleProfileCBs_tsimpleBLEPeripheral_SimpleProfileCBs=

{

simpleProfileChangeCB//Charactersiticvaluechangecallback

};

在SimpleProfile_RegisterAppCBs函数中赋值。

simpleProfile_AppCBs=simpleProfileChangeCB

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

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

如下:

  

{  staticattHandleValueNoti_tpReport;//声明attHandleValueNoti_t这个结构体

    uint16noti_cHandle;//存放handle

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

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

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

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

    GATT_Notification(noti_cHandle,&pReport,FALSE);

}

主机使能Notification:

这个handle应该是相应的characteristicvalue的handle的后面一个,就是characteristicvalue的handle加1.

例子:

{

attWriteReq_twriteReq;

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)||........), 添加  elseif((pMsg->method==ATT_HANDLE_VALUE_NOTI ) ||......)

就可以处理从机Notification的数据。

 

value被写的时候首先 simpleProfile_WriteAttrCB()会被调到.

 

最后才会调用 simpleProfileChangeCB()

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

if(events&SBP_START_DEVICE_EVT)

{

//StarttheDevice

VOIDGAPRole_StartDevice(&simpleBLEPeripheral_PeripheralCBs);

//启动设备,注册回调函数,用于监督设备的状态变化:

广播、连接、配对、绑定等。

//StartBondManager

VOIDGAPBondMgr_Register(&simpleBLEPeripheral_BondMgrCBs);

}

simpleBLEPeripheral_PeripheralCBs函数定义如下

staticgapRolesCBs_tsimpleBLEPeripheral_PeripheralCBs=

{

peripheralStateNotificationCB,//ProfileStateChangeCallbacks

NULL//WhenavalidRSSIisreadfromcontroller(notusedbyapplication)

};

staticvoidperipheralStateNotificationCB(gaprole_States_tnewState)//传入参数由GPA自己输入,内部调用回调函数给用户,处理连接状态的改变

simpleBLEPeripheral_BondMgrCBs函数定义如下:

staticgapBondCBs_tsimpleBLEPeripheral_BondMgrCBs=

{

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

ProcessPairStateCB//主机密码的校验处理。

配对状态管理

};

一、修改广播功率

{

#defineLL_EXT_TX_POWER_MINUS_23_DBM0//-23dbm功率最小

#defineLL_EXT_TX_POWER_MINUS_6_DBM1//-6dbm

#defineLL_EXT_TX_POWER_0_DBM2//0dbm

#defineLL_EXT_TX_POWER_4_DBM3//+dbm功率最大

HCI_EXT_SetTxPowerCmd(gTxPower);

更新广播内容

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

}

二、数据加密解密

{

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

//需要加密的数据

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

//加密后数据存放区

uint8encryptedData[16];

//解密后数据存放区

uint8deccryptedData[16];

//开始加密

LL_Encrypt(key,plaintextData,encryptedData);

//开始解密

LL_EXT_Decrypt(key,encryptedData,deccryptedData);

}

 

三、设置从机广播时间

1)、广播模式必须是LimitedDiscoverablemode

在advertData 中加入此ADstring:

0x02,

GAP_ADTYPE_FLAGS,

GAP_ADTYPE_FLAGS_LIMITED|GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED

2)、设置时间

//Maximumtimetoremainadvertising,wheninLimitedDiscoverablemode.unitisseconds

#defineUSER_DEF_ADV_TIMEOUT               30

GAP_SetParamValue(TGAP_LIM_ADV_TIMEOUT,USER_DEF_ADV_TIMEOUT);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1