Я работал над этим проектом, чтобы управлять роботизированной машиной через Bluetooth. Я использую Python и библиотеку PyBluez для связи с Bluetooth-приемником HC-06, который взаимодействует с Arduino Uno. У меня все отлично работало, но затем я попытался реализовать управление скоростью и кнопку переподключения для Bluetooth. Раньше он подключался при запуске приложения, но мне это надоело, поэтому я попытался сделать эту кнопку. Наверное, следовало бы придерживаться того, что у меня было, потому что теперь оно вообще не соединится. Я продолжаю получать те же две ошибки, либо [111]: соединение отказано и [77]: дескриптор файла в плохом состоянии. Это не очень полезная информация, и я все еще пытаюсь выяснить, что не так в моем сетевом коде.
Я подумал, что, возможно, HC-06 сгорел, но я могу подключиться к нему через приложение терминала Bluetooth через телефон Android. Я попытался закрыть сокет после неудачных подключений, подключить сокет при инициализации, установить время ожидания сокета и увеличить номер порта, но, похоже, ничего не изменилось. Он успешно подключился к моей кнопке подключения один раз, но мне пришлось перезапустить arduino и приложение, чтобы сделать это, и с тех пор я не смог восстановить его.
import bluetooth
import socket
class BTconnect:
def __init__(self, in_address, in_port):
self.port = in_port
self.address = in_address
self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) #initialize socket
def connect(self):
#tmpsock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) #initialize socket
#tmpsock.settimeout(5)
'''try:
self.sock.connect((self.address, self.port))
except:
print("Connection failed.")
return False
sock.shutdown(socket.SHUT_RDWR)'''
self.sock.connect((self.address, self.port))
print("Connection successful!")
sock = tmpsock
return True
def sendData(self, data):
self.sock.send(bytes(data, 'ascii'))
#self.sock.listen(1)
#echo = self.sock.recv(1024)
#print("ECHO: %s" % echo)
def disconnect(self):
self.sock.close()
print("socket closed")
class Handler:
#TO-DO:
#put all signal handlers here
def on_window1_destroy(self, *args):
print("quit on cancel")
Gtk.main_quit()
connection.disconnect()
def on_connect_button_clicked(self, button):
print("Connecting...")
tmp_connect = BTconnect(address, 2)
#time.sleep(1)
cstatus.set_text("Connecting...")
#time.sleep(1)
#connection.connect()
time.sleep(1)
if tmp_connect.connect():
cstatus.set_text("Connected.")
else:
cstatus.set_text("Disconnected.")
connection = tmp_connect
address = "20:17:05:08:43:07" #input bluetooth address of receiver
connection = BTconnect(address,22)
connection.connect()
Gtk.main()
Я ожидаю, что соединение будет считывать «Соединение установлено успешно» после успешного взаимодействия двух устройств, но здесь этого не происходит. Обратите внимание, что это своего рода код Франкенштейна, потому что я извлекаю два файла, чтобы показать полный объем программы. Есть ли причина, по которой в соединении будет отказано? Или это внешняя проблема, как в моей ОС?