MartinBL gravatar image

Posted 2015-03-31 16:27:13 +0200

Bluetooth low energy Advertising, a beginner's tutorial

The purpose of this tutorial is to get you started with the basics of the nRF5x and Bluetooth Low Energy (BLE). The tutorial is fairly superficial and is meant to be a hands-on introduction to BLE advertising and broadcasting of a limited payload. It is intended to be a fun way to get you started with something functional, and maybe inspire you to go further with BLE. Here you will not learn details of the BLE protocol, but we will have a quick look at what you should know before making an advertising device.

Before we begin

Table of context

    1. Before we begin
    2. The "Hello world" example
    3. Advertising
      • RSSI
      • Addresses
      • Address types
      • Advertising types
      • Bonding
    4. Advertising data
    5. Scan response data

Change Log 2016.03.14: Updated tutorial to suit SDK V11.0.0 and the possibility to use both nRF51 and nRF52 kits.

Equipment and software

To complete this tutorial you will need the following:

Other kits, dongles and software versions might work as well, but this is what I have used. This tutorial will not cover how to install and setup the software. Please search the forum if you run into trouble before posting questions here.

Necessary prior knowledge

It is expected that you have basic knowledge of how to use Keil, MCP and nRFgo Studio and how to download your application to your kit. Please browse the Tutorial section and the Infocenter to find guides on how to use your equipment and compile your first BLE application. Here is an excellent blogpost that I highly recommend you read. It provides a more in depth explanation on how advertising works and is a natural supplement to this tutorial.

If you run into troubles please browse devzone, look for documentation on our Infocenter, and read the user guides for your kits. I urge you to post any questions you might have on the forum and not below the tutorial. This makes it is easier for other users and Nordic employees to see and search for your question and you will actually most likely get a faster response(!).

The “Hello world” example

First thing first: download the example code from github. It is based on the template example found in the SDK V11.0.0, but stripped of all code that is not necessary for our purpose. There is still quite a lot of code left though, which is used to initiate and utilize processes running in the background. The code is not essential for this tutorial and can be left as is. If you are curious of what it is anyway then here are some links to documentation on some of the modules that are used in the code:

  1. The Device Manager. This is a module that handles active and bonded connections. Since this tutorial is about advertising and not connections it is not really relevant. Still I chose to leave it in the code as it is extensively used in more advanced examples, so I figured you might just as well get used to it being there and it doesn't do any harm.
  2. The Button Support Package (bsp). This module is used to handle the LEDs and the buttons. In this example you will notice that an LED is blinking when your board is advertising. After 180 seconds the board will stop advertising and go to sleep. Then you can push Button 1 and the board will wake up and start advertising again. All this is handled by the bsp module.
  3. Various _evt() and _dispatch() functions. These are functions that handle BLE and system events that originates in the Softdevice. They also allow your application to take various actions based on what is going on in the Softdevice. We will not dwell on these functions in this tutorial.

To compile the example download the files and copy the folder "nrf5x-ble-tutorial-advertising" to "your_SDK_folder\examples\ble_peripheral". Your main.c file should then be found in the folder "your_SDK_folder\examples\ble_peripheral\nrf5x-ble-tutorial-advertising". If you need help with this please have a look at this thread on devzone: Compiling github projects. Open the project file "ble_app_tutorial_advertising.uvprojx" and hit “Build”. It should compile without any errors or warnings.

Advertising

Now, let us have some fun right away. Make sure you have programmed the correct SoftDevice to your nRF5x DK kit and compiled the example successfully. Then hit the download button in Keil and load the example onto your kit as well. Open MCP and start discovery using your nRF51 Dongle as master emulator. To learn how to use MCP and a master emulator read this tutorial: Testing and using a simple BLE application. A device named “HelloWorld” should show up in the list of discovered devices as shown in the picture below. Discovered device(s)

