FBSD bt gammu

Iain Hibbert plunky at rya-online.net
Mon May 25 12:48:07 UTC 2009


On Thu, 6 Sep 2007, Boris Samorodov wrote:

> On Wed, 5 Sep 2007 09:56:26 -0700 Maksim Yevmenkin wrote:
>
> > please modify cmake scripts so it can properly detect bluetooth on freebsd
>
> Michal incorporated all FreeBSD patches to svn version. All bluetooth
> functions except channel searching (switched off for FreeBSD) should
> work fine.
>
> Those who are interested may test it and give a feedback.
> Those who are interested may look into channel searching problem and
> produce patches. ;-)

Hi Boris,

This was some time ago but I have just rewritten the FBSD support in gammu
to be generic BSD support and implemented channel searching using the new
device access (already in FreeBSD) and service discovery (which Max is
working on porting) routines. I wonder if you can validate that my work
doesn't cause any regressions on FreeBSD?

The attached patch adds
	cmake/FindBSDBluetooth.cmake
	libgammu/device/bluetoth/blue_bsd.c
	libgammu/device/bluetoth/blue_bsd.h

and converts the build to use those files instead of the 'fbsd' versions,
which can be removed, and the cmake framework will enable the channel
searching if the new API is present.

I'm not quite ready to commit the bt_dev stuff into NetBSD but will push
this upstream after we have all caught up. I'm not sure if it will be
worth putting the patches into ports or not, will leave that up to you.

iain
-------------- next part --------------
diff -Nru orig/gammu-1.24.0/CMakeLists.txt gammu-1.24.0/CMakeLists.txt
--- orig/gammu-1.24.0/CMakeLists.txt	2009-04-15 14:39:54.000000000 +0100
+++ gammu-1.24.0/CMakeLists.txt	2009-05-25 13:04:36.000000000 +0100
@@ -270,12 +270,12 @@
             set(BLUETOOTH_SEARCH TRUE)
             message(STATUS "Using BlueZ stack")
         endif (BLUEZ_FOUND)
-        find_package (FBSDBluetooth)
-        if (FBSD_BLUE_FOUND)
+        find_package (BSDBluetooth)
+        if (BSD_BLUE_FOUND)
             set(BLUETOOTH_FOUND ON)
-            set(BLUETOOTH_SEARCH FALSE)
-            message(STATUS "Using FreeBSD Bluetooth stack")
-        endif (FBSD_BLUE_FOUND)
+	    check_library_exists(bluetooth sdp_service_search_attribute "" BLUETOOTH_SEARCH)
+            message(STATUS "Using BSD Bluetooth stack")
+        endif (BSD_BLUE_FOUND)
         find_package (OSXBluetooth)
         if (OSX_BLUE_FOUND)
             set(BLUETOOTH_FOUND ON)
@@ -360,11 +360,11 @@
     endif (NOT "${BLUEZ_LIBRARIES}" STREQUAL "")
 endif (BLUEZ_FOUND)
 
-if (FBSD_BLUE_FOUND)
-    if (NOT "${FBSD_BLUE_LIBRARIES}" STREQUAL "")
-        set (GAMMU_LIBS "${GAMMU_LIBS} -l${FBSD_BLUE_LIBRARIES}")
-    endif (NOT "${FBSD_BLUE_LIBRARIES}" STREQUAL "")
-endif (FBSD_BLUE_FOUND)
+if (BSD_BLUE_FOUND)
+    if (NOT "${BSD_BLUE_LIBRARIES}" STREQUAL "")
+        set (GAMMU_LIBS "${GAMMU_LIBS} -l${BSD_BLUE_LIBRARIES}")
+    endif (NOT "${BSD_BLUE_LIBRARIES}" STREQUAL "")
+endif (BSD_BLUE_FOUND)
 
 if (ICONV_FOUND)
     if (NOT "${ICONV_LIBRARIES}" STREQUAL "")
diff -Nru orig/gammu-1.24.0/cmake/FindBSDBluetooth.cmake gammu-1.24.0/cmake/FindBSDBluetooth.cmake
--- orig/gammu-1.24.0/cmake/FindBSDBluetooth.cmake	1970-01-01 01:00:00.000000000 +0100
+++ gammu-1.24.0/cmake/FindBSDBluetooth.cmake	2009-05-22 09:48:26.000000000 +0100
@@ -0,0 +1,35 @@
+# - Finds Bluetooth library on BSD
+# This module defines
+#  BSD_BLUE_INCLUDE_DIR, where to find bluetooth.h
+#  BSD_BLUE_LIBRARIES, the libraries needed to use BSD Bluetooth.
+#  BSD_BLUE_FOUND, If false, do not try to use BSD Bluetooth.
+#
+# Copyright (c) 2007, Michal Cihar, <michal at cihar.com>
+#
+# vim: expandtab sw=4 ts=4 sts=4:
+
+if (NOT DEFINED BSD_BLUE_FOUND)
+    if (NOT CROSS_MINGW)
+        find_path(BSD_BLUE_INCLUDE_DIR NAMES bluetooth.h
+           PATHS
+           /usr/include
+           /usr/local/include
+        )
+
+        find_library(BSD_BLUE_LIBRARIES NAMES bluetooth
+           PATHS
+           /usr/lib
+           /usr/local/lib
+        )
+
+        if(BSD_BLUE_INCLUDE_DIR AND BSD_BLUE_LIBRARIES)
+           set(BSD_BLUE_FOUND TRUE CACHE INTERNAL "BSD Bluetooth found")
+           message(STATUS "Found BSD Bluetooth: ${BSD_BLUE_INCLUDE_DIR}, ${BSD_BLUE_LIBRARIES}")
+        else(BSD_BLUE_INCLUDE_DIR AND BSD_BLUE_LIBRARIES)
+           set(BSD_BLUE_FOUND FALSE CACHE INTERNAL "BSD Bluetooth found")
+           message(STATUS "BSD Bluetooth not found.")
+        endif(BSD_BLUE_INCLUDE_DIR AND BSD_BLUE_LIBRARIES)
+
+        mark_as_advanced(BSD_BLUE_INCLUDE_DIR BSD_BLUE_LIBRARIES)
+    endif (NOT CROSS_MINGW)
+endif (NOT DEFINED BSD_BLUE_FOUND)
diff -Nru orig/gammu-1.24.0/cmake/templates/gammu-config.h.cmake gammu-1.24.0/cmake/templates/gammu-config.h.cmake
--- orig/gammu-1.24.0/cmake/templates/gammu-config.h.cmake	2009-03-17 15:01:11.000000000 +0000
+++ gammu-1.24.0/cmake/templates/gammu-config.h.cmake	2009-05-22 09:49:28.000000000 +0100
@@ -322,8 +322,8 @@
 /* Do we have libusb-1.0 ? */
 #cmakedefine LIBUSB_FOUND
 
-/* Will be used FreeBSD Bluetooth stack ? */
-#cmakedefine FBSD_BLUE_FOUND
+/* Will be used BSD Bluetooth stack ? */
+#cmakedefine BSD_BLUE_FOUND
 
 /* Will be used OSX Bluetooth stack ? */
 #cmakedefine OSX_BLUE_FOUND
diff -Nru orig/gammu-1.24.0/libgammu/CMakeLists.txt gammu-1.24.0/libgammu/CMakeLists.txt
--- orig/gammu-1.24.0/libgammu/CMakeLists.txt	2009-03-18 09:16:38.000000000 +0000
+++ gammu-1.24.0/libgammu/CMakeLists.txt	2009-05-22 09:46:23.000000000 +0100
@@ -76,9 +76,9 @@
 if (LIBUSB_FOUND)
     list (APPEND LIBRARY_SRC device/usb/usb.c)
 endif (LIBUSB_FOUND)
-if (FBSD_BLUE_FOUND)
-    list (APPEND LIBRARY_SRC device/bluetoth/blue_fbsd.c)
-endif (FBSD_BLUE_FOUND)
+if (BSD_BLUE_FOUND)
+    list (APPEND LIBRARY_SRC device/bluetoth/blue_bsd.c)
+endif (BSD_BLUE_FOUND)
 if (OSX_BLUE_FOUND)
     list (APPEND LIBRARY_SRC device/bluetoth/blue_osx.c)
 endif (OSX_BLUE_FOUND)
@@ -126,10 +126,10 @@
     include_directories (${LIBUSB_INCLUDE_DIR})
 endif (LIBUSB_FOUND)
 
-if (FBSD_BLUE_FOUND)
-    target_link_libraries (libGammu ${FBSD_BLUE_LIBRARIES})
-    include_directories (${FBSD_BLUE_INCLUDE_DIR})
-endif (FBSD_BLUE_FOUND)
+if (BSD_BLUE_FOUND)
+    target_link_libraries (libGammu ${BSD_BLUE_LIBRARIES})
+    include_directories (${BSD_BLUE_INCLUDE_DIR})
+endif (BSD_BLUE_FOUND)
 
 if (OSX_BLUE_FOUND)
     target_link_libraries (libGammu ${OSX_BLUE_LIBS})
