举例描述:
AGV机器人系统之间以组播地址实现相互学习同步数据,例如使用到了224.0.0.251类组播地址。AGV系统作为Ubuntu系统中应用子系统,其基于ROS通信系统实现。工厂中中控、AGV构建局域网,其之间通过2.48GHz频段无线通信,AGV自动导航定位感知判断完成各项任务,其之间相互学习,中控对整个工厂机器人系统进行调度管理监控。中控通过VPN技术实现对远端AGV群进行监控调度。
问题1:中控无法获取AGV状态,AGV之间未能相互发现
原因:局域网组播通信失败
诊断解决:
1. 组播地址ping失败
$ ping 224.0.0.251
2. 路由配置
添加224.0.0.0路由信息
$ sudo route add -net 224.0.0.0 netmask 224.0.0.0 dev wlp4s0
3.检查/etc/sysctl.conf配置
4.查看/proc/sys/net/ipv4/conf/all/*配置
5.检查防火墙配置
$ iptables -L -n
$ iptables -F #清除预设表filter中的所有规则链的规则(将可能导致主机网络异常)
$ sudo iptables -X #清除预设表filter中使用者自定链中的规则(将可能导致主机网络异常)
参考: https://www.cnblogs.com/alimac/p/5848372.html
6.查看组播绑定
$ sudo netstat -gn
$ sudo ifconfig wlp4s0 multicast #打开wlp4s0组播功能
$ sudo ifconfig wlp4s0 -multicase #关闭wlp4s0组播功能
7.导出防火墙配置
$ sudo iptables --list-rules > iptable.rule #导出iptable表一一删除排查
$ sudo apt-get install uif && sudo apt-get remove uif && iptables -L -n
$ sudo iptables -D ufw-before-input -d 224.0.0.251/32 -p udp -m udp --dport 5353 -j ACCEPT
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -P OUTPUT ACCEPT
8.直接卸载iptables
$ sudo apt-get remove iptables
9.检查IGMP/PIM组播路由模块
参考:http://blog.sina.com.cn/s/blog_55afbecd0102wy4n.html
10.诊断
B主机建立hotspot热点,A主机接入热点与B建立通信,接入网卡wlp4s0。
$ sudo ifconfig wlp4s0 192.168.1.116 #A主机ip
$ sudo ifconfig wlp4s0 192.168.1.113 #B主机ip
$ sudo route add -net 192.168.1.0/24 dev wlp4s0 # 新增192.168.1.0网段路由
$ sudo route add -net 224.0.0.0 netmask 224.0.0.0 dev wlp4s0 #新增组播路由信息
AB主机关闭反向过滤配置
$ echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter #AB主机关闭反向过滤配置
或者通过修改/etc/sysctl.conf配置
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.wlp4s0.rp_filter=0
$ sudo sysctl -p /etc/sysctl.conf
此时A与B通过192.168.1.0网段可相互通信,但组播地址224.0.0.251却无法访问。诊断方法如下:
$ sudo tcpdump -i wlp4s0 -n multicast -s 65534 #A与B使用tcpdump监听抓取wlp4s0报文
A主机ip为192.168.1.116,A主机ping组播地址224.0.0.251
$ ping 224.0.0.251
$ sudo tcpdump -i wlp4s0 -n multicast -s 65534
B主机ip为192.168.113,B主机ping组播地址224.0.0.251
$ ping 224.0.0.251
$ sudo tcpdump -i wlp4s0 -n multicast -s 65534
发现A主机与B主机都能收到双方组播icmp请求,但双方都无法收到组播icmp相应。