Я пытаюсь создать двунаправленную связь через гнездо bluetooth между 2 RP. Мне нужно запустить основную программу на ведущем устройстве, ожидая подключения, а затем иметь возможность отправлять sh сообщение с любого устройства в любое время и прерывать основной поток на любом из них при получении. Полученное сообщение выполнит действие с другим RPi. Например, включение ведущего устройства включит светодиод на ведомом устройстве в зависимости от сообщения, отправленного от ведущего устройства к ведомому, и наоборот. Я решаю эту проблему небольшими шагами и в настоящее время работаю над ожиданием соединения, а на данный момент просто использую соединение для отправки / получения ввода.
У меня мой сокет нормально работает в режиме отправки / получения. Теперь я пытаюсь перейти к нескольким процессам, чтобы дождаться соединения, и это работает, однако я теряю соединение, потому что, насколько я понимаю, я не могу получить к нему доступ вне процесса, который он был создан. Итак, я пытаюсь разработать следующий шаг и думаю, следует ли мне использовать многопоточность, асинхронность или придерживаться процессов.
Очень ценю любые идеи, которые у вас есть для решения этой проблемы. код Мастера Пи. Раб подключается нормально. Моя функция server_program - это базовое c рукопожатие отправки / получения, которое отлично работает, когда не выполняется соединение в процессе. Ошибка возникает в строке «data = conn.recv (1024) .decode ()», потому что «conn» не определено.
Я играл с менеджером и значением мультипроцессоров, но они не похоже, может справиться с подключением сокета.
from multiprocessing import Pool
import socket
#----------- Processes -----------
def WaitSlaveConnection():
print("Waiting for slave")
hostMACAddress = 'XX:XX:XX:XX:XX:XX' # The MAC address of a Bluetooth adapter on the server.
port = 3
size = 1024
server_socket = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
server_socket.bind((hostMACAddress,port))
server_socket.listen(1)
conn, address = server_socket.accept() # accept new connection
print("Connection from: " + str(address))
return "Connected"
#############################
########### Main ###########
#############################
def server_program():
while True:
data = conn.recv(1024).decode()
if not data:
# if data is not received break
break
print("from connected user: " + str(data))
data = input(' -> ')
conn.send(data.encode()) # send data to the client
conn.close() # close the connection
if __name__ == '__main__':
app_pool = Pool(processes=20)
slave_conn = app_pool.apply_async(WaitSlaveConnection)
while True:
if slave_conn.get(timeout=None) == "Connected":
print("Yes")
server_program()
else:
print("Waiting for Slave")