微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(5)

由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(5)

时间:08-02 来源:本站整理 点击:

特征值呢?特征值的管理是在profile中实现的。所以我们需要对profile进行修改。

  

  (1)修改simpleGATTProfile.h

  在simpleGATTProfile.h中可以看到现在定义的5个特征值的标示符和UUID,我们添加一个1Byte的特征值来控制灯的亮灭。

  

  因为simpleGATTProfile是共用的文件,为了不影响其它工程,我们使用一个宏来控制新增加的属性。

  

  接下来我们需要修改simpleGATTProfile.c,这个文件需要修改的地方较多,下面我们一步一步来修改。

  (2)添加UUID

  

  (3)添加属性

  

  (4)属性表

  

  (5)属性设置操作

  

  (6)属性获取操作

  

  (7)属性读操作

  

  (8)属性写操作

  

  Profile的改造完成后,我们将这个宏打开,配置工程。

  

  接着我们在staticvoid simpleProfileChangeCB( uint8 paramID )函数的switch中加入CHAR6的判断即可。

  

  编译烧录后,按照我们前面说的在Btool中对FFF6的UUID进行读写操作即可实现对LED的控制。

  第二十三节 蓝牙协议栈之主机通讯

  随着蓝牙4.0模块的大量使用,为了很多从未接触过蓝牙的工程师也能快速便捷地开发蓝牙项目或者使用蓝牙,主从一体、远控IO等等特性也成为蓝牙模块必 备的条件。其实,联合第二十一节和本节(第二十二节),我们就能将一个本无固件的裸片蓝牙,使其开发为具备主从一体功能的蓝牙模块。这两节的内容,也是本 连载篇的重点部分之一。

  上一节我们对从机的工作流程有了一个整体的把握。我们现在接着来看主机的工作流程。

  主机的工作主要是扫描设备,对发现的设备发起连接,然后就是对特征值的读写操作了。

  手动连接

  从机的对外广播是在初始化的时候完成的,那主机的扫描是在哪里开始的呢?阅读源码可以发现主机的操作都在按键处理中完成的。主机通过五向按键中的五个按键实现不同的功能。

  static void simpleBLECentral_HandleKeys( uint8 shift, uint8 keys )

  {

  (void)shift; // Intentionally unreferenced parameter

  if ( keys & HAL_KEY_UP ) // 向上

  {

  // Start or stop discovery

  if ( simpleBLEState != BLE_STATE_CONNECTED ) // 如果没有连接,开始扫描

  {

  if ( !simpleBLEScanning )

  {

  simpleBLEScanning = TRUE;

  simpleBLEScanRes = 0;

  LCD_WRITE_STRING( "Discovering.。。", HAL_LCD_LINE_1 );

  LCD_WRITE_STRING( "", HAL_LCD_LINE_2 );

  GAPCentralRole_StartDiscovery( DEFAULT_DISCOVERY_MODE,

  DEFAULT_DISCOVERY_ACTIVE_SCAN,

  DEFAULT_DISCOVERY_WHITE_LIST );

  }

  else

  {

  GAPCentralRole_CancelDiscovery();

  }

  }

  else if ( simpleBLEState == BLE_STATE_CONNECTED && // 如果连接并且发现Handle进行读写操作

  simpleBLECharHdl != 0 &&

  simpleBLEProcedureInProgress == FALSE )

  {

  uint8 status;

  // Do a read or write as long as no other read or write is in progress

  if ( simpleBLEDoWrite )

  {

  // Do a write

  attWriteReq_t req;

  req.handle = simpleBLECharHdl;

  req.len = 1;

  req.value[0] = simpleBLECharVal;

  req.sig = 0;

  req.cmd = 0;

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

  }

  else

  {

  // Do a read

  attReadReq_t req;

  req.handle = simpleBLECharHdl;

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

  }

  if ( status == SUCCESS )

  {

  simpleBLEProcedureInProgress = TRUE;

  simpleBLEDoWrite = !simpleBLEDoWrite;

  }

  }

  }

  if ( keys & HAL_KEY_LEFT ) // 左

  {

  // Display discovery results

  if ( !simpleBLEScanning && simpleBLEScanRes > 0 ) // 显示扫描到的设备

  {

  // Increment index of current result (with wraparound)

  simpleBLEScanIdx++;

  if ( simpleBLEScanIdx >= simpleBLEScanRes )

  {

  simpleBLEScanIdx = 0;

  }

  LCD_WRITE_STRING_VALUE( "Device", simpleBLEScanIdx + 1,

  10, HAL_LCD_LINE_1 );

  LCD_WRITE_STRING( bdAddr2Str( simpleBLEDevList[simpleBLEScanIdx].addr ),

  HAL_LCD_LINE_2 );

  }

  }

  if ( keys & HAL_KEY_RIGHT ) // 右

  {

  // Connection update

if ( simple

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top