What you see in the picture is:

    • The device name as defined in our main.c file. Try to search for #define DEVICE_NAME in your code and change the string to something of your own choice (just don’t make it too long). Now compile and download your application again and see how your device name has changed.
    • The Bluetooth Device Address. Similar to a Media Access Control address (MAC address), but not necessarily universally unique.
    • The Received Signal Strength Indicator (RSSI). This is a value of how good your signal strength is. Move your kit around or lay your hand over the PCB antenna on your kit and see how the RSSI changes.

The Advertising packet

Now expand the "HelloWorld" device tree by clicking on the little cross to the left. You should see something similar to the next image. Your first advertising packet

What you see here is:

RSSI

The Received Signal Strength Indicator as mentioned above.

Address

The Bluetooth Device Address as mentioned above.

Address Type

Address type as defined in the Bluetooth Core specification. See this post on devzone for more on address types. The default address type in our example is “Random static address”. Try to go into gap_params_init() in main.c and add these four lines at the end of the function:

ble_gap_addr_t gap_address;
gap_address.addr_type = BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE;
err_code = sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_AUTO, &gap_address);
APP_ERROR_CHECK(err_code);// Check for errors

This will set the address type to “Private Resolvable address”.The Address type will still show up as “Random”, but try to reset your board a few times. You should see that after each reset your device shows up with a different address in the device list. This functionality might be handy in certain situations demanding higher security. Remove the lines again to change the address type back to “Random static address”.

Advertising Type

To keep it simple there are two advertising types; connectable and non-connectable. Non-connectable might be useful if you just need one-way communication and only need to broadcast a couple of bytes. One use case for this might for example be location awareness. If you want to send more data to a specific device, on the other hand, you need a connectable device. Examples here might be a heart rate sensor connected to an app on your phone or a Bluetooth headset.

Bonded

This shows whether the device is bonded to another device or not. The purpose of bonding is described in the Bluetooth Core Specification 4.2 as:

    "The purpose of bonding is to create a relation between two Bluetooth devices based on a common link key (a bond). The link key is created and exchanged (pairing) during the bonding procedure and is expected to be stored by both Bluetooth devices, to be used for future authentication[...]"

Advertising Data

Now to the fun part! Go to the advertising_init() function. The advertising data fields contained in the advdata variable are the fields where you can configure your first advertising packet. The advertising packet in this example already contains your full device name. It also contains flags defining some of the advertising options. The flag field is mandatory, but we will discuss it here.

