【BLE】CC2541获取设备的MAC地址实验

来源:互联网 发布:玛斯威顿手表知乎 编辑:程序博客网 时间:2024/05/17 04:17

安卓调试工具扫描时直接显示就是MAC地址。
苹果设备是以UUID的方式显示。
所以我们直接用安卓设备来测试。

我们连接时可以知道主机的地址。
变量是gapRole_ConnectedDevAddr,可以在peripherial.c里搜索GAP_LINK_ESTABLISHED_EVENT事件的处理。

static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ){  uint8 notify = FALSE;   // State changed notify the app? (default no)  switch ( pMsg->opcode )  {    case GAP_DEVICE_INIT_DONE_EVENT:      {        gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *)pMsg;        bStatus_t stat = pPkt->hdr.status;        if ( stat == SUCCESS )        {          // Save off the generated keys          VOID osal_snv_write( BLE_NVID_IRK, KEYLEN, gapRole_IRK );          VOID osal_snv_write( BLE_NVID_CSRK, KEYLEN, gapRole_SRK );          // Save off the information          VOID osal_memcpy( gapRole_bdAddr, pPkt->devAddr, B_ADDR_LEN );          gapRole_state = GAPROLE_STARTED;          // Update the advertising data          stat = GAP_UpdateAdvertisingData( gapRole_TaskID,                              TRUE, gapRole_AdvertDataLen, gapRole_AdvertData );        }        if ( stat != SUCCESS )        {          gapRole_state = GAPROLE_ERROR;        }        notify = TRUE;      }      break;    case GAP_ADV_DATA_UPDATE_DONE_EVENT:      {        gapAdvDataUpdateEvent_t *pPkt = (gapAdvDataUpdateEvent_t *)pMsg;        if ( pPkt->hdr.status == SUCCESS )        {          if ( pPkt->adType )          {            // Setup the Response Data            pPkt->hdr.status = GAP_UpdateAdvertisingData( gapRole_TaskID,                              FALSE, gapRole_ScanRspDataLen, gapRole_ScanRspData );          }          else          {            // Start advertising            VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT );          }        }        if ( pPkt->hdr.status != SUCCESS )        {          // Set into Error state          gapRole_state = GAPROLE_ERROR;          notify = TRUE;        }      }      break;    case GAP_MAKE_DISCOVERABLE_DONE_EVENT:    case GAP_END_DISCOVERABLE_DONE_EVENT:      {        gapMakeDiscoverableRspEvent_t *pPkt = (gapMakeDiscoverableRspEvent_t *)pMsg;        if ( pPkt->hdr.status == SUCCESS )        {          if ( pMsg->opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT )          {            gapRole_state = GAPROLE_ADVERTISING;          }          else // GAP_END_DISCOVERABLE_DONE_EVENT          {            if ( gapRole_AdvertOffTime != 0 )            {              if ( ( gapRole_AdvEnabled ) )              {                VOID osal_start_timerEx( gapRole_TaskID, START_ADVERTISING_EVT, gapRole_AdvertOffTime );              }            }            else            {              // Since gapRole_AdvertOffTime is set to 0, the device should not              // automatically become discoverable again after a period of time.              // Set enabler to FALSE; device will become discoverable again when              // this value gets set to TRUE              gapRole_AdvEnabled = FALSE;            }            // In the Advertising Off period            gapRole_state = GAPROLE_WAITING;          }        }        else        {          gapRole_state = GAPROLE_ERROR;        }        notify = TRUE;      }      break;    case GAP_LINK_ESTABLISHED_EVENT:      {        gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *)pMsg;        if ( pPkt->hdr.status == SUCCESS )        {          VOID osal_memcpy( gapRole_ConnectedDevAddr, pPkt->devAddr, B_ADDR_LEN );          gapRole_ConnectionHandle = pPkt->connectionHandle;          gapRole_state = GAPROLE_CONNECTED;          if ( gapRole_RSSIReadRate )          {            // Start the RSSI Reads            VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate );          }          // Store connection information          gapRole_ConnInterval = pPkt->connInterval;          gapRole_ConnSlaveLatency = pPkt->connLatency;          gapRole_ConnTimeout = pPkt->connTimeout;          // Check whether update parameter request is enabled          if ( gapRole_ParamUpdateEnable == TRUE )          {            // Get the minimum time upon connection establishment before the             // peripheral can start a connection update procedure.            uint16 timeout = GAP_GetParamValue( TGAP_CONN_PAUSE_PERIPHERAL );            osal_start_timerEx( gapRole_TaskID, START_CONN_UPDATE_EVT, timeout*1000 );          }          // Notify the Bond Manager to the connection          VOID GAPBondMgr_LinkEst( pPkt->devAddrType, pPkt->devAddr, pPkt->connectionHandle, GAP_PROFILE_PERIPHERAL );        }        else if ( pPkt->hdr.status == bleGAPConnNotAcceptable )        {          // Set enabler to FALSE; device will become discoverable again when          // this value gets set to TRUE          gapRole_AdvEnabled = FALSE;          // Go to WAITING state, and then start advertising          gapRole_state = GAPROLE_WAITING;        }        else        {          gapRole_state = GAPROLE_ERROR;        }        notify = TRUE;      }      break;    case GAP_LINK_TERMINATED_EVENT:      {        gapTerminateLinkEvent_t *pPkt = (gapTerminateLinkEvent_t *)pMsg;        GAPBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg );        osal_memset( gapRole_ConnectedDevAddr, 0, B_ADDR_LEN );        // Erase connection information        gapRole_ConnInterval = 0;        gapRole_ConnSlaveLatency = 0;        gapRole_ConnTimeout = 0;        // Cancel all connection parameter update timers (if any active)        VOID osal_stop_timerEx( gapRole_TaskID, START_CONN_UPDATE_EVT );        VOID osal_stop_timerEx( gapRole_TaskID, CONN_PARAM_TIMEOUT_EVT );        // Go to WAITING state, and then start advertising        if( pPkt->reason == LL_SUPERVISION_TIMEOUT_TERM )        {          gapRole_state = GAPROLE_WAITING_AFTER_TIMEOUT;        }        else        {          gapRole_state = GAPROLE_WAITING;        }        notify = TRUE;        VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT );        gapRole_ConnectionHandle = INVALID_CONNHANDLE;      }      break;    case GAP_LINK_PARAM_UPDATE_EVENT:      {        gapLinkUpdateEvent_t *pPkt = (gapLinkUpdateEvent_t *)pMsg;        // Cancel connection param update timeout timer (if active)        VOID osal_stop_timerEx( gapRole_TaskID, CONN_PARAM_TIMEOUT_EVT );        if ( pPkt->hdr.status == SUCCESS )        {          // Store new connection parameters          gapRole_ConnInterval = pPkt->connInterval;          gapRole_ConnSlaveLatency = pPkt->connLatency;          gapRole_ConnTimeout = pPkt->connTimeout;          // Make sure there's no pending connection update procedure          if ( osal_get_timeoutEx( gapRole_TaskID, START_CONN_UPDATE_EVT ) == 0 )          {            // Notify the application with the new connection parameters            if ( pGapRoles_ParamUpdateCB != NULL )            {              (*pGapRoles_ParamUpdateCB)( gapRole_ConnInterval,                                           gapRole_ConnSlaveLatency,                                           gapRole_ConnTimeout );            }          }        }      }      break;    default:      break;  }  if ( notify == TRUE )  {    // Notify the application with the new state change    if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange )    {      pGapRoles_AppCGs->pfnStateChange( gapRole_state );    }  }}

应用场景:需要把mac地址通过蓝牙传输上去的话,gapRole_ConnectedDevAddr可以使用的到。

1 0