服务端实例
2040字约7分钟
2024-11-7
在服务启动服务后,还可以调用实例方法进行一些操作,比如让设备重启、重新设置wifi信息、设置存储数据、让设备说一句话等等,都可以在服务端用 nodejs
代码实现。
.getClients
获取连接了的所有设备, 或者指定设备ID的设备
案例代码
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
// 获取当前服务上连接的全部设备
const clients = espAiIns.getClients(); // 每一个设备都有自己的信息数据
// 获取指定的设备信息,传入设备ID(每个设备都有一个唯一设备ID, 在硬件端使用 getLocalData("device_id ") 读取)
const client = espAiIns.getClients("xxx-xxx-xxx-xxx");
.updateClientConfig
更新客户端配置也就是 gen_client_config
配置返回出来的数据。可以实现不停服务更新用户的 TTS/LLM/IAT 等配置。
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
espAiIns.updateClientConfig("xxx-xxx-xxx-xxx", {
tts_config: { ... },
...
});
.setWifiConfig
服务端设置客户端端wifi信息的方法。设置客户端 wifi 信息和存贮的业务数据,也就是配网页面设置的值,都可以用这个方法来改。等同于硬件端的 .setWifiConfig
方法。
如果只是设置数据,建议使用 .setLocalData
方法。
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
espAiIns.setWifiConfig("xxx-xxx-xxx-xxx", {
wifi_name:"",
wifi_pwd:"",
// 除了wifi信息外还可以充当配网页面的功能,来设置本地存储信息
api_key:"",
ext1:"",
ext2:"",
ext3:"",
ext4:"",
ext5:"",
ext6:"",
ext7:"",
})
.tts
让客户端输出一段话
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
await espAiIns.tts("xxx-xxx-xxx-xxx", "你好呀,我是你的智能助手!")
.stop
终止会话,包括:语音识别、TTS、LLM
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
await espAiIns.stop("xxx-xxx-xxx-xxx", "用户打断");
.newSession
终止会话。一般配合 .stop
使用,用于重启一个会话。返回 session_id
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
await espAiIns.newSession("xxx-xxx-xxx-xxx");
.matchIntention
匹配某个命令,如果匹配上会执行。用于服务端模拟用户发出指令。
第三个参数可以自定义命令指向完毕后向用户说些什么,而不是用指令配置中的 message
。
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
await espAiIns.matchIntention("xxx-xxx-xxx-xxx", "帮我开灯", "好的");
.restart
重启设备
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
await espAiIns.restart("xxx-xxx-xxx-xxx");
.setLocalData
手动设置设备本地存储的数据,值为空字符串时为清空。和 setWifiConfig
的区别是:本函数可将值设置为空字符串, setWifiConfig
为批量更新,空字符串会直接省略
可设置项:api_key
ext1
ext2
ext3
ext4
ext5
ext6
ext7
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
await espAiIns.setLocalData("xxx-xxx-xxx-xxx", "ext1", "业务数据");
.setLLMHistorys
设置用户的上下文,当对话存在多角色时在业务代码中可自行调用本方法进行切换角色
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
// 让 llm 变成翻译官
espAiIns.setLLMHistorys("xxx-xxx-xxx-xxx", [
{ role: 'system', content: '你是一个翻译官,只翻译用户说的话,不说任何其他多余的话。' },
]);
.getLLMHistorys
获取用户的上下文,在设置上下文时一般需要将当前上下文先存起来,否则切换回来时会丢失
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
const curHistory = espAiIns.getLLMHistorys("xxx-xxx-xxx-xxx");
// 自行存储 curHistory
.isPlaying
获取设备是否正在播放音频, 注意:不是TTS, 而是 __play_music__
指令触发的音频
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
const isPlaying = espAiIns.isPlaying("xxx-xxx-xxx-xxx");
console.log(isPlaying)
.pinMode
设置引脚引脚模式。
功能和 Arduino
的 pinMode
一样
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
// 设置 21 引脚为输出模式
espAiIns.pinMode(
// 设备ID
"xxx-xxx-xxx-xxx",
// 引脚号
21,
// 模式:"OUTPUT" | "INPUT" | "INPUT_PULLUP" | "INPUT_PULLDOWN"
"OUTPUT"
);
// 设置模式后就可以进行操作了
espAiIns.digitalWrite(
// 设备ID
"xxx-xxx-xxx-xxx",
// 引脚号
21,
// 设置输出电平: HIGH | LOW
"HIGH"
);
.digitalWrite
设置引脚电平
功能和 Arduino
的 digitalWrite
一样,使用前必须使用 pinMode
将引脚设置为 OUTPUT
模式。
将引脚电平设置为高电平或者低电平, 输出电压以开发板为准,如 esp32s3
开发板输出 3.3v
电压
使用场景:控制继电器闭合、点亮led
等等
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
// 设置 21 引脚为输出模式
espAiIns.pinMode(
// 设备ID
"xxx-xxx-xxx-xxx",
// 引脚号
21,
// 模式:"OUTPUT" | "INPUT" | "INPUT_PULLUP" | "INPUT_PULLDOWN"
"OUTPUT"
);
// 设置模式后就可以进行操作了
espAiIns.digitalWrite(
// 设备ID
"xxx-xxx-xxx-xxx",
// 引脚号
21,
// 设置输出电平: HIGH | LOW
"HIGH"
);
.digitalRead
读取引脚电平
功能和 Arduino
的 digitalRead
一样,使用前必须使用 pinMode
将引脚设置为 INPUT
模式。 注意:本方法存在 100ms 的延时
将引脚电平设置为高电平或者低电平, 输出电压以开发板为准,如 esp32s3
开发板输出 3.3v
电压 使用场景:读取按钮是否按下等等
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
// 设置 21 引脚为输出模式
espAiIns.pinMode(
// 设备ID
"xxx-xxx-xxx-xxx",
// 引脚号
21,
// 模式:"OUTPUT" | "INPUT" | "INPUT_PULLUP" | "INPUT_PULLDOWN"
"INPUT"
);
// 设置模式后就可以进行操作了
// 读取电位器值
instance.digitalRead(
// 设备ID
"xxx-xxx-xxx-xxx",
// 引脚号
21,
// 监听函数
function(val){
console.log('引脚状态变化:', val);
}
)
.analogWrite
引脚模拟输出
功能和 Arduino
的 analogWrite
一样,使用前必须使用 pinMode
将引脚设置为 OUTPUT
模式。
使用场景:使用 PWM 控制电机转速、舵机角度 等等。太频繁调用本方法会影响对话的流程性。
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
// 设置 21 引脚为输出模式
espAiIns.pinMode(
// 设备ID
"xxx-xxx-xxx-xxx",
// 引脚号
21,
// 模式:"OUTPUT" | "INPUT" | "INPUT_PULLUP" | "INPUT_PULLDOWN"
"OUTPUT"
);
// 设置模式后就可以进行操作了
instance.analogWrite(
// 设备ID
"xxx-xxx-xxx-xxx",
// 引脚号
21,
// 输出的 PWM 值
250
)
.analogRead
读取引脚模拟输入
功能和 Arduino
的 analogRead
一样。注意:本方法存在 100ms 的延时
将引脚电平设置为高电平或者低电平, 输出电压以开发板为准,如 esp32s3
开发板输出 3.3v
电压
使用场景: 读取电位器的值等等
const espAiIns = espAi({ ... }); // 函数配置形参中的 instance 也是这个对象,所以怎么获取这个对象都行
// 设置 21 引脚为输出模式
espAiIns.pinMode(
// 设备ID
"xxx-xxx-xxx-xxx",
// 引脚号
21,
// 模式:"OUTPUT" | "INPUT" | "INPUT_PULLUP" | "INPUT_PULLDOWN"
"INPUT"
);
// 设置模式后就可以进行操作了
// 读取电位器值
instance.analogRead(
// 设备ID
"xxx-xxx-xxx-xxx",
// 引脚号
21,
// 监听回调
function(val){
console.log('引脚状态变化:', val);
}
)