Search for the definition of the ble_advdata_t advertising data structure in your project files (right click on ble_advdata_t and click "Go To Definition Of 'ble_advdata_t'. This works on all functions and variables). When you find it you can see that it is a list of options and data structures with some very brief descriptions. There are quite a few options, but it is important to know that an advertising packet can consist of no more than 31 bytes, so you might need to select your data with care. Here is a useful discussion on advertising bytes.

First let us play with the name and pretend that we need a really long one. Find the "DEVICE_NAME" define again and change the string to “ThisIsAReallyLongName”. Compile and download the code and make sure your new name shows in the device list. This name consumes a lot of our precious 31 byte long advertising packet. So let us say we want to keep our long name, but only advertise the first few letters of it. The advertising_init() function should now look something like this:

static void advertising_init(void)
{
    uint32_t      err_code;
    ble_advdata_t advdata;  // Struct containing advertising parameters

    // Build advertising data struct to pass into @ref ble_advertising_init.
    memset(&advdata, 0, sizeof(advdata));

    advdata.name_type               = BLE_ADVDATA_FULL_NAME;
    advdata.flags                   = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;

    ble_adv_modes_config_t options = {0};
    options.ble_adv_fast_enabled  = BLE_ADV_FAST_ENABLED;
    options.ble_adv_fast_interval = APP_ADV_INTERVAL;
    options.ble_adv_fast_timeout  = APP_ADV_TIMEOUT_IN_SECONDS;

    err_code = ble_advertising_init(&advdata, NULL, &options, on_adv_evt, NULL);
    APP_ERROR_CHECK(err_code);
}

Change the advertising name type to:

advdata.name_type = BLE_ADVDATA_SHORT_NAME; // Use a shortened name

Then right below this add the line:

advdata.short_name_len = 6; // Advertise only first 6 letters of name

Compile and download again. In the “Discovered devices” list your device should now show up with the name “ThisIs”, the first 6 letters of the full name. However, if you connect to your device by clicking “Select device”, “Connect” and then “Discover services” you will see that the full name is still there. In our case, this frees up 15 bytes in the advertising packet.

Manufacturer Specific Data

One of the most interesting fields in the advertising data structure might be the p_manuf_specific_data field. This is a field where you can place whatever data you want. So copy the advertising_init() function below:

static void advertising_init(void)
{
    uint32_t      err_code;
    ble_advdata_t advdata;  // Struct containing advertising parameters

    ble_advdata_manuf_data_t        manuf_data; // Variable to hold manufacturer specific data
    uint8_t data[]                      = "SomeData!"; // Our data to adverise
    manuf_data.company_identifier       = 0x0059; // Nordics company ID
    manuf_data.data.p_data              = data;     
    manuf_data.data.size                = sizeof(data);

    // Build advertising data struct to pass into @ref ble_advertising_init.
    memset(&advdata, 0, sizeof(advdata));

    advdata.name_type               = BLE_ADVDATA_SHORT_NAME;
    advdata.short_name_len          = 6;
    advdata.flags                   = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
    advdata.p_manuf_specific_data   = &manuf_data;

    ble_adv_modes_config_t options = {0};
    options.ble_adv_fast_enabled  = BLE_ADV_FAST_ENABLED;
    options.ble_adv_fast_interval = APP_ADV_INTERVAL;
    options.ble_adv_fast_timeout  = APP_ADV_TIMEOUT_IN_SECONDS;

    err_code = ble_advertising_init(&advdata, NULL, &options, on_adv_evt, NULL);
    APP_ERROR_CHECK(err_code);
}

Now compile, download and check your MCP. You can see that there is a new field in the “Advertising Data” list called “ManufacturerSpecificData”. It contains a cryptic string of hexadecimal numbers. The first two numbers are the company ID (0x0059) with the least significant byte first. The company ID is a unique 16-bit value assigned to Bluetooth SIG members. It is not allowed to broadcast a custom company ID value without being a member. If you are curious you can see a list of the Bluetooth SIG member IDs here. As described at the bottom of the page the value 0xFFFF "may be used in the internal and interoperability tests before a Company ID has been assigned. This value shall not be used in shipping end products". When you are ready for shipping you will need to apply for a Bluetooth SIG membership to get your own unique ID. "Adopter level" membership is free, but you will need to be associated with a valid company. The next 10 bytes in the manufacturer specific data field are the actual data. If you compare with an ASCII table you will recognize the string “SomeData!”, most significant byte first this time. The last two zeroes at the end represent a termination character in the string.

Challenge 1: Try to add and populate the "p_tx_power_level" field in "advdata" with a value of your own choice and see what happens in MCP. This field is meant to advertise the transmit power of your device. This value might, e.g., enable other units to roughly estimate the distance to your device. (Keep in mind that you will have to use one of the valid tx power levels shown in Chapter 8.5.3 in the nRF51 Product Specification V3.3. It is also important to know that this doesn't change the actual transmit power, just the information that is advertised).

Challenge 2: Set the "include_appearance" field in "advdata" to "true" and see what happens in MCP. Then search for sd_ble_gap_appearance_set(0) in your main file and change the ‘0’ to “BLE_APPEARANCE_HID_MOUSE” and see what happens. The appearance feature might be useful to developers of e.g. mobile phone apps. If you have a BLE enabled phone (or a laptop) your kit should now show up with the name "ThisIs" and a computer mouse icon if you search for BLE devices.

Tips: Your advertisement packet is already getting dangerously full so you might want to shorten your manufacturer data size or device name.

This is what I can see on my phone:

Scan response data

But what if you really, really want to advertise more than 31 bytes? Then there is a solution for you and that is the Scan response data. This is an optional "secondary" advertising payload which allows scanning devices that detect an advertising device to request a second advertising packet. This allows you to send two advertising frames with a total payload of 62 bytes.

Challenge: In your code, immediately above the line err_code = ble_advdata_set(&advdata, NULL), do the following:

    1. Declare a new "ble_advdata_manuf_data_t" type variable called "manuf_data_response".
    2. Populate "manuf_data_response" with data as we did with the first advertising packet.
    3. Declare a new "ble_advdata_t" type variable called "advdata_response".
    4. Populate "advdata_response" with name type "BLE_ADVDATA_NO_NAME".
    5. Populate "advdata_response" with your new manufacturer specific data.
    6. Change the line

      err_code = ble_advertising_init(&advdata, NULL, &options, on_adv_evt, NULL);

      to

      err_code = ble_advertising_init(&advdata, advdata_response, &options, on_adv_evt, NULL);
    7. Compile, download and see what happens.

This should make your device look something like this in MCP: Advertising with Scan response

In case you need help your advertising_init() function should now look similar to this:

static void advertising_init(void)
{
    uint32_t      err_code;
    ble_advdata_t advdata;  // Struct containing advertising parameters

    ble_advdata_manuf_data_t        manuf_data; // Variable to hold manufacturer specific data
    uint8_t data[]                      = "SomeData!"; // Our data to adverise
    manuf_data.company_identifier       = 0x0059; // Nordics company ID
    manuf_data.data.p_data              = data;     
    manuf_data.data.size                = sizeof(data);

    // Build advertising data struct to pass into @ref ble_advertising_init.
    memset(&advdata, 0, sizeof(advdata));

    advdata.name_type               = BLE_ADVDATA_SHORT_NAME;
    advdata.short_name_len          = 3;
    advdata.flags                   = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
    advdata.p_manuf_specific_data   = &manuf_data;
    int8_t tx_power                 = -4;
    advdata.p_tx_power_level        = &tx_power;
    advdata.include_appearance      = true;

    // Prepare the scan response Manufacturer specific data packet
    ble_advdata_manuf_data_t                manuf_data_response;
    uint8_t                                 data_response[] = "Many_bytes_of_data"; // Remember there is a 0 terminator at the end of string
    manuf_data_response.company_identifier       = 0x0059;               
    manuf_data_response.data.p_data              = data_response;        
    manuf_data_response.data.size                = sizeof(data_response);

    ble_advdata_t   advdata_response;// Declare and populate a scan response packet

    // Always initialize all fields in structs to zero or you might get unexpected behaviour
    memset(&advdata_response, 0, sizeof(advdata_response));
    // Populate the scan response packet
    advdata_response.name_type               = BLE_ADVDATA_NO_NAME; 
    advdata_response.p_manuf_specific_data   = &manuf_data_response;

    ble_adv_modes_config_t options = {0};
    options.ble_adv_fast_enabled  = BLE_ADV_FAST_ENABLED;
    options.ble_adv_fast_interval = APP_ADV_INTERVAL;
    options.ble_adv_fast_timeout  = APP_ADV_TIMEOUT_IN_SECONDS;

    err_code = ble_advertising_init(&advdata, &advdata_response, &options, on_adv_evt, NULL);
    APP_ERROR_CHECK(err_code);
}

Summary

And there you go. Your first nRF5x DK kit advertising its name, various options, and a small payload. Once again I recommend that you take a look at this blog post: Bluetooth Smart and the Nordic's Softdevices - Part 1 GAP Advertising. The next step will be to add services and characteristics: BLE Services, a beginner's tutorial

46 comments

Wass0392 gravatar image

Posted April 18, 2015, 12:01 a.m.

after downloading the github file, where should one extract the file to? I can never get downloaded github projects to work? any insight would be a massive help

Ferdas gravatar image

Posted April 19, 2015, 3:42 p.m.

Hi, You should move into the directory

nRF51_SDK_8.0.0_5fc2c3a/examples/ble_peripheral

of the official SDK, then downloading the code example by typing

git clone https://github.com/NordicSemiconductor/nrf51-ble-tutorial-advertising.git

after that you can proceed compiling as you always did with other example projects :)

I hope it helped,

Francesco

muhkuhns gravatar image

Posted April 21, 2015, 7:48 p.m.

Thanks for this Guide! (I guess. Haven't tried it out yet, but soon I will!)

What am I suppose to use for "manuf_data.company_identifier" as I don't work for a Bluetooth SIG Company ? ;-)

0xFFFF ? https://www.bluetooth.org/en-us/specification/assigned-numbers/company-identifiers

MartinBL gravatar image

Posted April 22, 2015, 9:16 a.m.

Hi. Thank you for your comment. I have updated the text to make it clearer for future readers. As stated in your link:

This value [0xFFFF] may be used in the internal and interoperability tests before a Company ID has been assigned. This value shall not be used in shipping end products.

Any other values are reserved and forbidden to use in an end product. When you are ready for shipping you will need to apply for a Bluetooth SIG membership to get your own unique ID. "Adopter level" membership is free, but you will need to be associated with a valid company.

EL34PP gravatar image

Posted May 9, 2015, 5:48 a.m.

Thanks for this guide and it's great. When will have Advertise UUID/flag tutorial? I'm waiting for this.

MartinBL gravatar image

Posted May 12, 2015, 10:41 a.m.

@EL34PP The next tutorial is a work in progress, but I can't make any promises for a "release date".

jialee gravatar image

Posted May 14, 2015, 12:40 a.m.

Hi all,

I followed this instruction from github.

To compile it, clone the repository to "your_SDK_v8.0.0_folder\examples\ble_peripheral". Download and extract the zipped version of the SDK. It will not work with the Pack installer. If you need help with this please have a look at this thread on devzone:

My path is C:\Keil_v5\ARM\Pack\NordicSemiconductor\nRF_Examples\8.0.0\ble_peripheral. However, it showed me an error.

error

I'm using Keil v5.14. Please help.

John

shubhamkumarmishra gravatar image

Posted May 14, 2015, 9:29 a.m.

I tried the things mentione above . I have PC10003 EK (nRF51422), for check i turned on my TICK_LED(LED_0) function in main. But it seems the control is not transferring to the main functions. And I tried with various example but I never seen PC10003 board ble get turned on.

IROM1: 0x18000 size 0x28000

IRAM : 0x2000200 size : 0x6000

This is how I configured the memory address.

Please help me now, this is situation of give up , Don't know where and what I am missing. Soft Device version S110 BLE_STACK using right now .

Please help me asap. Or is there any hardware fault? How could I check that BLE module of PCA10003 board for any hardware issues?

MartinBL gravatar image

Posted May 15, 2015, 10:44 a.m.

@John: I can see that you have used the Pack installer. The third sentence in your quote actually states that the example will not work with pack installer. Download the SDK 8.0.0 .zip-file from here, ectract it to a folder of your own chosing and then extract the example as instructed. I know the Pack vs .zip-file is confusing and we have a lot of people struggling with the same issue. In general we recommend the .zip-file solution as this will get rid of the "file not found" errors you have.

MartinBL gravatar image

Posted May 15, 2015, 11:01 a.m.

@ Shubham Kumar Mishra : The PCA10003 has an old revision 2 nRF51422 on it. As you can see in the Compatibility Matrix this is not compatible with SDK V8.0.0 and SoftDevice S110 V8.0.0. Hence, it is not guaranteed to work with this example either. However, I did try the tutorial on my PCA10003 and it seems to work, but I haven't tested it thoroughly. Also, as a sidenote, the PCA10003 only has 16kB of RAM and you should set your IRAM1 size to 0x2000 instead of 0x6000. If this is a problem with your function TICK_LED() we can't help you unless you post your code.

PS: if your problem is related to your question here then lets continue our problem solving there.

jialee gravatar image

Posted May 15, 2015, 8:30 p.m.

@Martin Børs-Lind Yeah, you were right. I just moved it to SDK8.0.0 I downloaded. It seems fine now. I have almost completed this tutorial except for challenge 1. I'm still struggling with changing the transmit power level.

MartinBL gravatar image

Posted May 18, 2015, 12:21 p.m.

@John: I have answered you question in your post here: link.

Luca122131 gravatar image

Posted May 26, 2015, 5 p.m.

Can I use this example with SDK 8.1.0 ?

I tried and I got a build error.

Step to reproduce and find:

  • Clone github files in the right place under SDK 8.1.0
  • Open the project and build
  • In nRF_Libraries -> app_button.c I see (line 19) #include "nrf_drv_gpiote.h"

The error is that nrf_drv_gpiote.h isn't found.

I tried to import the example in the SDK 8.0.0 and all works fine; so I tried to open the app_button.c of the SDK 8.0.0 and it's different from app_button.c of the SDK 8.1.0.

If app_button.c is part of the nRF_Libraries of SDK 8.1.0, and If it includes nrf_drv_gpiote.h that's part of the library too. Could be a bug or I'm doing something wrong? Thanks

MartinBL gravatar image

Posted May 27, 2015, 9:43 a.m.

I'm afraid that you can't use it with SDK 8.1.0. If you look at the advertising_init() function in main.c in SDK V8.1.0 you can see that is has some differences from V8.0.0 as well. But the example code used in the tutorial is very similar to the ble_app_template examples so with a little extra effort you can use this. You just need to take a close look at advertising_init() and ble_advertising_init() (called in advertising_init() and located in ble_advertising.c) and you should be able to recognize a lot of stuff. image description

I say that it might be easy, but to make the tutorial compatible with SDK 8.1.0 I'll need to rewrite a lot of text and make new example code so I probably won't prioritize that.

gulizseray gravatar image

Posted May 29, 2015, 6:51 p.m.

Why is it that nRF Beacon Android app cannot detect the development kit after uploading this project, whereas nRF Master control app can?

MartinBL gravatar image

Posted June 2, 2015, 11:13 a.m.

Becons have a specific configuration of the adveritisng packet. The Beacon app is scanning for and shows only devices with this configuration. Take a look at the ble_app_beacon example in the SDK.

wilhelmsen gravatar image

Posted June 18, 2015, 9:03 a.m.

Could you create the same type of tutorial for S120?

Miladn gravatar image

Posted June 18, 2015, 4:13 p.m.

Hello Nordic Comunity :) When I change the code as instructed in the tutorial

image description

My dongle does not even detect the device. Meanwhile when I comment out the following code

   // err_code = ble_advdata_set(&p_advdata, NULL);
  //  APP_ERROR_CHECK(err_code);// Check for errors

My device becomes detected yet on the advertise data of MCP nothing shows up. Why is this happening and What is the purpose of this challange ?

Thank You, Milad

MartinBL gravatar image

Posted June 18, 2015, 6:14 p.m.

Hi Milad. Could it be that you advertising packet is already full? Remember that you can only have 31 bytes in the packet in total. Have a look at this explanation and see if that helps.

Miladn gravatar image

Posted June 18, 2015, 8:54 p.m.

Hey Martin, I am only sending an integer value.

power=0x3A;
advdata.p_tx_power_level= &power;

I do not think that this would be a problem. What other issues might be the reason? Thanks

Miladn gravatar image

Posted June 18, 2015, 9:54 p.m.

Meanwhile where is the continuation to this tutorial and as for the GATT communication ?

Thanks

MartinBL gravatar image

Posted June 19, 2015, 9:50 a.m.

Do you have control over how many bytes you have in your packet? Adding the tx power level value will actually add 3 more bytes, not just the value; a length byte, a type byte and the tx power level byte. Can you post your .c-file? You can't attach files in the tutorial comment sections, so maybe you can post it in the thread I linked to above or send it to me on PM.

The next tutorial is still a work in progress.

hsa gravatar image

Posted June 25, 2015, 6:47 a.m.

Hi~ Thansks for this post. I tried to implement the challanges but I am unable to implement the challange regarding "scan data response" for advertising data more than 31 bytes.

Please share some code example for reference related to modifications in advertising_init().

Thanks. /Ash

jthie gravatar image

Posted July 19, 2015, 4 p.m.

@martinbl :Thank you for the tutorial. It is very helpful!

I have a question on writing the ADC value to the manufacturer specific data. It looks like this data is only written to the packet during the advertising initialisation.

How do I read from the ADC (e.g. AIN2 in P0.01) and broadcast the ADC value in the advertising packet?

I have tried out the adc_simple example code as it was (without S100). Can I use the same ADC code in this tutorial code?

kuchims1 gravatar image

Posted Aug. 26, 2015, 6:55 p.m.

i amusing SDK 6.0 since i am using nRF51822 EK. Is this tutorial still valid for me?

MartinBL gravatar image

Posted Sept. 1, 2015, 2:51 p.m.

Sorry for the late response guys. Holidays and busy days in general...

@HSA: Did you try to copy paste the code at the bottom of the tutorial to get scan response working? Are you getting any errors returned from ble_advdata_set()?

@Johnson: Yes, you should be able to use the adc example code alongside the tutorial. To put adc values in your advertising packet you will have to update the manufacturer data and run advdata_set() once more to actually change det packet.

@harsha: Not directly I'm afraid, but with some work you should be able to port it.

I will encourage you all to ask your questions on the forum's main page and not here in the tutorial comment field. That way it will be easier for all users and Nordic employees to see and search for your post. You will probably also get an answer faster that way. Tips and comments about the tutorial are welcome here. You can also send me a PM.

MARTIN FR gravatar image

Posted Sept. 16, 2015, 10:39 a.m.

int8_t *       tx_power_level; // Variable to hold manufacturer specific data
uint8_t data[]                      = "4DBM";
tx_power_level.data.p_data              = data; 
tx_power_level.data.size             = sizeof(data);     
advdata.p_tx_power_level   = &tx_power_level;

i added this line for challenge on ebut it shows me error can anyonbe guide how to solve this issue? in order to tranmit the power?

MartinBL gravatar image

Posted Sept. 16, 2015, 1:41 p.m.

Remove the star (*). You should not declare a pointer. And remember to assign a value to tx_power_level. Try this:

int8_t tx_power_level = 4;
advdata.p_tx_power_level = &tx_power_level;
selim gravatar image

Posted Oct. 9, 2015, 4:50 p.m.

Hello,

So, a regular advertisement is done continuously while the the scan response is only sent when there is a request from a central.

Then, is it more power efficient to put the data in the scan response or in the regular advertisement? Are there any other criteria we have to consider when deciding which attribute to place where? Thanks

andrelongo85 gravatar image

Posted Nov. 3, 2015, 9:51 a.m.

Hi There, I have an nRF52 DK, is there a way to run this tutorial on it? Thanks!

MartinBL gravatar image

Posted Feb. 10, 2016, 9:03 a.m.

As of yesterday it is :)

Sensors gravatar image

Posted Feb. 19, 2016, 3:24 p.m.

There's an error in your 'Scan Response Data' section where you refer toerr_code = ble_advdata_set(&advdata, NULL), which does not exist in the code. It seems to now be this function err_code = ble_advertising_init(&advdata, NULL, &options, on_adv_evt, NULL);

MartinBL gravatar image

Posted Feb. 29, 2016, 2:08 p.m.

Thanks. Fixed it now.

adysan gravatar image

Posted March 26, 2016, 4:20 p.m.

Any reason why Keil is the compiler of choice here? I would appreciate arm-gcc make files to make it easier of Linux/Mac users.

MartinBL gravatar image

Posted April 22, 2016, 2:43 p.m.

I have added GCC files to the SDK11 project now. Please PM me if they don't work.

Keil has been the prefered IDE here at Nordic for a while. Partly because it is easier to set up than GCC and free to use (within the code size limitation of course).

nicewook gravatar image

Posted May 3, 2016, 8:22 a.m.

Thank you for the tutorial. :-)

just minor fix needed. you missed "&"

Change the line err_code = ble_advertising_init(&advdata, NULL, &options, on_adv_evt, NULL);

to

err_code = ble_advertising_init(&advdata, &advdata_response, &options, on_adv_evt, NULL);

