From e076f1242fa5d38a0c1200f7a827c2142adfbdc2 Mon Sep 17 00:00:00 2001 From: "matthias.ringwald@gmail.com" Date: Mon, 10 Jun 2013 10:43:53 +0000 Subject: [PATCH] examples for POSIX/libusb platform, sdp rfcomm query --- example/libusb/Makefile | 60 +++++++++++++++ example/libusb/config.h | 15 ++++ example/libusb/sdp_rfcomm_query.c | 119 ++++++++++++++++++++++++++++++ 3 files changed, 194 insertions(+) create mode 100644 example/libusb/Makefile create mode 100644 example/libusb/config.h create mode 100644 example/libusb/sdp_rfcomm_query.c diff --git a/example/libusb/Makefile b/example/libusb/Makefile new file mode 100644 index 000000000..22def4604 --- /dev/null +++ b/example/libusb/Makefile @@ -0,0 +1,60 @@ +BTSTACK_ROOT = ../.. + + +CFLAGS = -g -Wall -I. -I${BTSTACK_ROOT}/src -I${BTSTACK_ROOT}/include -I${BTSTACK_ROOT}/chipset-cc256x +CFLAGS += -I/sw/include -I../.. +LDFLAGS = -L/sw/lib -lusb-1.0 + +CORE = \ + ${BTSTACK_ROOT}/src/btstack_memory.c \ + ${BTSTACK_ROOT}/src/linked_list.c \ + ${BTSTACK_ROOT}/src/memory_pool.c \ + ${BTSTACK_ROOT}/src/run_loop.c \ + ${BTSTACK_ROOT}/src/run_loop_posix.c \ + +COMMON = \ + ${BTSTACK_ROOT}/src/hci.c \ + ${BTSTACK_ROOT}/src/hci_cmds.c \ + ${BTSTACK_ROOT}/src/hci_dump.c \ + ${BTSTACK_ROOT}/src/hci_transport_h4.c \ + ${BTSTACK_ROOT}/src/hci_transport_usb.c \ + ${BTSTACK_ROOT}/src/l2cap.c \ + ${BTSTACK_ROOT}/src/l2cap_signaling.c \ + ${BTSTACK_ROOT}/src/remote_device_db_memory.c \ + ${BTSTACK_ROOT}/src/sdp_util.c \ + ${BTSTACK_ROOT}/src/utils.c \ + ${BTSTACK_ROOT}/src/sdp_query_rfcomm.c \ + ${BTSTACK_ROOT}/src/sdp_parser.c \ + ${BTSTACK_ROOT}/src/sdp_client.c \ + + # ${BTSTACK_ROOT}/src/rfcomm.c \ + # ${BTSTACK_ROOT}/src/sdp.c \ + # ${BTSTACK_ROOT}/chipset-cc256x/bt_control_cc256x.c \ + # ${BTSTACK_ROOT}/chipset-cc256x/bluetooth_init_cc2560A_2.1.c \ + +CORE_OBJ = $(CORE:.c=.o) +COMMON_OBJ = $(COMMON:.c=.o) + + +# create firmware image from common objects and example source file + +all: sdp_rfcomm_query +#spp-usb l2cap-server-usb l2cap-client-usb l2cap-server-uart l2cap-client-uart + +sdp_rfcomm_query: ${CORE_OBJ} ${COMMON_OBJ} sdp_rfcomm_query.c + ${CC} $^ ${CFLAGS} ${LDFLAGS} -o $@ + +spp: ${CORE_OBJ} ${COMMON_OBJ} spp-usb.o + ${CC} $^ ${LDFLAGS} -o $@ + +l2cap_server: ${CORE_OBJ} ${COMMON_OBJ} l2cap-server.c + ${CC} $^ ${CFLAGS} ${LDFLAGS} -o $@ + +l2cap_client: ${CORE_OBJ} ${COMMON_OBJ} l2cap-client.c + ${CC} $^ ${CFLAGS} ${LDFLAGS} -o $@ + +clean: + rm -f l2cap_server l2cap_client spp sdp_rfcomm_query *.o *.out *.hex ../driver/*.o ${BTSTACK_ROOT}/src/*.o + rm -f ${BTSTACK_ROOT}/chipset-cc256x/*.o + rm -rf *.dSYM + \ No newline at end of file diff --git a/example/libusb/config.h b/example/libusb/config.h new file mode 100644 index 000000000..d1630c86d --- /dev/null +++ b/example/libusb/config.h @@ -0,0 +1,15 @@ +// config.h created by configure for BTstack Tue Jun 4 23:10:20 CEST 2013 +#define HAVE_TRANSPORT_USB +#define USB_PRODUCT_ID 0 +#define USB_VENDOR_ID 0 +#define USE_POSIX_RUN_LOOP +#define HAVE_SDP +#define HAVE_RFCOMM +#define REMOTE_DEVICE_DB remote_device_db_iphone +#define HAVE_SO_NOSIGPIPE +#define HAVE_TIME +#define HAVE_MALLOC +#define HAVE_BZERO +#define ENABLE_LOG_INFO +#define ENABLE_LOG_ERROR +#define HCI_ACL_PAYLOAD_SIZE 1021 diff --git a/example/libusb/sdp_rfcomm_query.c b/example/libusb/sdp_rfcomm_query.c new file mode 100644 index 000000000..d5ed7fb6f --- /dev/null +++ b/example/libusb/sdp_rfcomm_query.c @@ -0,0 +1,119 @@ + +//***************************************************************************** +// +// minimal setup for SDP client over USB or UART +// +//***************************************************************************** + +#include "config.h" + +#include +#include +#include +#include + +#include "sdp_query_rfcomm.h" + +#include +#include + +#include "hci.h" +#include "btstack_memory.h" +#include "hci_dump.h" +#include "l2cap.h" + +static bd_addr_t remote = {0x04,0x0C,0xCE,0xE4,0x85,0xD3}; + +static uint8_t service_index = 0; +static uint8_t channel_nr[10]; +static char* service_name[10]; + + +static void packet_handler (void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ + printf("packet_handler type %u, packet[0] %x\n", packet_type, packet[0]); + + if (packet_type != HCI_EVENT_PACKET) return; + uint8_t event = packet[0]; + + switch (event) { + case BTSTACK_EVENT_STATE: + // bt stack activated, get started + if (packet[2] == HCI_STATE_WORKING){ + sdp_query_rfcomm_channel_and_name_for_uuid(remote, 0x1002); + } + break; + default: + break; + } +} + +static void btstack_setup(){ + /// GET STARTED /// + btstack_memory_init(); + run_loop_init(RUN_LOOP_POSIX); + + // hci_dump_open("/tmp/hci_dump_sdp_client.pklg", HCI_DUMP_PACKETLOGGER); + + hci_transport_t * transport = hci_transport_usb_instance(); + hci_uart_config_t * config = NULL; + bt_control_t * control = NULL; + + remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_memory; + hci_init(transport, config, control, remote_db); + printf("Client HCI init done\r\n"); + + // init L2CAP + l2cap_init(); + l2cap_register_packet_handler(packet_handler); + + // turn on! + hci_power_control(HCI_POWER_ON); +} + +void store_found_service(uint8_t * name, uint8_t port){ + printf("APP: Service name: '%s', RFCOMM port %u\n", name, port); + channel_nr[service_index] = port; + service_name[service_index] = (char*) malloc(SDP_SERVICE_NAME_LEN+1); + strncpy(service_name[service_index], (char*) name, SDP_SERVICE_NAME_LEN); + service_name[service_index][SDP_SERVICE_NAME_LEN] = 0; + service_index++; +} + +void report_found_services(){ + printf("\n *** Client query response done. "); + if (service_index == 0){ + printf("No service found.\n\n"); + } else { + printf("Found following %d services:\n", service_index); + } + int i; + for (i=0; itype){ + case SDP_QUERY_RFCOMM_SERVICE: + ve = (sdp_query_rfcomm_service_event_t*) event; + store_found_service(ve->service_name, ve->channel_nr); + break; + case SDP_QUERY_COMPLETE: + ce = (sdp_query_complete_event_t*) event; + report_found_services(); + break; + } +} + +int main(void){ + sdp_query_rfcomm_register_callback(handle_query_rfcomm_event, NULL); + + btstack_setup(); + // go! + run_loop_execute(); + return 0; +}