易可迪信息发布系统
YKDPlayer 开发文档

MQTT 指令控制与 HTTP OpenAPI

面向客户中控程序、业务服务器和二次开发。每项功能均给出标准命令、参数、请求方式和设备反馈。

推荐客户业务系统HTTPS OpenAPI
平台内部YKD IoT 平台MQTT QoS 1
执行端YKDPlayerMAC 唯一标识
Overview

选择接入方式

HTTP OpenAPI(推荐)

客户服务器通过 HTTPS 调用平台。无需保存 MQTT 用户名、密码或 Topic,平台自动校验账号下的设备和素材。

  • 适合网站、APP 后台、企业中控平台
  • 使用 Bearer API Key
  • 基础控制与进阶文件功能均支持

MQTT 直连

客户服务端直接连接 Broker,向设备 Topic 发布 JSON,并订阅反馈 Topic。适合已有 MQTT 基础设施的项目。

  • Broker:iot.yikedi.cn
  • MQTT 3.1.1,QoS 1
  • 账号下设备共用用户级 MQTT 凭据
两种方式执行的是同一套功能

OpenAPI 是平台对 MQTT 的 HTTPS 封装层,不会再造一套播放器命令。基础功能统一使用本文的无下划线 CMD。

Quick start

快速开始:查询音量

在 YKD IoT 平台“开发设置”生成 API Key,然后向命令接口发送 CMD:

curl -X POST "https://iot.yikedi.cn/openapi/devices/4CEBD60BFD62/commands" \
  -H "Authorization: Bearer ykd_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"requestId":"cmd-0001","command":"GETVOLUME;"}'

接口先返回 202 accepted;随后按 requestId 查询设备执行结果:

curl "https://iot.yikedi.cn/openapi/devices/4CEBD60BFD62/requests/cmd-0001" \
  -H "Authorization: Bearer ykd_your_api_key"

向设备命令 Topic 发布 QoS 1、Retain=false 的 JSON:

Topic: ykd/devices/4CEBD60BFD62/cmd

{
  "requestId": "cmd-0001",
  "command": "GETVOLUME;"
}

订阅 ykd/devices/4CEBD60BFD62/reply,设备返回:

{
  "requestId": "cmd-0001",
  "mac": "4CEBD60BFD62",
  "feedback": "VOLUME current=45;"
}
MQTT

连接参数与设备标识

Brokeriot.yikedi.cn
TCP1883
TLS/SSL8883
协议 / QoSMQTT 3.1.1 / QoS 1

deviceId 与 Client ID

deviceId 固定使用设备大写 MAC:12 位十六进制字符,不带冒号、短横线或空格,例如 4CEBD60BFD62。播放器默认 Client ID 为 ykdplayer-4CEBD60BFD62

不要把服务端 Client ID 填到播放器

平台“开发设置”中的服务端 Client ID 只给客户服务器连接 Broker 使用。每台播放器继续使用自己的 Client ID;同一个 Client ID 同时连接会互相顶下线。

Topic 总表

功能Topic方向QoSRetain
基础控制请求ykd/devices/{deviceId}/cmd服务器 → 设备1false
基础控制反馈ykd/devices/{deviceId}/reply设备 → 服务器1false
进阶功能请求ykd/devices/{deviceId}/api/request服务器 → 设备1false
进阶功能反馈ykd/devices/{deviceId}/api/reply设备 → 服务器1false
文件任务进度ykd/devices/{deviceId}/api/progress设备 → 服务器1false
设备状态ykd/devices/{deviceId}/status设备 → 服务器1true
当前内容播放状态与进度ykd/devices/{deviceId}/playback/status设备 → 服务器1true

管理多台设备时可订阅 ykd/devices/+/replyykd/devices/+/api/replyykd/devices/+/api/progressykd/devices/+/statusykd/devices/+/playback/status。所有上行消息都带 mac,用它区分设备。

Message format

MQTT 请求与反馈格式

