蓝牙知识小结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“公共基础知识小结”。
蓝牙协议知识总结
蓝牙设备 和 主机进行连接和数据通信的 流程如下:外部设备发出广告(带有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 //!
0x02 //!
0x03 //!
0x04 //!
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 这个文件, 里面有个函数:simpleBLECentralProceGATTMsg()这个函数就是处理各种从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 = {
ProcePacodeCB,// 生成配对密码,发送给主机
ProcePairStateCB
//主机密码的校验处理。配对状态管理 };
一、修改广播功率 { #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_TIMEOUTGAP_SetParamValue(TGAP_LIM_ADV_TIMEOUT, USER_DEF_ADV_TIMEOUT);
学习之前先了解两个基本概念:一、RFCOMM协议: 一个基于欧洲电信标准协会ETSI07.10规程的串行线性仿真协议。此协议提供RS232控制和状态信号,如基带上的损坏,CTS以及数据信号等,......
iOS 蓝牙使用小结 bluetooth现将创建蓝牙工程的要点总结一下,由于工程主要涉及中心模式,所以只总结中心模式的用法 1,引入CoreBluetooth.framework 2,实现蓝牙协议,如: .h文件如......
高一物理教案第一章力第一章知识小结一、力:⑴力的概念⑵物体间的作用规律⑶任何力都有________物体。飞在空中的铅球受__个力作用。它们的施力物体分别是________。⑷测量力的工具是______;测量质量的......
Unit 7 Would you mind turning down the music? 重点知识小结一、本单元语言目标:1、请求或者询问对方意愿2、抱怨或对事情感到生气二、重点单词KEY WORDS 1.request, 请求,要......
安全知识小结一、HSE相关知识1、HSE管理体系是指实施安全,环境与健康管理的组织机构、职责、做法、程序、过程和资源等而构成的整体。2、HSE中的“S”(安全)是指在劳动生产中努......