For the transmission power, are we allowed to use any number in the range [-30, 4] or only the values specified in table 37 in the product specification? When we select one of these values, what value do we use for the tx level in the advertising value? It isn't going to be the same value, is it? I'm confused, because according to my measurements with nRF 51822 Beacon kit, tx power at one meter is -54, which is clearly not in the aforementioned range.
If you look in the documentation, this should be pretty clear. Only the values mentioned there is allowed.
The TX power is a setting for the radio to set its transmitting strength. Higher values…
Okay, I was not aware of you using any manufacturer specific data at all, so please mention this in your question next time. Is this the iBeacon profile? If so, then the TX power is indeed included as…
Well, I guess my confusion arises from the advertising message having two different tx power values. One in the manufacturer data (In android I parse the manufacturer data to retrieve this, and actually…
The TX power is a setting for the radio to set its transmitting strength. Higher values amplify the signal strength, but also increase power usage. The values you are measuring are received signal strength in dBm, which is based on the distance between the devices, the transmitting power of the advertiser, and the sensitivity of the peer. So while not entirely unrelated, these two values will be vastly different and should not be compared as such.
The TX Power AD field should be set to the transmitting power of your advertiser, so either of the allowed values for sd_ble_gap_tx_power_set().
Well, I guess my confusion arises from the advertising message having two different tx power values. One in the manufacturer data (In android I parse the manufacturer data to retrieve this, and actually calibrate the beacons with that by doing measurements at 1 meter), and another one, which is level above that (that I get by scanRecord.getTxPowerLevel()). The first one is what I use for distance calculations, with the second one I do nothing, it actually isn't even set for default beacons.
Could you tell me if the following is correct? If I change the beacon's transmission power on the fly using sd_ble_gap_tx_power_set(), I should set the second tx power level in the advertising message to the same value by doing advdata.p_tx_power_level = &tx_power_level. The tx power value in the manufacturer data still needs to be figured out with measurements, and when I know what tx power corresponds to what RSSI value at 1 meter for my receiver, then I can include that in the manufacturer data.
Also, the default value seems to be 10 (#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A /**< Transmit power level. */) How is that possbile? From the link you sent the maximum value can be seen as 4.
Okay, I was not aware of you using any manufacturer specific data at all, so please mention this in your question next time. Is this the iBeacon profile? If so, then the TX power is indeed included as the last byte of the data (in 2's complement form). The standardized way of including the TX power level is to use the AD Type, but this costs 3 bytes of advertising data. You might not need to include the standardized AD Type if you only care about peers that understand the iBeacon format.
Advertising data is formatted like Length1|Type1|Data1|Length2|Type2|Data2|...| where DataN has a dynamic length based on the type. The define you list is meant for the Type field, not the Data field. I am not sure if the actual TX power levels have any defines.
Just remember that new advertising data will not be effective until the next advertising event. TX power could change faster, so be careful!
Thanks very much for your answer Ulrich. Yes, I'm using the iBeacon format now. So, semantically the tx power which is the last byte of manufacturer data and the standard AD type tx power are not the same, right? Because the tx power in the iBeacon format is determined with measurements and can be any value (indeed the default value with nordic beacons was -69 db), whereas the standard AD type can be set only to the specified values that are in the range [-30,4]. Or is it that they're semantically the same, but iBeacon chose to use this format to save space (1 instead of 3).