bleprofile_GenerateADVData in central role

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Anonymous
Not applicable

Hi,

like in the hello_client example, i need to scan and advertise at the same time. So i call:

...

blecen_Create();

blecen_Scan(LOW_SCAN);

bleprofile_Discoverable(HIGH_UNDIRECTED_DISCOVERABLE, NULL);

That seems to work, i see the device advertising and scanning. But if i try to modify the advertising data with a call to the bleprofile_GenerateADVData, then something goes broken and the device does not advertise anymore.

Is it possible to change the advertising data while in central role?

Thank you.

Fabrizio

0 Likes
1 Solution
Anonymous
Not applicable

In order to scan and advertise at the same time try using blecm_startAdv() and blecm_startScan() together, the stack will handle which one happens when.

// HCIULP Advertising

#define     HCIULP_ADV_SCAN_IND                              0x02

#define     HCIULP_ADV_NONCONN_IND                           0x03

#define     HCIULP_ADV_CHANNEL_37                            0x01

#define     HCIULP_ADV_CHANNEL_38                            0x02

#define     HCIULP_ADV_CHANNEL_39                            0x04

#define     HCIULP_ADV_CHANNEL_MAP_MASK                      (HCIULP_ADV_CHANNEL_37 | HCIULP_ADV_CHANNEL_38 | HCIULP_ADV_CHANNEL_39)

#define     HCIULP_ADV_FILTER_POLICY_WHITE_LIST_NOT_USED     0x00    // white list not used

#define     HCIULP_ADV_FILTER_POLICY_WHITE_LIST_USED         0x01    // white list used

// advType:           Type of advertisement.  0 : ADV_IND; 1 : ADV_DIRECT_IND; 2 : ADV_SCAN_IND; 3 : ADV_NONCONN_IND; others are invalid.

// adcInterval:       Min and Max advertisement interval in BT slots. Min = 20mS; Max = 10.24s. Not valid for ADV_DIRECT_IND

// advChannel:        Mask of channels to advertise (bitwise set to enable). 1 = Ch 37; 2 = Ch 38; 4 = Ch 39.

// advAdrType:        Own address type. 0 : Public; 1 : Random device address; Others are reserved.

// advFilterPolicy:   ADV filter policy. 0 : Allow scan and connect from any; 1 : Allow scan from whitelist, connect from any; 2 : Allow scan from any, connect from whitelist; 3 : Allow scan and connect from whitelist only.

// initiatorAdrType:  Direct address type. 0 : Public; 1 : Random device address; Others are reserved.

// initiatorAdr:      Address of the device to be connected when ADV_DIRECT_IND

//

// Start advertisements

blecm_startAdv(

    HCIULP_ADV_SCAN_IND,                            // Non-connectable, scannable undirected advertisement

    160,                                            // Adv interval 160*0.625ms = 100ms

    HCIULP_ADV_CHANNEL_MAP_MASK,                    // All channels

    HCIULP_PUBLIC_ADDRESS,                          // int32 advAdrType,

    HCIULP_ADV_FILTER_POLICY_WHITE_LIST_NOT_USED,   // int32 advFilterPolicy,

    HCIULP_PUBLIC_ADDRESS,                          // int32 initiatorAdrType,

    NULL);                                          // uint8* initiatorAdr

// scanType:          Type of scan.  0 : HCIULP_PASSIVE_SCAN = No SCAN_REQ packets shall be sent; 1 : HCIULP_ACTIVE_SCAN = SCAN_REQ packets may be sent.

// scanInterval:      Time interval from when the Controller started its last LE scan until it begins the subsequent LE scan.

// scanWindow:        The duration of the LE scan.

// scanAdrType:       Own address type. 0 : Public; 1 : Random device address; Others are reserved.

// scanFilterPolicy:  Scan filter policy.

// filterDuplicates:  Filter duplicates.

//

// Start scanning

blecm_startScan(

    HCIULP_ACTIVE_SCAN,                             // Active scanning. SCAN_REQ packets may be sent.

    96,                                             // Scan interval 96*0.625ms = 60ms

    48,                                             // Scan duration 48*0.625ms = 30ms

    HCIULP_PUBLIC_ADDRESS,                          // int32 scanAdrType

    HCIULP_SCAN_FILTER_POLICY_WHITE_LIST_NOT_USED,  // int32 scanFilterPolicy

    HCIULP_SCAN_DUPLICATE_FILTER_ON);               // int32 filterDuplicates

In order to modify your advertising data try bleprofile_notifyAdvPacketTransmissions(&update_adv_packet, 2500). This will register the function "update_adv_packet" to be called 2.5msec before and after and adv packet is sent. However in order to get his function to work you need to add "APP_PATCHES_AND_LIBS += additional_advertisement_control.a" to your makefile AND MAKE SURE YOU ARE USING SDK 2.2.1. There is a bug in SDK 2.2.0 that prevents bleprofile_notifyAdvPacketTransmissions from working. See the my_beacon example.

View solution in original post

6 Replies
Anonymous
Not applicable

In order to scan and advertise at the same time try using blecm_startAdv() and blecm_startScan() together, the stack will handle which one happens when.

// HCIULP Advertising

#define     HCIULP_ADV_SCAN_IND                              0x02

