如何同时将树莓派设置为服务器和客户端?

如何解决如何同时将树莓派设置为服务器和客户端?

我同时将Raspberry用作服务器和客户端。 但是,我的RPI在作为客户端连接到另一台设备后没有启用服务器连接。要求是,RPI必须一次连接到多个设备。

使用以太网电缆的最小示例是:

Device A <-----ETH-----> RPI <-----ETH-----> Device B

因此,在上述配置中,首先将其作为客户端连接到设备B,设备A无法连接到RPI。如果我将其用作独立的服务器/客户端,则可以正常运行,但不能用作并行功能。没有错误消息,设备A只是没有连接到Raspberry。

请注意,我正在通过以太网转USB适配器连接设备A,它可以完美地用作独立服务器。我正在对树莓派上的每个设备使用多重处理。

感谢您的帮助。

我注意到在这种配置中,树莓充当了访问点(?)。 树莓派的功能是,它必须将传入的消息转发到另一台设备,以便每个设备都不知道彼此的端口或IP地址,只有PI知道。

所以我对树莓的简化代码是:

walkie_talkie.py

import socket

# socket.socket(socket.AF_INET,socket.SOCK_STREAM)

class walkie_talkie(socket.socket):
'''Inherits all functionalities of sockets.sockets
Use this class for connection using TCP/IP e.g. internet/ethernet

Example usage:

>>> from walkie_talkie import walkie_talkie
>>> wt = walkie_talkie()
>>> wt.BUFFERSIZE = 8
...
'''


def __init__(self):
    self.BUFFERSIZE = 8192
    self.STATE = None
    self.IP = None                              # Server IP
    self.PORT = 5000
    self.NUMBER_OF_UNACCEPTED_CONNECTIONS = 1
    self.bytestream = None
    self.PROTOCOL = socket.SOCK_STREAM # Using UDP: socket.SOCK_DGRAM
    super().__init__(socket.AF_INET,self.PROTOCOL)



def setup_server(self):
    print('****** SERVER SETUP ******\n'
          'TCP/IP: {}\n'
          'PORT: {}\n'
          'BUFFERSIZE: {}\n'
          'Acc. conn.: {}\n'
          '****** SERVER SETUP ******\n'.format(self.IP,self.PORT,self.BUFFERSIZE,self.NUMBER_OF_UNACCEPTED_CONNECTIONS))
    self.STATE = 'SERVER'
    self.bind((self.IP,self.PORT))
    self.listen(self.NUMBER_OF_UNACCEPTED_CONNECTIONS)
    self.CONN,self.ADDRESS = self.accept()


def setup_client(self):
    print('****** CLIENT SETUP ******\n'
          'TCP/IP: {}\n'
          'PORT: {}\n'
          'BUFFERSIZE: {}\n'
          'Acc. conn.: {}\n'
          '****** CLIENT SETUP ******\n'.format(self.IP,self.NUMBER_OF_UNACCEPTED_CONNECTIONS))
    self.STATE = 'CLIENT'
    #self.settimeout(10.0)
    self.connect((self.IP,self.PORT))
    #self.settimeout(None)
    print('Connected.')

由于我还必须通过同一设备的多个端口传输数据,因此我对每个通信隧道使用了多处理。

multiprocessing_rpi.py

import socket
from walkie_talkie import walkie_talkie
import multiprocessing
import time


def setup_alpha_watchdog(IP,PORT):
    ''' Creates an alpha watchdog

    :param str IP: Server IP on Raspberry to listen to
    :param int PORT: Server Port to open for Device A

    '''
    global BUFFERSIZE
    print('alpha Watchdog >> {} @ {}'.format(IP,PORT))
    alpha_watchdog = walkie_talkie()
    alpha_watchdog.IP = IP
    alpha_watchdog.PORT = PORT
    alpha_watchdog.BUFFERSIZE = BUFFERSIZE

    try:
        # Setup alpha watchdog and omega watchdog right afterwards
        alpha_watchdog.setup_server()
        omega_watchdog = setup_omega_watchdog(DEVICE_B_IP,PORT) # returns a walkie_talkie object as client

        superstream(alpha=alpha_watchdog,omega=omega_watchdog)
    except Exception as watchdog_error:
        print('Error: ' + str(watchdog_error))
        exit()
    pass


def setup_omega_watchdog(IP,PORT):
    ''' Creates an omega watchdog 
    Description:
    omega watchdog takes data from alpha watchdog and pass them to the specified device
    If the connection is denied,abort both watchdogs.

    :param str IP: Server IP of Device B to connect to
    :param int PORT: Server Port on Device B to send data to

    '''
    global BUFFERSIZE
    print('omega Watchdog >> {} @ {}'.format(IP,PORT))
    watchdog = walkie_talkie()
    watchdog.IP = IP
    watchdog.PORT = PORT
    watchdog.BUFFERSIZE = BUFFERSIZE

    try:
        watchdog.setup_client()
    except Exception as watchdog_error:
        print('Error: ' + str(watchdog_error))
        exit()

    return watchdog


def superstream(alpha,omega):
    '''Streams data between the watchdogs on Request-Response scheme
    Description:
    After setting alpha & omega watchdogs,the communication takes place after incoming signal from alpha passed to omega.
    For example,the byte b'\x02\x00\x00\x00\xff\x00' coming from Device A will be passed to alpha watchdog
    and the raspberry will then pass this byte to the omega watchdog and finally to the Device B.

    :param object alpha: An alpha watchdog
    :param object omega: An omega watchdog
    '''

    while 1:
        try:
            # Get data coming from Device A and send it directly to Device B
            data_from_Device_A = alpha.CONN.recv(alpha.BUFFERSIZE)
            omega.send(data_from_Device_A )

            # Get response from Device B and send back to Device A
            RESPONSE= omega.recv(omega.BUFFERSIZE)
            alpha.CONN.send(RESPONSE)

        except Exception as e1:
            print('Error: ' + str(e1))
            break

    alpha.shutdown(2)
    alpha.close()
    omega.shutdown(2)
    omega.close()



if __name__ == '__main__':
    THIS_RPI_IP= '169.254.244.192'  # IP of raspberry,so Device A can connect to it
    DEVICE_B_IP = '192.xxx.....'  # Device B IP

    # Reserve ports correlating number of devices
    SERVER_PORTS = [5000,# 5001,# 5002,# 5003,# 5004,5005]

    SERVER_IP = THIS_RPI_IP
    BUFFERSIZE = 8192
    PROCESS_LIST = []

    #For each port,setup a socket for clients
    for PORT in SERVER_PORTS:
        p = multiprocessing.Process(target=setup_alpha_watchdog,args=(THIS_RPI_IP,PORT,))
        PROCESS_LIST.append(p)
        p.start()

    for _ in PROCESS_LIST:
        _.join()

setup_alpha_watchdog中,我可以交换线路,在这里我首先作为客户端连接到设备B(成功!),然后收听设备A,但是我无法建立服务器作为设备A的连接。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res