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

news2025/1/8 5:18:14

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.coloradmin.cn/o/1461405.html

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

相关文章

欢迎来到 《探索HarmonyOS(鸿蒙应用开发)入门到实战》专栏!

各位小伙伴 国产纯血鸿蒙系统来了。 了解鸿蒙技术的小伙伴都知道,鸿蒙技术一直在持续更新,越来越多的鸿蒙开发者都开始投入鸿蒙技术的开发。 为了更容易和快速的入手鸿蒙开发,闪客专门做了一个鸿蒙应用开发入门到实战课程。 热情的开发者们,是否已经准备好加入革命性的物…

【vue3】手动实现md在线编辑

1.背景 由于知识库的一些.md格式的文件的文件内容可能会有变动&#xff0c;如果频繁下载修改后&#xff0c;再进行上传&#xff0c;会让用户操作不方便&#xff0c;为此接入md在线编辑功能 2 md在线编辑具体实现 2.1 搭建项目 搭建项目下载和引入bytemd和fflate相关依赖&…

ansible及其模块

一、ansible是什么&#xff1f; Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部…

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

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

不同种类遥感图像汇总 !!

文章目录 前言 1、可见光遥感图像 2、全色遥感图像 3、多光谱遥感图像 4、高光谱遥感图像 5、红外遥感图像 6、激光雷达图像 7、合成孔径雷达遥感图像 前言 遥感技术是从远距离感知目标反射或自身辐射的电磁波、可见光、红外线&#xff0c;对目标进行探测和识别的技术。遥感卫…

HTML学习笔记——08:表单<form>

HTML <form> 元素表示文档中的一个区域&#xff0c;此区域包含交互控件&#xff0c;用于向 Web 服务器提交信息。 例如&#xff1a;登录页面。 作用&#xff1a;搜集不同类型的用户输入&#xff0c;并向服务器传送数据。 注意&#xff1a;表单本身并不可见&#xff01;…

《Linux C编程实战》笔记:消息队列

消息队列是一个存放在内核中的消息链表&#xff0c;每个消息队列由消息队列标识符标识。与管道不同的是消息队列存放在内核中&#xff0c;只有在内核重启&#xff08;即操作系统重启&#xff09;或显示地删除一个消息队列时&#xff0c;该消息队列才会被真正的删除。 操作消息…

前端进度条组件NProgress

nprogress 安装 npm install --save nprogress使用 import NProgress from nprogress // 引入nprogress插件 import nprogress/nprogress.css // 这个nprogress样式必须引入// axios请求拦截器 axios.interceptors.request.use(config > {NProgress.start() // 设置加载进…

二维码扫码登录原理,其实比你想的要简单的多

二维码&#xff0c;大家再熟悉不过了 购物扫个码&#xff0c;吃饭扫个码&#xff0c;坐公交也扫个码 在扫码的过程中&#xff0c;大家可能会有疑问&#xff1a;这二维码安全吗&#xff1f; 会不会泄漏我的个人信息&#xff1f; 更深度的用户还会考虑&#xff1a;我的系统是不…

【合宙ESP32C3 Arduino开发】第一篇:初探合宙ESP32C3

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建时间 2024-02-21❤️❤️ 本篇更新时间 2024-02-21❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64f;…

时序分析深入必学的时序模型详细讲解

目录 一、前言 二、时序建模 2.1 反相器 2.2 线性时序模型 2.3 非线性时序模型 三、时序模块 3.1 组合单元 3.2 时序单元 3.3 同步检查&#xff1a;setup和hold 3.4 异步检查&#xff1a;recovery和removal 3.5 脉冲宽度检查Pulse width check 3.6 传输时延 3.7 …

yolov5-tracking-xxxsort yolov5融合六种跟踪算法(一)--环境配置GPU版本

本次开源计划主要针对大学生无人机相关竞赛的视觉算法开发。 开源代码仓库链接&#xff1a;https://github.com/zzhmx/yolov5-tracking-xxxsort.git 如果要配置CPU环境可以看我这篇文章&#xff1a; yolov5-tracking-xxxsort yolov5融合六种跟踪算法&#xff08;一&#xff09;…

【安卓基础2】简单控件

&#x1f3c6;作者简介&#xff1a;|康有为| &#xff0c;大四在读&#xff0c;目前在小米安卓实习&#xff0c;毕业入职。 &#x1f3c6;安卓学习资料推荐&#xff1a; 视频&#xff1a;b站搜动脑学院 视频链接 &#xff08;他们的视频后面一部分没再更新&#xff0c;看看前面…

[java基础揉碎]this

引出this: 什么是this: java虚拟机会给每个对象分配 this&#xff0c;代表当前对象。 这里的this就是new出来的这个对象 this的本质: this是个引用在堆中指向它自己: this的细节: 访问成员方法: 访问构造器:

【GUI编程】Tkinter之OptionMenu

OptionMenu OptionMenu类是一个辅助类&#xff0c;它用来创建弹出菜单&#xff0c;并且有一恶搞按钮显示它。它非常类似Windows上的下拉列表插件。 如果要获取当前选项菜单的值&#xff0c;你需要把它和一个Tkinter变量联系起来。 def __init__(self, master, variable, val…

SQL防止注入工具类,可能用于SQL注入的字符有哪些

SQL注入是一种攻击技术&#xff0c;攻击者试图通过在输入中注入恶意的SQL代码来干扰应用程序的数据库查询。为了防止SQL注入&#xff0c;你需要了解可能用于注入的一些常见字符和技术。以下是一些常见的SQL注入字符和技术&#xff1a; 单引号 ​&#xff1a; 攻击者可能会尝试…

中国 AI 开课速度直逼美国 AI 颠覆性创新速度

原文链接&#xff1a; 中国 AI 开课速度直逼美国 AI 颠覆性创新速度 今日热帖&#xff0c;有网友发帖称&#xff1a;Sora 和 ChatGPT 告诉我们&#xff0c;美国确实是遥遥领先&#xff0c;而且还越拉越远。 是不是遥遥领先暂且不说&#xff0c;但领先我们的确是事实。 主要是…

尚未创建默认 SSL 站点。若要支持不带 SNI 功能的浏览器,建议创建一个默认 SSL 站点。

在 Windows Server 2012 IIS 站点中设置 SSL 证书后&#xff0c;IIS 右上角提示&#xff1a; 尚未创建默认 SSL 站点。若要支持不带 SNI 功能的浏览器&#xff0c;建议创建一个默认 SSL 站点。 该提示客户忽略不管&#xff0c;但是若要支持不带 SNI(Server Name Indication)…

消息中间件-面试题

MQ选择 一、Kafka 1、消息队列如何保证消息可靠性 消息不重复 生产者控制消费者幂等消息不丢失 生产者发送,要确认broker收到并持久化broker确认消费者消费完,再删除消息2、kafka是什么 Kafka是一种高吞吐量、分布式、基于发布/订阅的消息中间件,是Apache的开源项目。broke…

多线程——threading和queue模块的理解。加实例+详解+思路

并发&#xff1a;假的多任务 并行&#xff1a;真的多任务 实现多线程用——threading模块 import threading import timedef shuru():for i in range(1,4):print("正在输入")time.sleep(1) def shuchu():for i in range(1,4):print("正在输出")time.sle…