LocalSend跨设备传输文件传输协议 v2

LocalSend仓库地址:GitHub - localsend/localsend: An open-source cross-platform alternative to AirDrop

LocalSend 协议 v2

English | 简体中文

主要为了实现一个不依赖于任何外部服务器的简单 REST 协议。

因为计算机网络比较复杂,因此我们不能假设每种方法都可用。某些设备可能不支持多点广播或不能运行 HTTP 服务器。

就是这个原因,所以这协议尝试用多种方式去发现其他 LocalSend 成员,从而执行发送文件。

该协议只需要一方建立 HTTP 服务器即可运行。

目录

  • LocalSend 协议 v2
    • 目录
    • 1. 默认配置
    • 2. 指纹
    • 3. 搜寻发现
      • 3.1 UDP 广播
      • 3.2 HTTP (传统模式)
    • 4. 文件传输 (HTTP)
      • 4.1 准备工作 (仅元数据)
      • 4.2 发送文件
      • 4.3 取消
    • 5. 反向文件传输 (HTTP)
      • 5.1 浏览器 URL
      • 5.2 接收请求
      • 5.3 接收文件
    • 6. 其他 API
      • 6.1 信息
    • 7. 枚举
      • 7.1 设备类型

1. 默认配置

LocalSend 不需要特定的端口或广播地址,而是提供默认配置。

如果端口/地址不可用,可以在应用程序中修改配置。

默认广播地址是 224.0.0.0/24,因为某些 Android 设备禁止其他广播组。

UDP广播

  • 端口: 53317
  • 地址: 224.0.0.167

HTTP (TCP)

  • 端口: 53317

2. 指纹

指纹用于区分设备。

使用 HTTPS 加密时,证书的 SHA-256 哈希值作为指纹。

当关闭 HTTP 加密时,用随机字符串作为指纹。

3. 搜寻发现

3.1 UDP 广播

通知

在应用程序启动时,会发送以下消息到广播地址:

{"alias": "Nice Orange","version": "2.0", // 协议版本(major.minor)"deviceModel": "Samsung", // nullable"deviceType": "mobile", // mobile | desktop | web | headless | server, nullable"fingerprint": "随机字符串","port": 53317,"protocol": "https", // http | https"download": true, // 下载 API(5.2 和 5.3)是否激活(可选,默认为 false)"announce": true
}

返回

其他 LocalSend 成员会收到到此消息并回复各自的设备信息。

首先,向原设备发送 HTTP/TCP 请求:

POST /api/localsend/v2/register

{"alias": "Secret Banana","version": "2.0","deviceModel": "Windows","deviceType": "desktop","fingerprint": "随机字符串", // 在 HTTPS 模式下被忽略"port": 53317,"protocol": "https","download": true, // 下载 API(5.2 和 5.3)是否激活(可选,默认为 false)
}

另外,成员还可以使用 UDP 广播消息进行响应。

{"alias": "Secret Banana","version": "2.0","deviceModel": "Windows","deviceType": "desktop","fingerprint": "随机字符串","port": 53317,"protocol": "https","download": true,"announce": false,
}

fingerprint 仅用于区分自身设备。

只有当 announce 为 true 时,才会触发响应。

3.2 HTTP (传统模式)

当广播不成功时应使用此方法。

向本地所有 IP 地址发送此请求来发现设备。

POST /api/localsend/v2/register

请求:

{"alias": "Secret Banana","version": "2.0", // 协议版本(major.minor)"deviceModel": "Windows","deviceType": "desktop","fingerprint": "随机字符串", // 在 HTTPS 模式下被忽略"port": 53317,"protocol": "https", // http | https"download": true, // 下载 API(5.2 和 5.3)是否激活(可选,默认为 false)
}

返回:

{"alias": "Nice Orange","version": "2.0","deviceModel": "Samsung","deviceType": "mobile","fingerprint": "随机字符串", // 在 HTTPS 模式下被忽略"download": true, // 下载 API(5.2 和 5.3)是否激活(可选,默认为 false)
}

4. 文件传输 (HTTP)

HTTP传输是默认方式。

接收方作为 HTTP 服务器。

发送方(即 HTTP 客户端)将文件发送到 HTTP 服务器。

