# BLE peripheral

**URL:** <https://forum.amebaiot.com/t/ble-peripheral/1315>\
**Category:** BT\
**Tags:** rtl872xd\
**Created:** [June 21, 2022, 3:24am UTC](https://forum.amebaiot.com/t/ble-peripheral/1315 "2022-06-21T03:24:45Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![EthanZhao](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/ethanzhao/32/917_2.png) [@EthanZhao](https://forum.amebaiot.com/u/EthanZhao)\
**Post date:** [June 21, 2022, 3:24am UTC](https://forum.amebaiot.com/t/ble-peripheral/1315/1 "2022-06-21T03:24:45Z")

</div>

目前在使用 BLE peripheral 的部分，在下完ATBp=1後可以看到打印出來的資訊，請問為什麼我在 pc 端上使用 bluez 的 tool 時，scan 不到此 mac 地址?

 ![image](https://us1.discourse-cdn.com/flex016/uploads/ameba/original/2X/4/4a0a5ba20ad5c0e5e1561350bf821d97d07bbefd.png)

---

<div class="post-metadata">

**Author:** ![wyy](https://avatars.discourse-cdn.com/v4/letter/w/bc8723/32.png) [@wyy](https://forum.amebaiot.com/u/wyy)\
**Post date:** [June 22, 2022, 3:31am UTC](https://forum.amebaiot.com/t/ble-peripheral/1315/2 "2022-06-22T03:31:27Z")

</div>

![Screenshot 2022-06-22 111412](https://us1.discourse-cdn.com/flex016/uploads/ameba/original/2X/6/66bed074f97e88c74361cff6091bfc53354eba06.png)  
 ![Screenshot from 2022-06-22 11-12-51](https://us1.discourse-cdn.com/flex016/uploads/ameba/original/2X/3/3ffbf22f5a2bf4135ca65f0a63fd4acaec0e4beb.png)

我用 ubuntu 18 的 bluez

```auto
sudo bluetoothctl
scan on

```

scan 到了

---

<div class="post-metadata">

**Author:** ![EthanZhao](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/ethanzhao/32/917_2.png) [@EthanZhao](https://forum.amebaiot.com/u/EthanZhao)\
**Post date:** [June 24, 2022, 6:08am UTC](https://forum.amebaiot.com/t/ble-peripheral/1315/3 "2022-06-24T06:08:20Z")

</div>

另想請問，我想使用 BLE peripheral 的一些範例  
在下了 ATBp = 1後，在PC端上(central) 已可connect到 rtl8712dm  
請問如果要讓 cenrral 與 peripheral間傳遞資料的話  
我該從 SDK 的哪些 example 開始參考?  
謝謝

---

<div class="post-metadata">

**Author:** ![wyy](https://avatars.discourse-cdn.com/v4/letter/w/bc8723/32.png) [@wyy](https://forum.amebaiot.com/u/wyy)\
**Post date:** [June 25, 2022, 7:38pm UTC](https://forum.amebaiot.com/t/ble-peripheral/1315/4 "2022-06-25T19:38:23Z")

</div>

BLE 的 example 文件在 `\component\common\bluetooth\realtek\sdk\example`  
ATBp 启动的是 peripheral 的 example，用的是 BAS service 和 simple BLE service。  
Service 的代码文件在 :

- `\component\common\bluetooth\realtek\sdk\src\ble\profile\server`
- `\component\common\bluetooth\realtek\sdk\inc\bluetooth\profile\server`

想要 central 和 peripheral 传数据，需要在 central 上读取 GATT attributes，找到 service 和 characteristic 相对应的 UUID，然后更改某一个 characteristic 数据值。

---

<div class="post-metadata">

**Author:** ![EthanZhao](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/ethanzhao/32/917_2.png) [@EthanZhao](https://forum.amebaiot.com/u/EthanZhao)\
**Post date:** [June 29, 2022, 2:02am UTC](https://forum.amebaiot.com/t/ble-peripheral/1315/5 "2022-06-29T02:02:13Z")

</div>

好的，謝謝~  
我想將 Ameba 在 peripheral mode被 scan 到的名字(目前是 BLE\_PERIPHERAL)  
但在整個SDK裡搜尋後找不太到  
請問我該從哪裡改?

---

<div class="post-metadata">

**Author:** ![wyy](https://avatars.discourse-cdn.com/v4/letter/w/bc8723/32.png) [@wyy](https://forum.amebaiot.com/u/wyy)\
**Post date:** [June 29, 2022, 10:02am UTC](https://forum.amebaiot.com/t/ble-peripheral/1315/6 "2022-06-29T10:02:10Z")

</div>

`\component\common\bluetooth\realtek\sdk\example\ble_peripheral\ble_app_main.c`  
BLE 有两个地方可以改名字

1. Scan 到的名字，也就是 BLE ADV 蓝牙广告数据里的名字，需要改蓝牙广告数据

```auto
static const uint8_t adv_data[] =
{
    /* Flags */
    0x02, /* length */
    GAP_ADTYPE_FLAGS, /* type="Flags" */
    GAP_ADTYPE_FLAGS_LIMITED | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
    /* Service */
    0x03, /* length */
    GAP_ADTYPE_16BIT_COMPLETE,
    LO_WORD(GATT_UUID_SIMPLE_PROFILE),
    HI_WORD(GATT_UUID_SIMPLE_PROFILE),
    /* Local name */
    0x0F, /* length */
    GAP_ADTYPE_LOCAL_NAME_COMPLETE,
    'B', 'L', 'E', '_', 'P', 'E', 'R', 'I', 'P', 'H', 'E', 'R', 'A', 'L',
};

```

1. 链接后能看到的 device name，在这里改

```auto
void app_le_gap_init(void)
{
    /* Device name and device appearance */
    uint8_t device_name[GAP_DEVICE_NAME_LEN] = "BLE_PERIPHERAL";
    uint16_t appearance = GAP_GATT_APPEARANCE_UNKNOWN;
    uint8_t slave_init_mtu_req = false;

    /* Advertising parameters */
    uint8_t adv_evt_type = GAP_ADTYPE_ADV_IND;
    uint8_t adv_direct_type = GAP_REMOTE_ADDR_LE_PUBLIC;
    uint8_t adv_direct_addr[GAP_BD_ADDR_LEN] = {0};
    uint8_t adv_chann_map = GAP_ADVCHAN_ALL;
    uint8_t adv_filter_policy = GAP_ADV_FILTER_ANY;
    uint16_t adv_int_min = DEFAULT_ADVERTISING_INTERVAL_MIN;
    uint16_t adv_int_max = DEFAULT_ADVERTISING_INTERVAL_MAX;

    /* GAP Bond Manager parameters */
    uint8_t auth_pair_mode = GAP_PAIRING_MODE_PAIRABLE;
    uint16_t auth_flags = GAP_AUTHEN_BIT_BONDING_FLAG;
    uint8_t auth_io_cap = GAP_IO_CAP_NO_INPUT_NO_OUTPUT;
#if F_BT_LE_SMP_OOB_SUPPORT
    uint8_t auth_oob = false;
#endif
    uint8_t auth_use_fix_passkey = false;
    uint32_t auth_fix_passkey = 0;
    uint8_t auth_sec_req_enable = false;
    uint16_t auth_sec_req_flags = GAP_AUTHEN_BIT_BONDING_FLAG;

    /* Set device name and device appearance */
    le_set_gap_param(GAP_PARAM_DEVICE_NAME, GAP_DEVICE_NAME_LEN, device_name);
    le_set_gap_param(GAP_PARAM_APPEARANCE, sizeof(appearance), &appearance);
    le_set_gap_param(GAP_PARAM_SLAVE_INIT_GATT_MTU_REQ, sizeof(slave_init_mtu_req),
                     &slave_init_mtu_req);

    /* Set advertising parameters */
    le_adv_set_param(GAP_PARAM_ADV_EVENT_TYPE, sizeof(adv_evt_type), &adv_evt_type);
    le_adv_set_param(GAP_PARAM_ADV_DIRECT_ADDR_TYPE, sizeof(adv_direct_type), &adv_direct_type);
    le_adv_set_param(GAP_PARAM_ADV_DIRECT_ADDR, sizeof(adv_direct_addr), adv_direct_addr);
    le_adv_set_param(GAP_PARAM_ADV_CHANNEL_MAP, sizeof(adv_chann_map), &adv_chann_map);
    le_adv_set_param(GAP_PARAM_ADV_FILTER_POLICY, sizeof(adv_filter_policy), &adv_filter_policy);
    le_adv_set_param(GAP_PARAM_ADV_INTERVAL_MIN, sizeof(adv_int_min), &adv_int_min);
    le_adv_set_param(GAP_PARAM_ADV_INTERVAL_MAX, sizeof(adv_int_max), &adv_int_max);
    le_adv_set_param(GAP_PARAM_ADV_DATA, sizeof(adv_data), (void *)adv_data);
    le_adv_set_param(GAP_PARAM_SCAN_RSP_DATA, sizeof(scan_rsp_data), (void *)scan_rsp_data);

    /* Setup the GAP Bond Manager */
    gap_set_param(GAP_PARAM_BOND_PAIRING_MODE, sizeof(auth_pair_mode), &auth_pair_mode);
    gap_set_param(GAP_PARAM_BOND_AUTHEN_REQUIREMENTS_FLAGS, sizeof(auth_flags), &auth_flags);
    gap_set_param(GAP_PARAM_BOND_IO_CAPABILITIES, sizeof(auth_io_cap), &auth_io_cap);
#if F_BT_LE_SMP_OOB_SUPPORT
    gap_set_param(GAP_PARAM_BOND_OOB_ENABLED, sizeof(auth_oob), &auth_oob);
#endif
    le_bond_set_param(GAP_PARAM_BOND_FIXED_PASSKEY, sizeof(auth_fix_passkey), &auth_fix_passkey);
    le_bond_set_param(GAP_PARAM_BOND_FIXED_PASSKEY_ENABLE, sizeof(auth_use_fix_passkey),
                      &auth_use_fix_passkey);
    le_bond_set_param(GAP_PARAM_BOND_SEC_REQ_ENABLE, sizeof(auth_sec_req_enable), &auth_sec_req_enable);
    le_bond_set_param(GAP_PARAM_BOND_SEC_REQ_REQUIREMENT, sizeof(auth_sec_req_flags),
                      &auth_sec_req_flags);

    /* register gap message callback */
    le_register_app_cb(app_gap_callback);
}

```

---

<div class="post-metadata">

**Author:** ![EthanZhao](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/ethanzhao/32/917_2.png) [@EthanZhao](https://forum.amebaiot.com/u/EthanZhao)\
**Post date:** [July 6, 2022, 2:34am UTC](https://forum.amebaiot.com/t/ble-peripheral/1315/7 "2022-07-06T02:34:54Z")

</div>

Hi,  
目前在使用 BLE peripheral 的部分遇到點問題  
在 \component\common\bluetooth\realtek\sdk\src\ble\profile\server\simple\_ble\_service.c

 ![simple_ble_service_attr_read_cb](https://us1.discourse-cdn.com/flex016/uploads/ameba/original/2X/0/0dbfca027a8d84fd5de471d179d21df471e8ab77.png)  
請問上圖紅底線的參數是從哪裡提供的?  
我知道在下圖的 server\_add\_service裡有導入  
simple\_ble\_service\_tbl 的 function pointer struct  
 ![simp_ble_service_add_service](https://us1.discourse-cdn.com/flex016/uploads/ameba/original/2X/c/c9a97cbe00a632990be3c37e0413a31af3f9c3d9.png)  
但卻找不到圖一紅底線的參數是從哪裡導入的

---

<div class="post-metadata">

**Author:** ![EthanZhao](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/ethanzhao/32/917_2.png) [@EthanZhao](https://forum.amebaiot.com/u/EthanZhao)\
**Post date:** [July 6, 2022, 6:45am UTC](https://forum.amebaiot.com/t/ble-peripheral/1315/8 "2022-07-06T06:45:18Z")

</div>

另外想請問  
我想不透過AT Command來啟動 BLE peripheral  
因此我把ATBp = 1 裡有關的function都拉到 main  
為什麼開機後卻只會有下列的畫面  
 ![image](https://us1.discourse-cdn.com/flex016/uploads/ameba/original/2X/d/d27b711889d2b4c390266b849ede89b6f6e01073.png)

---

<div class="post-metadata">

**Author:** ![wyy](https://avatars.discourse-cdn.com/v4/letter/w/bc8723/32.png) [@wyy](https://forum.amebaiot.com/u/wyy)\
**Post date:** [July 6, 2022, 9:49am UTC](https://forum.amebaiot.com/t/ble-peripheral/1315/9 "2022-07-06T09:49:25Z")

</div>

> [@EthanZhao](#):
>
> 找不到圖一紅底線的參數是從哪裡導入的

是底层 BLE driver stack 提供的，BLE driver 收到 read request 时，attrib\_index 就是想要读的 attribute

> [@EthanZhao](#):
>
> 我想不透過AT Command來啟動 BLE peripheral  
> 因此我把ATBp = 1 裡有關的function都拉到 main

开启 BLE 前必须先开启 wifi，因为 BLE 和 wifi 共用 RF，wifi 还有 RF 的主控权

你也可以参考一下 Arduino 里面的 [BLE](https://github.com/ambiot/ambd_arduino/blob/dev/Arduino_package/hardware/libraries/BLE/src/BLEDevice.cpp)。

---

<div class="post-metadata">

**Author:** ![EthanZhao](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/ethanzhao/32/917_2.png) [@EthanZhao](https://forum.amebaiot.com/u/EthanZhao)\
**Post date:** [July 7, 2022, 6:13am UTC](https://forum.amebaiot.com/t/ble-peripheral/1315/10 "2022-07-07T06:13:53Z")

</div>

Hi wxxy,  
那請問我在 peripheral 可以開兩個 read 的 characteristics 嗎?  
因為我目前開了兩個 read characteristics ，但因為 attrib\_index是由 BLE Driver所提供的  
所以另一個 read service 無法被執行

---

<div class="post-metadata">

**Author:** ![wyy](https://avatars.discourse-cdn.com/v4/letter/w/bc8723/32.png) [@wyy](https://forum.amebaiot.com/u/wyy)\
**Post date:** [July 8, 2022, 2:03am UTC](https://forum.amebaiot.com/t/ble-peripheral/1315/11 "2022-07-08T02:03:11Z")

</div>

```auto
const T_FUN_GATT_SERVICE_CBS simp_ble_service_cbs =
{
    simp_ble_service_attr_read_cb, // Read callback function pointer
    simp_ble_service_attr_write_cb, // Write callback function pointer
    simp_ble_service_cccd_update_cb // CCCD update callback function pointer
};

```

characteristic read/write 数量无限制，但是只能有一个 read\_cb，read\_cb 里面必须按照 `attrib_index` 选择相对应的 characteristic 进行读写操作。

```auto
#define SIMPLE_BLE_SERVICE_CHAR_V1_READ_INDEX 0x02
#define SIMPLE_BLE_SERVICE_CHAR_V2_WRITE_INDEX 0x05
#define SIMPLE_BLE_SERVICE_CHAR_V3_NOTIFY_INDEX 0x07
#define SIMPLE_BLE_SERVICE_CHAR_V4_INDICATE_INDEX 0x0a
#define SIMPLE_BLE_SERVICE_CHAR_NOTIFY_CCCD_INDEX (SIMPLE_BLE_SERVICE_CHAR_V3_NOTIFY_INDEX + 1)
#define SIMPLE_BLE_SERVICE_CHAR_INDICATE_CCCD_INDEX (SIMPLE_BLE_SERVICE_CHAR_V4_INDICATE_INDEX + 1)

```

attrib\_index 是从 `simple_ble_service_tbl` 里面第一个 service attribute 为 0x00 开始算，原本 `GATT_UUID_CHAR_SIMPLE_V1_READ` 是第三个 attribute，所以 index 为 0x02。

---

<div class="post-metadata">

**Author:** ![EthanZhao](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/ethanzhao/32/917_2.png) [@EthanZhao](https://forum.amebaiot.com/u/EthanZhao)\
**Post date:** [July 8, 2022, 2:23am UTC](https://forum.amebaiot.com/t/ble-peripheral/1315/12 "2022-07-08T02:23:08Z")

</div>

Hi wyy,  
謝謝~ 這問題卡住我好一陣子了
