CC2540/CC2541做蓝牙BLE中心设备

CC2540/CC2541做蓝牙BLE中心设备

1)搜索设备

//开始搜索
GAPCentralRole_StartDiscovery( DEFAULT_DISCOVERY_MODE, DEFAULT_DISCOVERY_ACTIVE_SCAN, DEFAULT_DISCOVERY_WHITE_LIST);

...

//在GAP_DEVICE_INFO_EVENT事件将得到搜索到的设备的 MAC地址,RSSI,支持的服务等信息,在这里可以判断设备是否提供了需要的服务,把符合要求的设备保存起来;
//GAP_DEVICE_DISCOVERY_EVENT事件表明搜索已经结束了,这里可以选择需要连接的设备,或者重新搜索设备;

2)连接设备

//知道设备的地址就可以建立连接
GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE, DEFAULT_LINK_WHITE_LIST, addrType, peerAddr);

...

//GAP_LINK_ESTABLISHED_EVENT事件表明连接动作已经完成,可能成功,也可能失败,如下面方式判断
if (pEvent->gap.hdr.status == SUCCESS) {
   //连接成功
   //这里开始发现服务,延迟执行
   osal_start_timerEx(simpleBLETaskId, START_DISCOVERY_EVT, DEFAULT_SVC_DISCOVERY_DELAY);
}
else{
   //连接失败
}

3)发现服务

//开始发现指定的服务
GATT_DiscPrimaryServiceByUUID(app_ble_connHandle, (uint8*) uuid, ATT_BT_UUID_SIZE, simpleBLETaskId);
//在pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP时表明得到了指定的服务,这时可以开始发现特性

4)发现特性

ttReadByTypeReq_t req;
req.startHandle = simpleBLESvcStartHdl;//handle可以认为是一个逻辑地址,对应的是外设在注册服务时(GATTServApp_RegisterService)的一个gattAttribute_t[]结构中的下标,  我们实际上是在这个结构范围内寻找特性
req.endHandle = simpleBLESvcEndHdl;
req.type.len = ATT_BT_UUID_SIZE;
req.type.uuid[0] = LO_UINT16(THERMOMETER_SERV_CHAR1_UUID);
req.type.uuid[1] = HI_UINT16(THERMOMETER_SERV_CHAR1_UUID);
//GATT_ReadUsingCharUUID(app_ble_connHandle, &req, simpleBLETaskId);
GATT_DiscCharsByUUID(app_ble_connHandle, &req, simpleBLETaskId);

...

if(pMsg->method == ATT_READ_BY_TYPE_RSP){
   //发现特性,从此可以读写特性值,对于NOTIFY或INDICATE类型的需要先激活
}

5)激活NOTIFY/INDICATE型的特性

//实际上就是修改特性配置项的值
req.handle = simpleBLECharHdl + 2; // simpleBLECharHdl对应的是描述,描述后是值,值后才是配置;直接+2感觉不好,但没有找到搜索的办法.
uint8 tv = GATT_CLIENT_CFG_INDICATE;//GATT_CLIENT_CFG_NOTIFY
req.len = 2;
req.value[0] = tv;
req.value[1] = 0;
req.sig = 0;
req.cmd = 0;//这个值是什么?看有资料是1,但1不成功
bStatus_t r = GATT_WriteCharValue(app_ble_connHandle, &req, simpleBLETaskId);

...

if(pMsg->method == ATT_WRITE_RSP){
   //就是修改配置项已经完成
}

...

if(pMsg->method == ATT_HANDLE_VALUE_IND || pMsg->method == ATT_HANDLE_VALUE_NOTI){
   //外设发来数据
   ATT_HandleValueCfm(pMsg->connHandle);//TODO 特别重要,告诉外设ind已经收到,没有这一行就只会收到一次
}

你可能感兴趣的:(CC2540/CC2541做蓝牙BLE中心设备)