具有 pico w 配置的 btstack

问题描述 投票:0回答:1

我在编译旨在通过蓝牙发送和接收字符串的程序时遇到问题。从文档中,我知道 btstack_run_loop_embedded_get_instance() 存在,但我收到错误:“btstack_run_loop_embedded_get_instance”未在此范围内声明。

我一直在阅读文档并要求 chatgpt 帮助我理解它,据我所知,蓝牙是基于 GATT 等协议构建的,但特别是 SPP,这是我关心的,因为它本质上是蓝牙上的串行端口?尝试编译时出现了有关缺少 btstack_config.h 的错误,该错误是故意丢失的,因为作为开发人员,我应该根据自己的需要对其进行配置。我从 pico w 示例中删除了 btstack_config.h,但它给了我错误:“btstack_run_loop_embedded_get_instance”未在此范围内声明。

看来我没有正确包含 pico-sdk 中的 btstack。

// main.cpp
#include <iostream>
#include <cstring>
#include "btstack.h" // Include the BTstack header file
#include <btstack_run_loop_embedded.h>
#include <btstack_uart_block.h>
#include <hci_transport_h4.h>
#include "pico/cyw43_arch.h"
#include "pico/btstack_cyw43.h"
#include "btstack_memory.h"
#include "hci.h"
#include "rfcomm.h"
// Callback function for receiving data
void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);

int main() {
    // Initialize BTstack
    btstack_memory_init();
    btstack_run_loop_init(btstack_run_loop_embedded_get_instance());

    // Set up Bluetooth module
    const hci_transport_t *transport = hci_transport_h4_instance(btstack_uart_block_embedded_instance());
    remote_device_db_t *remote_device_db = (remote_device_db_t *) &remote_device_db_memory;
    hci_init((hci_transport_t *)transport, NULL, remote_device_db, NULL);
    hci_set_class_of_device(0x000508); // Set device class to 'Uncategorized'

    // Initialize L2CAP
    l2cap_init();

    // Initialize RFCOMM
    rfcomm_init();

    // Initialize SDP
    sdp_init();

    // Setup SPP service
    rfcomm_register_service(packet_handler, RFCOMM_SERVER_CHANNEL, 0xffff);

    // Set local device name
    gap_set_local_name("BTstack SPP Server");

    // Configure Bluetooth device
    hci_power_control(HCI_POWER_ON);

    // Run the event loop
    btstack_run_loop_execute();

    return 0;
}

// Callback function for receiving data
void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size) {
    switch (packet_type) {
        case HCI_EVENT_PACKET:
            switch (packet[0]) {
                case RFCOMM_EVENT_INCOMING_CONNECTION:
                    // Accept incoming connection
                    rfcomm_event_incoming_connection_get_bd_addr(packet, remote_addr);
                    rfcomm_accept_connection(channel);
                    break;
                case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE:
                    if (packet[2]) {
                        std::cerr << "Connection failed" << std::endl;
                    } else {
                        std::cout << "Connection established" << std::endl;

                        // Send a string over Bluetooth
                        const char *message = "Hello, Bluetooth!";
                        rfcomm_send_internal(channel, (uint8_t *) message, strlen(message));
                    }
                    break;
                case RFCOMM_EVENT_CHANNEL_CLOSED:
                    std::cout << "Connection closed" << std::endl;
                    break;
                case RFCOMM_EVENT_DATA_PACKET:
                    // Received data
                    std::cout << "Received: ";
                    for (int i = 0; i < size; i++) {
                        std::cout << packet[i];
                    }
                    std::cout << std::endl;
                    break;
                default:
                    break;
            }
            break;
        default:
            break;
    }
}

//CmakeLists.txt
cmake_minimum_required(VERSION 3.13)

#include(pico_sdk_import.cmake)
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
include($ENV{PICO_EXTRAS_PATH}/external/pico_extras_import.cmake)

project(bt_uart_example)

set(PICO_BOARD pico_w)
pico_sdk_init()
add_executable(${PROJECT_NAME}
    main.cpp
)

# Add BTstack include directories

include_directories(/home/pi/pico/pico-sdk/lib/btstack/src/classic)
include_directories(/home/pi/pico/pico-sdk/lib/btstack/src)
include_directories(/home/pi/pico/pico-sdk/lib/btstack/platform/embedded)
# Add other include directories if needed

# Add BTstack source files
#set(BTSTACK_SOURCES
#    your_project_path/btstack/src/...   # List the necessary source files
#    your_project_path/btstack/platform/embedded/...   # List platform-specific source files
#)

target_include_directories(${PROJECT_NAME} PRIVATE
    ${CMAKE_CURRENT_LIST_DIR}
)
#target_compile_definitions(CYW43_ENABLE_BLUETOOTH=1)

target_compile_options(${PROJECT_NAME} PRIVATE -std=c++17)

