从mac无线发送字符串到raspberry pi

2024-04-25 23:32:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个mac来尝试通过蓝牙和python无线发送一个字符串给一个raspberry pi。但是,我找不到一个适用于mac的API。我尝试过像pybluez和lightblue这样的选项,但是它们似乎不适合mac。有解决这个问题的办法吗?蓝牙通讯会更好,但我愿意接受其他建议。提前谢谢


Tags: 字符串apimac选项piraspberry建议lightblue
1条回答
网友
1楼 · 发布于 2024-04-25 23:32:30

更新答案

仍然使用netcat方法,如下所示,但这是用Python实现的发送方,它改编自this answer,并与下面的接收方一起工作:

#!/usr/local/bin/python3
import socket

def netcat(host, port, content):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, int(port)))
    s.sendall(content.encode())
    s.shutdown(socket.SHUT_WR)
    while True:
        data = s.recv(4096)
        if not data:
            break
        print(repr(data))
    s.close()

netcat('192.168.0.131', 40000, 'Hi')

下面是一个匹配的侦听器/服务器,如here所实现,它与上面的发送器或命令行中的简单netcat发送器一起工作。你知道吗

#!/usr/bin/env python

import socket
import select

class SocketServer:
    """ Simple socket server that listens to one single client. """

    def __init__(self, host = '0.0.0.0', port = 2010):
        """ Initialize the server with a host and port to listen to. """
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.host = host
        self.port = port
        self.sock.bind((host, port))
        self.sock.listen(1)

    def close(self):
        """ Close the server socket. """
        print('Closing server socket (host {}, port {})'.format(self.host, self.port))
        if self.sock:
            self.sock.close()
            self.sock = None

    def run_server(self):
        """ Accept and handle an incoming connection. """
        print('Starting socket server (host {}, port {})'.format(self.host, self.port))

        client_sock, client_addr = self.sock.accept()

        print('Client {} connected'.format(client_addr))

        stop = False
        while not stop:
            if client_sock:
                # Check if the client is still connected and if data is available:
                try:
                    rdy_read, rdy_write, sock_err = select.select([client_sock,], [], [])
                except select.error:
                    print('Select() failed on socket with {}'.format(client_addr))
                    return 1

                if len(rdy_read) > 0:
                    read_data = client_sock.recv(255)
                    # Check if socket has been closed
                    if len(read_data) == 0:
                        print('{} closed the socket.'.format(client_addr))
                        stop = True
                    else:
                        print('>>> Received: {}'.format(read_data.rstrip()))
                        if read_data.rstrip() == 'quit':
                            stop = True
                        else:
                            client_sock.send(read_data)
            else:
                print("No client is connected, SocketServer can't receive data")
                stop = True

        # Close socket
        print('Closing connection with {}'.format(client_addr))
        client_sock.close()
        return 0

def main():
    server = SocketServer(port=40000)
    server.run_server()
    print('Exiting')

if __name__ == "__main__":
    main()

原始答案

尝试使用netcatnc。你知道吗

在RaspberryPi上,使用TCP在端口40000上侦听:

nc -l 40000

在Mac上,假设RaspberryPi的IP地址为192.168.0.131:

echo "hi" | /usr/bin/nc 192.168.0.131 40000 

树莓显示:

hi

相关问题 更多 >