- :const:`BTPROTO_HCI` accepts a format that depends on your OS.
- - On Linux it accepts a tuple ``(device_id, [channel])`` where ``device_id``
- is an integer specifying the number of the Bluetooth device,
+ - On Linux it accepts an integer ``device_id`` or a tuple
+ ``(device_id, [channel])`` where ``device_id``
+ specifies the number of the Bluetooth device,
and ``channel`` is an optional integer specifying the HCI channel
(:const:`HCI_CHANNEL_RAW` by default).
- On FreeBSD, NetBSD and DragonFly BSD it accepts ``bdaddr``
.. versionchanged:: next
Added ``channel`` field.
+ ``device_id`` not packed in a tuple is now accepted.
- :const:`BTPROTO_SCO` accepts ``bdaddr`` where ``bdaddr`` is
the Bluetooth address as a string or a :class:`bytes` object.
addr = s.getsockname()
self.assertEqual(addr, dev)
+ with (self.subTest('integer'),
+ socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s):
+ s.bind(dev)
+ addr = s.getsockname()
+ self.assertEqual(addr, dev)
+
with (self.subTest('channel=HCI_CHANNEL_RAW'),
socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s):
channel = socket.HCI_CHANNEL_RAW
s.bind(())
with self.assertRaises(OSError):
s.bind((dev, socket.HCI_CHANNEL_RAW, 0, 0))
- with self.assertRaises(OSError):
- s.bind(dev)
with self.assertRaises(OSError):
s.bind(socket.BDADDR_ANY)
with self.assertRaises(OSError):
--- /dev/null
+The Bluetooth socket with the :data:`~socket.BTPROTO_HCI` protocol on Linux
+now accepts an address in the format of an integer ``device_id``, not only a
+tuple ``(device_id,)``.
#if defined(HAVE_BLUETOOTH_BLUETOOTH_H)
unsigned short dev;
unsigned short channel = HCI_CHANNEL_RAW;
- if (!PyArg_ParseTuple(args, "H|H", &dev, &channel)) {
+ if (PyLong_Check(args)) {
+ if (!PyArg_Parse(args, "H", &dev)) {
+ return 0;
+ }
+ }
+ else if (!PyArg_ParseTuple(args, "H|H", &dev, &channel)) {
PyErr_Format(PyExc_OSError,
"%s(): wrong format", caller);
return 0;