4.1 准备工作 (仅元数据)

仅将元数据发送给接收方。

接收方将决定该请求是否被接受、部分接受或拒绝。

POST /api/localsend/v2/prepare-upload

请求:

{"info": {"alias": "Nice Orange","version": "2.0", // 协议版本 (major.minor)"deviceModel": "Samsung", // 可为空"deviceType": "mobile", // mobile | desktop | web | headless | server, 可为空"fingerprint": "随机字符串", // 在 HTTPS 模式下被忽略"port": 53317,"protocol": "https", // http | https"download": true, // 下载 API (5.2 和 5.3) 是否激活 (可选,默认为 false)},"files": {"文件ID": {"id": "文件ID","fileName": "我的图片.png","size": 324242, // bytes"fileType": "image/jpeg","sha256": "*sha256哈希值*", // 可为空"preview": "*预览数据*" // 可为空},"另一个文件ID": {"id": "另一个文件ID","fileName": "另一个图片.jpg","size": 1234,"fileType": "image/jpeg","sha256": "*sha256哈希值*","preview": "*预览数据*"}}
}

返回:

{"sessionId": "我的会话ID","files": {"文件ID": "文件Token","另一个文件ID": "另一个文件Token"}
}

Errors 错误代码

HTTP 代码信息
204完成 (无需传输文件)
400无效请求体
403拒绝
500接收器未知错误

4.2 发送文件

文件传输。

使用来自 /prepare-upload 的 sessionIdfileId 及其特定于文件的 token

这请求路径可以同时调用。

POST /api/localsend/v2/upload?sessionId=我的会话ID&fileId=文件ID&token=文件Token

请求:

二进制数据

返回:

无响应体

Errors 错误代码

HTTP 代码信息
400参数缺失
403无效令牌或 IP 地址
409被其他会话阻止
500接收器未知错误

4.3 取消

当发送方希望取消会话时,可用此请求路径。

使用 /send-request 中的 sessionId

POST /api/localsend/v2/cancel?sessionId=我的会话ID

返回:

无响应体

5. 反向文件传输 (HTTP)

HTTP方式是当接收方无法使用 LocalSend 时应使用的备用方法。

发送方设置一个 HTTP 服务器,通过提供 URL 将文件发送给其他成员。

然后接收方使用给定的 URL 打开浏览器并下载文件。

需要注意的是,由于浏览器拒绝自签名证书,因此使用未加密的 HTTP 协议。

5.1 浏览器 URL

接收方可以在浏览器中打开以下网址来下载文件。

http://<发送者ip>:<发送者端口>

5.2 接收请求

向发送方发送请求以获取文件元数据列表。

下载方可以添加 ?sessionId=我的会话ID。此时,如果是同一个会话,则接受该请求。

如果用户刷新浏览器页面,则需要这样操作。

POST /api/localsend/v2/prepare-download

请求:

无请求体

返回:

{"info": {"alias": "Nice Orange","version": "2.0","deviceModel": "Samsung", // 可为空"deviceType": "mobile", // mobile | desktop | web | headless | server, 可为空"fingerprint": "随机字符串", //  在 HTTPS 模式下被忽略"download": true, // 下载 API (5.2 和 5.3) 是否激活 (可选,默认为 false)},"sessionId": "mySessionId","files": {"文件ID": {"id": "文件ID","fileName": "我的图片.png","size": 324242, // bytes"fileType": "image/jpeg","sha256": "*sha256哈希值*", // 可为空"preview": "*预览数据*" // 可为空},"另一个文件ID": {"id": "另一个文件ID","fileName": "另一个图片.jpg","size": 1234,"fileType": "image/jpeg","sha256": "*sha256哈希值*","preview": "*预览数据*"}}
}

5.3 接收文件

文件传输。

使用 /receive-request 中的 sessionId 和 fileId

这请求路径可以同时调用。

GET /api/localsend/v2/download?sessionId=我的会话ID&fileId=文件ID

请求:

无请求体

返回:

二进制数据

6. 其他 API

6.1 信息

这是一条以前用于发现的旧连接。 它已被替换为“/register”,这是一种双向发现。

现在该路由应该仅用于调试。

GET /api/localsend/v2/info

返回:

{"alias": "Nice Orange","version": "2.0","deviceModel": "Samsung", // 可为空"deviceType": "mobile", // mobile | desktop | web | headless | server, 可为空"fingerprint": "随机字符串","download": true, // 下载 API (5.2 和 5.3) 是否激活 (可选,默认为 false)
}

7. 枚举

在这项目中,枚举用于定义某些字段的可能值。

7.1 设备类型

设备类型仅用于 UI 使用,例如显示图标。

各种设备类型的协议都一样。

描述
mobile移动设备 (Android, iOS, FireOS)
desktop桌面 (Windows, macOS, Linux)
web网页浏览器 (Firefox, Chrome)
headless在终端运行的无图形用户界面程序
server全天候运行的(自托管)云服务

如有枚举外的值,都返回 desktop 类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源Excel 处理工具库MyExcel介绍以及简单例子

MyExcel是一个开源的Java库&#xff0c;用于简化Excel文件的处理。它提供了一种简单、高效的方式来读写Excel文件&#xff0c;支持多种格式&#xff0c;包括XLS、XLSX和CSV。MyExcel的设计目标是易于使用&#xff0c;同时提供足够的灵活性来处理复杂的Excel操作。 主要…

【ModelScope】Linux安装

CentOS下g的安装 Centos下的g安装包的名字叫做gcc-c&#xff0c;这是与Centos与Ubuntu不同的地方。安装命令如下&#xff1a; yum install gcc gcc-c pip安装 ModelScope Libarary由核心框架&#xff0c;以及不同领域模型的对接组件组成。如果只需要ModelScope模型和数据集访…

Java实现假日旅社管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统介绍2.2 QA 问答 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿评论4.3 查询民宿新闻4.4 新建民宿预订单4.5 查询我的民宿预订单 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的假日旅社…

uniapp引入微信小程序直播组件

在manifest.json配置即可&#xff0c;与直接在小程序代码中引入相同。 在工程的manifest.json文件中引入直播插件 "mp-weixin" : {/* 小程序特有相关 */"usingComponents" : true,"appid" : "xxx","plugins": {"live…

3.Swift导航栏的使用

Swift 导航栏的使用 一、基本使用 1.1 创建导航栏 在AppDelegate 如下方法中添加创建导航栏的代码&#xff1a; func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { …

js遇到的问题 --持续更新

indexOf 遇到问题&#xff1a; 如果key if(INK,map.indexOf(key) -1)return alert("取芯方式维护有误&#xff01;"); 改表单式仍就不会报错 结果&#xff1a;INK,map.indexOf()0js 格式化时间 YYYY-MM-DD形式 new Date().toISOString().substr(0, 10);

Gin框架: Cookie和Session在单体架构和分布式架构下的应用

Gin 中单一Cookie的应用 1 &#xff09;路由处理 package routersimport ("gin-demo/controllers/web""github.com/gin-gonic/gin" )func WebRoutersInit(r *gin.Engine) {webRouters : r.Group("/"){webRouters.GET("/", web.WebCtr…

第十七届“挑战杯”广东大学生课外学术科技作品比赛感想

博主曾在2023年参加了第十七届“挑战杯”广东大学生课外学术科技作品比赛&#xff0c;也就是人们俗称的大挑&#xff0c;在团队赛里面含金量应该是排在第一档的了&#xff0c;当初我们有幸作为学校唯一一支科技创新B类进入到线下答辩&#xff0c;线下答辩就是区分银奖和金奖和特…

postgis应用笔记

1. postgis多边形查询相交LineString并切割相交范围内 table.shape 是postgis的Geometry的lineString 传入的参数shape是wkt格式的pologon select st_intersection(shape,st_geofromewkt(${shape})) from table where st_intersects(shape,st_geofromewkt(${shape}))2. 路牌坐…

恩智浦MCX A系列:开启工程师的无限创造潜力 | 百能云芯

恩智浦半导体&#xff08;NXP&#xff09;最近宣布推出旗下MCX产品组合中的全新成员——通用A系列的首批产品MCX A14x和MCX A15x&#xff0c;现已正式上市。这一系列的微控制器&#xff08;MCU&#xff09;不仅性价比高、使用便捷、体积小巧&#xff0c;而且还旨在为工程师们打…

分布式版本控制系统 Git

目录 一、Git简介 二、Git历史 三、安装git 1.准备环境 2.Yum安装Git 四、初次运行 Git 前的配置 命令集 实例&#xff1a; 五、Git命令常规操作 六、获取 Git 仓库&#xff08;初始化仓库&#xff09; 创建裸库 实例 &#xff1a; 创建本地库 一、Git简介 官网&…

美国硅谷服务器的优势有哪些

很多用户在选择服务器时会优先选择美国硅谷服务器&#xff0c;那么美国硅谷服务器&#xff0c;为什么会让人更加青睐&#xff0c;美国硅谷服务器为您整理发布美国硅谷服务器的优势有哪些。 美国硅谷服务器的优势主要体现在以下几个方面&#xff1a; 1. 性能卓越&#xff1a;硅…

opencv-python安装失败问题解决

用pip install opencv-python命令终端中出现如下报错&#xff1a; 解决方法&#xff0c;换一个源&#xff0c;输入&#xff1a; pip install opencv-python -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com运行之后即可安装成功&#xff1a;

【工具】Ubuntu开机黑屏、NVIDIA显卡驱动问题

重装显卡驱动导致开机黑屏 联想 P720 工作站&#xff0c;更新NVIDIA Quadro RTX5000 显卡驱动&#xff0c;重启后黑屏。 开机后待显示Lenovo后按下ESC&#xff0c; 进入Ubuntu 设置&#xff0c;按下E键&#xff0c;用箭头移动光标改参数 ro quiet splash $vt_handoff 改为 rw …

CAN Linux C应用编程

由于 Linux 系统将 CAN 设备作为网络设备进行管理&#xff0c;因此在 CAN 总线应用开发方面&#xff0c; Linux 提供了SocketCAN 应用编程接口&#xff0c;使得 CAN 总线通信近似于和以太网的通信&#xff0c;应用程序开发接口更加通用&#xff0c;也更加灵活。 SocketCAN 中大…

隐私保护 AI 的演变:从协议到实际实现

近些年&#xff0c;人工智能不断发展&#xff0c;在解决日常人类任务方面变得更加高效。但与此同时&#xff0c;它增加了个人信息滥用的可能性&#xff0c;在分析和传播个人数据方面达到了前所未有的力量和速度水平。在这篇文章中&#xff0c;我想仔细研究一下人工智能系统和机…

spinalhdl,vivado,fpga

https://spinalhdl.github.io/SpinalDoc-RTD/master spinal hdl sudo apt install openjdk-17-jdk scala curl echo “deb https://repo.scala-sbt.org/scalasbt/debian all main” | sudo tee /etc/apt/sources.list.d/sbt.list echo “deb https://repo.scala-sbt.org/scal…

浅谈加密算法(对称加密、非对称加密、混合加密、数字签名、哈希函数)

1、对称加密 对称加密只有一个密钥&#xff0c;直接使用这一个密钥对信息进行加密或解密。这样子就使得对称加密解密十分高效&#xff0c;计算量也相较于非对称加密小很多&#xff0c;适合有大量数据的场合。 密钥只有一个且他一定不能泄漏。由此分发密钥&#xff0c;讲这个密钥…

SQL 练习题目(入门级)

今天发现了一个练习SQL的网站--牛客网。里面题目挺多的&#xff0c;按照入门、简单、中等、困难进行了分类&#xff0c;可以直接在线输入SQL语句验证是否正确&#xff0c;并且提供了测试表的创建语句&#xff0c;也可以方便自己拓展练习&#xff0c;感觉还是很不错的一个网站&a…

ChromeDriver | 谷歌浏览器驱动下载地址 及 浏览器版本禁止更新

在使用selenoum时&#xff0c;需要chrome浏览器的版本和chrome浏览器驱动的版本一致匹配&#xff0c;才能进行自动化测试 一、ChromeDriver驱动镜像网址 国内可以搜到的谷歌浏览器下载地址里面最新的驱动器只有114版本的CNPM Binaries Mirror 在其他博主那找到了最新版本12X的…