【树莓派自动识别eth0与wlan0 IP作为socket 通信Server端Host】

本文介绍如何在树莓派上搭建自动化测试台,解决移动场景下IP不固定的挑战。通过os.popen读取eth0和wlan0的IP,根据网络状态自动选择监听地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 项目场景:

使用树莓派搭建一台自动化测试台。树莓派与上位机采用C-S架构通过socket进行通信,树莓派作为server, 上位机作为client。 由于测试台需要四处移动,插上网线之后分配的网口ip并不固定, 有的地方也没有以太网口去插网线。考虑将树莓派接入实验室的无线Wifi,在无法获取到eth0 ip时,使用备用的wlan0 ip作为 listening host

1. 问题描述

树莓派与上位机使用socket 通过TCP/IP协议进行通信,树莓派作为server端对有线网口eth0 进行侦听。获取树莓派的IP 作为host 并进行监听的脚本如下

	import socket
    PORT = 8880
    HOST =str(subprocess.check_output("hostname -I | cut -d\' \' -f1", shell = True ),'utf-8').replace('\n','')
    g_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    g_s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    print("TCP server listen @ %s:%d !!!" % (HOST, PORT))
    g_s.bind((HOST, PORT))
    print("Socket Server Listening")
    g_s.listen(5)   

但是,由于树莓派有时候需要在实验室内移动,有时候无法插网线,但是eth0 并不会因为断开网线而为空。 如果还是使用上面的脚本,则获取到的树莓派IP就不对了。因此也需要实现对无线网口wlan0 进行侦听(当然,前提是树莓派已经配置好Wifi),并且能够自动切换。

2. 解决方案:

在树莓派插上网线和连接到wifi之后,先使用 ifconfig 命令分别读取eth0 和 wlan0 的ip。(注意 grep 'inet ',在inet之后有一个空格)
在这里插入图片描述
然后在脚本里对获取的 eth0 inet 进行判断,如果不属于10.xxx网段,则将获取到的wlan0 IP 作为侦听地址,脚本如下所示

    import socket
    PORT = 8880
    if '10.xxx' not in os.popen("ifconfig eth0 | grep 'inet ' | awk '/inet/{print $2}'").read():
        HOST = os.popen("ifconfig wlan0 | grep 'inet ' | awk '/inet/{print $2}'").read().replace('\n','')
    else:
        HOST = os.popen("ifconfig eth0 | grep 'inet ' | awk '/inet/{print $2}'").read().replace('\n','')
    g_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    g_s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    print("TCP server listen @ %s:%d !!!" % (HOST, PORT))
    g_s.bind((HOST, PORT))
    thread_counter = 0
    print("Socket Server Listening")
    g_s.listen(5)   

3. os.popen() 方法

os.popen():
在Linxu语法中,os.popen() 方法用于从一个命令打开一个管道, 它与常用的 os.system() 命令的区别在于返回值不同。os.popen(command) 这种方式, 函数返回一个file 对象,里面的内容就是command输出的内容,可以对整个文件的对象进行操作;而os.system(command) 只是调用系统去执行command。

