Python двунаправленная связь через гнездо bluetooth между 2 RPi (главный / подчиненный) - PullRequest
2 голосов
/ 01 августа 2020

Я пытаюсь создать двунаправленную связь через гнездо 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...