基础控制请求

requestIdstring · 必填

由请求方生成的唯一编号,用于匹配反馈和防止 QoS 1 重复执行。

commandstring · 必填

标准 CMD;每条以半角分号结束,最多 20 条、总长不超过 1024 字节。

{
  "requestId": "cmd-0002",
  "command": "SELECTPLAYLIST 1;PLAY 1;"
}

基础控制反馈

{
  "requestId": "cmd-0002",
  "mac": "4CEBD60BFD62",
  "feedback": "OK:SELECTPLAYLIST;OK:PLAY;"
}

requestId 匹配请求,mac 区分设备,feedback 是实际执行结果。批量命令遇到失败时停止后续命令。

requestId 怎么生成

客户程序自行生成即可,例如“业务前缀 + 时间 + 随机数”或 UUID。相同 requestId 与相同内容会返回原结果;相同 requestId 携带不同内容会返回冲突。

Playback status

当前内容播放状态与进度 Topic

视频、图片、网页、PDF 和 PPT 的播放状态与进度统一发布到 ykd/devices/{deviceId}/playback/status。播放期间约每 1 秒发布;暂停、完成、停止或错误时立即发布状态变化。

不要与文件任务进度混淆

api/progress 表示文件下载、校验和导入进度;playback/status 表示当前内容的播放位置、时长、页码和播放状态。

MQTT Payload

{
  "mac": "4CEBD60BFD62",
  "playSessionId": "90d89d0e-1470-44c8-9c75-fb8cf9fb7ab6",
  "sequence": 5,
  "mediaType": "video",
  "fileName": "company.mp4",
  "state": "playing",
  "positionMs": 42000,
  "durationMs": 120000,
  "ended": false,
  "reason": null,
  "reportedAt": 1788400000000
}
playSessionId + sequence去重标识

同一播放会话内 sequence 单调递增;忽略较小或相等的旧消息。

positionMs / durationMs毫秒

表示当前播放位置与总时长;所有媒体类型统一使用毫秒。

mediaTypestring

videoimagewebpdfppt

statestring

playingpausedcompletedstoppederror

PDF / PPT 页进度

文档播放会额外携带 pageNumbertotalPagespagePositionMspageDurationMs。页码从 1 开始。

状态与上报行为

state含义上报行为
playing正在播放约每 1 秒发布
paused已暂停暂停时发布一次,暂停期间不周期发布
completed正常播放完成发布一次终态,ended=true
stopped主动停止或切换内容发布一次终态,ended=false
error播放失败发布一次终态,结合 reason 排查

该 Topic 使用 QoS 1、Retain=true。Retain 只表示 Broker 保存最后一条播放状态;服务器仍应结合 statereportedAt 和设备在线状态判断内容是否仍在播放。

CMD commands

播放与选择

播放列表序号和播放项序号均从 1 开始。需要跨列表播放时,按“选择列表 → 选择播放项 → 播放选中项”的顺序发送。

功能标准 CMD参数成功反馈说明
选择播放列表SELECTPLAYLIST <playlist_index>;playlist_index:播放列表序号,从 1 开始OK:SELECTPLAYLIST;只改变当前选中的播放列表
选择播放项SELECTPLAYITEM <index>;index:当前列表内的播放项序号,从 1 开始OK:SELECTPLAYITEM;先选择播放列表,再选择播放项
播放当前选中项PLAYSELECTED;OK:PLAYSELECTED;播放已经选中的播放项
播放指定项PLAY <index>;index:当前列表内的播放项序号OK:PLAY;index 不是文件名或全局文件编号
播放/暂停切换PLAYTOGGLE;OK:PLAYTOGGLE;播放中变暂停,暂停中恢复播放
停止STOP;OK:STOP;停止当前内容
暂停PAUSE;OK:PAUSE;暂停当前内容
恢复播放UNPAUSE;OK:UNPAUSE;从暂停状态恢复
上一项PLAYPREVIOUS;OK:PLAYPREVIOUS;切换到当前列表上一项
下一项PLAYNEXT;OK:PLAYNEXT;切换到当前列表下一项
CMD commands

