Найти - Пользователи
Полная версия: Ошибка при попытке подключиться к устройству.|Pybluez
Начало » GUI » Ошибка при попытке подключиться к устройству.|Pybluez
1
Kirya200
Доброго времени суток.Я заинтересовался темой блютуз устройств и решил ее изучить с примерами.Но при попытке подключиться к какому-либо серверу(в данном случае самому себе) у меня выскакивает ошибка.Вот мой код:
 from bluetooth import *
server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",PORT_ANY))
server_sock.listen(1)
server=BluetoothSocket( RFCOMM )
ADDR = "00:11:22:98:76:54"
server.connect((ADDR,PORT_ANY))
server.send("hello!!")
server.close()
client_sock,address = server_sock.accept()
client_sock.close()
server_sock.close()
server.close()
А вот сама ошибка:
 Traceback (most recent call last):
  File "D:\Рабочий стол\fhg.py", line 9, in <module>
    server.connect((ADDR,PORT_ANY))
  File "D:\pythonchik\lib\site-packages\bluetooth\msbt.py", line 72, in connect
    bt.connect (self._sockfd, addr, port)
IOError: Требуемый адрес для своего контекста неверен.
Скажите,что это за ошибка и как ее исправить?Заранее спасибо!
p.s.у меня python 2.7 и модуль pybluez.
Kirya200
Мне тут помогут?
py.user.next
Kirya200
Скажите,что это за ошибка и как ее исправить?
Наверное, сервер и клиент отличаются. Нужно сделать клиента, чтобы подлючать его потом.
MrViktor
Kirya200
Но при попытке подключиться к какому-либо серверу(в данном случае самому себе) у меня выскакивает ошибка
Это как, к самому себе? У Вас в компе вставлен один свисток блютус и Вы пытаетесь его использовать как сервер и клиент?
Данная ошибка возникает при попытке использовать уже занятый сокет (у меня покрайней мере было такое поведение, когда сокет подвисал).
А вообще, нужно больше информации о том, что вы пытаетесь сделать.
Все таки пересилил себя для подробного просмотра вашего кода и
 from bluetooth import *
server_sock=BluetoothSocket( RFCOMM ) # Создаем сокет сервера
server_sock.bind(("",PORT_ANY))       # 
server_sock.listen(1)                 #
server=BluetoothSocket( RFCOMM )      # Создаем сокет клиента,
ADDR = "00:11:22:98:76:54"            #  
server.connect((ADDR,PORT_ANY))       # Подключаемся к созданному серверу (через устройство которое уже работает сервером и ждет подключения)
server.send("hello!!")                # Отправляем сообщение
server.close()                        # Закрывает сокет клиента
client_sock,address = server_sock.accept() # Обрабатываем сообщение от клиента
client_sock.close()
server_sock.close()
server.close()                             # Второй раз закрываем сокет клиента
В общем, подумайте, где у вас ошибка (прочитав мои комментарии к вашему коду), надеюсь я правильно помню про этот модуль (да и посмотрите примеры которые идут с этим модулем, там все не так сложно).
Kirya200
Это как, к самому себе? У Вас в компе вставлен один свисток блютус и Вы пытаетесь его использовать как сервер и клиент?
Да,вы правильно меня поняли.Я пытаюсь подключиться к самому себе используя свисток,как сервер и клиент.Но при попытке подключиться к близлежащим устройствам у меня высвечивается та же ошибка.
как эту ошибку исправить?
В общем, подумайте, где у вас ошибка (прочитав мои комментарии к вашему коду), надеюсь я правильно помню про этот модуль (да и посмотрите примеры которые идут с этим модулем, там все не так сложно).
1.У меня ошибка в строке с подсоединением к серверу в моем и вашем примере(server.connect((ADDR,PORT_ANY)) ).
2.Просмотрев примеры у меня возник вопрос с примером rfcomm-client.py.Т.к. там у меня там не доходит даже до подключения.Вот тот код:
 from bluetooth import *
import sys
if sys.version < '3':
    input = raw_input
addr = None
if len(sys.argv) < 2:
    print("no device specified.  Searching all nearby bluetooth devices for")
    print("the SampleServer service")
