某 v2er 做的 App 代码关键部分可能不是基于 LocalSend 改的

132 天前
 othercat

起因是看到 这个帖子 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 改的。

以上。

2021 次点击
所在节点    分享发现
17 条回复
Goooooos
132 天前
人们更愿意相信自己认为的,所以你这贴没啥用,只有作者完全开放源代码,就像电影《让子弹飞》里的老六为了证明自己只吃了一碗凉粉。
但作为一个付费 APP ,作者肯定不会开放源码。
othercat
132 天前
@Goooooos 所以我只是说关键代码不是基于 LocalSend 修改,因为协议层实现比 UI 还是要复杂得多(当然不一定比 LocalSend 更优雅或者安全)

我相信通过替换 Framework 可以直接使用,应该是有借鉴 Flutter 层面相关代码的,但是由于关键功能的协议层自己有实现,因此作者认为自己没有抄袭可能也有他自己的道理。
w568w
132 天前
大家关心的问题不在于「抄没抄」,而是「遵没遵守协议」。不要打烟雾弹。

LocalSend 使用的 MIT 协议本来就是允许抄、欢迎抄的。退一万步说,就算他抄了,抄袭不可耻,闭源也不可耻,盈利更没有违反任何协议,完全是他的营销本事。

现在的关键是:他是否基于 LocalSend 代码二次开发,以及是否履行 MIT 协议。

其项目源代码结构被逆向工程发现和 LocalSend 的目录结构、文件名完全一致,这基本确定是基于 LocalSend 源代码。然而其三番五次声称自己和 LocalSend 「没有任何关系」,也没有看到任何协议标注和版权署名,这才是问题所在。

至于核心代码如何变化,我想这并非目前的重点。SSDP Flutter 方面的库也很多很成熟了,LocalSend 的 Provider 架构写得很好,加个协议只是复制粘贴的时间。
w568w
132 天前
@w568w 注:第一句没有说楼主故意混淆视听的意思。
othercat
132 天前
@w568w 没有打烟雾弹,只是描述一个事实。因为 Flutter UI 实在太好替换和借鉴,而 LocalSend 的代码结构说实话因为写的太规范,所以也可以认为有规范的人都可以写的相似。

目录结构现在我只看到大家借鉴的是主程序部分,但是主程序说老实话,只有 UI ,因为协议层都不在这里。

因此这部分我仔细看了一下引用的几个核心网络层面 Framework 的实现,其实有很多和 LocalSend 引用的不同,当然因为闭源很难证明,我也没精力和兴趣去证明。

我只想表达,协议层面自己造轮子实现,如果用 LocalSend 的代码二次开发,可能会更痛苦。
othercat
132 天前
@w568w 补充一点我自己个人的猜测,仅仅是猜测:

作者是基于 LocalSend 的代码结构还有设计思路,自己修改了 UI ,同时自己实现了他描述当中的核心功能协议替换。

另外大家逆向的看到的主要还是基于 Flutter 打包的结构,这个结构可能写的规范的人都差不多,很难证明什么。
w568w
132 天前
@othercat #5

> 认为有规范的人都可以写的相似

所有文件名都相似的概率太低了。我是 Flutter 开发者,我很清楚至少在列出的那些文件名上,并没有听说过什么「规范」。

> 主程序说老实话,只有 UI ,因为协议层都不在这里

协议层可以就在这里。请不要把 Flutter 当成 HTML 那样的前端标记语言,它没有什么「主程序」、「前端」、「后端」的概念,编写一个操作系统模拟器都不在话下,实现一个网络协议还是非常容易的。

例如,LocalSend 的协议实现就是纯 Dart 编写的。

> 协议层面自己造轮子实现,如果用 LocalSend 的代码二次开发

「二次开发」的意思你可能弄错了。并不是必须全部代码照搬,自己一行都不写,然后改两行加上「 VIP 充值」按钮才叫「二次开发」,理论上借鉴(即:再演绎)任何代码全都是「二次开发」。既然是二次开发,就必须遵守协议。

再强调一次:关心的重点不是「抄不抄袭」,抄袭本来就是一个感情用事的词语。
body007
132 天前
@othercat #6 作者是真不怕影响销量,也不出来说两句。结果我们一群吃瓜群众来回拉扯,这样一闹,知道的或以前不知道的都要去用 localsend 咯
othercat
132 天前
@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 相似,这。。。
othercat
132 天前
@body007 我个人看法:

1. 代码结构和思路肯定是借鉴 LocalSend 的,多加一个 致敬声明 就没事了,但是自己觉得 UI 和协议都是我自己写的,我只是借鉴了思路和代码框架,为啥要声明,哈哈

2. 具体协议层,就 macOS 上来说,LocalSend 自己用 Pod 的一些现成轮子组成的私有协议,和作者用另外一组 Pod 的的一些现成轮子组成的自己的另外的标准协议实现,后者算不算抄袭或借鉴,我觉得很难。

3. 我个人来说,LocalSend ,除了在雷电 3 ,4 组雷雳网桥的性能极差(可能是一些变量没考虑 20Gbps 的传输带宽之外),其他层面 LocalSend 就够了。毕竟用一直用 SSDP 真的会比目前 LocalSend 这个协议耗电。
othercat
132 天前
上面说的 “但是自己觉得 UI 和协议都是我自己写的” -> ",但是作者肯定自己觉得 UI 和协议都是我自己写的"
w568w
132 天前
@othercat #9

> 大概判断出如果不用这些协议,使用其他 SSDP 到底是自己造轮子方便,还是借鉴代码方便了吧

你的逻辑我似乎没理解。要实现一个协议,除了「造轮子」和「借鉴代码」,还有一个选项是「调库」。我最后提的是调库最方便。

另外,我再强调一次:这不是重点…… 以下讨论我们就按你的来,默认全部是他自己写的好了。

> cocoapods 包这些东西,核心在这里

核心多半不在这里,网络请求 API 在 Dart Runtime 本身就有,为什么要依赖三方库?

> 在 cocoapods 里面实现的

我对比了 LocalSend 和 AirClap 的依赖原生库(即你说的 cocapods 依赖库)。很遗憾,所有库我都用过,并没有哪个和 UDP 有特别的关系。你列出的几个都是获取平台信息的,比如 WiFi 名称、5G 情况、检查是否联网等。

其次明确一点,这里不是他的依赖库列表,充其量是个子集。你可以再看看 Flutter packages 依赖进入打包的过程。
28Sv0ngQfIE7Yloe
132 天前
他这个 UI 还挺好看的。
othercat
132 天前
@w568w 哎,我觉得重复回复人也累,哈哈, 参考我 10 楼的回复吧,就这样了。
beimenjun
132 天前
首先我觉得应该有个共识:

1. 基于 localsend 开发,不代表就不能自己做修改了。

2. 做了修改,不代表就不是基于 localsend 开发。

脱离了这两点就没啥好讨论了。

另外我的💢指责再说一遍:他这个 App 参考了很多 localsend 的代码(事实也是如此),稍微致谢里也该说一下吧?为什么还要撇清关系,好像完全没从这个开源项目获益一样。
zagfai
132 天前
@othercat 我感觉 w568w 不是很懂,在装懂:)
w568w
131 天前
@zagfai 我是不是不懂装懂点进 github 个人主页就看到了,还是说必须是 flutter core dev 才能说话?

有错请直接指出我的错误,阴阳怪气真的很没意思。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1052440

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX