2022-03-21 03:55 AM
I try to read the data from BlueNRG-M2SP on an android application. For that with my STM32 I send to the UART a "u". On the application, I scan the services and Characteristic and I only find a write Characteristic but no read Characteristic, and I can't find in the documentation (https://www.st.com/resource/en/programming_manual/dm00294449-bluenrg-1-bluenrg-2-ble-stack-v2-x-programming-guidelines-stmicroelectronics.pdf ) how to have a read Characteristic on the custome service.
i use the code exemple BLE chat Server that can find on the BlueNRG-1 Navigator
On the code exemple i find some UUID but that doesn't work when i try to read data from the STM32
2022-03-22 12:47 AM
Please refer to BLE_SensorDemo sample project.
As for PM2057, please check section 3.2 Services and characteristic configuration
2022-03-22 03:25 AM
Thanks for your reply @Winfred LU, I changed the feature property to notify and read, and added some code from the sensor demo, but I can't read the data from my STM32, and now when I try to read, it automatically disconnects.There the code where i set my service and characteristic:
gatt_db.c
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "ble_const.h"
#include "bluenrg1_stack.h"
#include "osal.h"
#include "app_state.h"
#include "SDK_EVAL_Config.h"
#include "chat.h"
#if DEBUG
#include <stdio.h>
#define PRINTF(...) printf(__VA_ARGS__)
#else
#define PRINTF(...)
#endif
uint16_t chatServHandle, TXCharHandle, RXCharHandle;
extern uint16_t connection_handle;
/* UUIDs */
Service_UUID_t service_uuid;
Char_UUID_t char_uuid;
/*******************************************************************************
* Function Name : Add_Chat_Service
* Description : Add the Chat service.
* Input : None
* Return : Status.
*******************************************************************************/
uint8_t Add_Chat_Service(void)
{
uint8_t ret;
/*
UUIDs:
D973F2E0-B19E-11E2-9E96-0800200C9A66
D973F2E1-B19E-11E2-9E96-0800200C9A66
D973F2E2-B19E-11E2-9E96-0800200C9A66
*/
const uint8_t uuid[16] = {0x66,0x9a,0x0c,0x20,0x00,0x08,0x96,0x9e,0xe2,0x11,0x9e,0xb1,0xe0,0xf2,0x73,0xd9};
const uint8_t charUuidTX[16] = {0x66,0x9a,0x0c,0x20,0x00,0x08,0x96,0x9e,0xe2,0x11,0x9e,0xb1,0xe1,0xf2,0x73,0xd9};
const uint8_t charUuidRX[16] = {0x66,0x9a,0x0c,0x20,0x00,0x08,0x96,0x9e,0xe2,0x11,0x9e,0xb1,0xe2,0xf2,0x73,0xd9};
Osal_MemCpy(&service_uuid.Service_UUID_128, uuid, 16);
ret = aci_gatt_add_service(UUID_TYPE_128, &service_uuid, PRIMARY_SERVICE, 6, &chatServHandle);
if (ret != BLE_STATUS_SUCCESS) goto fail;
Osal_MemCpy(&char_uuid.Char_UUID_128, charUuidTX, 16);
ret = aci_gatt_add_char(chatServHandle, UUID_TYPE_128, &char_uuid, 20, CHAR_PROP_NOTIFY|CHAR_PROP_READ, ATTR_PERMISSION_NONE, GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP,
16, 1, &TXCharHandle);
if (ret != BLE_STATUS_SUCCESS) goto fail;
Osal_MemCpy(&char_uuid.Char_UUID_128, charUuidRX, 16);
ret = aci_gatt_add_char(chatServHandle, UUID_TYPE_128, &char_uuid, 20, CHAR_PROP_WRITE|CHAR_PROP_WRITE_WITHOUT_RESP, ATTR_PERMISSION_NONE, GATT_NOTIFY_ATTRIBUTE_WRITE,
16, 1, &RXCharHandle);
if (ret != BLE_STATUS_SUCCESS) goto fail;
printf("Chat Service added.\nTX Char Handle %04X, RX Char Handle %04X\n", TXCharHandle, RXCharHandle);
return BLE_STATUS_SUCCESS;
fail:
printf("Error while adding Chat service.\n");
return BLE_STATUS_ERROR ;
}
/*******************************************************************************
* Function Name : Attribute_Modified_CB
* Description : Callback when RX/TX attribute handle is modified.
* Input : Handle of the characteristic modified. Handle of the attribute
* modified and data written
* Return : None.
*******************************************************************************/
void Attribute_Modified_CB(uint16_t handle, uint16_t data_length, uint8_t *att_data)
{
if(handle == RXCharHandle + 1)
{
for(int i = 0; i < data_length; i++)
printf("%c", att_data[i]);
}
else if(handle == TXCharHandle + 2)
{
if(att_data[0] == 0x01)
APP_FLAG_SET(NOTIFICATIONS_ENABLED);
}
}
tBleStatus Free_Fall_Notification(void){
uint8_t val;
tBleStatus ret;
val = 0x01;
ret = aci_gatt_update_char_value_ext(connection_handle, chatServHandle, TXCharHandle, 1, 6, 0, 6, &val);
if(ret != BLE_STATUS_SUCCESS){
PRINTF("Error while updating Free Fall characteristic: 0x%02X\n",ret);
return BLE_STATUS_ERROR;
}
return BLE_STATUS_SUCCESS;
}
tBleStatus SensorUpdate(void){
uint8_t buff[6];
tBleStatus ret;
ret = aci_gatt_update_char_value_ext(connection_handle, chatServHandle , TXCharHandle, 1, 6, 0, 6, buff);
if (ret != BLE_STATUS_SUCCESS) {
PRINTF("Error while updating Sensor characteristic: 0x%02X\n", ret);
return BLE_STATUS_ERROR;
}
return BLE_STATUS_SUCCESS;
}
2022-03-22 06:42 PM
Please check for the return code and events on the BlueNRG-M2 side, which will provide more clues.
My guess would be that you set the GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP, but in the application you did not give permission to the read command.
Try to use GATT_DONT_NOTIFY_EVENTS instead.
2022-03-23 12:49 AM
Ok now, the application doesn't disconnect when I read but I'm still not able to read what my STM32 sends, I get a long 0x00.
2022-03-23 01:05 AM
I tested with STEVAL-IDB007 which worked properly.
If you would like to read whatever was written previously, it is supposed to write to and read from the same attribute with both read and write permission.
2022-03-23 01:09 AM
I don't want to read what has been read before, my STM32 will continuously send data and I only want to read this data that the BLE receives in real time to display it in my application.@Winfred LU
2022-03-23 05:36 AM
I don't want to read what has been read before, my STM32 will continuously send data and I only want to read this data that the BLE receives in real time to display it in my application.@Winfred LU (ST Employee)
2022-03-25 12:40 AM
Please clarify your environment, if i understand correctly :
If my understanding is correct, please modify the attribute with aci_gatt_update_char_value_ext() ACI, as suggested in the sample project. In your posted code, SensorUpdate() function.
2022-03-25 02:41 AM
my environment is simple the next
I managed to get the "u" on the notification (the solution was to add the end character CR+LF).
The problem is that the BLE doesn't want to read an int without an end character and I can't do like a printf because it won't read the variable a and will return 0 and the end character
int a = 10;
HAL_UART_Transmit_IT(&hlpuart1, (a, '\r\n') , sizeof((a, '\r\n')));
And what should I change in the attribute?
tBleStatus SensorUpdate(void){
uint8_t buff[6];
tBleStatus ret;
ret = aci_gatt_update_char_value_ext(connection_handle, chatServHandle , TXCharHandle, 1, 6, 0, 6, &buff);
if (ret != BLE_STATUS_SUCCESS) {
PRINTF("Error while updating Sensor characteristic: 0x%02X\n", ret);
return BLE_STATUS_ERROR;
}
return BLE_STATUS_SUCCESS;
}