视频进度

positionMs 和 durationMs 的单位都是毫秒。拖动、快进和快退反馈的是播放器执行后的实际位置。

功能标准 CMD参数成功反馈说明
查询视频进度GETPROGRESS;PROGRESS positionMs=42000 durationMs=120000 state=playing;state 为 playing、paused 或 stopped
拖动到指定位置SEEK <positionMs>;positionMs:目标位置,毫秒OK:SEEK positionMs=60000;返回实际采用的位置
快进约 3 秒SEEKFORWARD;OK:SEEKFORWARD positionMs=45000;返回快进后的实际位置
快退约 3 秒SEEKBACKWARD;OK:SEEKBACKWARD positionMs=42000;返回快退后的实际位置
CMD commands

音量与静音

音量范围 0–100,步长 5。设置非 5 倍数时,余数 1/2 取低档,余数 3/4 取高档;反馈中的 current 是设备实际音量。

功能标准 CMD参数成功反馈说明
设置音量SETVOLUME <value>;value:0–100OK:SETVOLUME current=45;例如 12→10、13→15、43→45
查询音量GETVOLUME;VOLUME current=45;current 为当前实际音量
音量加VOLUMEUP;OK:VOLUMEUP current=50;增加一个 5 点档位
音量减VOLUMEDOWN;OK:VOLUMEDOWN current=40;降低一个 5 点档位
静音MUTE;OK:MUTE;打开静音
取消静音UNMUTE;OK:UNMUTE;关闭静音
静音切换MUTETOGGLE;OK:MUTETOGGLE;在静音与非静音之间切换
CMD commands

PPT / PDF 分页

PPT 和 PDF 使用同一组分页命令,不另外增加 PDF 专用命令。页码从 1 开始。

功能标准 CMD参数成功反馈说明
上一页PPTPREVIOUS;OK:PPTPREVIOUS;当前内容为 PPT 或 PDF 时有效
下一页PPTNEXT;OK:PPTNEXT;当前内容为 PPT 或 PDF 时有效
跳到指定页PPTPAGE <page>;page:目标页码,从 1 开始OK:PPTPAGE;跳转到当前文档指定页
CMD commands

设备控制

关机/开机为播放器的假关机与唤醒机制;重启会重启 Android 设备,请谨慎使用。

功能标准 CMD参数成功反馈说明
重启设备RESTART;OK:RESTART;收到反馈后设备开始重启,连接会短暂中断
假关机SHUTDOWN;OK:SHUTDOWN;黑屏并进入待机控制状态
假开机POWERON;OK:POWERON;从假关机状态唤醒
HTTP OpenAPI

接口地址与鉴权

推荐接口根地址https://iot.yikedi.cn/openapi

平台网页、OpenAPI 和 MQTT Broker 的对外域名统一使用 iot.yikedi.cn

  1. 1
    登录平台

    登录 YKD IoT 设备管理平台

  2. 2
    生成 API Key

    进入“开发设置 → HTTP API”,选择权限和有效期。登录后可按需查看完整 Key,页面会在 60 秒后自动隐藏。

  3. 3
    服务端调用

    每次请求增加 Authorization: Bearer ykd_xxx

API Key 只能保存在客户服务器

不要把 Key 放到浏览器前端、网页源码或播放器中。平台根据 Key 自动确定用户,客户端不能传 userId,也不能访问其他用户的设备和素材。

权限 Scope

Scope用途
device:read查询设备、状态、反馈和进度
device:control发送基础 CMD
device:advanced发送播放列表与文件进阶请求
material:read查询素材、生成下载地址、发送素材
material:write上传平台素材
Endpoints

OpenAPI 接口总表

下表路径均相对于接口根地址。路径中的 {mac} 使用设备的 12 位大写 MAC。

