###### tags: `micro`
# Doubts / Duvidas
## ESP32 / ExpressIf
> [CS]
> painlessmesh BLE LINK ???
> https://github.com/fermuch/esp32-painlessmesh-ble-boilerplate
### Zephyr support ESP32 Bluetooth Mesh?
- best choice? maybe not
### FreeRTOS?
- most used with ESP32
### Friendship
- No examples of ESP32
- No information about functions ()
>[CS]
>friend link espressif
>https://github.com/espressif/esp-idf/blob/master/components/bt/esp_ble_mesh/mesh_core/friend.c
> [RF]
> - aslkghaslkh
> -
### RPI
- nordic example / BluePi
- exemplo: ...
>[CS]
> link discussion
> https://devzone.nordicsemi.com/nordic/nordic-blog/b/blog/posts/nordic-thingy52-raspberry-pi-python-interface
>[CS]
>Python Bluez Mesh ?????
>https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/test/test-mesh
### Bluetooth Mesh ESP32
- Not able to send "strings", only "0" and "1"
[EE]
#### Descobertas com GATT
Enviar uma mensagem (string) para o servidor GATT
(esp/esp-idf/examples/bluetooth/bluedroid/ble/gatt_client/main/gattc_demo.c)
```
if (p_data->write.status != ESP_GATT_OK){
ESP_LOGE(GATTC_TAG, "write descr failed, error status = %x", p_data->write.status);
break;
}
ESP_LOGI(GATTC_TAG, "write descr success ");
uint8_t write_char_data[5]; //array com 5 posições
write_char_data[0] = 0x74; //char: t
write_char_data[1] = 0x65; //char: e
write_char_data[2] = 0x73; //char: s
write_char_data[3] = 0x74; //char: t
write_char_data[4] = 0x65; //char: e
esp_ble_gattc_write_char( gattc_if,
gl_profile_tab[PROFILE_A_APP_ID].conn_id,
gl_profile_tab[PROFILE_A_APP_ID].char_handle,
sizeof(write_char_data),
write_char_data,
ESP_GATT_WRITE_TYPE_RSP,
ESP_GATT_AUTH_REQ_NONE);
```
E o servidor recebe 0x74, 0x65...
Já no (esp/esp-idf/examples/bluetooth/bluedroid/ble/gatt_server/main/gatts_demo.c)
```
case ESP_GATTS_WRITE_EVT: {
ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, conn_id %d, trans_id %d, handle %d", param->write.conn_id, param->write.trans_id, param->write.handle);
if (!param->write.is_prep){
ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, value len %d, value :", param->write.len);
lerComandoHex(param->write.value, param->write.len);
...
```
Onde a função lerComandoHex tem dois parâmetros apesar de só precisar de um nesta fase de testes (Seria necessário so dois caso fossemos usar um loop usando o tamanho do array):
```
static void lerComandoHex(uint8_t *param, uint16_t len){
printf("%s\n", (char*)param);
}
```
Desta forma conseguimos ler como string e em princípio interpretar os comandos
# Who is who?
[RF] - Rui Fernandes
[CS] - Cristiano Silva
[EE] - Eduardo Ervideira