• 【BLE】CC2541之主机端读取特征值


    本篇博文最后改动时间:2017年01月06日,11:06。


    一、简单介绍

    本文介绍怎样在SimpleBLECentralproject中,读取SimpleBLEPeripheralproject中的特征值char1的数据。

    (注:SimpleBLECentralproject默认就可以通过UP键进行读、写特征值,而本文採用的方法是连接上从机后自己主动读取特征值数据


    二、实验平台

    协议栈版本号:BLE-CC254x-1.4.0

    编译软件:IAR 8.20.2

    硬件平台:两块Smart RF(主芯片CC2541)


    版权声明

    博主:甜甜的大香瓜

    声明:喝水不忘挖井人。转载请注明出处。

    原文地址:http://blog.csdn.NET/feilusia

    联系方式:897503845@qq.com

    香瓜BLE之CC2541群:127442605

    香瓜BLE之CC2640群:557278427

    香瓜BLE之Android群:541462902

    香瓜单片机之STM8/STM32群:164311667
    甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

    四、实验前提
    1、在进行本文步骤前,请先阅读下面博文:
    1)《CC2541之发现服务与特征值》:http://blog.csdn.net/feilusia/article/details/46909847
    2)《CC2541之发现多个特征值句柄》:http://blog.csdn.net/feilusia/article/details/48314165

    2、在进行本文步骤前。请先实现下面博文:
    暂无


    五、基础知识

    暂无


    六、实验步骤

    1、加入读特征值事件

    1)定义读特征值事件SimpleBLECentral.c的SimpleBLECentral_ProcessEvent中

    //香瓜
      if ( events & GUA_READ_CHAR1_EVT )
      { 
          // Do a read
          attReadReq_t req;
          uint8 status;
            
          req.handle = simpleBLECharHdl;
          status = GATT_ReadCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );
    
          if ( status == SUCCESS )
          {
            simpleBLEProcedureInProgress = TRUE;
          }      
        
        return ( events ^ GUA_READ_CHAR1_EVT );
      }
    //香瓜 

    2)定义读特征值事件的宏SimpleBLECentral.h中)

    //香瓜  
    #define GUA_READ_CHAR1_EVT                            0x0004
    //香瓜  

    2、在发现特征值句柄后直接读取特征值(SimpleBLECentral.c的simpleBLEGATTDiscoveryEvent

    static void simpleBLEGATTDiscoveryEvent( gattMsgEvent_t *pMsg )
    {
      attReadByTypeReq_t req;
      
      if ( simpleBLEDiscState == BLE_DISC_STATE_SVC )
      {
        // Service found, store handles
        if ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&
             pMsg->msg.findByTypeValueRsp.numInfo > 0 )
        {
          simpleBLESvcStartHdl = pMsg->msg.findByTypeValueRsp.handlesInfo[0].handle;
          simpleBLESvcEndHdl = pMsg->msg.findByTypeValueRsp.handlesInfo[0].grpEndHandle;
        }
        
        // If procedure complete
        if ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP  && 
               pMsg->hdr.status == bleProcedureComplete ) ||
             ( pMsg->method == ATT_ERROR_RSP ) )
        {
          if ( simpleBLESvcStartHdl != 0 )
          {
            // Discover characteristic
            simpleBLEDiscState = BLE_DISC_STATE_CHAR;
            
            req.startHandle = simpleBLESvcStartHdl;
            req.endHandle = simpleBLESvcEndHdl;
            req.type.len = ATT_BT_UUID_SIZE;
            req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
            req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);
    
            GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId );
          }
        }
      }
      else if ( simpleBLEDiscState == BLE_DISC_STATE_CHAR )
      {
        // Characteristic found, store handle
        if ( pMsg->method == ATT_READ_BY_TYPE_RSP && 
             pMsg->msg.readByTypeRsp.numPairs > 0 )
        {
          simpleBLECharHdl = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0],
                                           pMsg->msg.readByTypeRsp.dataList[1] );
          
          LCD_WRITE_STRING( "Simple Svc Found", HAL_LCD_LINE_1 );
          simpleBLEProcedureInProgress = FALSE;
        }
        
        simpleBLEDiscState = BLE_DISC_STATE_IDLE;
    
    //香瓜    
        osal_start_timerEx( simpleBLETaskId, GUA_READ_CHAR1_EVT, 1000 );//一定要延时一定时间,否则会读取特征值失败  
    //香瓜     
      }    
    }
    特别注意,假设上面的定时器定时的是1ms,会失败。

    因此须要多延时一点时间。此处香瓜使用的是延时1S。


    七、注意事项

    暂无


    八、实验结果

    1)将SimpleBLEPeripheralproject的代码下进当中一块Smart RF中,使其上电广播。

    2)在SimpleBLECentralproject中仿真。在例如以下图位置设置断点。并依据方向键进行扫描、选择设备、连接。在连接上1S之后。会自然停在断点。看到例如以下图的char1的数据:







  • 相关阅读:
    linux 运维 nginx服务器
    linux 运维,代理,acl控制访问
    shell脚本 awk工具
    shell脚本 sed工具
    shell脚本 字串截取 正则表达式
    Django ORM 反向查询
    Django model操作
    Form的is_valid校验规则及验证顺序
    Django 中的Form、ModelForm
    Django 中的Form表单认证
  • 原文地址:https://www.cnblogs.com/llguanli/p/8734487.html
Copyright © 2020-2023  润新知