//******************************************************************************
//name: GUA_clockHandler
//introduce: 香瓜的定时回调函数
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2640(557278427)
//changetime: 2016.09.28
//******************************************************************************
static void GUA_clockHandler(UArg arg)
// Store the event.
events |= arg;
// Wake up the application.
Semaphore_post(sem);
②声明定时回调函数(SimpleBLECentral.c中)
static void GUA_clockHandler(UArg arg);
2)修改香瓜定时事件初始化(SimpleBLECentral.c的SimpleBLECentral_Init中)
//初始化定时器
Util_constructClock(&GUA_periodicClock, GUA_clockHandler,
SBP_GUA_PERIODIC_EVT_PERIOD, 0, false, SBP_GUA_PERIODIC_EVT);
也就是将新写的GUA_clockHandler函数,作为参数传给Util_constructClock。
3)修改香瓜定时事件的时间(SimpleBLECentral.c中)
//GUA
#define SBP_GUA_PERIODIC_EVT_PERIOD 6000 //香瓜定时时间
修改为6S,因为扫描时间为4S,因此本周期要比4S长一些。
4)修改香瓜定时事件的处理代码(SimpleBLECentral.c的SimpleBLECentral_taskFxn函数中)
//香瓜周期事件
if (events & SBP_GUA_PERIODIC_EVT)
events &= ~SBP_GUA_PERIODIC_EVT;
//再次启动定时器
//Util_startClock(&GUA_periodicClock);
//香瓜周期处理函数
GUA_performPeriodicTask();
}
注意,之所以在这里注释掉再次启动定时器的步骤,是因为在GUA_performPeriodicTask函数中要判断是否要再次启动。
2、添加周期扫描的处理代码(SimpleBLECentral.c的GUA_performPeriodicTask函数中)
//******************************************************************************
//name: GUA_performPeriodicTask
//introduce: 周期事件的处理函数
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2640(557278427)
//changetime: 2016.09.28
//******************************************************************************
static void GUA_performPeriodicTask(void)
uint8_t bGUA_PeripheralMac[B_ADDR_LEN] = {0xd9, 0x1b, 0x62, 0x4c, 0x99, 0xb4}; //香瓜的从机mac:b4994c621bd9
//非连接状态
if(state != BLE_STATE_CONNECTED)
//当前没有扫描、扫描已结束,则开启扫描
if(scanningStarted == FALSE)
//扫描到了设备,判断是否有我们想连接的设备,如果有则连接并退出
if(scanRes > 0)
uint8_t addrType;
uint8_t *peerAddr;
//判断是否有我们想连接的设备
for(uint8_t i = 0; i < scanRes; i++)
//当前扫描到的设备mac,与我们想连接的设备mac相匹配,连接
if(memcmp(bGUA_PeripheralMac, devList[i].addr , B_ADDR_LEN) == 0)
peerAddr = devList[i].addr;
addrType = devList[i].addrType;
state = BLE_STATE_CONNECTING;
GAPCentralRole_EstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,
DEFAULT_LINK_WHITE_LIST,
addrType, peerAddr);
LCD_WRITE_STRING("Connecting", LCD_PAGE2);
LCD_WRITE_STRING(Util_convertBdAddr2Str(peerAddr), LCD_PAGE3);
LCD_WRITE_STRING("", LCD_PAGE4);
return;
//没有扫描到想要的设备,继续扫描
//修改为在扫描的状态
scanningStarted = TRUE;
//清空扫描到的设备数
scanRes = 0;
//LCD显示正在扫描
LCD_WRITE_STRING("Discovering...", LCD_PAGE2);
LCD_WRITE_STRING("", LCD_PAGE3);
LCD_WRITE_STRING("", LCD_PAGE4);
//开始扫描
GAPCentralRole_StartDiscovery(DEFAULT_DISCOVERY_MODE,
DEFAULT_DISCOVERY_ACTIVE_SCAN,
DEFAULT_DISCOVERY_WHITE_LIST);
//再次启动定时器
Util_startClock(&GUA_periodicClock);
}
在这里一旦扫描到香瓜指定mac的从机设备,即连接。
3、修改扫描完成的回调代码(SimpleBLECentral_processRoleEvent函数中)
case GAP_DEVICE_DISCOVERY_EVENT:
// discovery complete
scanningStarted = FALSE;
// if not filtering device discovery results based on service UUID
if (DEFAULT_DEV_DISC_BY_SVC_UUID == FALSE)
// Copy results
scanRes = pEvent->discCmpl.numDevs;
memcpy(devList, pEvent->discCmpl.pDevList,
(sizeof(gapDevRec_t) * scanRes));
LCD_WRITE_STRING_VALUE("Devices Found", scanRes, 10, LCD_PAGE2);
//GUA
if (scanRes > 0)
LCD_WRITE_STRING("<- To Select", LCD_PAGE3);
//GUA
// initialize scan index to last device
scanIdx = scanRes;
break;
将LCD的选择设备提示去除。实现以上步骤,即可实现上电自动扫描连接。
4、修改断开连接的回调代码(SimpleBLECentral_processRoleEvent函数中)
case GAP_LINK_TERMINATED_EVENT:
state = BLE_STATE_IDLE;
connHandle = GAP_CONNHANDLE_INIT;
discState = BLE_DISC_STATE_IDLE;
charHdl = 0;
procedureInProgress = FALSE;
// Cancel RSSI reads
SimpleBLECentral_CancelRssi(pEvent->linkTerminate.connectionHandle);
LCD_WRITE_STRING("Disconnected", LCD_PAGE2);
LCD_WRITE_STRING_VALUE("Reason:", pEvent->linkTerminate.reason,
10, LCD_PAGE3);
LCD_WRITE_STRING("", LCD_PAGE4);
//清空扫描到的设备数
scanRes = 0;
//启动定时器
Util_startClock(&GUA_periodicClock);
break;
注意两点:
1、要在这里清空设备数,否则周期事件中会误认为扫描到设备了。
2、启动定时器不需要再初始化一次定时器,否则定时周期事件会失效。
七、实验结果
1、将从机上电广播。
2、主机仿真全速运行本博客工程,上电6S后启动扫描事件。
3、4S后扫描结束,显示发现的连接数。
4、1~2S后连接上了我指定mac的设备,如下图
5、让从机掉电,等待10S主机端会发现连接断开,然后再次启动6S一次的周期扫描设备。
注:如果觉得本处的10S时间过长,可通过修改从机端的连接参数:
// Connection Pause Peripheral time value (in seconds)
#define DEFAULT_CONN_PAUSE_PERIPHERAL 1//6
6、从机再次上电,又可实现自动连接。
因此,实验成功。
已BLE HID为例,Android原生代码bta_hh_le_add_dev_bg_conn按照Spec描述,在加载配对记录后,对已配的BLE HID Device设备执行了Auto connection流程,代码内,会触发中心设备向BLE HID Device设备自动发起连接的情况包括如下三种:
配对成功之后;
车机蓝牙(中心设备)启动,加载配对记录之后;
原因是connection t...
原创博客,如有转载,注明出处——在金华的电子民工林。
原先写在其他论坛上的,现在转移到这边来,绝对原创,希望对大家有帮助。
上一篇说了central怎么开始新建一个项目,并讲解了主机发现从机并连接的一个流程,现在详细说一下我是怎么按照自己的思路,修改例程,来达到最终的目的的。
TI提供的demo里,上一篇已经说了,是通过按键实现的,2个按键,一个选择,一个确认,再加上串口打印显示实现功能。
我的项...
Nordic 固件的配对和绑定,参数设置为
当手机发来配对请求,协议栈触发事件 BLE_GAP_EVT_SEC_PARAMS_REQUEST,将事件传送到设备管理器事件处理函数中: dm_ble_evt_handler()
该事件处理函数在ble_evt_dispatch()中注册。
在对该事件的处理中,需要调用回复API回复配对参数 sd_ble_gap_sec_params_reply
sd_ble_gap_sec_params_repl 的第三个参数g_pair_params参数就是要回复的配对绑定
HCI(Host Controller Interface)层中文称为主机与控制器接口,它连接主机(Host)和控制器(Controller),将主机的操作转化成HCI指令传给控制器,BLE协议规定了HCI的指令集。
单芯片与双芯片
在BLE协议栈的层模型中,位于下部的物理层、链路层、DTM属于控制器,位于上部的L2Cap、ATT、GATT、GAP、SM层则属于主机,在主机之上用户自己的程序称...
链路层(LL)控制设备的射频状态,有五个设备状态:待机、广播、扫描、初始化和连接。
广播 为广播数据包,而 扫描 则是监听广播。
GAP通信中角色,中心设备(Central - 主机)用来扫描和连接 外围设备(Peripheral - 从机)。
大部分情况下外围设备通过广播自己来让中心设备发现自己,并建立 GATT 连接,从而进行更多的数据交换。
也有些情况是不需要连接的,只要外设广播自...
BLE连接,再次连接BLE的第一次连接1 蓝牙连接过程中的角色2 连接过程中两个角色对应的状态ble蓝牙的连接过程1 二次连接的特点:
BLE的第一次连接
所谓连接,分为一对多,多对一。这篇文章我先主要讲一下一对一的情况。
1 蓝牙连接过程中的角色
两者的角色:主(master)和从(slave),服务器(sever)和客户端(client),中心设备(Central)和外围设备(Peripheral)。
在蓝牙的整个连接过程中,其实更主要的是将设备分为“广播者”(Advertiser)和“发现者”(Obs
问题描述:
在使用nordic的nRF51822或者nRF52832开发BLE产品的过程中发现,当我在使用安卓应用程序不启动扫描而只使用MAC地址去连接BLE产品时,此时无法成功连接上BLE设备;
而在使用其他品牌如TI的CC2541或者CC2640开发时,发现使用安卓应用程序不启动扫描而直接使用MAC地址去连接BLE产品时,则可以成功脸上BLE设备。