#define     HCIULP_ADV_NONCONN_IND                           0x03

#define     HCIULP_ADV_CHANNEL_37                            0x01

#define     HCIULP_ADV_CHANNEL_38                            0x02

#define     HCIULP_ADV_CHANNEL_39                            0x04

#define     HCIULP_ADV_CHANNEL_MAP_MASK                      (HCIULP_ADV_CHANNEL_37 | HCIULP_ADV_CHANNEL_38 | HCIULP_ADV_CHANNEL_39)

#define     HCIULP_ADV_FILTER_POLICY_WHITE_LIST_NOT_USED     0x00    // white list not used

#define     HCIULP_ADV_FILTER_POLICY_WHITE_LIST_USED         0x01    // white list used

// advType:           Type of advertisement.  0 : ADV_IND; 1 : ADV_DIRECT_IND; 2 : ADV_SCAN_IND; 3 : ADV_NONCONN_IND; others are invalid.

// adcInterval:       Min and Max advertisement interval in BT slots. Min = 20mS; Max = 10.24s. Not valid for ADV_DIRECT_IND

// advChannel:        Mask of channels to advertise (bitwise set to enable). 1 = Ch 37; 2 = Ch 38; 4 = Ch 39.

// advAdrType:        Own address type. 0 : Public; 1 : Random device address; Others are reserved.

// advFilterPolicy:   ADV filter policy. 0 : Allow scan and connect from any; 1 : Allow scan from whitelist, connect from any; 2 : Allow scan from any, connect from whitelist; 3 : Allow scan and connect from whitelist only.

// initiatorAdrType:  Direct address type. 0 : Public; 1 : Random device address; Others are reserved.

// initiatorAdr:      Address of the device to be connected when ADV_DIRECT_IND

//

// Start advertisements

blecm_startAdv(

    HCIULP_ADV_SCAN_IND,                            // Non-connectable, scannable undirected advertisement

    160,                                            // Adv interval 160*0.625ms = 100ms

    HCIULP_ADV_CHANNEL_MAP_MASK,                    // All channels

    HCIULP_PUBLIC_ADDRESS,                          // int32 advAdrType,

    HCIULP_ADV_FILTER_POLICY_WHITE_LIST_NOT_USED,   // int32 advFilterPolicy,

    HCIULP_PUBLIC_ADDRESS,                          // int32 initiatorAdrType,

    NULL);                                          // uint8* initiatorAdr

// scanType:          Type of scan.  0 : HCIULP_PASSIVE_SCAN = No SCAN_REQ packets shall be sent; 1 : HCIULP_ACTIVE_SCAN = SCAN_REQ packets may be sent.

// scanInterval:      Time interval from when the Controller started its last LE scan until it begins the subsequent LE scan.

// scanWindow:        The duration of the LE scan.

// scanAdrType:       Own address type. 0 : Public; 1 : Random device address; Others are reserved.

// scanFilterPolicy:  Scan filter policy.

// filterDuplicates:  Filter duplicates.

//

// Start scanning

blecm_startScan(

    HCIULP_ACTIVE_SCAN,                             // Active scanning. SCAN_REQ packets may be sent.

    96,                                             // Scan interval 96*0.625ms = 60ms

    48,                                             // Scan duration 48*0.625ms = 30ms

    HCIULP_PUBLIC_ADDRESS,                          // int32 scanAdrType

    HCIULP_SCAN_FILTER_POLICY_WHITE_LIST_NOT_USED,  // int32 scanFilterPolicy

    HCIULP_SCAN_DUPLICATE_FILTER_ON);               // int32 filterDuplicates

In order to modify your advertising data try bleprofile_notifyAdvPacketTransmissions(&update_adv_packet, 2500). This will register the function "update_adv_packet" to be called 2.5msec before and after and adv packet is sent. However in order to get his function to work you need to add "APP_PATCHES_AND_LIBS += additional_advertisement_control.a" to your makefile AND MAKE SURE YOU ARE USING SDK 2.2.1. There is a bug in SDK 2.2.0 that prevents bleprofile_notifyAdvPacketTransmissions from working. See the my_beacon example.

lock attach
Attachments are accessible only for community members.
Anonymous
Not applicable

Hi, thank you for your answer. It is getting better, but there is still some issue. Now i can advertise and scan at the same time and i can set the advertising packet, but only the first time during the _create function. The callback registered with bleprofile_notifyAdvPacketTransmissions is not getting called. Attached my create function.

0 Likes
Anonymous
Not applicable

ok,if i change the advertising data with the function bleprofile_GenerateADVData, everything works. The callback is called. The problem seems to come out when i try to change the scan response data too, with a call to the bleprofile_GenerateScanRspData function, in the callback.

0 Likes
Anonymous
Not applicable

Its possible that the Scan Response data doesn't work with the bleprofile_notifyAdvPacketTransmissions() function, only advertising packets. I'm not too sure about this since I only just got the function working myself a few days ago and I haven't actually tried updating the SCR packet too.

0 Likes
Anonymous
Not applicable

ok, for now i will not use the SCR packet. Thank you very much for your help.

0 Likes
Anonymous
Not applicable

No problem, I might get around to testing this myself sometime as it may come in handy in the future.

0 Likes