else:
    addr = sys.argv[1]
    print("Searching for SampleServer on %s" % addr)
# search for the SampleServer service
uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"
service_matches = find_service( uuid = uuid, address = addr )
if len(service_matches) == 0:
    print("couldn't find the SampleServer service =(")
    sys.exit(0)
first_match = service_matches[0]
port = first_match["port"]
name = first_match["name"]
host = first_match["host"]
print("connecting to \"%s\" on %s" % (name, host))
# Create the client socket
sock=BluetoothSocket( RFCOMM )
sock.connect((host, port))
print("connected.  type stuff")
while True:
    data = input()
    if len(data) == 0: break
    sock.send(data)
sock.close()
Но при этом у меня высвечивается только вот что:
 no device specified.  Searching all nearby bluetooth devices for
the SampleServer service
couldn't find the SampleServer service =(
А при убирании sys.exit(0) у меня выскакивает ошибка с first_match = service_matches в виде:
 first_match = service_matches[0]
IndexError: list index out of range
Имеется вопрос,как мне исправить эту ошибку и сделать так,что бы код заработал с подключением?
MrViktor
Kirya200
Ох.. не хотите вы читать, а тем более понимать то, что вы кодите.
Чтоб не было ошибки, исправьте в вашем коде строчку (видать Вам нужно было только это)
Kirya200
server.connect((ADDR,PORT_ANY))
на
 server.connect((ADDR,1))
На каком порту у вас весит профиль RFCOMM, тот и нужно указать.
Но далеко вы не уйдете, пока не станете понимать хотя бы азы.
Kirya200
Вот скажите мне пожалуйста,каким образом мне исправить вот этот код?
 from bluetooth import *
server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",1))
server_sock.listen(1)
server=BluetoothSocket( RFCOMM )
ADDR = "00:11:22:98:76:54"
server.connect((ADDR,1))
server.send("hello!!")
server.close()
client_sock,address = server_sock.accept()
client_sock.close()
server_sock.close()
server.close()
При котором высвечивается ошибка:
 Traceback (most recent call last):
  File "D:\Рабочий стол\fhg.py", line 7, in <module>
    server.connect((ADDR,1))
  File "D:\pythonchik\lib\site-packages\bluetooth\msbt.py", line 72, in connect
    bt.connect (self._sockfd, addr, port)
IOError: Сделана попытка выполнить операцию на сокете при отключенной сети.
Ох.. не хотите вы читать, а тем более понимать то, что вы кодите.
Я все читаю и понимаю,кроме того,почему у меня высвечиваются ошибки даже при смене кода?Я пытался обнаружить проблему и кажется понял в чем дело.Вот:http://softport02.ulcraft.com/uploads/s/w/y/r/wyr3is6uek66/img/autocrop/081e7c73d543cbe474f22aa379248d95.png
Это скрин моих подключений,но при этом в подключении блютуз у меня красный крест.Имеется прямой вопрос:каким образом мне исправить эту сеть и преобразовать ее в работающую с подключением.
MrViktor
Kirya200
Вот скажите мне пожалуйста,каким образом мне исправить вот этот код?
Ох… придется поучить немного.
Во первых определитесь, что хотите сделать клиента или сервер.
Во вторых один адаптер bluetooth не может работать в двух режимах (клиент и сервер) одновременно.
Этот код будет создает сокет сервера и ждет подключения (у меня были определенные трудности с авторизацией и обнаружением на linux).
 from bluetooth import *
server_sock=BluetoothSocket(RFCOMM)
server_sock.bind(("", ANY_PORT))
server_sock.listen(1)
client_sock, address = server_sock.accept() # метод accept() возвращает сокет клиентского подключения и
client_sock.close()                 # его адрес, все присланные клиентом сообщения будем читать из client_sock
server_sock.close()
server.close()

А этот код будет создавать клиентский сокет и будет пытаться подключиться к устройству с адресом “00:11:22:98:76:54”.
 from bluetooth import *
