赞
踩
终于写到了flutter初体验的最后一篇,一直想等应用上架了再把这一篇发出来,结果到现在拖了快一个月了。
这里先给没看过前几篇的朋友讲下前情提要:前段时间,我学了一下谷歌的跨平台客户端框架flutter,并用它搭建了一个网络设备扫描的app,这几篇文章主要是介绍我使用flutter的初体验。
在上一篇里,我介绍了项目中ui端的一些要点,有兴趣的朋友可以先看看上一篇:我的Flutter初体验-2-ui端CSDN/酷安。
在之前的文章中,根据app的工作流程,我将逻辑端分为多个模块,本篇文章就介绍一下每个模块的实现方式和要点。
根据app功能和工作流程,可以将逻辑端分为以下模块:
下面针对不同模块进行详细介绍。
设备扫描模块的功能是从一个ip范围之内找到所有可达的ip地址,其工作流程大致分为几步:
第一步比较简单,就不再描述了,下面主要介绍一下后两步。
大家都知道,判断ip地址是否可达有很多种方法,ping是一个比较简单且常用的方法。想要使用dart语言ping一个ip地址,主要有下面几个手段:
dart:io
包中的Process类执行命令上述几种手段中:
在项目里,对于windows平台,我采用了调用系统ping命令的方法(编解码原因),对于其他平台,我采用了第三方库ping操作(简单方便)。
扫描结果的异步返回,既可以使用Future,也可以使用Stream,我在项目中采用了Stream来实现。
在数据链路层中,需要区分不同主机,以确定数据帧传输的目的地,mac地址正是用来区分主机的标识。mac地址共6个字节48位,前24位是ieee分配的厂商标志,后24位是厂商分配的设备标志。
在windows中,可以通过ipconfig
命令查看自身mac地址;在linux中可以通过ifconfig
或ip addr
查看自身mac地址。而想要获取其他设备的mac地址,可以通过读取arp缓存来实现。
arp协议是一个通过ip地址获取网络设备mac地址的协议,在每次广播arp请求并受到响应后,设备会将收到的ip和mac地址存入本机的arp缓存中,并保留一段时间。所以,通过读取arp缓存,我们就能通过ip地址查询到该地址对应设备的mac地址,虽然可能会出现错误(设备ip地址发生变化),但大致上还是可靠的。
在不同的平台上读取arp缓存的方法不同:
arp -a
命令arp -a
命令ip neigh
命令/proc/net/arp
文件ip neigh
命令通过上述几种方法读取arp缓存后,采用正则表达式解析出ip和mac地址的对应关系,就可以通过第一步扫描到ip地址查询到该设备的mac地址。
之前好像还没有人写过dart读取arp缓存的包,所以我抽取了这部分功能并发布了出来,可以去dart packages里面搜arp_cache_loader。
上面讲到mac地址中前24位是由ieee分配给厂商的,这部分被称为oui(organization unique identifier),那么我们理所当然的可以通过mac地址查询到设备所属的厂商。通过mac地址查询厂商有下面几种方法:
我在项目中采用了第三方网站:macvendors.com,这个网站提供了方便的api接口,虽然免费账户限制每秒最多2次查询,但是只要加上重试机制,那么次数限制就不是问题~
这次开发总体来说比较顺利,在前期学习flutter和dart的过程中也没遇到太大的麻烦。这次的开发不仅让我了解了一些客户端搭建方面的知识,也巩固和加强了我计算机网络、项目结构、异步操作等方面的知识和能力,可谓收获良多。
根据个人体验,我总结了几条flutter的优缺点:
由于底层操作、包体积等问题,我个人认为flutter更适合用来构建服务类应用,而不太适合构建系统工具类应用(flutter本身也提供了许多好看的ui效果,不用来搭建服务类应用就可惜了)。
以上均是我个人观点,有不同意见的朋友可以友善交流~
最后附上app和项目地址:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。