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,一经查实,立即删除!

相关文章

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的假日旅社…

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

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

恩智浦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简介 官网&…

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;

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

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的…

【PX4SimulinkGazebo联合仿真】在Simulink中使用ROS2控制无人机沿自定义圆形轨迹飞行并在Gazebo中可视化

在Simulink中使用ROS2控制无人机沿自定义圆形轨迹飞行并在Gazebo中可视化 系统架构Matlab官方例程Control a Simulated UAV Using ROS 2 and PX4 Bridge运行所需的环境配置PX4&Simulink&Gazebo联合仿真实现方法建立Simulink模型并完成基本配置整体框架各子系统实现原理…

识别图片字符-PaddleOCR

PaddleOCR 是由百度开发的一个开源光学字符识别&#xff08;OCR&#xff09;工具&#xff0c;它可以识别图片中的文本信息。然而&#xff0c;PaddleOCR 本身主要专注于文本的检测与识别 安装PaddleOCR框架 pip install paddlepaddle paddleocr 使用PaddleOCR识别图片代码 fro…

STL - hash

1、unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到O()&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好 的查询是&#xff0c;进…

第四十一回 还道村受三卷天书 宋公明遇九天玄女-python创建临时文件和文件夹

宋江想回家请老父亲上山&#xff0c;晁盖说过几天带领山寨人马一起去。宋江还是坚持一个人去。 宋江到了宋家村&#xff0c;被两个都头和捕快们追捕&#xff0c;慌不择路&#xff0c;躲进了一所古庙。一会儿&#xff0c;听见有人说&#xff1a;小童奉娘娘法旨&#xff0c;请星主…

SpringBoot2整合支付宝进行沙箱支付

目录 1. 进入支付宝的开放平台 2. 导入Maven依赖 3. 配置application.yml文件 NATAPP.cn(内网穿透工具) 注册登录 下载 4. 后端配置 5. 测试 1. 进入支付宝的开放平台 开发平台: 支付宝开放平台 登录后,点击控制台 点击最下面的沙箱 2. 导入Maven依赖 <dependency…

Git 客户端可视化工具tortoisegit

Git 使用教程 git一点通 (kdocs.cn) 二、Git 客户端可视化工具-推荐 1.常用工具 tortoisegit 官网 https://tortoisegit.org/ 推荐 sourcetree 官网 https://www.sourcetreeapp.com/ 2.tortoisegit安装 2.1 下载安装包 2.2 下载语言包 2.3 安装 2.4 安装语言包 5.使用 5.1 新建…

Spring学习笔记(三)--Spring中的Bean的管理

一、什么是Bean Bean是注册到Spring容器中的Java类&#xff0c;控制反转和依赖注入都是通过Bean实现的&#xff0c;任何一个Java类都可以是一个Bean。Bean由Spring进行管理&#xff0c;可以通过xml文件对bean进行配置和管理。 二、BeanFactory接口和ApplicationContext接口&a…

利用Python实现科学式占卜

一直以来&#xff0c;中式占卜都是基于算命先生手工实现&#xff0c;程序繁琐&#xff08;往往需要沐浴、计算天时、静心等等流程&#xff09;。准备工作复杂&#xff08;通常需要铜钱等道具&#xff09;&#xff0c;计算方法复杂&#xff0c;需要纯手工计算二进制并转换为最终…

2023年12月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 运行以下程序,输出的结果是?( ) class A():def __init__(self,x):self.x=x

手机连接电脑后资源管理器无法识别(识别设备但无法访问文件)

问题描述 小米8刷了pixel experience系统,今天用电脑连接后无法访问手机文件,但是手机选择了usb传输模式为文件传输 解决办法 在设备和打印机页面中右键选择属性 点击改变设置 卸载驱动,注意勾选删除设备的驱动程序软件 卸载后重新连接手机,电脑弹出希望对设备进行什么操作时…

Code-Audit(代码审计)习题记录4-5

4、习题4 题目内容如下&#xff1a; <?php error_reporting(0); show_source(__FILE__); $a $_REQUEST[hello]; eval("var_dump($a);"); 函数解释 $REQUEST — HTTP Request 变量&#xff0c;默认情况下包含了 [$GET]&#xff0c;[$POST] 和 [$COOKIE]的数…

HTML知识点

HTML 【一】HTML简介 【1】什么是HTML HTML是一种用于创建网页结构和内容的超文本标记语言&#xff0c;它是构建网页的基础。为了让浏览器正确渲染页面&#xff0c;我们必须遵循HTML的语法规则。浏览器在解析网页时会将HTML代码转换为可视化的页面&#xff0c;所以我们在浏览…