方法路径权限用途用法
GET/devicesdevice:read查询当前 API Key 用户名下的全部设备
GET/devices/{mac}device:read查询一台设备及当前播放摘要路径中的 mac 为 12 位大写 MAC
GET/devices/{mac}/statusdevice:read查询在线状态、当前内容、进度、时长和音量适合状态面板和定时刷新
POST/devices/{mac}/commandsdevice:control发送一个或一组基础 CMDJSON:command 必填,requestId 可选
POST/devices/{mac}/requestsdevice:advanced发送播放列表或文件进阶请求JSON:method、path 必填,body/file 按功能填写
GET/devices/{mac}/requests/{requestId}device:read按 requestId 查询反馈和文件任务进度轮询直到 completed 或 failed
GET/devices/{mac}/eventsdevice:read查询设备原始事件可使用 after、limit、type 参数
GET/materialsmaterial:read查询当前用户名下的素材列表不返回其他用户素材
GET/materials/{materialId}material:read查询素材详情包含文件名、大小、类型和 SHA-256 等信息
POST/materials?name={fileName}material:write上传一个素材到平台请求体直接发送文件二进制
POST/materials/{materialId}/downloadmaterial:read生成素材临时下载地址地址有时效,不应长期保存
POST/devices/{mac}/materials/{materialId}/senddevice:advanced + material:read把平台素材发送到指定设备设备直接从对象存储下载,文件不经过 MQTT

发送任意基础 CMD

前面 CMD 表中的每一条命令,都通过同一个 commands 接口发送。requestId 可省略,由平台自动生成;需要幂等控制时建议主动提供。

POST /openapi/devices/4CEBD60BFD62/commands
Authorization: Bearer ykd_your_api_key
Content-Type: application/json

{
  "requestId": "cmd-0002",
  "command": "SELECTPLAYLIST 1;PLAY 1;"
}

平台先返回 202 accepted;再查询 GET /openapi/devices/4CEBD60BFD62/requests/cmd-0002,完成后的 feedbackOK:SELECTPLAYLIST;OK:PLAY;

设备查询示例

# 名下设备
GET /openapi/devices

# 单台设备与播放状态
GET /openapi/devices/4CEBD60BFD62/status

读取当前播放进度

GET /devices/{mac}GET /devices/{mac}/status 都返回独立的 playback 对象;后者还返回设备原始 status 与服务器时间。以下为 playback 节选:

{
  "playback": {
    "playSessionId": "90d89d0e-1470-44c8-9c75-fb8cf9fb7ab6",
    "sequence": 5,
    "mediaType": "video",
    "fileName": "company.mp4",
    "state": "playing",
    "positionMs": 42000,
    "durationMs": 120000,
    "ended": false,
    "reason": null,
    "reportedAt": 1788400000000,
    "playing": true,
    "online": true
  }
}

playback 来自 MQTT playback/status;设备在线、开关机、IP、版本和音量等信息仍来自 MQTT status,两者不再共用一个消息。

Advanced requests

播放列表与文件进阶功能

MQTT 发布到 ykd/devices/{deviceId}/api/request;OpenAPI 发布到 POST /devices/{mac}/requests。两种方式的请求体相同。

功能methodpath填写说明
查询播放列表GET/api/dir不需要 body 或 file
查询播放列表顺序GET/api/dir/order不需要 body 或 file
查询播放项/文件GET/api/dir/file?playlist_index=1使用设备返回的 playlist_index
从设备读取单文件GET/api/file/downloaditems?playlist_index=1&index=3file.upload_url 填 HTTPS 预签名上传地址
下载并添加单文件POST/api/item/addbody 指定列表;file 提供下载地址、文件名、大小、SHA-256
删除播放项POST/api/item/deletebody:playlist_index 和 index

查询播放列表

{
  "requestId": "list-0001",
  "method": "GET",
  "path": "/api/dir"
}

查询播放项

{
  "requestId": "file-list-0001",
  "method": "GET",
  "path": "/api/dir/file?playlist_index=1"
}

从地址下载并添加单文件

{
  "requestId": "upload-0001",
  "method": "POST",
  "path": "/api/item/add",
  "body": {
    "playlist_index": 1,
    "name_alias": "企业宣传片"
  },
  "file": {
    "download_url": "https://oss.example.com/company.mp4?signature=xxx",
    "file_name": "company.mp4",
    "size": 356728901,
    "sha256": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
  }
}

download_urlfile_namesizesha256 都必填。设备直接从 HTTPS 地址下载;MQTT 不传文件二进制。

从设备导出单文件

{
  "requestId": "download-0001",
  "method": "GET",
  "path": "/api/file/downloaditems?playlist_index=1&index=3",
  "file": {
    "upload_url": "https://oss.example.com/export/company.mp4?signature=xxx"
  }
}

删除播放项

{
  "requestId": "delete-0001",
  "method": "POST",
  "path": "/api/item/delete",
  "body": { "playlist_index": 1, "index": 3 }
}
Materials

平台素材上传与发送

适合客户先把素材上传到 YKD IoT 平台,再让指定播放器直接从对象存储下载。

1. 上传素材

curl -X POST "https://iot.yikedi.cn/openapi/materials?name=company.mp4" \
  -H "Authorization: Bearer ykd_your_api_key" \
  -H "Content-Type: video/mp4" \
  --data-binary "@company.mp4"

2. 发送到设备

POST /openapi/devices/4CEBD60BFD62/materials/{materialId}/send
Authorization: Bearer ykd_your_api_key
Content-Type: application/json

{
  "requestId": "upload-0002",
  "playlistIndex": 1,
  "nameAlias": "企业宣传片"
}

平台只通过 MQTT 下发下载地址、文件名、大小和 SHA-256;播放器直接访问素材地址,文件不会经过 MQTT Broker。

Results

查询反馈、进度与事件

按 requestId 查询

GET /openapi/devices/4CEBD60BFD62/requests/upload-0001
Authorization: Bearer ykd_your_api_key

文件任务状态依次为 accepted → downloading → verifying → importing → completed;失败时为 failed

{
  "requestId": "upload-0001",
  "mac": "4CEBD60BFD62",
  "kind": "advanced",
  "state": "downloading",
  "progress": {
    "state": "downloading",
    "progress": 35
  }
}

查询事件

GET /devices/{mac}/events?after=时间戳&limit=100。可用 type=replyapiReplyapiProgressstatusplaybackStatus 过滤。播放进度事件示例:GET /devices/{mac}/events?type=playbackStatus

MQTT 进阶反馈

{
  "requestId": "upload-0001",
  "mac": "4CEBD60BFD62",
  "state": "failed",
  "error": "CHECKSUM_MISMATCH",
  "message": "file sha256 mismatch"
}
Errors & security

HTTP 状态码、错误与安全规则

200查询成功 / 幂等请求已存在
201素材创建成功
202控制或任务已接收
400参数、CMD 或白名单接口错误
401API Key 无效、过期或停用
403权限不足
404设备、素材或请求不存在
409requestId 内容冲突
429超过调用频率限制
502平台无法下发到设备链路

常见文件错误码

INVALID_REQUESTREQUEST_ID_CONFLICTAPI_NOT_ALLOWEDPLAYLIST_NOT_FOUNDFILE_NOT_FOUNDFILE_EXISTSDOWNLOAD_FAILEDUPLOAD_FAILEDNO_SPACESIZE_MISMATCHCHECKSUM_MISMATCH

上线前检查

OpenAPI 仅使用 HTTPS;MQTT 互联网部署建议使用 8883 TLS。控制消息 Retain 必须为 false;文件地址使用短期 HTTPS 预签名 URL,消息中禁止携带永久对象存储密钥。