Developing Bluetooth Applications ################################# Initialization ************** The Bluetooth subsystem is initialized using the :c:func:`bt_enable()` function. The caller should ensure that function succeeds by checking the return code for errors. If a function pointer is passed to :c:func:`bt_enable()`, the initialization happens asynchronously, and the completion is notified through the given function. Bluetooth Application Example ***************************** A simple Bluetooth beacon application is shown below. The application initializes the Bluetooth Subsystem and enables non-connectable advertising, effectively acting as a Bluetooth Low Energy broadcaster. .. literalinclude:: ../../../samples/bluetooth/beacon/src/main.c :language: c :lines: 19- :linenos: The key APIs employed by the beacon sample are :c:func:`bt_enable()` that's used to initialize Bluetooth and then :c:func:`bt_le_adv_start()` that's used to start advertising a specific combination of advertising and scan response data. Testing with QEMU ***************** It's possible to test Bluetooth applications using QEMU. In order to do so, a Bluetooth controller needs to be exported from the host OS (Linux) to the emulator. Using Host System Bluetooth Controller in QEMU ============================================== The host OS's Bluetooth controller is connected to the second QEMU serial line using a UNIX socket. This socket employs the QEMU option :literal:`-serial unix:/tmp/bt-server-bredr`. This option is already added to QEMU through :makevar:`QEMU_EXTRA_FLAGS` in most Bluetooth sample Makefiles' and made available through the 'run' make target. On the host side, BlueZ allows to export its Bluetooth controller through a so-called user channel for QEMU to use: #. Make sure that the Bluetooth controller is down #. Use the btproxy tool to open the listening UNIX socket, type: .. code-block:: console $ sudo tools/btproxy -u Listening on /tmp/bt-server-bredr #. Choose one of the Bluetooth sample applications located in :literal:`samples/bluetooth`. #. To run Bluetooth application in QEMU, type: .. code-block:: console $ make run Running QEMU now results in a connection with the second serial line to the :literal:`bt-server-bredr` UNIX socket, letting the application access the Bluetooth controller.