Skip to content

代码示例

本文档提供完整的代码示例,帮助您快速集成 OMI 玩具车控制功能。

JavaScript 完整示例

javascript
/**
 * OMI玩具车控制平台完整集成示例
 * 适用于亲子互动、娱乐竞技等场景
 */

class OMIToyCarController {
  constructor(appId, appSecret, baseUrl = 'http://182.254.182.254:9090') {
    this.appId = appId;
    this.appSecret = appSecret;
    this.baseUrl = baseUrl;
    this.accessToken = null;
  }

  /**
   * 获取访问Token
   */
  async getAccessToken() {
    try {
      const response = await fetch(`${this.baseUrl}/app/token`, {
        method: 'GET',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          appId: this.appId,
          appSecret: this.appSecret
        })
      });

      const data = await response.json();
      if (data.status === 200) {
        this.accessToken = data.data.token;
        return this.accessToken;
      } else {
        throw new Error(data.desc || '获取Token失败');
      }
    } catch (error) {
      console.error('获取Token失败:', error);
      throw error;
    }
  }

  /**
   * 查询设备列表
   */
  async getDeviceList(page = 1, pageSize = 10, filters = {}) {
    if (!this.accessToken) {
      await this.getAccessToken();
    }

    try {
      const params = new URLSearchParams({
        page: page.toString(),
        pageSize: pageSize.toString(),
        ...filters
      });

      const response = await fetch(
        `${this.baseUrl}/device/openList?${params}`,
        {
          method: 'GET',
          headers: {
            'token': this.accessToken
          }
        }
      );

      const data = await response.json();
      if (data.status === 200) {
        return data.data;
      } else {
        throw new Error(data.desc || '获取设备列表失败');
      }
    } catch (error) {
      console.error('获取设备列表失败:', error);
      throw error;
    }
  }

  /**
   * 获取玩具车控制地址
   */
  async getToyCarControlUrl(toyCarSn, duration = 1800) {
    if (!this.accessToken) {
      await this.getAccessToken();
    }

    try {
      const response = await fetch(
        `${this.baseUrl}/device/ctrlUrl?deviceSn=${toyCarSn}&duration=${duration}`,
        {
          method: 'GET',
          headers: {
            'token': this.accessToken
          }
        }
      );

      const data = await response.json();
      if (data.status === 200) {
        return data.data.url;
      } else {
        // 特殊处理:设备正在控制中
        if (data.desc && data.desc.includes('设备正在控制中')) {
          throw new Error('设备正在被其他人控制,请稍后再试');
        }
        throw new Error(data.desc || '获取控制地址失败');
      }
    } catch (error) {
      console.error('获取控制地址失败:', error);
      throw error;
    }
  }

  /**
   * 启动玩具车控制面板
   */
  async startToyCarControl(toyCarSn, containerId, duration = 1800) {
    try {
      const controlUrl = await this.getToyCarControlUrl(toyCarSn, duration);
      
      // 创建控制面板iframe
      const container = document.getElementById(containerId);
      if (!container) {
        throw new Error(`容器元素 ${containerId} 不存在`);
      }

      container.innerHTML = `
        <iframe 
          src="${controlUrl}" 
          width="100%" 
          height="600px" 
          frameborder="0"
          allow="camera; microphone; fullscreen"
          title="玩具车控制面板">
        </iframe>
      `;

      console.log('玩具车控制面板已启动');
      return controlUrl;
    } catch (error) {
      if (error.message.includes('设备正在被其他人控制')) {
        console.error('设备正在被占用,请稍后重试');
      }
      console.error('启动玩具车控制失败:', error);
      throw error;
    }
  }

  /**
   * 查询空闲设备
   */
  async findAvailableDevices() {
    try {
      const result = await this.getDeviceList(1, 100, { status: '在线' });
      return result.items.filter(device => device.useStatus === '空闲');
    } catch (error) {
      console.error('查询空闲设备失败:', error);
      throw error;
    }
  }
}

// 使用示例
const toyCarController = new OMIToyCarController(
  'RC_APP25090001',
  'rBIzZ8UVJsxLqwRtAOhWpiHFjjqaTSWHe7GOSZDkp4I'
);

// 场景1:启动指定玩具车控制
toyCarController.startToyCarControl('TOY_CAR_001', 'toy-car-panel', 1800)
  .then(url => {
    console.log('控制面板地址:', url);
  })
  .catch(error => {
    console.error('启动失败:', error);
  });

// 场景2:查找空闲设备并控制
toyCarController.findAvailableDevices()
  .then(devices => {
    if (devices.length > 0) {
      const device = devices[0];
      return toyCarController.startToyCarControl(device.sn, 'toy-car-panel');
    } else {
      console.log('没有可用的空闲设备');
    }
  })
  .then(url => {
    if (url) {
      console.log('控制面板已启动');
    }
  })
  .catch(error => {
    console.error('操作失败:', error);
  });

// 场景3:查询所有设备信息
toyCarController.getDeviceList()
  .then(data => {
    console.log('设备列表:', data.items);
    console.log('总数量:', data.pager.total);
  })
  .catch(error => {
    console.error('查询失败:', error);
  });

集成步骤说明

  1. 初始化控制器:传入应用凭证创建控制器实例
  2. 获取Token:自动获取访问Token(有效期3小时)
  3. 查询设备列表(可选):获取可用的玩具车设备列表,查看设备状态
  4. 获取控制地址:通过玩具车SN获取控制面板地址
  5. 启动控制面板:在指定容器中嵌入控制面板iframe
  6. 开始控制:用户通过控制面板远程操作玩具车

使用建议

  • 在发起控制前,建议先查询设备状态,选择空闲设备
  • Token 会自动缓存和刷新,无需手动管理
  • 处理设备被占用的情况,给用户友好的提示
  • 根据需要调整控制时长(duration 参数)

错误处理

参考 错误处理指南 了解详细的错误处理方式。

OMI