This blog post discusses implementation of BLE Proximity Profile in CYW20719 and CYW20735 using the Bluetooth Designer tool of WICED Studio SDK.

Requirment:

Tool: WICED studio 6.2, Serial Terminal (Example: TeraTerm, CoolTerm)

Programming Language: C

Associated Parts: CYW20719 / CYW20735

Related Hardware: CYW920719Q40EVB_01 Board (1 or 2) / CYW920735Q60EVB_01 (1 or 2)

Proximity Profile:

The purpose of proximity profile is to keep an eye on the BLE Connection link between two devices and trigger an alert when the link is weakened as path loss increases. This profile supports two roles:

  1. Proximity Server (Reporter)
  2. Proximity Client (Monitor)

The proximity profile must include the Link Loss Service. It may optionally include Tx Power Service and Immediate alert service also. Link Loss Service:  The GATT DB of the link loss service has the “Alert Level” characteristic which may be written by the proximity client. This indicates the level of alert to be triggered in the server when the disconnection happens.Tx power Service:  The proximity client may anytime know the Transmitter Power level of the server. This is enabled by reading the Tx Power level characteristic included in the Tx power service.Immediate Alert Service:  The proximity monitor may keep calculating the path loss as follows:

 

Path Loss = Tx Power Level – RSSI

 

If the path loss exceeds a certain threshold, the monitor may write the Alert Level characteristic of the IAS, thereby prompting the user to perform appropriate action to avoid disconnection.

Block Diagram:


Using the Bluetooth Designer to generate Proximity Server project:

