Hi,
I'm trying to create a BLE profile for sending sensor data over BLE link. Can you point me in the direction where I can find example for this? Is there a document where i can read on implementing a custom profile?
Regards
Device:
Hi Mutahir,
Eventually, we will have an application note to describe this process - but in the mean time, you could use ble_peripheral located in demos to get you started or pxp reporter. As for a customer service, within SDK 1.0.8, you could reference our serial port service (sps.c) located in the ble_services folder. SPS is a custom service that uses the constructs of the SDKs APIs to create a custom service. Following the flow of the SDK, in the application layer, you use the following two lines to initialize the service:
ble_service_t *svc;
svc = my_service_init(callbacks cb);
ble_service_add(svc);
----------------------------------------------------
You can then follow the flow of the other services from the init functions - from the sps_init function:
ble_service_t *sps_init(sps_callbacks_t *cb)
{
uint16_t num_attr, sps_tx_desc_h, sps_rx_desc_h, sps_flow_ctrl_desc_h;
sp_service_t *sps;
att_uuid_t uuid;
sps = OS_MALLOC(sizeof(*sps));
memset(sps, 0, sizeof(*sps));
num_attr = ble_gatts_get_num_attr(0, 3, 5);
ble_uuid_from_string(UUID_SPS, &uuid);
ble_gatts_add_service(&uuid, GATT_SERVICE_PRIMARY, num_attr);
/* SPS Server TX */
ble_uuid_from_string(UUID_SPS_SERVER_TX, &uuid);
ble_gatts_add_characteristic(&uuid, GATT_PROP_NOTIFY, ATT_PERM_NONE,
sps_server_tx_size, 0, NULL, &sps->sps_tx_val_h);
ble_uuid_create16(UUID_GATT_CLIENT_CHAR_CONFIGURATION, &uuid);
ble_gatts_add_descriptor(&uuid, ATT_PERM_RW, 2, 0, &sps->sps_tx_ccc_h);
ble_uuid_create16(UUID_GATT_CHAR_USER_DESCRIPTION, &uuid);
ble_gatts_add_descriptor(&uuid, ATT_PERM_READ, sizeof(sps_tx_desc), 0, &sps_tx_desc_h);
/* SPS Server RX */
ble_uuid_from_string(UUID_SPS_SERVER_RX, &uuid);
ble_gatts_add_characteristic(&uuid, GATT_PROP_WRITE_NO_RESP, ATT_PERM_WRITE,
sps_server_rx_size, 0, NULL, &sps->sps_rx_val_h);
ble_uuid_create16(UUID_GATT_CHAR_USER_DESCRIPTION, &uuid);
ble_gatts_add_descriptor(&uuid, ATT_PERM_READ, sizeof(sps_rx_desc), 0, &sps_rx_desc_h);
/* SPS Flow Control */
ble_uuid_from_string(UUID_SPS_FLOW_CTRL, &uuid);
ble_gatts_add_characteristic(&uuid, GATT_PROP_WRITE_NO_RESP | GATT_PROP_NOTIFY, ATT_PERM_WRITE,
1, 0, NULL, &sps->sps_flow_ctrl_val_h);
ble_uuid_create16(UUID_GATT_CLIENT_CHAR_CONFIGURATION, &uuid);
ble_gatts_add_descriptor(&uuid, ATT_PERM_RW, 2, 0, &sps->sps_flow_ctrl_ccc_h);
ble_uuid_create16(UUID_GATT_CHAR_USER_DESCRIPTION, &uuid);
ble_gatts_add_descriptor(&uuid, ATT_PERM_READ, sizeof(sps_flow_control_desc), 0, &sps_flow_ctrl_desc_h);
/* Register SPS Service */
ble_gatts_register_service(&sps->svc.start_h, &sps->sps_tx_val_h, &sps->sps_tx_ccc_h,
&sps_tx_desc_h, &sps->sps_rx_val_h, &sps_rx_desc_h,
&sps->sps_flow_ctrl_val_h, &sps->sps_flow_ctrl_ccc_h,
&sps_flow_ctrl_desc_h, 0);
/* Set value of Characteristic Descriptions */
ble_gatts_set_value(sps_tx_desc_h, sizeof(sps_tx_desc), sps_tx_desc);
ble_gatts_set_value (sps_rx_desc_h sizeof (sps_rx_desc), sps_rx_desc);
ble_gatts_set_value(sps_flow_ctrl_desc_h, sizeof(sps_flow_control_desc),
sps_flow_control_desc);
sps - > svc。end_h = sps->svc.start_h + num_attr;
sps - > svc。write_req = handle_write_req;
sps - > svc。read_req = handle_read_req;
sps - > svc。event_sent = handle_event_sent;
sps->cb = cb;
return &sps->svc;
}
Thanks for the extensive reply, much appreciated. Coming back to ble_peripheral how do i modify the my_service to have a readable data value that I can update regularly.
Again, please refer to sps.c (or any of the other ble profiles) for the example. The my_service_init does nothing at this point, but could be modified. You could change the characteristic that is there to GATT_PROP_READ and then register a read callback. Registering the read call back is illustrated on line 287 of sps.c, and setting the value is also illustrated.
/* Set value of Characteristic Descriptions */
ble_gatts_set_value(sps_tx_desc_h, sizeof(sps_tx_desc), sps_tx_desc);
ble_gatts_set_value (sps_rx_desc_h sizeof (sps_rx_desc), sps_rx_desc);
ble_gatts_set_value(sps_flow_ctrl_desc_h, sizeof(sps_flow_control_desc),
sps_flow_control_desc);
sps - > svc。end_h = sps->svc.start_h + num_attr;
sps - > svc。write_req = handle_write_req;
sps - > svc。read_req = handle_read_req;
sps - > svc。event_sent = handle_event_sent;
sps->cb = cb;
return &sps->svc;
thanks really helped