2025-08-18 12:03 PM
Hello,
I have custom hardware with a WB55 on it that I'm trying to use as a client, I've chosen the P2PClient profile for this board.
I also have a Nucleo-WB55 board that is configured as my server, Server Profile with a Custom Template. The custom template has one characteristic that is a variable length CHAR_PROP_NOTIFY.
Modifying the app_ble.c and I can successfully connect to the Nucleo-WB55 board using the full name as can be seen in the code below.
/* search AD TYPE 0x09 (Complete Local Name) */
/* search AD Type 0x02 (16 bits UUIDS) */
if (event_type == ADV_IND)
{
/* ISOLATION OF BD ADDRESS AND LOCAL NAME */
while(k < event_data_size)
{
adlength = adv_report_data[k];
adtype = adv_report_data[k + 1];
switch (adtype)
{
case AD_TYPE_FLAGS: /* now get flags */
/* USER CODE BEGIN AD_TYPE_FLAGS */
/* USER CODE END AD_TYPE_FLAGS */
break;
case AD_TYPE_TX_POWER_LEVEL: /* Tx power level */
/* USER CODE BEGIN AD_TYPE_TX_POWER_LEVEL */
//int RSSI = (int8_t)*(uint8_t*) (adv_report_data + le_advertising_event->Advertising_Report[0].Length_Data);
/* USER CODE END AD_TYPE_TX_POWER_LEVEL */
break;
case AD_TYPE_MANUFACTURER_SPECIFIC_DATA: /* Manufacturer Specific */
/* USER CODE BEGIN AD_TYPE_MANUFACTURER_SPECIFIC_DATA */
/* USER CODE END AD_TYPE_MANUFACTURER_SPECIFIC_DATA */
if (adlength >= 7 && adv_report_data[k + 2] == 0x01)
{ /* ST VERSION ID 01 */
APP_DBG_MSG("--- ST MANUFACTURER ID --- \n\r");
switch (adv_report_data[k + 3])
{ /* Demo ID */
case CFG_DEV_ID_P2P_SERVER1: /* End Device 1 */
APP_DBG_MSG("-- SERVER DETECTED -- VIA MAN ID\n\r");
BleApplicationContext.DeviceServerFound = 0x01;
SERVER_REMOTE_ADDR_TYPE = le_advertising_event->Advertising_Report[0].Address_Type;
SERVER_REMOTE_BDADDR[0] = le_advertising_event->Advertising_Report[0].Address[0];
SERVER_REMOTE_BDADDR[1] = le_advertising_event->Advertising_Report[0].Address[1];
SERVER_REMOTE_BDADDR[2] = le_advertising_event->Advertising_Report[0].Address[2];
SERVER_REMOTE_BDADDR[3] = le_advertising_event->Advertising_Report[0].Address[3];
SERVER_REMOTE_BDADDR[4] = le_advertising_event->Advertising_Report[0].Address[4];
SERVER_REMOTE_BDADDR[5] = le_advertising_event->Advertising_Report[0].Address[5];
break;
default:
break;
}
}
break;
case AD_TYPE_SERVICE_DATA: /* service data 16 bits */
/* USER CODE BEGIN AD_TYPE_SERVICE_DATA */
/* USER CODE END AD_TYPE_SERVICE_DATA */
break;
default:
/* USER CODE BEGIN adtype_default */
case AD_TYPE_COMPLETE_LOCAL_NAME:
{
char name[adlength];
for(int i = 0; i < adlength; i++)
{
name[i] = adv_report_data[k + 2 + i];
}
if (strstr(name, "My Custom Service") != NULL || strstr(name, "my custom service") != NULL)
{
BleApplicationContext.DeviceServerFound = 0x01;
SERVER_REMOTE_ADDR_TYPE = le_advertising_event->Advertising_Report[0].Address_Type;
SERVER_REMOTE_BDADDR[0] = le_advertising_event->Advertising_Report[0].Address[0];
SERVER_REMOTE_BDADDR[1] = le_advertising_event->Advertising_Report[0].Address[1];
SERVER_REMOTE_BDADDR[2] = le_advertising_event->Advertising_Report[0].Address[2];
SERVER_REMOTE_BDADDR[3] = le_advertising_event->Advertising_Report[0].Address[3];
SERVER_REMOTE_BDADDR[4] = le_advertising_event->Advertising_Report[0].Address[4];
SERVER_REMOTE_BDADDR[5] = le_advertising_event->Advertising_Report[0].Address[5];
}
break;
}
/* USER CODE END adtype_default */
break;
} /* end switch adtype */
k += adlength + 1;
} /* end while */
} /* end if ADV_IND */
I set the DeviceServerFound and the SERVER_REMOTE_BDADDR values just like the case AD_TYPE_MANUFACTURER_SPECIFIC_DATA does.
While debugging the code, I expect the p2p_client_app.c Update_Service to be called so the characteristics can be found. But in the following code, the aP2PClientContext[index].connHandle == 0, thus never setting the task.
case ACI_GATT_PROC_COMPLETE_VSEVT_CODE:
{
aci_gatt_proc_complete_event_rp0 *pr = (void*)blecore_evt->data;
#if(CFG_DEBUG_APP_TRACE != 0)
APP_DBG_MSG("-- GATT : ACI_GATT_PROC_COMPLETE_VSEVT_CODE \n");
APP_DBG_MSG("\n");
#endif
uint8_t index;
index = 0;
while((index < BLE_CFG_CLT_MAX_NBR_CB) && (aP2PClientContext[index].connHandle != pr->Connection_Handle))
index++;
if(index < BLE_CFG_CLT_MAX_NBR_CB)
{
UTIL_SEQ_SetTask( 1<<CFG_TASK_SEARCH_SERVICE_ID, CFG_SCH_PRIO_0);
}
}
I can't figure out where the aP2PClientContext[index].connHandle is being set or what I'm missing to get a handle to my notify characteristic and turning it on to collect data from the Nucleo-WB55.
Any help would be greatly appreciated.
Kindest regards.