target_link_libraries(${PROJECT_NAME} PRIVATE
    pico_stdlib
    pico_btstack_ble # Needed for ble
    pico_btstack_cyw43 # Needed for ble
    pico_cyw43_arch_none # Needed for pico_w
    #pico_bluetooth
    hardware_adc
)
pico_enable_stdio_usb(${PROJECT_NAME} 1)
pico_enable_stdio_uart(${PROJECT_NAME} 0)

pico_add_extra_outputs(${PROJECT_NAME})

// btstack_config.h
#ifndef _PICO_BTSTACK_BTSTACK_CONFIG_H
#define _PICO_BTSTACK_BTSTACK_CONFIG_H

#ifndef ENABLE_BLE
#error Please link to pico_btstack_ble
#endif

// BTstack features that can be enabled
#define ENABLE_LE_PERIPHERAL
#define ENABLE_LOG_INFO
#define ENABLE_LOG_ERROR
#define ENABLE_PRINTF_HEXDUMP

// for the client
#if RUNNING_AS_CLIENT
#define ENABLE_LE_CENTRAL
#define MAX_NR_GATT_CLIENTS 1
#else
#define MAX_NR_GATT_CLIENTS 0
#endif

// BTstack configuration. buffers, sizes, ...
#define HCI_OUTGOING_PRE_BUFFER_SIZE 4
#define HCI_ACL_PAYLOAD_SIZE (255 + 4)
#define HCI_ACL_CHUNK_SIZE_ALIGNMENT 4
#define MAX_NR_HCI_CONNECTIONS 1
#define MAX_NR_SM_LOOKUP_ENTRIES 3
#define MAX_NR_WHITELIST_ENTRIES 16
#define MAX_NR_LE_DEVICE_DB_ENTRIES 16

// Limit number of ACL/SCO Buffer to use by stack to avoid cyw43 shared bus overrun
#define MAX_NR_CONTROLLER_ACL_BUFFERS 3
#define MAX_NR_CONTROLLER_SCO_PACKETS 3

// Enable and configure HCI Controller to Host Flow Control to avoid cyw43 shared bus overrun
#define ENABLE_HCI_CONTROLLER_TO_HOST_FLOW_CONTROL
#define HCI_HOST_ACL_PACKET_LEN (255+4)
#define HCI_HOST_ACL_PACKET_NUM 3
#define HCI_HOST_SCO_PACKET_LEN 120
#define HCI_HOST_SCO_PACKET_NUM 3

// Link Key DB and LE Device DB using TLV on top of Flash Sector interface
#define NVM_NUM_DEVICE_DB_ENTRIES 16
#define NVM_NUM_LINK_KEYS 16

// We don't give btstack a malloc, so use a fixed-size ATT DB.
#define MAX_ATT_DB_SIZE 512

// BTstack HAL configuration
#define HAVE_EMBEDDED_TIME_MS
#define HAVE_EMBEDDED_TICK
#define HAVE_EMBEDDED_TICK_ELAPSED
#define HAVE_EMBEDDED_SLEEP
// map btstack_assert onto Pico SDK assert()
#define HAVE_ASSERT
// Some USB dongles take longer to respond to HCI reset (e.g. BCM20702A).
#define HCI_RESET_RESEND_TIMEOUT_MS 1000
#define ENABLE_SOFTWARE_AES128
#define ENABLE_MICRO_ECC_FOR_LE_SECURE_CONNECTIONS

#endif // MICROPY_INCLUDED_EXTMOD_BTSTACK_BTSTACK_CONFIG_H

make output:

/home/pi/pico/phonk/branch5/main.cpp: In function 'int main()':
/home/pi/pico/phonk/branch5/main.cpp:22:5: error: 'remote_device_db_t' was not declared in this scope
     remote_device_db_t *remote_device_db = (remote_device_db_t *) &remote_device_db_memory;
     ^~~~~~~~~~~~~~~~~~
/home/pi/pico/phonk/branch5/main.cpp:22:5: note: suggested alternative: 'le_device_db_add'
     remote_device_db_t *remote_device_db = (remote_device_db_t *) &remote_device_db_memory;
     ^~~~~~~~~~~~~~~~~~
     le_device_db_add
/home/pi/pico/phonk/branch5/main.cpp:22:25: error: 'remote_device_db' was not declared in this scope
     remote_device_db_t *remote_device_db = (remote_device_db_t *) &remote_device_db_memory;
                         ^~~~~~~~~~~~~~~~
/home/pi/pico/phonk/branch5/main.cpp:22:25: note: suggested alternative: 'rfcomm_service_t'
     remote_device_db_t *remote_device_db = (remote_device_db_t *) &remote_device_db_memory;
                         ^~~~~~~~~~~~~~~~
                         rfcomm_service_t
/home/pi/pico/phonk/branch5/main.cpp:22:65: error: expected primary-expression before ')' token
     remote_device_db_t *remote_device_db = (remote_device_db_t *) &remote_device_db_memory;
                                                                 ^