buffalo42 gravatar image

Posted May 25, 2016, 6:39 p.m.

Hi,

I think it is worth mentioning that example project won't compile with SDK 11.0.0 alpha version. I assumed the changes from alpha to stable 11.0.0 couldn't be so big and tried to use previously installed v11.0.0-2.alpha which didn't work (due to the changes in softdevice api I think). Using recent nRF5_SDK_11.0.0_89a8197 solved the issues with compilation. I took me a lot of hair scratching until I figured it out, so maybe this post will help someone.

Vijayalakshmi gravatar image

Posted July 13, 2016, 4:46 p.m.

Hi,

Can you explain how to advertise for limited time say 120 seconds.

Thanks.

Gustavo Reynaga gravatar image

Posted July 14, 2016, 8:29 p.m.

Hi, im a Teacher in a community college in Mazatlan, Mexico, it is posible, to do all tutorials, using only open source software like Linux, gcc, etc.? (No Keils for example)

lamarts gravatar image

Posted July 17, 2016, 7:57 p.m.

Great tutorial!!!! Thanks for putting this together.

For Challenge 2 I made the changes as described in the tutorial.

advdata.include_appearance = true; sd_ble_gap_appearance_set(BLE_APPEARANCE_HID_MOUSE);

could not see any changes in the MCP nor was the device seen on my BLE enabled device (Ipad). Any ideas?

