# 边缘盒子

topic 中的 `location` 指景区编码， `point` 指景区内具体点位

## 1. 接收启动

Topic: `server/${location}/${point}/play`

Payload:

```json lines
{
  // 设备超时时长(s)
  "timeout": 30,
  // 是否需要整体电源控制
  "power": true,
  // 游戏中背景音乐(支持 file:// 本地文件地址、 http(s):// 远程文件地址)
  "bgm": "",
  // 整体设备音量(0-1)
  "volume": 0.5,
  // 屏幕默认打印(设备待机时展示文本)
  "default-print": "",
  // 文本转语音整体控制
  "tts": {
    // 开始播报语音
    "start": "",
    // 超时自动停止时播报语音
    "timeout": "",
    // 结束播报语音
    "end": "",
    // 终止播报语音
    "stop": "",
    // 固定节点播报语音
    "timer": [
      {
        // 时间节点(s)
        "time": 10,
        // 语音文字
        "value": ""
      },
      ...
    ]
  },
  // 屏幕打印控制
  "print": [
    {
      // 时间节点(s)
      "time": 10,
      // 展示文字
      "text": "",
      // 持续时长(s)
      "duration": 10
    },
    ...
  ],
  // 根据具体游戏特定
  "game": {}
}
```

[游戏节点报文](./game.md)

#### 例: 入口欢迎播报

```json lines
{
  "volume": 1,
  "tts": {
    "start": "欢迎前来挑战！"
  }
}
```

## 2. 事件反馈

### 状态变更

Topic: `device/${location}/${point}/status`

Payload:

```text
0
```

> 0 待机; 1 使用中; -1 状态异常

## 3. 接收指令

### 终止

Topic: `server/${location}/${point}/command`

Payload:

```text
stop
```

### 终止后台

Topic: `server/${location}/${point}/command`

Payload:

```text
stop-bg
```

### 查询状态

Topic: `server/${location}/${point}/command`

Payload:

```text
status
```

> 设备接收到该指令会立即向 `device/${location}/${point}/status` 发送一次当前状态

## 4. 待机执行

Topic: `server/${location}/${point}/wait`

Payload:

```json lines
{
  // 执行的时间区间(需要系统配置正确时区)
  "cron": "17:20-21:35 1-5 * *",
  // 执行项
  "items": [
    {
      // 执行的时间区间
      "cron": "17:20-21:35 1-5 * *",
      // 间隔时间(s), 类型>2时, 该项无效, default 0
      "interval": 0,
      // 持续时长(s), 待机任务执行时持续的时长。为 0 表示 音频、视频、TTS 按播放时长，继电器、网页、投影仪、激光秀持续整个时间段。 default 0
      "duration": 0,
      // 事件类型(0: 音频; 1: 视频; 2: TTS; 3: 继电器; 4: 网页; 5: 投影仪; 6: 激光秀;) default 0
      "type": 2,
      // Game 指令执行时是否暂停。default false
      "pause": true,
      // 待机任务执行时，是否锁定设备。default false
      "lock": false,
      // 事件数据(TTS为文字, 继电器为端口号，激光秀为节目名，投影仪忽略该参数, 其他都为地址链接。支持 file:// 本地文件地址、 http(s):// 远程文件地址)
      "data": "",
    },
    ...
  ]
}
```

> 同一个类型的待机任务只能有一个，当有新的任务到达时会覆盖之前的任务

### 配置时区
```bash
sudo timedatectl set-timezone Asia/Shanghai
```

### Cron Format

The format consists of four fields separated by whitespace:
```
time dow dom month
```

Where:
- `time`:  Time range in 24-hour format (HH:MM[:SS]-HH:MM[:SS]) or * for all day. Seconds are optional.
- `dow`:   Day of week (0-6, where 0=Sunday)
- `dom`:   Day of month (1-31)
- `month`: Month (1-12)

Multiple rules can be combined using semicolons (;).

Each field (except time) supports:
- Single values: "5"
- Lists:        "1,3,5"
- Ranges:       "1-5"
- Asterisk:     "*" for any/all values
