选择接入方式
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。
快速开始:查询音量
在 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;"
}
连接参数与设备标识
iot.yikedi.cn18838883MQTT 3.1.1 / QoS 1deviceId 与 Client ID
deviceId 固定使用设备大写 MAC:12 位十六进制字符,不带冒号、短横线或空格,例如 4CEBD60BFD62。播放器默认 Client ID 为 ykdplayer-4CEBD60BFD62。
平台“开发设置”中的服务端 Client ID 只给客户服务器连接 Broker 使用。每台播放器继续使用自己的 Client ID;同一个 Client ID 同时连接会互相顶下线。
Topic 总表
| 功能 | Topic | 方向 | QoS | Retain |
|---|---|---|---|---|
| 基础控制请求 | ykd/devices/{deviceId}/cmd | 服务器 → 设备 | 1 | false |
| 基础控制反馈 | ykd/devices/{deviceId}/reply | 设备 → 服务器 | 1 | false |
| 进阶功能请求 | ykd/devices/{deviceId}/api/request | 服务器 → 设备 | 1 | false |
| 进阶功能反馈 | ykd/devices/{deviceId}/api/reply | 设备 → 服务器 | 1 | false |
| 文件任务进度 | ykd/devices/{deviceId}/api/progress | 设备 → 服务器 | 1 | false |
| 设备状态 | ykd/devices/{deviceId}/status | 设备 → 服务器 | 1 | true |
| 当前内容播放状态与进度 | ykd/devices/{deviceId}/playback/status | 设备 → 服务器 | 1 | true |
管理多台设备时可订阅 ykd/devices/+/reply、ykd/devices/+/api/reply、ykd/devices/+/api/progress、ykd/devices/+/status 和 ykd/devices/+/playback/status。所有上行消息都带 mac,用它区分设备。
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 是实际执行结果。批量命令遇到失败时停止后续命令。
客户程序自行生成即可,例如“业务前缀 + 时间 + 随机数”或 UUID。相同 requestId 与相同内容会返回原结果;相同 requestId 携带不同内容会返回冲突。
当前内容播放状态与进度 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毫秒表示当前播放位置与总时长;所有媒体类型统一使用毫秒。
mediaTypestringvideo、image、web、pdf 或 ppt。
statestringplaying、paused、completed、stopped 或 error。
PDF / PPT 页进度
文档播放会额外携带 pageNumber、totalPages、pagePositionMs 和 pageDurationMs。页码从 1 开始。
状态与上报行为
| state | 含义 | 上报行为 |
|---|---|---|
playing | 正在播放 | 约每 1 秒发布 |
paused | 已暂停 | 暂停时发布一次,暂停期间不周期发布 |
completed | 正常播放完成 | 发布一次终态,ended=true |
stopped | 主动停止或切换内容 | 发布一次终态,ended=false |
error | 播放失败 | 发布一次终态,结合 reason 排查 |
该 Topic 使用 QoS 1、Retain=true。Retain 只表示 Broker 保存最后一条播放状态;服务器仍应结合 state、reportedAt 和设备在线状态判断内容是否仍在播放。
播放与选择
播放列表序号和播放项序号均从 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; | 切换到当前列表下一项 |
视频进度
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; | 返回快退后的实际位置 |
音量与静音
音量范围 0–100,步长 5。设置非 5 倍数时,余数 1/2 取低档,余数 3/4 取高档;反馈中的 current 是设备实际音量。
| 功能 | 标准 CMD | 参数 | 成功反馈 | 说明 |
|---|---|---|---|---|
| 设置音量 | SETVOLUME <value>; | value:0–100 | OK: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; | 在静音与非静音之间切换 |
PPT / PDF 分页
PPT 和 PDF 使用同一组分页命令,不另外增加 PDF 专用命令。页码从 1 开始。
| 功能 | 标准 CMD | 参数 | 成功反馈 | 说明 |
|---|---|---|---|---|
| 上一页 | PPTPREVIOUS; | 无 | OK:PPTPREVIOUS; | 当前内容为 PPT 或 PDF 时有效 |
| 下一页 | PPTNEXT; | 无 | OK:PPTNEXT; | 当前内容为 PPT 或 PDF 时有效 |
| 跳到指定页 | PPTPAGE <page>; | page:目标页码,从 1 开始 | OK:PPTPAGE; | 跳转到当前文档指定页 |
设备控制
关机/开机为播放器的假关机与唤醒机制;重启会重启 Android 设备,请谨慎使用。
| 功能 | 标准 CMD | 参数 | 成功反馈 | 说明 |
|---|---|---|---|---|
| 重启设备 | RESTART; | 无 | OK:RESTART; | 收到反馈后设备开始重启,连接会短暂中断 |
| 假关机 | SHUTDOWN; | 无 | OK:SHUTDOWN; | 黑屏并进入待机控制状态 |
| 假开机 | POWERON; | 无 | OK:POWERON; | 从假关机状态唤醒 |
接口地址与鉴权
https://iot.yikedi.cn/openapi平台网页、OpenAPI 和 MQTT Broker 的对外域名统一使用 iot.yikedi.cn。
- 1登录平台
登录 YKD IoT 设备管理平台。
- 2生成 API Key
进入“开发设置 → HTTP API”,选择权限和有效期。登录后可按需查看完整 Key,页面会在 60 秒后自动隐藏。
- 3服务端调用
每次请求增加
Authorization: Bearer ykd_xxx。
不要把 Key 放到浏览器前端、网页源码或播放器中。平台根据 Key 自动确定用户,客户端不能传 userId,也不能访问其他用户的设备和素材。
权限 Scope
| Scope | 用途 |
|---|---|
device:read | 查询设备、状态、反馈和进度 |
device:control | 发送基础 CMD |
device:advanced | 发送播放列表与文件进阶请求 |
material:read | 查询素材、生成下载地址、发送素材 |
material:write | 上传平台素材 |
OpenAPI 接口总表
下表路径均相对于接口根地址。路径中的 {mac} 使用设备的 12 位大写 MAC。
| 方法 | 路径 | 权限 | 用途 | 用法 |
|---|---|---|---|---|
| GET | /devices | device:read | 查询当前 API Key 用户名下的全部设备 | 无 |
| GET | /devices/{mac} | device:read | 查询一台设备及当前播放摘要 | 路径中的 mac 为 12 位大写 MAC |
| GET | /devices/{mac}/status | device:read | 查询在线状态、当前内容、进度、时长和音量 | 适合状态面板和定时刷新 |
| POST | /devices/{mac}/commands | device:control | 发送一个或一组基础 CMD | JSON:command 必填,requestId 可选 |
| POST | /devices/{mac}/requests | device:advanced | 发送播放列表或文件进阶请求 | JSON:method、path 必填,body/file 按功能填写 |
| GET | /devices/{mac}/requests/{requestId} | device:read | 按 requestId 查询反馈和文件任务进度 | 轮询直到 completed 或 failed |
| GET | /devices/{mac}/events | device:read | 查询设备原始事件 | 可使用 after、limit、type 参数 |
| GET | /materials | material:read | 查询当前用户名下的素材列表 | 不返回其他用户素材 |
| GET | /materials/{materialId} | material:read | 查询素材详情 | 包含文件名、大小、类型和 SHA-256 等信息 |
| POST | /materials?name={fileName} | material:write | 上传一个素材到平台 | 请求体直接发送文件二进制 |
| POST | /materials/{materialId}/download | material:read | 生成素材临时下载地址 | 地址有时效,不应长期保存 |
| POST | /devices/{mac}/materials/{materialId}/send | device: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,完成后的 feedback 为 OK: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,两者不再共用一个消息。
播放列表与文件进阶功能
MQTT 发布到 ykd/devices/{deviceId}/api/request;OpenAPI 发布到 POST /devices/{mac}/requests。两种方式的请求体相同。
| 功能 | method | path | 填写说明 |
|---|---|---|---|
| 查询播放列表 | 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=3 | file.upload_url 填 HTTPS 预签名上传地址 |
| 下载并添加单文件 | POST | /api/item/add | body 指定列表;file 提供下载地址、文件名、大小、SHA-256 |
| 删除播放项 | POST | /api/item/delete | body: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_url、file_name、size、sha256 都必填。设备直接从 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 }
}
平台素材上传与发送
适合客户先把素材上传到 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。
查询反馈、进度与事件
按 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=reply、apiReply、apiProgress、status 或 playbackStatus 过滤。播放进度事件示例:GET /devices/{mac}/events?type=playbackStatus。
MQTT 进阶反馈
{
"requestId": "upload-0001",
"mac": "4CEBD60BFD62",
"state": "failed",
"error": "CHECKSUM_MISMATCH",
"message": "file sha256 mismatch"
}
HTTP 状态码、错误与安全规则
常见文件错误码
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,消息中禁止携带永久对象存储密钥。
请尝试搜索命令名、功能名称、Topic 或接口路径。