We can use the Bluetooth Designer in WICED Studio SDK to generate the GATT DB and an outline code for the firmware. For more details on using the Bluetooth Designer, refer to the Bluetooth Designer Guide in WICED Studio SDK. The GATT DB of the Proximity Server has 3 different services. It is easy to generate the GATT DB and a skeleton code using the Bluetooth Designer Tool. (For more details on the Bluetooth Designer tool, please refer the user guide which can be accessed in the WICED Studio from Project Explorer -> <Platform> -> Doc

  1. In the WICED Studio SDK, go to File -> New -> WICED Bluetooth Designer. Enter the device name as “ProximityServer”, mode as Single Mode LE.
  2. Check the GATT DB enabled option Click Next.
  3. Using the “Add Service” Option, different services are selected.
  4. Add the characteristics as shown above and click “Generate Code” to obtain the skeleton project.


Firmware:This example contains two projects – The proximity server and the proximity client. Proximity Server:  A skeleton code of the proximity server can be generated using the above steps. Certain key features need to be added to the skeleton code to make the server project complete. According to the specification, a proximity reporter has to advertise with the UUID of Link Loss Service. So, the advertisement data should be modified as follows

 

:/* Set Advertisement Data */

void proximityserver_set_advertisement_data( void )

{    wiced_bt_ble_advert_elem_t adv_elem[3] = { 0 };

    uint8_t adv_flag = BTM_BLE_GENERAL_DISCOVERABLE_FLAG | BTM_BLE_BREDR_NOT_SUPPORTED;

    uint8_t num_elem = 0;
    /* Advertisement Element for Flags */ 

    adv_elem[num_elem].advert_type = BTM_BLE_ADVERT_TYPE_FLAG;

    adv_elem[num_elem].len = sizeof(uint8_t);

    adv_elem[num_elem].p_data = &adv_flag;

    num_elem++;


    adv_elem[num_elem].advert_type  = BTM_BLE_ADVERT_TYPE_16SRV_COMPLETE;

   adv_elem[num_elem].len          = sizeof(lls_uuid);

   adv_elem[num_elem].p_data       = ( uint8_t* )lls_uuid;

   num_elem++;


    /* Advertisement Element for Name */

   adv_elem[num_elem].advert_type = BTM_BLE_ADVERT_TYPE_NAME_COMPLETE;

    adv_elem[num_elem].len = strlen((const char*)BT_LOCAL_NAME);

    adv_elem[num_elem].p_data = BT_LOCAL_NAME;

    num_elem++;


    /* Set Raw Advertisement Data */

    wiced_bt_ble_set_raw_advertisement_data(num_elem, adv_elem);

}


Where lls_uuid is declared and initialized as:

/* Link Loss service UUID  */

const uint8_t lls_uuid[2] = {(uint8_t)UUID_SERVICE_LINK_LOSS & 0xFF, (uint8_t)(UUID_SERVICE_LINK_LOSS >> 8)  };


The proximity server receives Link Loss and IAS Alerts in the form of writes.. The IAS Alert is triggered instantaneously where as the link loss alert happens when there is a disconnection. The Alerts are indicated by the LEDs.Proximity Client:  This is a central / client device that performs read / write operations with the GATT DB of the server. The central starts scanning for peripherals that advertise with a Link Loss Service UUID, upon a GPIO button press and initiates the connection. Then it begins to discover all the three services of the proximity profile in the server, one by one and saves the handles of the attributes. Following this, the TX power characteristic of the server is read. Now the client periodically calculates the RSSI every 100 mS and thus the average path loss. If the path loss reaches beyond certain thresholds, the client writes to the Immediate alert characteristics of the server, resulting in an immediate trigger. The thresholds are as follows:MILD ALERT: Path loss above 90 dB HIGH ALERT: Path loss above 100 dBThe Link loss alert can be written to the server by pressing the GPIO Interrupts on the client Eval Board. Everytime the GPIO is pressed, a different LL alert value is written to the server. 


Programming and Testing:

 

  1. Install the WICED Studio 6.2 (or above) in your PC. Plug in two CYW920719Q40EVB_01 Boards and let the drivers bind
  2. to the devices. Make sure the jumpers are in place. Open WICED Studio and set the platform as 20719-B1_Bluetooth. For more details, please refer CYW920719Q40EVB_01-Kit-Guide.pdf present in Doc folder in the project explorer.
  3. Copy the ProximityServer and the ProximityClient folders. In the WICED Studio, right-click the Apps folder in the Project Explorer pane and click Paste. You can see these folders under the Apps folder.
  4. Open two windows of Serial Terminal (Example: Teraterm or Coolterm), and bind each of those windows to the PUART COM Ports of each devices. Each device has two COM Ports with consecutive numbers. The COM Port with the bigger number corresponds to the PUART that displays Debug Messages. The one with the smaller number corresponds to the HCI UART. The BaudRate is set to 115200 in the firmware. Make sure the BaudRate in serial terminals is also set to 115200.
  5. Create a Make Target for the project by selecting Project -> Make Target -> Create. Paste the following as the entry in the Target Name field:

ProximityServer-CYW920719Q40EVB_01 UART=COMxx download

Make sure that the Same as the Target Name checkbox is checked. Click OK. Create another target, in addition to the previous one as:

ProximityClient-CYW920719Q40EVB_01 UART=COMyy download

(Note: In the above targets, XX and YY are the PUART COM Port numbers of each of the devices)

    6. Double click the ProximityServer Target you just created, shown in the Make Target Pane on the right. You can see the Secure_hub program being built and downloaded into one of the boards.

     7.  Similarly program the ProximityClient program to the device.

     8. The ProximityServer device will start to advertise. In the ProximityClient device, press the BTN (D2) button for more than 5 seconds for the scan to start. Once the ProximityClient finds the           ProximityServer device advertising, it will automatically initiate connection and pairing process.

     9. The client performs discovery in the server and saves the attribute handles of the Link loss alert, immediate alert and transmit power characteristics. The initial Tx power is also read from the server.

     10. Click the BTN (D2) button to write LL Alert value to the server. Everytime the button is pressed, a different value of alert level (among the 3: NO_ALERT, MILD_ALERT, HIGH_ALERT) is written to the server. When a link loss happens the server will be triggered based on the alert level that was written, as indicated by the LED 2.

     11. The client will also keep calculating the Path loss and writes immediate alerts to the server if the path loss value exceeds a certain threshold. Such alerts immediately trigger the server, as indicated by the LED 1.


Path Loss Vs Distance:

 

For a Tx Power of 4 dBm in CYW20719 and of 12 dBm in CYW20735, the path loss Vs Distance values are observed as below in an office environment.

CYW20719:

 

  

CYW20735:

 

Distance (m)

Path Loss (dBm)

0

12

0.01

20

0.02

30

1

50

2

60

5

70

7

80

10

93

15

95

20

96

25

97

30

98

40

99

50

100

80

101

100

102

120

104

140

105

160

107

180

107

200

108

210

109

Related Documents:

The below table lists all relevant application notes, code examples, knowledge base articles, device datasheets, and Component / user module datasheets.

 

Document

Title

Comment

002-22816

CYW920719Q40EVB-01 Evaluation Board User Guide

The  User Guide can be accessed in the WICED Studio from Project Explorer -> 20719-B1_Bluetooth -> Doc

002-19103

Developing Custom Applications with BT Designer - Document

This document can be accessed from Project Explorer -> <Platform> -> Doc