蓝牙4.0BLE协议栈学习过程中问题总结与剖析


在学习开发TI CC2540/CC2541蓝牙协议栈遇到的问题总结:

1.蓝牙设备号BD_ADDR就是MAC地址,不同于uuid,uuid是服务号,作为唯一标识符。

2.scanRspData数组是扫描回应数据数组,用户可以自定义设备名。advertData数组是广播数据数组,主要是包含在广播里的数据信息。

3.主从机通信:

主从机通信具体流程就是 Scanning (搜索) -->Devices Found(发现从机) --> Connected (连接) --> discoverService(发现设备服务)-->读写characteristic(属性)。协议栈中的SimpleBLEPeripheral是从机模式,主要是广播信息,让其他设备知道。SimpleBLECentral作为主机,主要是与从机建立连接。读写characteristic可以理解为GATT层的client向service发送数据,或者是service向client端发送数据。主机设备可以是client(客户端),也可以是service(服务器),即主机向从机发送数据,从机主动向主机发送数据。

主机向从机读写数据调用GATT_WriteCharValue函数和GATT_ReadCharValue函数。如下:

if ( simpleBLEDoWrite )

{

// Do a write

attWriteReq_t req;


req.handle = simpleBLECharHdl+2;

req.len = 2;

req.value[0] = simpleBLECharVal;

req.sig = 0;

req.cmd = 0;

status = GATT_WriteCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );

if ( status == SUCCESS )

{

NPI_WriteTransport("write ok\\r\\n", 10);

simpleBLEProcedureInProgress = TRUE;

simpleBLEDoWrite = !simpleBLEDoWrite;

}


else

{

// Do a read

attReadReq_t req;


req.handle = simpleBLECharHdl+2;

status = GATT_ReadCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );

}

从机和主机发送数据机制不一样。主机用write命令,从机用Notification通知命令。从机向主机发送数据调用GATT_Notification函数,如:

static attHandleValueNoti_t Report ;

uint16 GetHandle;

noti.len = 1;

noti.value[0] = GetLen;

GATT_Notification(GetHandle, &Report, FALSE );

4.获取电池电量:

battMeasure函数是通过ADC采集内部电压获得的电压值,参考电压是1.25v,最大测量电压是3.75V。如果要获取精度较高的值需要从外部输入引脚接入稳定性较高的参考电压,然后通过ADC采集转换。

if ( events &SBP_ADV_RGB_EVT )

{

//P0_3=~P0_3;

advertData[6]= battMeasure();//获取电池电量

GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );

osal_start_timerEx(simpleBLEBroadcaster_TaskID,SBP_ADV_RGB_EVT,1000);

return ( events ^ SBP_ADV_RGB_EVT );

}

5.获取RSSI值:

通过获取信号强度RSSI值,可以测定信号源与接收点的距离,即标签和基站的距离。从而用相关算法进行定位。注意的是由于受到脉冲干扰等会出现浮动值,需要进行滤波算法来获得比较准确的采样值。

case GAP_DEVICE_INFO_EVENT:

{

if( *(pEvent->deviceInfo.pEvtData+7)==0xA7)

simpleBLEAddDeviceInfo( pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType, pEvent->deviceInfo.rssi ,*(pEvent->deviceInfo.pEvtData+6));

}

break;

蓝牙4.0BLE协议栈学习过程中问题总结与剖析


分享到:


相關文章: