OpenWRT的BusyBox中小数除法并向上取整

##OpenWRT中BusyBox环境做浮点数除法并向上取整.

项目中出了点小问题,原因基本由2个方面引起:

  • 路由器中的DHCP服务器的dhcp leasetime默认12小时,而路由器地址池有限,对公共场合的路由器来说,12小时内也许很容易达到地址池用完的情况.
  • 对于免费WiFi的路由器来说,其客户端具有很强大的流动性和即时性,就是说,设备连接上后几分钟就走了.再也不回来了的.哪怕他没有达到认证时间到期. 而就算认证时间到期了.该设备离开了.而其分配的IP地址因为默认的dhcp leasetime很长而占有资源,导致新设备无法加入网络的可能.

解决办法:

  • 我们不能认为的把leasetime设置的过短,短于认证的时间,不然就会在认证时间段内,因为leasetime到期设备自动续租,自动续租到的IP地址不再相同,导致认证的IP-MAC映射关系出错而把已经认证过的设备当作新设备再次弹出Captive Portal认证.这是用户体验很差的.
  • 所以我们最好的办法就是把路由器的DHCP服务器的leasetime设置为认证时间相同的一个数值.

由于项目中认证时间用的时间单位是秒数,这个时间值是写在配置文件中的. 为了不去修改C代码,通过shell脚本去实现,就需要做OpenWrt的BusyBox环境下进行秒数转分钟数,并且应该向上取整.
一开始就想到shell里的bc命令,但是动手才发现环境有局限.折腾了一会才想到用如下的方法来做BusyBox环境下来实现这一简单需求:

auth_seconds=61.5  #比如这个是配置文件中的秒数:61.5秒

auth_minutes=`echo|awk '{printf "%.fm", ('$auth_seconds'/60)+0.5}'`;
uci set dhcp.lan.leasetime=$auth_minutes;
uci commit;
/etc/init.d/dnsmasq restart;

Shell真的是个万能胶,长期不用会生锈,要时不时磨磨刀.

标签:none

添加新评论