判断经过batman-adv协议的mesh自组网拓扑节点设备个数

记录: 判断经过batman-adv协议的mesh自组网拓扑节点设备个数

1、可以通过二层网络工具包batctl确定与当前节点无线组网的节点个数,batctl n命令可以展示当前节点无线组网的邻居节点的mac地址
在这里插入图片描述

2、但是面临一个问题是不够准确,断掉一个设备很长时间里还是会在列表中出现,为了解决这个问题就用了ping的方式来实时判断设备在线与否

pox_system("iw mesh0 mpath dump|awk {'print $2'}|sort -u |grep -v ADDR > /tmp/mesh0");

    modefd = popen("uci get wireless.default_radio0.mode", "r");

    if (fgets(mac_line, 256, modefd) != NULL) 
	{
        mac_line[strlen(mac_line) - 1] = '\0';
    }

    pclose(modefd);
    //mode is mesh
    if (strcmp(mac_line,"mesh") == 0)
    {
        info = fopen("/tmp/mesh0", "r");

        if (NULL != info)
        {
            memset(mac_buf, 0, sizeof(mac_buf));
            memset(line, 0, sizeof(line));
            while (fgets(line, _LINE_LENGTH, info) != NULL)
            {
                *(line + strlen(line) -1) = '\0';
                 //Check whether the MAC address is correct
                if ((strlen(line) != 17) && (line[2] != ':') && (line[5] != ':'))
                {                                                                                                                                                                                           
                    break;
                }

                strcat(mac_buf, line);

                sprintf(node_buf, "batctl ping -c 3 %s|grep packets|awk {'print $6'}", line);

                fd = popen(node_buf,"r");
                if ( NULL == fd )
                {
                    debug(LOG_DEBUG, "ping other node fail,mac_buf host is not online");

                }

                memset(str, 0, sizeof(str));
                if (fgets(str, sizeof(str), fd) == NULL)
                {
                    debug(LOG_DEBUG,"the results of ping error!");
                }
                else
                {
                    str[strlen(str) - 1] = '\0';
                    if (strcmp(str, "100%") == 0)
					{
                        debug(LOG_DEBUG, "device in offline");
                    }
                    else
                    {
                        device_count++; //The number of Nodes in the Network
                    }
                }
                pclose(fd);
            }

        }
        else
        {
            debug(LOG_DEBUG, "popen iw mesh0 mpath dump is NULL.");
        }

            fclose(info);
    }
    else //mode is ap/station
    {
        device_count = 0;                                                                                                                                                                                   
    }

3、但是后续组网设备数量过多(二三十台以上)会有网络环路问题,思考如何既能实时显示又能减少网络负担,所以根据最后一次收到包的时间来判断设备是否在线
在这里插入图片描述

        FILE *time_info;
        pox_system("batctl n |awk {'print $2'} |grep -v Neighbor > /tmp/recvpak_time");
        time_info = fopen("/tmp/recvpak_time", "r");
        if (NULL != time_info)
        {   
            memset(line, 0, sizeof(line));
            while (fgets(line, _LINE_LENGTH, time_info) != NULL)
            {   
                *(line + strlen(line) -1) = '\0';
                recvtime = strtod(line, NULL);
                if (recvtime < 15) 
                {   
                    device_count++;
                }   
                memset(line, 0, sizeof(line));
            }   
        }   
        else
        {   
            debug(LOG_DEBUG, "batctl n get neighbor node time is NULL!");
        }   

        fclose(time_info);

### 关于BATMAN协议的实现与应用 #### BATMAN简介 Better Approach to Mobile Ad-hoc Networking (BATMAN) 是一种用于移动自组织网络(MANETs) 的分布式路由协议。该协议旨在提供高效可靠的多跳无线通信路径,适用于各种规模和密度的网络环境[^3]。 #### 协议特点 - **快速收敛**:当节点加入或离开网络时能够迅速调整拓扑结构并重新计算最优路径。 - **冗余备份**:支持多个独立的数据传输通道以增强系统的鲁棒性和容错能力。 - **低延迟特性**:通过优化算法减少转发过程中的等待时间从而提高整体性能表现。 - **易于扩展**:可以方便地与其他类型的设备和服务集成在一起工作。 #### 实现方式 Linux内核自带了对BATMAN的支持模块`batman-adv`, 安装配置相对简单直接: 1. 加载驱动程序: ```bash modprobe batman-adv ``` 2. 创建虚拟接口并与物理网卡绑定: ```bash ip link add name bat0 type batadv ip link set dev eth0 master bat0 ip addr add 192.168.1.x/24 dev bat0 # 替换成实际使用的IP地址范围 ip link set up dev bat0 ``` 3. 配置参数(可选) 可以根据具体需求修改一些默认设置来获得更好的效果, 如更改原数据包TTL值、启用心跳检测机制等: ```bash echo "5" > /sys/class/net/bat0/mesh/ttl echo "1" > /sys/class/net/bat0/mesh/hop_penalty ``` 以上操作完成后即可让参与构建Mesh Network的所有主机之间互相发现彼此并通过最短路径交换信息流。 #### 使用场景举例 假设在一个大型户外活动中部署临时性的Wi-Fi覆盖方案,则可以通过安装运行了上述软件定义网络(SDN)控制器及相应客户端插件后的路由器形成一张动态变化但始终保持连通状态下的互联网接入平台;又或者是城市级别的公共安全应急响应体系里作为传统有线链路失效情况下的补充手段之一发挥作用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值