代码示例
本文档提供完整的代码示例,帮助您快速集成 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);
});集成步骤说明
- 初始化控制器:传入应用凭证创建控制器实例
- 获取Token:自动获取访问Token(有效期3小时)
- 查询设备列表(可选):获取可用的玩具车设备列表,查看设备状态
- 获取控制地址:通过玩具车SN获取控制面板地址
- 启动控制面板:在指定容器中嵌入控制面板iframe
- 开始控制:用户通过控制面板远程操作玩具车
使用建议
- 在发起控制前,建议先查询设备状态,选择空闲设备
- Token 会自动缓存和刷新,无需手动管理
- 处理设备被占用的情况,给用户友好的提示
- 根据需要调整控制时长(
duration参数)
错误处理
参考 错误处理指南 了解详细的错误处理方式。
