本帖最后由 冒汗的心情 于 2016-4-15 11:22 编辑
一、简介 以ti 的SimpleBLEPeripheral工程为例, 介绍CC2541如何读取苹果手机电量并且广播。
二、实验平台
协议栈版本: BLE-CC254x-1.4.0
编译软件: IAR 8.20.2
硬件平台: CC2541 + USB-RS232 USB dongle 手机平台: 苹果4s
APP: LightBlue
三、实现步骤 1.保证项目中有hal_adc.c和hal_adc.h
2.添加Profile如下图所示
我的文件路径在:C:Texas InstrumentsBLE-CC254x-1.4.0ProjectsbleProfilesBatt(如果找不到建议下载一个“光速搜索”,这个软件用起来很好用)
3.添加两文件的路径(因为我的改了名字,你们的不必和我的一致,和你们的名字相同就行了)
4.打开ADC采样的宏
5.添加头文件( simpleBLEPeripheral.c)
#include "battservice.h"
6.修改代码给电源电量预留的位置( simpleBLEPeripheral.c)
static uint8 advertData[] =
{
0x07,
GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type
0x20, //给MAC地址预留位置 2
0x20,
0x20,
0x20,
0x20,
0x20, // 7
0x01,
GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type
0x20,//给电池电量预留的位置 10
7.添加相应的变量 (simpleBLEPeripheral.c) 8、添加相应的代码(simpleBLEPeripheral.c) //读取电池电量
Batt_GetParameter(BATT_PARAM_LEVEL,battLevel);
osal_memcpy (advertData + 10, battLevel,1);
//更新广播数据
GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,TRUE,sizeof(advertData),advertData );
读取电池电量这里需要注意我在simpleBLEPeripheral.c中调用battservice.c中调用下面这个函数 不能用,我也添加了相应的声明在“.h”文件中 并且把static去掉了还是不能再其他的.c文件中调用。只能在 battservice.c中调用(这个希望大神们指导)
在下面这个函数中调用battMeasure函数读取相应的电池电量。(battservice.c) bStatus_t Batt_GetParameter( uint8 param, void *value )
{
bStatus_t ret = SUCCESS;
switch ( param )
{
case BATT_PARAM_LEVEL:
//wodejiqing
battLevel = battMeasure();
*((uint8*)value) = battLevel;
break;
9、在 simpleBLEperipheral.h中添加一个新的事件
10、在 simpleBLEperipheral.c中下面位置启动这个事件
11.添加相应的处理函数(我的是广播30秒后不再广播) //周期性广播处理事件
if ( events & SBP_ADV_PERIODIC_PROCESS_EVT )
{
static uint8 k = 0;
osal_memcpy (advertData + 2, ownAddress,6);
osal_memcpy (advertData + 10, battLevel,1);
// GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,TRUE,sizeof(advertData),advertData ); //更新广播数据
k += 2;
if(k <= 30 )
{
osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_ADV_PERIODIC_PROCESS_EVT, adv_per_time );
}else{
uint8 initial_advertising_enable = FALSE;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
}
return (events ^ SBP_ADV_PERIODIC_PROCESS_EVT);
}
然后就可以了 下面是运行结果因为用的是u***供电所以电量一直未100、我也用过电子供电,结果很理想。
|