Подтвердить что ты не робот

Сервер Bluetooth с Python 3.3

Python 3.3 поставляется с встроенной поддержкой сокетов bluetooth. К сожалению, это еще не слишком хорошо документировано (есть только одно упоминание об этом в документации).

В результате он обнаружил сообщение в блоге о внедрении клиента, но я ничего не мог найти о создании сервера.

В частности, как настроить удобное имя и рекламировать службу.

Итак, что-то вроде

import socket

serverSocket = socket.socket(socket.AF_BLUETOOTH,
                             socket.SOCK_STREAM,
                             socket.BTPROTO_RFCOMM)
serverSocket.setTimeout(1)
serverSocket.bind(("", 1))
serverSocket.listen(1)

something.advertise_service(something something)

Любые идеи?

4b9b3361

Ответ 1

Плохая новость: Python, похоже, не поддерживает то, что вы хотите сделать из коробки. (По крайней мере, не в socketmodule.c).

Большинство пользователей python/bluetooth, которых я видел, используют pybluez, хотя он не обновлялся с 2009 года.

Хорошие новости: Я прошел через их источник (для подключений Linux) и нашел соответствующие биты для рекламных услуг. Большая часть кода по существу скопирована с версии python 2.2 socketmodule.c.

pybluez определяет некоторые дополнительные функции для объекта socket для реализации всех этих плюсов Bluetooth. Он не становится слишком низкоуровневым и вместо этого зависит от BlueZ. Из того, что я могу сказать, он в основном принимает объекты python и создает структуры данных, ожидаемые BlueZ, и просто вызывает это. Если вы не хотите/не можете использовать pybluez, вам придется каким-то образом реализовать эту недостающую функциональность. Я думаю, что вы можете сделать это с помощью c-типов. Соответствующие части для рекламы услуги находятся в btmodule.c, строки 2562-2642.

В источнике есть ветвь python-3 для pybluez, хотя я не знаю, работает ли она или нет.

Если вы решите использовать pybluez, пример, взятый из их источник

server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",PORT_ANY))
server_sock.listen(1)

port = server_sock.getsockname()[1]

uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"

advertise_service(server_sock, "SampleServer",
                  service_id = uuid,
                  service_classes = [ uuid, SERIAL_PORT_CLASS ],
                  profiles = [ SERIAL_PORT_PROFILE ], 
                  )

Когда код google закрывается, код также можно найти в github здесь.