我们将展示如何使用蓝牙遥控器(带 USB 加密狗)的键来控制待机功能、增大和减小音量,以及控制协作室或桌面设备的摄像机。我们会创建一个侦听相关事件的宏,并使用协作室或桌面设备的 API 执行相关操作。

本文介绍了第三方 USB 输入设备的功能。

在以下示例中,您必须输入以普通字体书写的文本。斜体文本是从协作室或桌面设备收到的响应。

1

在 SSH 上登录协作室或桌面设备。必须有一个本地 Admin 用户。

2

配置设备以允许使用第三方 USB 遥控器。

xConfiguration Peripherals InputDevice Mode: On
** end

OK

               

 

您可以使用以下命令检查配置是打开还是关闭:

xConfiguration Peripherals InputDevice Mode
*c xConfiguration Peripherals InputDevice Mode: On
** end

OK

                  
3

注册接收反馈,以便在遥控器按钮按下和松开时能收到通知。

xFeedback Register /event/userinterface/inputdevice
** end

OK

               

 

您可以使用此命令检查设备注册的反馈:

xFeedback list
/event/userinterface/inputdevice
** end

OK

                  
4

按下并松开遥控器上的按钮以检查反馈注册是否有效。

此操作会生成两个事件:按下松开。如果您按住按钮,会看到按下事件;松开之后会生成松开事件。

按下并松开 Enter 键时,这些事件会发布:

 
                  
*e UserInterface InputDevice Key Action Key: KEY_ENTER
*e UserInterface InputDevice Key Action Code: 28
*e UserInterface InputDevice Key Action Type: Pressed
** end
*e UserInterface InputDevice Key Action Key: KEY_ENTER
*e UserInterface InputDevice Key Action Code: 28
*e UserInterface InputDevice Key Action Type: Released
** end

               
5

编写侦听相关输入设备事件的宏,并使用设备的 API 执行关联操作。

  • 启动待机、音量增大和音量减小按钮。当宏看到包含 KEY_VOLUMEUP、KEY_VOLUMEDOWN 或 KEY_SLEEP 的事件时,会执行相关命令。

  • 为箭头键创建摄像机控制功能。在按下按钮时,我们想要摄像机保持移动。松开按钮时,摄像机停止移动。当宏看到包含 KEY_LEFT、KEY_RIGHT、KEY_UP 或 KEY_DOWN 的事件时,会执行相关命令。

const xapi = require('xapi');

function com(command, args='') {
  xapi.command(command, args);
  log(command + ' ' + JSON.stringify(args));
}

function log(event) {
  console.log(event);
}

function notify(message) {
  xapi.command('UserInterface Message TextLine Display', {
    Text: message,
    duration: 3
  });
}

function cameraControl(motor, direction, cameraId='1') {
  com('Camera Ramp', { 'CameraId': cameraId,
                       [motor]: direction
  });
}

function init() {
  let standbyState;
  xapi.status.get('Standby').then((state) => {standbyState = state.State === 'Off' ? false : true; });
  xapi.status.on('Standby', state => {
      standbyState = state.State === 'Off' ? false : true; 
  });
  
  xapi.event.on('UserInterface InputDevice Key Action', press => {
    if (press.Type == "Pressed") {
      switch (press.Key) {
        case "KEY_LEFT":
          cameraControl('Pan', 'Left');
          break;
        case "KEY_RIGHT":
          cameraControl('Pan', 'Right');
          break;
        case "KEY_UP":
          cameraControl('Tilt', 'Up');
          break;
        case "KEY_DOWN":
          cameraControl('Tilt', 'Down');
          break;
        default:
          break;
        }
    } else if (press.Type == "Released") {
        switch (press.Key) {
          case "KEY_LEFT":
            cameraControl('Pan', 'Stop');
          break;
          case "KEY_RIGHT":
            cameraControl('Pan', 'Stop');
          break;
          case "KEY_UP":
            cameraControl('Tilt', 'Stop');
          break;
          case "KEY_DOWN":
            cameraControl('Tilt', 'Stop');
          break;
          case 'KEY_VOLUMEUP':
            com('Audio Volume Increase');
            break;
          case 'KEY_VOLUMEDOWN':
            com('Audio Volume Decrease');
            break;
          case 'KEY_SLEEP':
            com(standbyState ? 'Standby Deactivate' : 'Standby Activate');
            break;
          default:
            break;
          }
      } 
  });
}

init();