diff -Nru orig/gammu-1.24.0/libgammu/device/bluetoth/blue_bsd.c gammu-1.24.0/libgammu/device/bluetoth/blue_bsd.c
--- orig/gammu-1.24.0/libgammu/device/bluetoth/blue_bsd.c	1970-01-01 01:00:00.000000000 +0100
+++ gammu-1.24.0/libgammu/device/bluetoth/blue_bsd.c	2009-05-25 13:37:40.000000000 +0100
@@ -0,0 +1,265 @@
+/*-
+ * Copyright (c) 2009 Iain Hibbert
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_BLUETOOTHDEVICE
+#ifdef BSD_BLUE_FOUND
+
+#include <sys/socket.h>
+#include <sys/time.h>
+
+#include <bluetooth.h>
+#include <errno.h>
+#include <netdb.h>
+#include <sdp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "../../gsmcomon.h"
+#include "../devfunc.h"
+#include "bluetoth.h"
+
+/*
+ * Handle FreeBSD compatibility
+ */
+#ifndef BTPROTO_RFCOMM
+#define BTPROTO_RFCOMM	BLUETOOTH_PROTO_RFCOMM
+#define BDADDR_ANY	NG_HCI_BDADDR_ANY
+#define sockaddr_bt	sockaddr_rfcomm
+#define bt_len		rfcomm_len
+#define bt_family	rfcomm_family
+#define bt_channel	rfcomm_channel
+#define bt_bdaddr	rfcomm_bdaddr
+#endif
+
+static GSM_Error bluetooth_open(GSM_StateMachine *s, bdaddr_t *bdaddr, int channel)
+{
+	GSM_Device_BlueToothData	*d = &s->Device.Data.BlueTooth;
+	struct sockaddr_bt 		sa;
+	int 				fd;
+
+	memset(&sa, 0, sizeof(sa));
+	sa.bt_len = sizeof(sa);
+	sa.bt_family = AF_BLUETOOTH;
+
+	smprintf(s, "Connecting to RF channel %i\n", channel);
+
+	fd = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
+	if (fd < 0) {
+		smprintf(s, "Can't create socket\n");
+		return ERR_DEVICENODRIVER;
+	}
+
+	bdaddr_copy(&sa.bt_bdaddr, BDADDR_ANY);
+
+	if (bind(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
+		smprintf(s, "Can't bind socket: %s\n", strerror(errno));
+		close(fd);
+		return ERR_DEVICEOPENERROR;
+	}
+
+	sa.bt_channel = channel;
+	bdaddr_copy(&sa.bt_bdaddr, bdaddr);
+
+	if (connect(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
+		smprintf(s, "Can't connect to %s: %s\n", bt_ntoa(bdaddr, NULL), strerror(errno));
+		close(fd);
+		return ERR_DEVICEOPENERROR;
+	}
+
+	d->hPhone = fd;
+    	return ERR_NONE;
+}
+
+GSM_Error bluetooth_connect(GSM_StateMachine *s, int port, char *device)
+{
+	bdaddr_t	bdaddr;
+	struct hostent *he = NULL;
+
+	if (!bt_aton(device, &bdaddr)) {
+		if ((he = bt_gethostbyname(device)) == NULL) {
+			smprintf(s, "%s: %s\n", device, hstrerror(h_errno));
+			return ERR_UNKNOWN;
+		}
+
+		bdaddr_copy(&bdaddr, (bdaddr_t *)he->h_addr);
+	}
+
+	return bluetooth_open(s, &bdaddr, port);
+}
+
+#ifdef BLUETOOTH_RF_SEARCHING
+
+static int bluetooth_channel(sdp_data_t *value)
+{
+	sdp_data_t	pdl, seq;
+	uintmax_t	channel;
+
+	sdp_get_alt(value, value);	/* strip any alt container */
+
+	while (sdp_get_seq(value, &pdl)) {
+		if (sdp_get_seq(&pdl, &seq)
+		    && sdp_match_uuid16(&seq, SDP_UUID_PROTOCOL_L2CAP)
+		    && sdp_get_seq(&pdl, &seq)
+		    && sdp_match_uuid16(&seq, SDP_UUID_PROTOCOL_RFCOMM)
+		    && sdp_get_uint(&seq, &channel)
+		    && channel >= 1 && channel <= 30)
+			return channel;
+	}
+
+	return -1;
+}
+
+static char *bluetooth_service(sdp_data_t *value)
+{
+	char		*str;
+	size_t		len;
+
+	if (!sdp_get_str(value, &str, &len))
+		return NULL;
+
+	return strndup(str, len);
+}
+
+static GSM_Error bluetooth_search(GSM_StateMachine *s, bdaddr_t *bdaddr)
+{
+	sdp_data_t	rec, rsp, ssp, value;
+	uint8_t		buf[3];
+	uint16_t	attr;
+	sdp_session_t	ss;
+	int		ch, channel, sc, score;
+	char		*sv;
+
+	smprintf(s, "Searching for services on %s\n", bt_ntoa(bdaddr, NULL));
+
+	ss = sdp_open(NULL, bdaddr);
+	if (ss == NULL) {
+		smprintf(s, "SDP Connection failed: %s\n", strerror(errno));
+		return ERR_TIMEOUT;
+	}
+
+	ssp.next = buf;
+	ssp.end = buf + sizeof(buf);
+	sdp_put_uuid16(&ssp, SDP_UUID_PROTOCOL_RFCOMM);
+	ssp.end = ssp.next;
+	ssp.next = buf;
+
+	if (!sdp_service_search_attribute(ss, &ssp, NULL, &rsp)) {
+		smprintf(s, "SDP Service Search Attribute failed: %s\n", strerror(errno));
+		sdp_close(ss);
+		return ERR_UNKNOWN;
+	}
+
+	channel = -1;
+	score = 0;
+
+	while (sdp_get_seq(&rsp, &rec)) {
+		ch = -1;
+		sv = NULL;
+
+		while (sdp_get_attr(&rec, &attr, &value)) {
+			switch (attr) {
+			case SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST:
+				ch = bluetooth_channel(&value);
+				break;
+
+			case SDP_ATTR_PRIMARY_LANGUAGE_BASE_ID + SDP_ATTR_SERVICE_NAME_OFFSET:
+				sv = bluetooth_service(&value);
+				break;
+
+			default:
+				break;
+			}
+		}
+
+		if (ch != -1) {
+			smprintf(s, "   Channel %i", ch);
+			if (sv != NULL) {
+				sc = bluetooth_checkservicename(s, sv);
+				smprintf(s, " - \"%s\" (score=%d)", sv, sc);
+				if (sc > score) {
+					score = sc;
+					channel = ch;
+				}
+			}
+			smprintf(s, "\n");
+		}
+
+		free(sv);
+	}
+
+	sdp_close(ss);
+
+	if (channel == -1) {
+		smprintf(s, "No suitable service found!\n");
+		return ERR_NOTSUPPORTED;
+	}
+
+	return bluetooth_open(s, bdaddr, channel);
+}
+
+GSM_Error bluetooth_findchannel(GSM_StateMachine *s)
+{
+	char			*device = s->CurrentConfig->Device;
+	bdaddr_t		bdaddr;
+	struct hostent		*he;
+	struct bt_devinquiry	*ii;
+	int			n;
+
+	if (bt_aton(device, &bdaddr))
+		return bluetooth_search(s, &bdaddr);
+
+	if ((he = bt_gethostbyname(device)) != NULL)
+		return bluetooth_search(s, (bdaddr_t *)he->h_addr);
+
+	smprintf(s, "Device \"%s\" unknown. Starting inquiry..\n");
+
+	if ((n = bt_devinquiry(NULL, 10, 20, &ii)) == -1) {
+		smprintf(s, "Inquiry failed: %s\n", strerror(errno));
+		return ERR_UNKNOWN;
+	}
+
+	smprintf(s, "Found %d devices\n", n);
+
+	while (n-- > 0) {
+		if (bluetooth_search(s, &ii->bdaddr) == ERR_NONE)
+			return ERR_NONE;
+
+		ii++;
+	}
+
+	return ERR_UNKNOWN;
+}
+
+#endif
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff -Nru orig/gammu-1.24.0/libgammu/device/bluetoth/blue_bsd.h gammu-1.24.0/libgammu/device/bluetoth/blue_bsd.h
--- orig/gammu-1.24.0/libgammu/device/bluetoth/blue_bsd.h	1970-01-01 01:00:00.000000000 +0100
+++ gammu-1.24.0/libgammu/device/bluetoth/blue_bsd.h	2009-05-25 13:35:44.000000000 +0100
@@ -0,0 +1 @@
+/* empty file */
diff -Nru orig/gammu-1.24.0/libgammu/device/bluetoth/bluetoth.c gammu-1.24.0/libgammu/device/bluetoth/bluetoth.c
--- orig/gammu-1.24.0/libgammu/device/bluetoth/bluetoth.c	2009-02-12 14:19:01.000000000 +0000
+++ gammu-1.24.0/libgammu/device/bluetoth/bluetoth.c	2009-05-22 09:44:29.000000000 +0100
@@ -21,8 +21,8 @@
 #ifdef BLUEZ_FOUND
 #  include "bluez.h"
 #endif
-#ifdef FBSD_BLUE_FOUND
-#  include "blue_fbsd.h"
+#ifdef BSD_BLUE_FOUND
+#  include "blue_bsd.h"
 #endif
 #ifdef OSX_BLUE_FOUND
 #  include "blue_osx.h"


More information about the freebsd-bluetooth mailing list