/home/pi/pico/phonk/branch5/main.cpp:22:68: error: 'remote_device_db_memory' was not declared in this scope
     remote_device_db_t *remote_device_db = (remote_device_db_t *) &remote_device_db_memory;
                                                                    ^~~~~~~~~~~~~~~~~~~~~~~
/home/pi/pico/phonk/branch5/main.cpp:22:68: note: suggested alternative: 'le_device_db_remove'
     remote_device_db_t *remote_device_db = (remote_device_db_t *) &remote_device_db_memory;
                                                                    ^~~~~~~~~~~~~~~~~~~~~~~
                                                                    le_device_db_remove
/home/pi/pico/phonk/branch5/main.cpp:24:5: error: 'hci_set_class_of_device' was not declared in this scope
     hci_set_class_of_device(0x000508); // Set device class to 'Uncategorized'
     ^~~~~~~~~~~~~~~~~~~~~~~
/home/pi/pico/phonk/branch5/main.cpp:24:5: note: suggested alternative: 'gap_set_class_of_device'
     hci_set_class_of_device(0x000508); // Set device class to 'Uncategorized'
     ^~~~~~~~~~~~~~~~~~~~~~~
     gap_set_class_of_device
/home/pi/pico/phonk/branch5/main.cpp:33:5: error: 'sdp_init' was not declared in this scope
     sdp_init();
     ^~~~~~~~
/home/pi/pico/phonk/branch5/main.cpp:33:5: note: suggested alternative: 'sm_init'
     sdp_init();
     ^~~~~~~~
     sm_init
/home/pi/pico/phonk/branch5/main.cpp:36:45: error: 'RFCOMM_SERVER_CHANNEL' was not declared in this scope
     rfcomm_register_service(packet_handler, RFCOMM_SERVER_CHANNEL, 0xffff);
                                             ^~~~~~~~~~~~~~~~~~~~~
/home/pi/pico/phonk/branch5/main.cpp:36:45: note: suggested alternative: 'RFCOMM_CREATE_CHANNEL'
     rfcomm_register_service(packet_handler, RFCOMM_SERVER_CHANNEL, 0xffff);
                                             ^~~~~~~~~~~~~~~~~~~~~
                                             RFCOMM_CREATE_CHANNEL
/home/pi/pico/phonk/branch5/main.cpp: In function 'void packet_handler(uint8_t, uint16_t, uint8_t*, uint16_t)':
/home/pi/pico/phonk/branch5/main.cpp:57:74: error: 'remote_addr' was not declared in this scope
                     rfcomm_event_incoming_connection_get_bd_addr(packet, remote_addr);
                                                                          ^~~~~~~~~~~
/home/pi/pico/phonk/branch5/main.cpp:57:74: note: suggested alternative: '_remove_r'
                     rfcomm_event_incoming_connection_get_bd_addr(packet, remote_addr);
                                                                          ^~~~~~~~~~~
                                                                          _remove_r
/home/pi/pico/phonk/branch5/main.cpp:60:22: error: 'RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE' was not declared in this scope
                 case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE:
                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/pi/pico/phonk/branch5/main.cpp:60:22: note: suggested alternative: 'RFCOMM_EVENT_CHANNEL_OPENED'
                 case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE:
                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      RFCOMM_EVENT_CHANNEL_OPENED
/home/pi/pico/phonk/branch5/main.cpp:68:25: error: 'rfcomm_send_internal' was not declared in this scope
                         rfcomm_send_internal(channel, (uint8_t *) message, strlen(message));
                         ^~~~~~~~~~~~~~~~~~~~
/home/pi/pico/phonk/branch5/main.cpp:68:25: note: suggested alternative: 'rfcomm_send_prepared'
                         rfcomm_send_internal(channel, (uint8_t *) message, strlen(message));
                         ^~~~~~~~~~~~~~~~~~~~
                         rfcomm_send_prepared
/home/pi/pico/phonk/branch5/main.cpp:74:22: error: 'RFCOMM_EVENT_DATA_PACKET' was not declared in this scope
                 case RFCOMM_EVENT_DATA_PACKET:
                      ^~~~~~~~~~~~~~~~~~~~~~~~
/home/pi/pico/phonk/branch5/main.cpp:74:22: note: suggested alternative: 'RFCOMM_DATA_PACKET'
                 case RFCOMM_EVENT_DATA_PACKET:
                      ^~~~~~~~~~~~~~~~~~~~~~~~
                      RFCOMM_DATA_PACKET
make[2]: *** [CMakeFiles/bt_uart_example.dir/build.make:63: CMakeFiles/bt_uart_example.dir/main.cpp.obj] Error 1
make[1]: *** [CMakeFiles/Makefile2:2181: CMakeFiles/bt_uart_example.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

c++ bluetooth-lowenergy raspberry-pi-pico btstack
1个回答
0
投票

你可以发送工作代码的最终版本吗?

© www.soinside.com 2019 - 2024. All rights reserved.