Re: cannot setup multiple connection using RFCOMM

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Han

> I have a client / server application running over bluetooth using
> RFCOMM as transport.  I am using socket API in C with AF_BLUETOOTH,
> SOCK_STREAM and BTPROTO_RFCOMM.

rfcomm is the wrong protocol if you want to have multiple connections
to one server.

In case you have no choice, I've appended a very old howto suggesting
a way to multiplex rfcomm for gps, but it's generally unreliable
because clients cache sdp records unpredictably.

================================

Bluetooth & GPS
I would like to have a multifunction GPS unit... logging, repeating
gps location data over bluetooth for two clients. gpsd is running and
receiving from the local gps.

Next, to make it repeat the gps stream, I started by installing gpspipe.

start with two rfcomm listeners in /etc/bluetooth/rfcomm.conf:

#
# cat /etc/bluetooth/rfcomm.conf
#
# RFCOMM configuration file.
#

rfcomm0 {
        listen yes;

        # Bluetooth address of the device
        device hci0;

        # RFCOMM channel for the connection
        channel 1;

        # Description of the connection
        comment "gps repeater channel 1";
}

rfcomm1 {
        listen yes;

        # Bluetooth address of the device
        device hci0;

        # RFCOMM channel for the connection
        channel 2;

        # Description of the connection
        comment "gps repeater channel 2";
}

next, in /etc/bluetooth/rfcomm/rfcomm-gps-repeater:

#!/bin/sh
# use: rfcomm-gps-repeater rfcommx next-port-number
# eg: rfcomm-gps-repeater rfcomm0 2 & rfcomm-gps-repeater rfcomm1 1 &
while true;
        do
        rfcomm show | grep $1 > /dev/null 2> /dev/null
        if [ "$?" != "1" ] ; then
                /usr/bin/sdptool add --channel=$2 SP
                /usr/bin/gpspipe -r >/dev/$1;
        fi
        sleep 1;
done

I run two of these in parallel, pointing each one to the *next* rfcomm
channel it should advertise via sdp. This is so the next bluetooth
client to scan sdp will find the available repeater.

It seems the rfcomm listener is not prepared to serve two ports. The
new /etc/bluetooth/rfcomm/rfcomm-listen:

#!/bin/sh
while $1 -r -f $2 listen $3;do continue;done

Finally, execute everything properly in /etc/init.d/S30bluetooth:

...
RFCOMM_GPS_REPEATER=/etc/bluetooth/rfcomm/rfcomm-gps-repeater
...
		#$RFCOMM_LISTEN $RFCOMM_EXEC $RFCOMM_CONFIG > /dev/null 2>&1 &
		$RFCOMM_LISTEN $RFCOMM_EXEC $RFCOMM_CONFIG rfcomm0 > /dev/null 2>&1 &
                $RFCOMM_LISTEN $RFCOMM_EXEC $RFCOMM_CONFIG rfcomm1 >
/dev/null 2>&1 &
                #$RFCOMM_GETTY > /dev/null 2>&1 &
                $RFCOMM_GPS_REPEATER rfcomm0 2 > /dev/null 2>&1 &
                $RFCOMM_GPS_REPEATER rfcomm1 1 > /dev/null 2>&1 &
...

You may have to change hcid.conf to contain "lm accept,master" so the
board insists on being the bluetooth master device. I was getting i/o
errors before I did that.

-- 
Brad Midgley
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux