All of lore.kernel.org
 help / color / mirror / Atom feed
From: Barry Byford <31baz66@gmail.com>
To: Bluez mailing list <linux-bluetooth@vger.kernel.org>
Subject: Re: Serial Port connection with DBus API
Date: Fri, 7 Apr 2017 22:56:43 +0100	[thread overview]
Message-ID: <CAAu3APbMKQY2dnD=TUAb_3BqFKk0s2bzuFFLX8=h-1g7gm8G=Q@mail.gmail.com> (raw)
In-Reply-To: <CAAu3APbw0JyPfKUi6PZ4Nr2Uh5WXtDprDVFBTj3xr+801b9L6w@mail.gmail.com>

Hi,

I've made progress by adding a dbus configuration file in
/etc/dbus-1/system.d and the python script is starting up. However on
startup btmon is reporting the following:

= bluetoothd: Invalid value for profile option Channel
= bluetoothd: RFCOMM server failed for SerialPort: socket(STREAM,
RFCOMM): Protocol not supported (93)

My assumption is that this is coming from the options on
RegisterProfile. However it is not obvious to me what the settings
should be. Any suggestions?

My Python script is:

import socket
from pydbus import SystemBus
from gi.repository import GLib

loop = GLib.MainLoop()

dbus = SystemBus()


class Profile(object):
    """
      <node>
        <interface name='org.bluez.Profile1'>
          <method name='Release'>
          </method>
          <method name='Cancel'>
          </method>
          <method name='NewConnection'>
            <arg type='o' name='path' direction='in'/>
            <arg type='h' name='fd' direction='in'/>
            <arg type='a{sv}' name='properties' direction='in'/>
          </method>
          <method name='RequestDisconnection'>
            <arg type='o' name='path' direction='in'/>
          </method>
        </interface>
      </node>
    """
    def __init__(self, mac_address):
        self.server_address = mac_address
        self.server_sock = None
        self.port = 1
        pass

    def Release(self):
        pass

    def Cancel(self):
        pass

    def NewConnection(self, path, fd, properties):
        print('New connection', path, fd, properties)
        self.server_sock = socket.socket(socket.AF_BLUETOOTH,
socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
        self.server_sock.settimeout(0.01)
        self.server_sock.bind((self.server_address, self.port))
        self.server_sock.listen(1)
        try:
            client, address = self.server_sock.accept()
            while True:
                data = client.recv(1024)
                if data:
                    print(data)
        except:
            print('Debug!')

    def RequestDisconnection(self, path):
        print('Disconnection', path)
        self.server_sock.close()
        self.server_sock = None

if __name__ == '__main__':
    profile_mngr = dbus.get('org.bluez', '/org/bluez')
    spp_uuid = '00001101-0000-1000-8000-00805f9b34fb'
    rfcom_uuid = '00000003-0000-1000-8000-00805F9B34FB'
    l2cap_uuid = '00000100-0000-1000-8000-00805f9b34fb'
    opts = {
            'AutoConnect': GLib.Variant('b', True),
            'Channel': GLib.Variant('i', 1),
            'Service': GLib.Variant('s', rfcom_uuid),
            'Role': GLib.Variant('s', 'server'),
            'Name': GLib.Variant('s', 'SerialPort')
        }

    dbus.publish('ukBaz.bluezero', Profile('00:00:00:00:5A:AD'))
    profile_mngr.RegisterProfile('/ukBaz/bluezero', spp_uuid, opts)

    loop.run()

The full output of btmon is:

Bluetooth monitor ver 5.43
= Note: Linux version 4.9.0-linaro-lt-qcom (aarch64)                   0.650926
= Note: Bluetooth subsystem version 2.22                               0.650947
= New Index: 00:00:00:00:5A:AD (Primary,SMD,hci0)               [hci0] 0.650954
= Open Index: 00:00:00:00:5A:AD                                 [hci0] 0.650961
= Index Info: 00:00:00:00:5A:AD (Qualcomm)                      [hci0] 0.650969
@ MGMT Open: bluetoothd (privileged) version 1.14             {0x0001} 0.650983
@ MGMT Open: btmon (privileged) version 1.14                  {0x0002} 0.651098
= bluetoothd: Invalid value for profile option Channel                 7.672569
= bluetoothd: RFCOMM server failed for SerialPort: socket(STREAM,...   7.675858
> HCI Event: Connect Request (0x04) plen 10                    [hci0] 19.885300
        Address: 64:BC:0C:F6:22:F8 (LG Electronics (Mobile Communications))
        Class: 0x5a020c
          Major class: Phone (cellular, cordless, payphone, modem)
          Minor class: Smart phone
          Networking (LAN, Ad hoc)
          Capturing (Scanner, Microphone)
          Object Transfer (v-Inbox, v-Folder)
          Telephony (Cordless telephony, Modem, Headset)
        Link type: ACL (0x01)
< HCI Command: Accept Connection Request (0x01|0x0009) plen 7  [hci0] 19.885506
        Address: 64:BC:0C:F6:22:F8 (LG Electronics (Mobile Communications))
        Role: Master (0x00)
> HCI Event: Command Status (0x0f) plen 4                      [hci0] 19.886181
      Accept Connection Request (0x01|0x0009) ncmd 1
        Status: Success (0x00)
> HCI Event: Role Change (0x12) plen 8                         [hci0] 20.138773
        Status: Success (0x00)
        Address: 64:BC:0C:F6:22:F8 (LG Electronics (Mobile Communications))
        Role: Master (0x00)
> HCI Event: Connect Complete (0x03) plen 11                   [hci0] 20.142779
        Status: Success (0x00)
        Handle: 1
        Address: 64:BC:0C:F6:22:F8 (LG Electronics (Mobile Communications))
        Link type: ACL (0x01)
        Encryption: Disabled (0x00)
< HCI Command: Read Remote Supported F.. (0x01|0x001b) plen 2  [hci0] 20.143326
        Handle: 1
> HCI Event: Command Status (0x0f) plen 4                      [hci0] 20.143779
      Read Remote Supported Features (0x01|0x001b) ncmd 1
        Status: Success (0x00)
> HCI Event: Read Remote Supported Features (0x0b) plen 11     [hci0] 20.143809
        Status: Success (0x00)
        Handle: 1
        Features: 0xff 0xfe 0x8f 0xfe 0xd8 0x3f 0x5b 0x87
          3 slot packets
          5 slot packets
          Encryption
          Slot offset
          Timing accuracy
          Role switch
          Hold mode
          Sniff mode
          Power control requests
          Channel quality driven data rate (CQDDR)
          SCO link
          HV2 packets
          HV3 packets
          u-law log synchronous data
          A-law log synchronous data
          CVSD synchronous data
          Paging parameter negotiation
          Power control
          Transparent synchronous data
          Broadcast Encryption
          Enhanced Data Rate ACL 2 Mbps mode
          Enhanced Data Rate ACL 3 Mbps mode
          Enhanced inquiry scan
          Interlaced inquiry scan
          Interlaced page scan
          RSSI with inquiry results
          Extended SCO link (EV3 packets)
          AFH capable slave
          AFH classification slave
          LE Supported (Controller)
          3-slot Enhanced Data Rate ACL packets
          5-slot Enhanced Data Rate ACL packets
          Sniff subrating
          Pause encryption
          AFH capable master
          AFH classification master
          Enhanced Data Rate eSCO 2 Mbps mode
          Extended Inquiry Response
          Simultaneous LE and BR/EDR (Controller)
          Secure Simple Pairing
          Encapsulated PDU
          Non-flushable Packet Boundary Flag
          Link Supervision Timeout Changed Event
          Inquiry TX Power Level
          Enhanced Power Control
          Extended features
< HCI Command: Write Scan Enable (0x03|0x001a) plen 1          [hci0] 20.143972
        Scan enable: No Scans (0x00)
> HCI Event: Command Complete (0x0e) plen 4                    [hci0] 20.144612
      Write Scan Enable (0x03|0x001a) ncmd 1
        Status: Success (0x00)
< HCI Command: Read Remote Extended Fe.. (0x01|0x001c) plen 3  [hci0] 20.144763
        Handle: 1
        Page: 1
> HCI Event: Command Status (0x0f) plen 4                      [hci0] 20.145061
      Read Remote Extended Features (0x01|0x001c) ncmd 1
        Status: Success (0x00)
> HCI Event: Read Remote Extended Features (0x23) plen 13      [hci0] 20.145089
        Status: Success (0x00)
        Handle: 1
        Page: 1/2
        Features: 0x0f 0x00 0x00 0x00 0x00 0x00 0x00 0x00
          Secure Simple Pairing (Host Support)
          LE Supported (Host)
          Simultaneous LE and BR/EDR (Host)
          Secure Connections (Host Support)
< HCI Command: Remote Name Request (0x01|0x0019) plen 10       [hci0] 20.145291
        Address: 64:BC:0C:F6:22:F8 (LG Electronics (Mobile Communications))
        Page scan repetition mode: R2 (0x02)
        Page scan mode: Mandatory (0x00)
        Clock offset: 0x0000
< ACL Data TX: Handle 1 flags 0x00 dlen 10                     [hci0] 20.145326
      L2CAP: Information Request (0x0a) ident 1 len 2
        Type: Extended features supported (0x0002)
> HCI Event: Command Status (0x0f) plen 4                      [hci0] 20.145898
      Remote Name Request (0x01|0x0019) ncmd 1
        Status: Success (0x00)
> HCI Event: Page Scan Repetition Mode Change (0x20) plen 7    [hci0] 20.149914
        Address: 64:BC:0C:F6:22:F8 (LG Electronics (Mobile Communications))
        Page scan repetition mode: R1 (0x01)
> HCI Event: Max Slots Change (0x1b) plen 3                    [hci0] 20.153646
        Handle: 1
        Max slots: 5
> HCI Event: Remote Name Req Complete (0x07) plen 255          [hci0] 20.154938
        Status: Success (0x00)
        Address: 64:BC:0C:F6:22:F8 (LG Electronics (Mobile Communications))
        Name: Nexus 5X
@ MGMT Event: Device Connected (0x000b) plen 28       {0x0002} [hci0] 20.155049
        BR/EDR Address: 64:BC:0C:F6:22:F8 (LG Electronics (Mobile
Communications))
        Flags: 0x00000000
        Data length: 15
        Name (complete): Nexus 5X
        Class: 0x5a020c
          Major class: Phone (cellular, cordless, payphone, modem)
          Minor class: Smart phone
          Networking (LAN, Ad hoc)
          Capturing (Scanner, Microphone)
          Object Transfer (v-Inbox, v-Folder)
          Telephony (Cordless telephony, Modem, Headset)
@ MGMT Event: Device Connected (0x000b) plen 28       {0x0001} [hci0] 20.155049
        BR/EDR Address: 64:BC:0C:F6:22:F8 (LG Electronics (Mobile
Communications))
        Flags: 0x00000000
        Data length: 15
        Name (complete): Nexus 5X
        Class: 0x5a020c
          Major class: Phone (cellular, cordless, payphone, modem)
          Minor class: Smart phone
          Networking (LAN, Ad hoc)
          Capturing (Scanner, Microphone)
          Object Transfer (v-Inbox, v-Folder)
          Telephony (Cordless telephony, Modem, Headset)
> ACL Data RX: Handle 1 flags 0x02 dlen 10                     [hci0] 20.293653
      L2CAP: Information Request (0x0a) ident 2 len 2
        Type: Extended features supported (0x0002)
< ACL Data TX: Handle 1 flags 0x00 dlen 16                     [hci0] 20.293854
      L2CAP: Information Response (0x0b) ident 2 len 8
        Type: Extended features supported (0x0002)
        Result: Success (0x0000)
        Features: 0x000002b8
          Enhanced Retransmission Mode
          Streaming Mode
          FCS Option
          Fixed Channels
          Unicast Connectionless Data Reception
> HCI Event: Number of Completed Packets (0x13) plen 5         [hci0] 20.392999
        Num handles: 1
        Handle: 1
        Count: 1
> HCI Event: Number of Completed Packets (0x13) plen 5         [hci0] 20.395496
        Num handles: 1
        Handle: 1
        Count: 1
> ACL Data RX: Handle 1 flags 0x02 dlen 16                     [hci0] 20.492372
      L2CAP: Information Response (0x0b) ident 1 len 8
        Type: Extended features supported (0x0002)
        Result: Success (0x0000)
        Features: 0x000000b8
          Enhanced Retransmission Mode
          Streaming Mode
          FCS Option
          Fixed Channels
< ACL Data TX: Handle 1 flags 0x00 dlen 10                     [hci0] 20.492531
      L2CAP: Information Request (0x0a) ident 2 len 2
        Type: Fixed channels supported (0x0003)
> ACL Data RX: Handle 1 flags 0x02 dlen 10                     [hci0] 20.493632
      L2CAP: Information Request (0x0a) ident 3 len 2
        Type: Fixed channels supported (0x0003)
< ACL Data TX: Handle 1 flags 0x00 dlen 20                     [hci0] 20.493768
      L2CAP: Information Response (0x0b) ident 3 len 12
        Type: Fixed channels supported (0x0003)
        Result: Success (0x0000)
        Channels: 0x0000000000000086
          L2CAP Signaling (BR/EDR)
          Connectionless reception
          Security Manager (BR/EDR)
> HCI Event: Number of Completed Packets (0x13) plen 5         [hci0] 20.591765
        Num handles: 1
        Handle: 1
        Count: 1
> HCI Event: Number of Completed Packets (0x13) plen 5         [hci0] 20.592972
        Num handles: 1
        Handle: 1
        Count: 1
> ACL Data RX: Handle 1 flags 0x02 dlen 20                     [hci0] 20.729872
      L2CAP: Information Response (0x0b) ident 2 len 12
        Type: Fixed channels supported (0x0003)
        Result: Success (0x0000)
        Channels: 0x0000000000000082
          L2CAP Signaling (BR/EDR)
          Security Manager (BR/EDR)
> ACL Data RX: Handle 1 flags 0x02 dlen 12                     [hci0] 20.731116
      L2CAP: Connection Request (0x02) ident 4 len 4
        PSM: 1 (0x0001)
        Source CID: 76
< ACL Data TX: Handle 1 flags 0x00 dlen 16                     [hci0] 20.731327
      L2CAP: Connection Response (0x03) ident 4 len 8
        Destination CID: 64
        Source CID: 76
        Result: Connection successful (0x0000)
        Status: No further information available (0x0000)
< ACL Data TX: Handle 1 flags 0x00 dlen 23                     [hci0] 20.731355
      L2CAP: Configure Request (0x04) ident 3 len 15
        Destination CID: 76
        Flags: 0x0000
        Option: Retransmission and Flow Control (0x04) [mandatory]
          Mode: Basic (0x00)
          TX window size: 0
          Max transmit: 0
          Retransmission timeout: 0
          Monitor timeout: 0
          Maximum PDU size: 0
> HCI Event: Number of Completed Packets (0x13) plen 5         [hci0] 20.734232
        Num handles: 1
        Handle: 1
        Count: 1
> ACL Data RX: Handle 1 flags 0x02 dlen 16                     [hci0] 20.768614
      L2CAP: Configure Request (0x04) ident 5 len 8
        Destination CID: 64
        Flags: 0x0000
        Option: Maximum Transmission Unit (0x01) [mandatory]
          MTU: 672
< ACL Data TX: Handle 1 flags 0x00 dlen 18                     [hci0] 20.768765
      L2CAP: Configure Response (0x05) ident 5 len 10
        Source CID: 76
        Flags: 0x0000
        Result: Success (0x0000)
        Option: Maximum Transmission Unit (0x01) [mandatory]
          MTU: 672
> HCI Event: Number of Completed Packets (0x13) plen 5         [hci0] 20.769242
        Num handles: 1
        Handle: 1
        Count: 1
> ACL Data RX: Handle 1 flags 0x02 dlen 14                     [hci0] 20.796104
      L2CAP: Configure Response (0x05) ident 3 len 6
        Source CID: 64
        Flags: 0x0000
        Result: Success (0x0000)
> HCI Event: Number of Completed Packets (0x13) plen 5         [hci0] 20.796754
        Num handles: 1
        Handle: 1
        Count: 1
> ACL Data RX: Handle 1 flags 0x02 dlen 38                     [hci0] 20.798611
      Channel: 64 len 34 [PSM 1 mode 0] {chan 0}
      SDP: Service Search Attribute Request (0x06) tid 0 len 29
        Search pattern: [len 19]
          Sequence (6) with 17 bytes [8 extra bits] len 19
            UUID (3) with 16 bytes [0 extra bits] len 17
              00001101-0000-1000-8000-00805f9b34fb
              Serial Port
        Max record count: 656
        Attribute list: [len 7]
          Sequence (6) with 5 bytes [8 extra bits] len 7
            Unsigned Integer (1) with 4 bytes [0 extra bits] len 5
              0x0000ffff
        Continuation state: 0
< ACL Data TX: Handle 1 flags 0x00 dlen 14                     [hci0] 20.799655
      Channel: 76 len 10 [PSM 1 mode 0] {chan 0}
      SDP: Service Search Attribute Response (0x07) tid 0 len 5
        Attribute bytes: 2
        Continuation state: 0
> HCI Event: Number of Completed Packets (0x13) plen 5         [hci0] 20.891773
        Num handles: 1
        Handle: 1
        Count: 1
> ACL Data RX: Handle 1 flags 0x02 dlen 12                     [hci0] 20.919861
      L2CAP: Disconnection Request (0x06) ident 6 len 4
        Destination CID: 64
        Source CID: 76
< ACL Data TX: Handle 1 flags 0x00 dlen 12                     [hci0] 20.920045
      L2CAP: Disconnection Response (0x07) ident 6 len 4
        Destination CID: 64
        Source CID: 76
> HCI Event: Number of Completed Packets (0x13) plen 5         [hci0] 20.992989
        Num handles: 1
        Handle: 1
        Count: 1
< HCI Command: Disconnect (0x01|0x0006) plen 3                 [hci0] 24.950685
        Handle: 1
        Reason: Remote User Terminated Connection (0x13)
> HCI Event: Command Status (0x0f) plen 4                      [hci0] 24.951252
      Disconnect (0x01|0x0006) ncmd 1
        Status: Success (0x00)
> HCI Event: Disconnect Complete (0x05) plen 4                 [hci0] 24.959359
        Status: Success (0x00)
        Handle: 1
        Reason: Connection Terminated By Local Host (0x16)
@ MGMT Event: Device Disconnected (0x000c) plen 8     {0x0002} [hci0] 24.959474
        BR/EDR Address: 64:BC:0C:F6:22:F8 (LG Electronics (Mobile
Communications))
        Reason: Connection terminated by local host (0x02)
@ MGMT Event: Device Disconnected (0x000c) plen 8     {0x0001} [hci0] 24.959474
        BR/EDR Address: 64:BC:0C:F6:22:F8 (LG Electronics (Mobile
Communications))
        Reason: Connection terminated by local host (0x02)
< HCI Command: Write Scan Enable (0x03|0x001a) plen 1          [hci0] 24.991008
        Scan enable: Page Scan (0x02)
> HCI Event: Command Complete (0x0e) plen 4                    [hci0] 24.993260
      Write Scan Enable (0x03|0x001a) ncmd 1
        Status: Success (0x00)


On 7 April 2017 at 14:47, Barry Byford <31baz66@gmail.com> wrote:
> Hello,
>
> I am trying to create a serial port server that can be connected to by
> an already existing Android app.
>
> The app is trying connect on channel 1. I am taking the
> test/test-profile example as my starting point.
> https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/test/test-profile?h=5.43
>
> My code is far from finished but I thought it would be enough to
> accept the connection (or at least print that a new connection attempt
> had happened.) However I am getting an access denied error and I'm
> concerned that I'm going down the wrong route on this and it might be
> simpler than I am making it.
>
> Error message
> $ python3 BTspp.py
> Traceback (most recent call last):
>   File "BTclassic.py", line 54, in <module>
>     dbus.publish('org.bluez.Profile1', Profile('x', 'y'))
>   File "/usr/local/lib/python3.5/dist-packages/pydbus/publication.py",
> line 42, in publish
>     return Publication(self, bus_name, *objects)
>   File "/usr/local/lib/python3.5/dist-packages/pydbus/publication.py",
> line 35, in __init__
>     self._at_exit(bus.request_name(bus_name,
> allow_replacement=allow_replacement, replace=replace).__exit__)
>   File "/usr/local/lib/python3.5/dist-packages/pydbus/request_name.py",
> line 29, in request_name
>     return NameOwner(self, name, allow_replacement, replace)
>   File "/usr/local/lib/python3.5/dist-packages/pydbus/request_name.py",
> line 8, in __init__
>     res = bus.dbus.RequestName(name, flags)
>   File "/usr/local/lib/python3.5/dist-packages/pydbus/proxy_method.py",
> line 75, in __call__
>     0, timeout_to_glib(timeout), None).unpack()
> GLib.Error: g-dbus-error-quark:
> GDBus.Error:org.freedesktop.DBus.Error.AccessDenied: Connection
> ":1.47" is not allowed to own the service "org.bluez.Profile1" due to
> security policies in the configuration file (9
>
> Python code so far:
>
> from pydbus import SystemBus
> from gi.repository import GLib
>
> loop = GLib.MainLoop()
>
> dbus = SystemBus()
>
>
> class Profile(object):
>     """
>       <node>
>         <interface name='org.bluez.Profile1'>
>           <method name='Release'>
>           </method>
>           <method name='Cancel'>
>           </method>
>           <method name='NewConnection'>
>             <arg type='o' name='path' direction='in'/>
>             <arg type='h' name='fd' direction='in'/>
>             <arg type='a{sv}' name='properties' direction='in'/>
>           </method>
>           <method name='RequestDisconnection'>
>             <arg type='o' name='path' direction='in'/>
>           </method>
>         </interface>
>       </node>
>     """
>     def __init__(self, x, y):
>         pass
>
>     def Release(self):
>         pass
>
>     def Cancel(self):
>         pass
>
>     def NewConnection(self, path, fd, properties):
>         print('New connection', path, fd, properties)
>
>     def RequestDisconnection(self, path):
>         pass
>
> if __name__ == '__main__':
>     profile_mngr = dbus.get('org.bluez', '/org/bluez')
>     uuid = "00001101-0000-1000-8000-00805f9b34fb"
>     opts = {
>             "AutoConnect": GLib.Variant('b', True),
>             'Channel': GLib.Variant('i', 1),
>             'Service': GLib.Variant('s', uuid),
>             'Name': GLib.Variant('s', 'Serial Port')
>         }
>
>     # my_profile = Profile(dbus, '/org/bluez/example')
>     dbus.publish('org.bluez.Profile1', Profile('x', 'y'))
>     profile_mngr.RegisterProfile('/foo/bar/profile', uuid, opts)
>
>     loop.run()
>
>
> Is there a simpler way of doing this?
>
> Thanks,
> Barry

  reply	other threads:[~2017-04-07 21:56 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-07 13:47 Serial Port connection with DBus API Barry Byford
2017-04-07 21:56 ` Barry Byford [this message]
2017-04-08  7:18   ` Johan Hedberg
2017-04-08  7:57     ` Barry Byford
2017-04-21 20:54     ` Barry Byford
2017-04-22  5:26       ` Johan Hedberg
2017-04-22 20:46         ` Barry Byford
2017-04-25 21:48           ` Barry Byford
2017-04-26 19:07             ` Johan Hedberg
2017-04-26 22:47               ` Barry Byford

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAAu3APbMKQY2dnD=TUAb_3BqFKk0s2bzuFFLX8=h-1g7gm8G=Q@mail.gmail.com' \
    --to=31baz66@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.