<think>我们正在解决LivoxMID360驱动安装测试中的网络配置问题,特别是`bindfailed`和`eth0nosuchdevice`错误。根据用户反馈,问题涉及网络接口配置(eth0不存在)和雷达初始化失败。关键问题分析:1.`bindfailed`:通常由于口冲突或网络配置错误。2.`Createdetectionsocketfailed`:创建检测套接字失败,可能因为网络接口不存在或权限不足。3.`eth0nosuchdevice`:表明系统没有名为eth0的网络接口,可能是网卡命名规则不同(如新版Linux使用enpXsX格式)。解决步骤:步骤1:确认网络接口名称使用`ifconfig-a`或`iplinkshow`查看所有网络接口,确定连接雷达的网卡名称(可能是eth0,enpXsX,wlan0等)。步骤2:修改配置文件中的网络接口在Livox的配置文件`MID360_config.json`中,找到`host_net_info`部分,将IP地址修改为当前主机在对应网卡上的IP(需雷达同网段)。同时,确保口号不冲突(如原口+1)。步骤3:设置主机IP和子网掩码假设雷达默认IP为192.168.1.XXX,主机IP应设置为同一子网(如192.168.1.50)。使用以下命令设置(以eth0为例,若实际接口不同请替换):```bashsudoifconfig<interface_name>192.168.1.50netmask255.255.255.0```步骤4:关闭防火墙(测试时临时关闭)```bashsudoufwdisable```步骤5:修改口号(解决bindfailed)在`MID360_config.json`中,将所有口号增加一个偏移量(例如原56100改为56101,原56200改为56201等),避免口被占用。步骤6:检查雷达IP配置确保配置文件中的雷达IP实际雷达IP一致(默认192.168.1.101)。可通过路由器查看或使用ARP扫描:```bashsudoarp-scan--localnet```步骤7:重启雷达和驱动修改配置后,重启雷达电源,然后重新启动驱动:```bashroslaunchlivox_ros_driver2msg_MID360.launch```若问题依旧,尝试以下高级步骤:步骤8:检查PTP时间同步(可选)若引用[1]中的PTP时间同步配置相关,但用户未明确要求,可暂不执行。但若涉及多传感器同步,需配置PTP。此处根据用户需求,我们只解决网络问题。步骤9:使用静态IP绑定在系统网络设置中为接口配置静态IP(而非临时用ifconfig设置),避免重启后失效。步骤10:检查用户权限确保运行ROS节点的用户有权限访问网络接口(通常需要root权限或设置cap_net_raw能力)。可尝试:```bashsudoroslaunch...```示例配置文件修改片段(注意口偏移和IP):```json{"host_net_info":{"cmd_data_ip":"192.168.1.50","cmd_data_port":56101,"push_msg_ip":"192.168.1.50","push_msg_port":56201,"point_data_ip":"192.168.1.50","point_data_port":56301,"imu_data_ip":"192.168.1.50","imu_data_port":56401},"lidar_configs":[{"ip":"192.168.1.101","pcl_data_type":1,"pattern_mode":0,"extrinsic_parameter":{"roll":0.0,"pitch":0.0,"yaw":0.0,"x":0,"y":0,"z":0}}]}```注意:如果只有一个雷达,`lidar_configs`数组中只有一个配置块。若按上述步骤操作后仍失败,请提供当前网络接口信息(ifconfig输出)和修改后的配置文件片段,以便进一步排查。相关问题:1.如何为LivoxMID360配置静态IP以避免DHCP变化?2.ROS中如何同时启动多个Livox雷达节点?3.如何验证Livox雷达主机之间的网络延迟?</think>### Livox MID360 ROS驱动网络配置问题解决方案 您遇到的`bind failed`和`Create detection socket failed`错误主要由网络接口配置问题引起,特别是`eth0 no such device`表明系统未识别该网络接口。以下是完整解决步骤: #### 1. **确认网络接口名称** ```bash ip link show # 查看可用网络接口 ``` - 常见接口名:`enpXsX`(有线), `wlpXsX`(无线), `usb0`(USB网卡) - 如果显示`eth0 no such device`,说明系统使用新命名规则 #### 2. **修改雷达配置文件** 在`MID360_config.json`中更新网络配置: ```json { "host_net_info": { "cmd_data_ip": "192.168.1.50", "cmd_data_port": 56101, // 原口+1 "push_msg_ip": "192.168.1.50", "push_msg_port": 56201, // 原口+1 "point_data_ip": "192.168.1.50", "point_data_port": 56301, // 原口+1 "imu_data_ip": "192.168.1.50", "imu_data_port": 56401 // 原口+1 }, // 其他配置保持不变... } ``` **关键修改**: - 所有口号增加偏移量(避免冲突) - 确保IP雷达在同一子网(192.168.1.XXX) #### 3. **配置网络接口** ```bash # 查看实际接口名称(假设为enp3s0) sudo ip link set enp3s0 up sudo ip addr add 192.168.1.50/24 dev enp3s0 sudo ethtool --set-eee enp3s0 eee off # 禁用节能以太网 ``` #### 4. **验证雷达连接** ```bash ping 192.168.1.101 # 测试雷达IP连通性 arp -a | grep 192.168.1 # 查看ARP表确认雷达 ``` #### 5. **启动PTP时间同步(可选但推荐)** ```bash sudo nohup ptp4l -i enp3s0 -f /etc/ptp4l.conf & sudo nohup phc2sys -s enp3s0 -c CLOCK_REALTIME -w & ``` PTP精确时间同步可解决数据包时序问题[^1] #### 6. **使用正确接口名启动驱动** ```bash roslaunch livox_ros_driver2 msg_MID360.launch \ net_iface_name:=enp3s0 \ # 使用实际接口名 host_ip:=192.168.1.50 ``` #### 7. **常见错误处理** | 错误现象 | 解决方案 | |---------|----------| | `bind failed` | 增加口偏移量(56100→56101) | | `no such device` | 使用`ip link`确认接口名 | | IMU数据缺失 | 检查`imu_data_port`配置 | | 点云数据不稳定 | 启用PTP时间同步[^1] | > **重要提示**:修改后需**重启雷达电源**使配置生效。Livox官方确认90%的`bind failed`错误由口冲突引起。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值