WICED Bluetooth Using the CYW20719
#
Title
Comment
0
A Two Hour WICED Bluetooth Class
WICED Bluetooth Using the CYW20719 in all its glory
1
Resources
Links to all of the Cypress WICED information including videos, application notes etc.
2
Your First Project
Making Hello World & the Blinky LED
3
The Super Mux Tool
Learning about platforms and the Super Mux Tool
4
Snips
Using the example projects to learn Bluetooth
5
Bluetooth Designer
Using the tool to customize a project and get going fast
6
The CCCD & Notification
Writing back to the Central
7
Advertising Beacon
Building a beacon project to advertise your custom information
8
Scanner
Viewing the world around you
9
Bluetooth Classic SPP
Using the Serial Port Profile to Transmit Lots of Data
Source code:
- git@github.com:iotexpert/wiced_bt_intro.git
- https://github.com/iotexpert/wiced_bt_intro
Summary
In the last lesson I showed you how to build a BLE Advertising Beacon. In that lesson I used a program called the “AdvScanner” which ran on a CYW920719Q40EVB-01 and acted like a Bluetooth Sniffer. In this lesson I’ll show you how to build a simpler version of that program to look for the L7_Advertiser we built in the last lesson.
The important concepts in this lesson are:
- BLE Scanning
- Parsing Advertising Packets
I am going to build a project that Scans for BLE Advertisers. Then, I’ll add the ability to print out the advertising packet. And finally, I will add filtering capability to only look for advertisers who are using the Cypress Manufacturers code.
The steps that we will follow are:
- Make a new project with WICED Bluetooth Designer called L8_Scanner
- Turn off the GATT Database
- Move it into your project folder
- Fix the WICED_BT_TRACE to use the PUART
- Create a make target and build it
- Add a new function that prints out Advertising Packets
- Update the l8_scanner_app_init function to remove Advertising
- Update the wiced_bt_config to never stop scanning
- Program the development kit and see what happens
- Update the newAdv function to print out the raw data in the advertising packet
- Program again and see all of the chaos
- Put a filter for the Advertisers using the Cypress MFG Code
- Program
Implement the Project
Create a new project called L8_Scanner using the Bluetooth Designer
Turn off the GATT Database and then press Generate Code
Move the project into the wiced_bt_class folder
Update the WICED_BT_TRACE to send output to the PUART
#if ((defined WICED_BT_TRACE_ENABLE) || (defined HCI_TRACE_OVER_TRANSPORT)) /* Set the Debug UART as WICED_ROUTE_DEBUG_NONE to get rid of prints */ // wiced_set_debug_uart( WICED_ROUTE_DEBUG_NONE ); /* Set Debug UART as WICED_ROUTE_DEBUG_TO_PUART to see debug traces on Peripheral UART (PUART) */ wiced_set_debug_uart( WICED_ROUTE_DEBUG_TO_PUART ); /* Set the Debug UART as WICED_ROUTE_DEBUG_TO_WICED_UART to send debug strings over the WICED debug interface */ //wiced_set_debug_uart( WICED_ROUTE_DEBUG_TO_WICED_UART ); #endif
Modify the make target & program that was created by the BT Designer
Make a new function that will be called when WICED finds a new advertising packet.
void newAdv(wiced_bt_ble_scan_results_t *p_scan_result, uint8_t *p_adv_data) { WICED_BT_TRACE("Found device %B\n",p_scan_result->remote_bd_addr); }
Remove the start advertising from l8_scanner_app_init
/* * This function is executed in the BTM_ENABLED_EVT management callback. */ void l8_scanner_app_init(void) { /* Initialize Application */ wiced_bt_app_init(); /* Allow peer to pair */ wiced_bt_set_pairable_mode(WICED_TRUE, 0); /* Set Advertisement Data */ //l8_scanner_set_advertisement_data(); /* Start Undirected LE Advertisements on device startup. * The corresponding parameters are contained in 'wiced_bt_cfg.c' */ /* TODO: Make sure that this is the desired behavior. */ //wiced_bt_start_advertisements(BTM_BLE_ADVERT_UNDIRECTED_HIGH, 0, NULL); wiced_bt_ble_scan(BTM_BLE_SCAN_TYPE_HIGH_DUTY,FALSE,newAdv); }
Update wiced_bt_config.c to never stop scanning.
.high_duty_scan_duration = 0, /**< High Duty Scan Duration in seconds (0 for infinite) */
Program your development kit and see what happens.
Now lets update the program to print the advertising packets.
void newAdv(wiced_bt_ble_scan_results_t *p_scan_result, uint8_t *p_adv_data) { uint8_t mfgLen; uint8_t* mfgData = wiced_bt_ble_check_advertising_data( p_adv_data,0xFF,&mfgLen); WICED_BT_TRACE("Found device %B ",p_scan_result->remote_bd_addr); uint8_t index=0; int fieldLength=p_adv_data[index]; do { for(int i=0;i<=fieldLength;i++) WICED_BT_TRACE("%02X ",p_adv_data[index+i]); index = index + fieldLength + 1; fieldLength = p_adv_data[index]; } while(fieldLength); WICED_BT_TRACE("\n"); }
Now program the development kit and see what happens. Where I am sitting this is not very helpful because there are boatloads of advertisers.
Now let’s make one more change. Instead of printing all of the packets let’s only look only at the ones that have Manufacturer data, the right length and the Cypress manufacturer id.
uint8_t mfgLen; uint8_t* mfgData = wiced_bt_ble_check_advertising_data( p_adv_data,0xFF,&mfgLen); if(!(mfgData && mfgLen == 3 && mfgData[0] == 0x31 && mfgData[1] == 0x01 )) return;
Now I only see my L7_Advertising project
No comment yet, add your voice below!