Thanks

leighf gravatar image

Posted Aug. 16, 2016, 9:12 a.m.

Hi, I think there is a mistake in the SDK "ble_advertising.c" in the function ble_advertising_init() used in this tutorial.

The code:

if(p_advdata->p_tx_power_level != NULL)
{
    m_advdata.p_tx_power_level    = &m_tx_power_level;
    m_advdata.p_tx_power_level    = p_advdata->p_tx_power_level;
}

should probably be

if(p_advdata->p_tx_power_level != NULL)
{
    m_advdata.p_tx_power_level     = &m_tx_power_level;
    *m_advdata.p_tx_power_level    = *p_advdata->p_tx_power_level;
}

as I think it is the value which should be copied into the local static m_tx_power_level.

I apologise if this has already been fixed. Regards.

wangyong gravatar image

Posted Aug. 31, 2016, 10:25 a.m.

Can I change the advertising data dynamically during program running? Just by calling advertising_init()?

JAMS1988 gravatar image

Posted Sept. 6, 2016, 10:26 p.m.

Hello, I'm using a nRF52835 pc10040, I have all the libs (SDK V11.0.0 zip) and I can compile with succesfully with out any errors and warnings. But the software is not doing anything, dosen't blink the LED when I press the button, and I can't see the device with the dongle in the MCP. This example is compatible with my setup?

Best regards

abrakada gravatar image

Posted Dec. 15, 2016, 7:17 a.m.

Great tutorials, best that i could find in web. Thanks

Gerstalexej gravatar image

Posted Jan. 14, 2017, 2:15 a.m.

Is there any other way to do this than with the dongle? I live in Europe and ordered the nrf52-DK via Express Delivery because I wanted to quickly test how it is to work with this device. I didn't realize that this dongle would be helpful/needed in order to progress through the tutorials.

carlos.po5i gravatar image

Posted Feb. 17, 2017, 1:43 a.m.

Great tutorial.

But I was struggling because I want it to advertise a beacon, now I took a look to the ble_app_beacon example, there the name has to be hidden: advdata.name_type = BLE_ADVDATA_NO_NAME; and many other changes.

The funny part is, when I flash the final firmware, some scanners app show that the name is what I defined in the firmware that was prevously installed. Why is that happening? Could be that the softdevice was modified? I was looking for a solution to change the device name AND advertise at the same time, is that possible?

Sign in to comment.

User menu

    or sign up

Related posts by tag