Hi im having problems with restarting advertising after disconnect. I tried NUS example, simple peripheral example but none of them works.
I modified NUS example with some extra functions but i cannot get it to work.
Unreferencing current connection as advised on forum doesnt help either.
/* * Copyright (c) 2024 Croxel, Inc. * * SPDX-License-Identifier: Apache-2.0 */ #include <zephyr/kernel.h> #include <zephyr/bluetooth/bluetooth.h> #include <zephyr/bluetooth/services/nus.h> #define DEVICE_NAME "XX45" #define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1) static struct bt_conn *current_conn; static const struct bt_data ad[] = { BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN), }; static const struct bt_data sd[] = { BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_NUS_SRV_VAL), }; static void notif_enabled(bool enabled, void *ctx) { ARG_UNUSED(ctx); printk("%s() - %s\n", __func__, (enabled ? "Enabled" : "Disabled")); } static void received(struct bt_conn *conn, const void *data, uint16_t len, void *ctx) { char message[CONFIG_BT_L2CAP_TX_MTU + 1] = ""; ARG_UNUSED(conn); ARG_UNUSED(ctx); memcpy(message, data, MIN(sizeof(message) - 1, len)); printk("%s() - Len: %d, Message: %s\n", __func__, len, message); } struct bt_nus_cb nus_listener = { .notif_enabled = notif_enabled, .received = received, }; int advertising_start() { int err; err = bt_le_adv_start(BT_LE_ADV_CONN_ONE_TIME, ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd)); if (err) { printk("Failed to start advertising: %d\n", err); return err; } return 0; } static void connected(struct bt_conn *conn, uint8_t err) { char addr[BT_ADDR_LE_STR_LEN]; if (err) { printk("Connection failed, err 0x%02x", err); return; } bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); printk("Connected %s", addr); current_conn = bt_conn_ref(conn); //dk_set_led_on(CON_STATUS_LED); } static void disconnected(struct bt_conn *conn, uint8_t reason) { char addr[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); printk("Disconnected: %s, reason 0x%02x ", addr, reason ); if (current_conn) { bt_conn_unref(current_conn); current_conn = NULL; //dk_set_led_off(CON_STATUS_LED); printk("Dereferenced current_conn\n"); advertising_start(); } } BT_CONN_CB_DEFINE(conn_callbacks) = { .connected = connected, .disconnected = disconnected, }; int main(void) { int err; printk("Sample - Bluetooth Peripheral NUS\n"); err = bt_nus_cb_register(&nus_listener, NULL); if (err) { printk("Failed to register NUS callback: %d\n", err); return err; } err = bt_enable(NULL); if (err) { printk("Failed to enable bluetooth: %d\n", err); return err; } advertising_start(); printk("Initialization complete\n"); while (true) { const char *hello_world = "Hello World!\n"; k_sleep(K_SECONDS(3)); err = bt_nus_send(NULL, hello_world, strlen(hello_world)); printk("Data send - Result: %d\n", err); if (err < 0 && (err != -EAGAIN) && (err != -ENOTCONN)) { return err; } } return 0; }
Data send - Result: -128 Connected 5B:4F:15:AE:C7:0B (random)Data send - Result: -128 notif_enabled() - Enabled notif_enabled() - Disabled Data send - Result: -128 Disconnected: 5B:4F:15:AE:C7:0B (random), reason 0x13 Dereferenced current_conn Failed to start advertising: -12