TIwilliam hill官网
直播中

h1654155275.5684

7年用户 174经验值
私信 关注
[问答]

主机查找从机服务UUID,API调用

各位好:
   本人初次接触BLE,很多基础东西不太明白,最近在搞主机和从机连接的DEMO,主机和从机用的都是ti官方的keyfob板,从机下载的是官方给的keyfob代码,主机用的SimpleBLECentral代码,在主机里添加了keyfob端的服务UUID,但keyfob广播包里发送了3个服务UUID:
// Proximity Profile Service UUIDs
//#define LINK_LOSS_SERVICE_UUID 0x1803
//#define IMMEDIATE_ALERT_SERVICE_UUID 0x1802
//#define TX_PWR_LEVEL_SERVICE_UUID 0x1804
我在Central代码里添加了LINK_LOSS_SERVICE_UUID如下:
static void simpleBLECentralStartDiscovery( void )
[
uint8 uuid[ATT_BT_UUID_SIZE] = [ LO_UINT16( LINK_LOSS_SERVICE_UUID ), // Link Loss Service (Proximity Profile)
HI_UINT16( LINK_LOSS_SERVICE_UUID ) ];
.....]
主机怎样通过服务UUID查找到从机的,这个流程哪里有说明??
接下来我又分别添加从机另外两个服务UUID,主机都能查找到从机,主机通过这三个UUID查找从机有没有区别,handle分配是不是不同??
稍微修改下按键,主机已经能和从机连接,但是我想让主机向从机写数据,把keyfob的报警功能打开,我在GATT查找函数加了个写入函数,但是有错:
static void simpleBLEGATTDiscoveryEvent( gattMsgEvent_t *pMsg )
[
attReadByTypeReq_t req_LLAlertLevel;
req_LLAlertLevel.handle = LLAlertLevelHdl;
req_LLAlertLevel.len = 1;
req_LLAlertLevel.value[0] = PP_ALERT_LEVEL_HIGH;
req_LLAlertLevel.sig = 0;
req_LLAlertLevel.cmd = 0;
GATT_WriteCharValue( simpleBLEConnHandle, *req_LLAlertLevel, simpleBLETaskId );
写入时必须要操作的handle才可以吗,主机读写有没有什么范例代码可以参考??API上说明好像不是很清楚

回帖(3)

凌云志

2018-6-21 18:31:10
写操作需要handle.其实simpleBLEGATTDiscoveryEvent的例子中的处理很清晰啊,只是这里是读取的是SIMPLEPROFILE_CHAR1_UUID。
发现完成就开始获得相应的UUID的handle.如下例子。 而读写操作在simpleBLECentral_HandleKeys里也有。调用的GATT_WriteCharValue()和
GATT_ReadCharValue().
    // 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;

    
  ]
                                                                          
举报

张娟

2018-6-21 18:47:34
@ethan
       您好。
       请问,是不是处于Broadcast的设备的广播信息和处于Peripheral的设备广播时候的信息有所不同啊??
      要怎么区分嘞??

     还有一个就是,请问一下,知不知道cc2540能不能在主和从模式之间切换。
举报

何羽衣

2018-6-21 19:00:56
引用: shenzhenqide 发表于 2018-6-21 18:31
写操作需要handle.其实simpleBLEGATTDiscoveryEvent的例子中的处理很清晰啊,只是这里是读取的是SIMPLEPROFILE_CHAR1_UUID。
发现完成就开始获得相应的UUID的handle.如下例子。 而读写操作在simpleBLECentral_HandleKeys里也有。调用的GATT_WriteCharValue()和
GATT_ReadCharValue().

请教下,如何使用GATT_ReadCharValue(). 获得数据呢? 他获得的值在什么地方返回?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分