- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
Solved! Go to Solution.
- Labels:
-
MasterSlave
-
SDK 2.X
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
ok, for now i will not use the SCR packet. Thank you very much for your help.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
No problem, I might get around to testing this myself sometime as it may come in handy in the future.