client=BluetoothSocket( RFCOMM )
ADDR = "00:11:22:98:76:54"
client.connect((ADDR,1))
client.send("hello!!")
client.close()
Насчет порта, Вам нужно сначала проанализировать то устройство к которому будете подключаться, на предмет какие сервисы доступны и на каком порту какой сервис висит, не знаю как это в windows сделать, но в linux к примеру я смотрю с помощью sdptool вывод примерно следующий
 Service Name: OBEX Object Push
Service RecHandle: 0x10006
Service Class ID List:
  "OBEX Object Push" (0x1105)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 4
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Service Name: Network Access Point Service
Service Description: Bluetooth NAP Service
Service RecHandle: 0x10007
Service Class ID List:
  "Network Access Point" (0x1116)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 15
  "BNEP" (0x000f)
    Version: 0x0100
    SEQ8: 0 6
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Network Access Point" (0x1116)
    Version: 0x0100
Service Name: Phonebook Access PSE
Service RecHandle: 0x10009
Service Class ID List:
  "Phonebook Access - PSE" (0x112f)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 8
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Phonebook Access" (0x1130)
    Version: 0x0100

Теперь вернемся к вашему коду, у вас в начале создается сокет сервера и запускает в режим ожидания подключения, дальше Вы создаете сокет клиента (видать чтоб понаваристей код был. Своими комментариями к вашему коду я на это намекал, но вы не поняли), но во первых если так делать нужно два bluetooth адаптера, во вторых клиент и сервер все равно нужно разделять и запускать отдельно или в разных потоках. Надеюсь сейчас Вы поймете насколько я офигел увидев ваш код.
Код примера из документации pyblueZ, в нем идет поиск сервера по UUID - естественно у Вас он другой и поэтому не работает, достаточно немного изменить код и все будет работать.
Вот измененный код
 from bluetooth import *
import sys
if sys.version < '3':
    input = raw_input
addr = None
if len(sys.argv) < 2:
    print("no device specified.  Searching all nearby bluetooth devices for")
    print("the SampleServer service")
else:
    addr = sys.argv[1]
    print("Searching for SampleServer on %s" % addr)
# search for the SampleServer service
adr = '00:11:22:98:76:54'
service_matches = find_service(address=adr)
if len(service_matches) == 0:
    print("couldn't find the SampleServer service =(")
    sys.exit(0)
first_match = service_matches[0]
port = first_match["port"]
name = first_match["name"]
host = first_match["host"]
print("connecting to \"%s\" on %s" % (name, host))
# Create the client socket
sock=BluetoothSocket( RFCOMM )
sock.connect((host, port))
print("connected.  type stuff")
while True:
    data = input()
    if len(data) == 0: break
    sock.send(data)
sock.close()

Так что, я думаю Вы взялись за не посильную для Вас задачу (покрайней мере пока), для начала изучите синтаксис python, его особенности и напишите пару простых программ.
Еще не забывайте про режим “видимости” bluetooth устройств!
Kirya200
Я хочу сделать переписку сообщениями с компьютера на телефон через блютуз.
Я пытался подключиться,но у меня опять высвечивается ошибка,но только теперь другая:
  from bluetooth import *
client=BluetoothSocket( RFCOMM )
ADDR = "40:d3:ae:4b:f1:c1"
client.connect((ADDR,1))
client.send("hello!!")
client.close()
А вот то,что выводится:
  Traceback (most recent call last):
  File "D:\Рабочий стол\fhg.py", line 4, in <module>
    client.connect((ADDR,1))
  File "D:\pythonchik\lib\site-packages\bluetooth\msbt.py", line 72, in connect
    bt.connect (self._sockfd, addr, port)
IOError: Произошла ошибка операции на сокете, т.к. конечный хост выключен.
Я попытался найти информацию в интернете,но ничего не нашел.Подскажите,как эту ошибку исправить?

Kirya200
Короче говоря я подключаюсь по этому коду(просто сделал тайм-аут видимости на устройстве к которому подключаюсь)и ничего не происходит.Просто идет бесконечное ожидание и еще на устройстве к которому я подключаюсь никакое сообщение не высвечивается,но если убрать тайм-аут видимости,то высветится ошибка:“…конечный хост выключен” на самом компьютере.Скажите,как мне двигаться дальше,то есть,как передать сообщение устройству?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB