起因是看到 这个帖子 https://v2ex.com/t/1052120
然后我好奇做了一些事情 (之前用的图是 Dropbox 但是 V2EX 可能不支持,现在换成 imgur 的)
即把原作者 @LuLiangDev 的 Airclap v1.2.0 的 Frameworks 替换掉了 手头 v1.14.0 的 LocalSend
这样显示效果是被我吐槽是一个 Airclap v1.14.0
但是考虑到 Flutter 架构其实就是方便前端 UI 替换,所以根本考虑是否基于 LocalSend 修改还是要看行为
例如原作者 在 https://v2ex.com/t/1051102 提到
基于 SSDP 深度定制发现协议和 P2P 安全传输协议,利用多链路传输技术,保证数据不丢包, 安全稳定并且高速传输
所以和朋友一起研究了一下
首先先确保 LocalSend 的发现协议是基于 https://github.com/localsend/protocol 所说的私有协议
The default multicast group is 224.0.0.0/24 because some Android devices reject any other multicast group.
Multicast (UDP)
Port: 53317
Address: 224.0.0.167
那么通过 WireShark 抓包的确能看到是这样的
那么我们替换之后的新 Airclap v1.2.0 到底是和 LocalSend 一致,还是和作者所说的一致呢?
通过抓包发现
因为 SSDP 一般使用多播地址 239.255.255.250 和 UDP 端口号 1900 ,所以可以认为作者说的符合他自己的描述
后续就不用特别研究了,因为至少目前为止,Airclap 表现的行为,和作者在发布的描述是一致的,而且的确是和 LocalSend 区别很大的
所以可以认为,@LuLiangDev 的 Airclap ,代码关键部分可能不是基于 LocalSend 改的。
以上。
1
Goooooos 158 天前
人们更愿意相信自己认为的,所以你这贴没啥用,只有作者完全开放源代码,就像电影《让子弹飞》里的老六为了证明自己只吃了一碗凉粉。
但作为一个付费 APP ,作者肯定不会开放源码。 |
2
othercat OP @Goooooos 所以我只是说关键代码不是基于 LocalSend 修改,因为协议层实现比 UI 还是要复杂得多(当然不一定比 LocalSend 更优雅或者安全)
我相信通过替换 Framework 可以直接使用,应该是有借鉴 Flutter 层面相关代码的,但是由于关键功能的协议层自己有实现,因此作者认为自己没有抄袭可能也有他自己的道理。 |
3
w568w 158 天前 2
大家关心的问题不在于「抄没抄」,而是「遵没遵守协议」。不要打烟雾弹。
LocalSend 使用的 MIT 协议本来就是允许抄、欢迎抄的。退一万步说,就算他抄了,抄袭不可耻,闭源也不可耻,盈利更没有违反任何协议,完全是他的营销本事。 现在的关键是:他是否基于 LocalSend 代码二次开发,以及是否履行 MIT 协议。 其项目源代码结构被逆向工程发现和 LocalSend 的目录结构、文件名完全一致,这基本确定是基于 LocalSend 源代码。然而其三番五次声称自己和 LocalSend 「没有任何关系」,也没有看到任何协议标注和版权署名,这才是问题所在。 至于核心代码如何变化,我想这并非目前的重点。SSDP Flutter 方面的库也很多很成熟了,LocalSend 的 Provider 架构写得很好,加个协议只是复制粘贴的时间。 |
5
othercat OP @w568w 没有打烟雾弹,只是描述一个事实。因为 Flutter UI 实在太好替换和借鉴,而 LocalSend 的代码结构说实话因为写的太规范,所以也可以认为有规范的人都可以写的相似。
目录结构现在我只看到大家借鉴的是主程序部分,但是主程序说老实话,只有 UI ,因为协议层都不在这里。 因此这部分我仔细看了一下引用的几个核心网络层面 Framework 的实现,其实有很多和 LocalSend 引用的不同,当然因为闭源很难证明,我也没精力和兴趣去证明。 我只想表达,协议层面自己造轮子实现,如果用 LocalSend 的代码二次开发,可能会更痛苦。 |
6
othercat OP @w568w 补充一点我自己个人的猜测,仅仅是猜测:
作者是基于 LocalSend 的代码结构还有设计思路,自己修改了 UI ,同时自己实现了他描述当中的核心功能协议替换。 另外大家逆向的看到的主要还是基于 Flutter 打包的结构,这个结构可能写的规范的人都差不多,很难证明什么。 |
7
w568w 158 天前
@othercat #5
> 认为有规范的人都可以写的相似 所有文件名都相似的概率太低了。我是 Flutter 开发者,我很清楚至少在列出的那些文件名上,并没有听说过什么「规范」。 > 主程序说老实话,只有 UI ,因为协议层都不在这里 协议层可以就在这里。请不要把 Flutter 当成 HTML 那样的前端标记语言,它没有什么「主程序」、「前端」、「后端」的概念,编写一个操作系统模拟器都不在话下,实现一个网络协议还是非常容易的。 例如,LocalSend 的协议实现就是纯 Dart 编写的。 > 协议层面自己造轮子实现,如果用 LocalSend 的代码二次开发 「二次开发」的意思你可能弄错了。并不是必须全部代码照搬,自己一行都不写,然后改两行加上「 VIP 充值」按钮才叫「二次开发」,理论上借鉴(即:再演绎)任何代码全都是「二次开发」。既然是二次开发,就必须遵守协议。 再强调一次:关心的重点不是「抄不抄袭」,抄袭本来就是一个感情用事的词语。 |
9
othercat OP @w568w
> 例如,LocalSend 的协议实现就是纯 Dart 编写的。 是啊,都能看到 LocalSend 的协议实现是纯 Dart 编写了,其实也可以大概判断出如果不用这些协议,使用其他 SSDP 到底是自己造轮子方便,还是借鉴代码方便了吧。 > 协议层可以就在这里。请不要把 Flutter 当成 HTML 那样的前端标记语言,它没有什么「主程序」、「前端」、「后端」的概念,编写一个操作系统模拟器都不在话下,实现一个网络协议还是非常容易的。 我说的协议层指的是 cocoapods 包这些东西,核心在这里,而不是 LocalSend 代码。简单来说,我 WireShark 抓包的内容,并不在 LocalSend 主程序实现,而是在 cocoapods 里面实现的 具体而言,可能是 https://github.com/localsend/localsend/blob/main/app/macos/Podfile.lock 这里面的 ``` Reachability network_info_plus connectivity_plus ``` 等等。 如果这些东西两者调用实现都不同,而仅仅是中间层调用 API 相似,这。。。 |
10
othercat OP @body007 我个人看法:
1. 代码结构和思路肯定是借鉴 LocalSend 的,多加一个 致敬声明 就没事了,但是自己觉得 UI 和协议都是我自己写的,我只是借鉴了思路和代码框架,为啥要声明,哈哈 2. 具体协议层,就 macOS 上来说,LocalSend 自己用 Pod 的一些现成轮子组成的私有协议,和作者用另外一组 Pod 的的一些现成轮子组成的自己的另外的标准协议实现,后者算不算抄袭或借鉴,我觉得很难。 3. 我个人来说,LocalSend ,除了在雷电 3 ,4 组雷雳网桥的性能极差(可能是一些变量没考虑 20Gbps 的传输带宽之外),其他层面 LocalSend 就够了。毕竟用一直用 SSDP 真的会比目前 LocalSend 这个协议耗电。 |
11
othercat OP 上面说的 “但是自己觉得 UI 和协议都是我自己写的” -> ",但是作者肯定自己觉得 UI 和协议都是我自己写的"
|
12
w568w 158 天前
@othercat #9
> 大概判断出如果不用这些协议,使用其他 SSDP 到底是自己造轮子方便,还是借鉴代码方便了吧 你的逻辑我似乎没理解。要实现一个协议,除了「造轮子」和「借鉴代码」,还有一个选项是「调库」。我最后提的是调库最方便。 另外,我再强调一次:这不是重点…… 以下讨论我们就按你的来,默认全部是他自己写的好了。 > cocoapods 包这些东西,核心在这里 核心多半不在这里,网络请求 API 在 Dart Runtime 本身就有,为什么要依赖三方库? > 在 cocoapods 里面实现的 我对比了 LocalSend 和 AirClap 的依赖原生库(即你说的 cocapods 依赖库)。很遗憾,所有库我都用过,并没有哪个和 UDP 有特别的关系。你列出的几个都是获取平台信息的,比如 WiFi 名称、5G 情况、检查是否联网等。 其次明确一点,这里不是他的依赖库列表,充其量是个子集。你可以再看看 Flutter packages 依赖进入打包的过程。 |
13
28Sv0ngQfIE7Yloe 158 天前
他这个 UI 还挺好看的。
|
15
beimenjun 158 天前 2
首先我觉得应该有个共识:
1. 基于 localsend 开发,不代表就不能自己做修改了。 2. 做了修改,不代表就不是基于 localsend 开发。 脱离了这两点就没啥好讨论了。 另外我的💢指责再说一遍:他这个 App 参考了很多 localsend 的代码(事实也是如此),稍微致谢里也该说一下吧?为什么还要撇清关系,好像完全没从这个开源项目获益一样。 |