mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
examples: add NimBLE GATT server example app
This commit is contained in:
parent
24a7f26eee
commit
f4dccc402e
24
examples/nimble_gatt/Makefile
Normal file
24
examples/nimble_gatt/Makefile
Normal file
@ -0,0 +1,24 @@
|
||||
# name of your application
|
||||
APPLICATION = nimble_gatt
|
||||
|
||||
# If no BOARD is found in the environment, use this default:
|
||||
BOARD ?= nrf52dk
|
||||
|
||||
# So far, NimBLE only works on nRF52 based platforms
|
||||
BOARD_WHITELIST := nrf52dk nrf52840dk
|
||||
|
||||
# This has to be the absolute path to the RIOT base directory:
|
||||
RIOTBASE ?= $(CURDIR)/../..
|
||||
|
||||
# Include NimBLE
|
||||
USEPKG += nimble
|
||||
|
||||
# Comment this out to disable code in RIOT that does safety checking
|
||||
# which is not needed in a production environment but helps in the
|
||||
# development process:
|
||||
DEVELHELP ?= 1
|
||||
|
||||
# Change this to 0 show compiler invocation lines by default:
|
||||
QUIET ?= 1
|
||||
|
||||
include $(RIOTBASE)/Makefile.include
|
9
examples/nimble_gatt/README.md
Normal file
9
examples/nimble_gatt/README.md
Normal file
@ -0,0 +1,9 @@
|
||||
NimBLE GATT Server Example
|
||||
==========================
|
||||
This example application configures and runs the NimBLE BLE stack as simple GATT
|
||||
server. It will provide two services, the build-in GAP and the build-in GATT
|
||||
service. The device will advertise itself by the name `NimBLE on RIOT`.
|
||||
|
||||
To interact with the BLE device running this example, use any BLE client that is
|
||||
able to discover and interact with GATT services.
|
||||
An easy way to get started is to use a smartphone (supporting at least BT 4.0) with Nordic's `nRF Connect` App.
|
135
examples/nimble_gatt/main.c
Normal file
135
examples/nimble_gatt/main.c
Normal file
@ -0,0 +1,135 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Freie Universität Berlin
|
||||
* 2018 Codecoup
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
* directory for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @ingroup examples
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief BLE peripheral example using NimBLE
|
||||
*
|
||||
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
|
||||
* @author Andrzej Kaczmarek <andrzej.kaczmarek@codecoup.pl>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "nimble_riot.h"
|
||||
|
||||
#include "nimble/nimble_port.h"
|
||||
#include "host/ble_hs.h"
|
||||
#include "host/util/util.h"
|
||||
#include "services/gap/ble_svc_gap.h"
|
||||
#include "services/gatt/ble_svc_gatt.h"
|
||||
|
||||
static const char device_name[] = "NimBLE on RIOT";
|
||||
static uint8_t own_addr_type;
|
||||
|
||||
|
||||
static void start_advertise(void);
|
||||
|
||||
static void put_ad(uint8_t ad_type, uint8_t ad_len, const void *ad, uint8_t *buf,
|
||||
uint8_t *len)
|
||||
{
|
||||
buf[(*len)++] = ad_len + 1;
|
||||
buf[(*len)++] = ad_type;
|
||||
|
||||
memcpy(&buf[*len], ad, ad_len);
|
||||
|
||||
*len += ad_len;
|
||||
}
|
||||
|
||||
static void update_ad(void)
|
||||
{
|
||||
uint8_t ad[BLE_HS_ADV_MAX_SZ];
|
||||
uint8_t ad_len = 0;
|
||||
uint8_t ad_flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP;
|
||||
|
||||
put_ad(BLE_HS_ADV_TYPE_FLAGS, 1, &ad_flags, ad, &ad_len);
|
||||
put_ad(BLE_HS_ADV_TYPE_COMP_NAME, sizeof(device_name), device_name, ad, &ad_len);
|
||||
|
||||
ble_gap_adv_set_data(ad, ad_len);
|
||||
}
|
||||
|
||||
static int gap_event_cb(struct ble_gap_event *event, void *arg)
|
||||
{
|
||||
(void)arg;
|
||||
|
||||
switch (event->type) {
|
||||
case BLE_GAP_EVENT_CONNECT:
|
||||
if (event->connect.status) {
|
||||
start_advertise();
|
||||
}
|
||||
break;
|
||||
|
||||
case BLE_GAP_EVENT_DISCONNECT:
|
||||
start_advertise();
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void start_advertise(void)
|
||||
{
|
||||
struct ble_gap_adv_params advp;
|
||||
int rc;
|
||||
|
||||
memset(&advp, 0, sizeof advp);
|
||||
advp.conn_mode = BLE_GAP_CONN_MODE_UND;
|
||||
advp.disc_mode = BLE_GAP_DISC_MODE_GEN;
|
||||
rc = ble_gap_adv_start(own_addr_type, NULL, BLE_HS_FOREVER,
|
||||
&advp, gap_event_cb, NULL);
|
||||
assert(rc == 0);
|
||||
}
|
||||
|
||||
static void app_ble_sync_cb(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = ble_hs_util_ensure_addr(0);
|
||||
assert(rc == 0);
|
||||
|
||||
rc = ble_hs_id_infer_auto(0, &own_addr_type);
|
||||
assert(rc == 0);
|
||||
|
||||
/* generate the advertising data */
|
||||
update_ad();
|
||||
|
||||
start_advertise();
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
puts("NimBLE GATT Server Example");
|
||||
|
||||
/* initialize NimBLE's controller */
|
||||
nimble_riot_controller_init();
|
||||
|
||||
/* register the synchronization callback that is triggered once the host has
|
||||
* finished its initialization */
|
||||
ble_hs_cfg.sync_cb = app_ble_sync_cb;
|
||||
|
||||
/* initialize NimBLE porting layer and the default GATT and GAP services*/
|
||||
nimble_port_init();
|
||||
ble_svc_gap_init();
|
||||
ble_svc_gatt_init();
|
||||
|
||||
/* set the device name */
|
||||
ble_svc_gap_device_name_set(device_name);
|
||||
|
||||
/* and finally run NimBLE's host event loop. The event loop contains a pre-
|
||||
* configured event which will trigger the hosts initialization */
|
||||
nimble_port_run();
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user