2025-10-11 18:25:59 +08:00

241 lines
9.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.Extensions.Hosting;
using Newtonsoft.Json.Linq;
using XiaoZhiSharp;
using XiaoZhiSharp.Kernels.Gis;
using XiaoZhiSharp.Models;
using XiaoZhiSharp.Utils;
using XiaoZhiSharp_ConsoleApp.Core;
using XiaoZhiSharp_ConsoleApp.Services;
class Program
{
private static XiaoZhiAgent _agent;
private static McpService _mcpService;
private static string _audioMode = "";
static async Task Main(string[] args)
{
Console.WriteLine("按任意键退出...");
SharpGISNmeaParser.PlaybackLogAsFastAsPossible();
Console.ReadKey(); // 等待用户按键
Console.WriteLine("程序已退出。");
return;
//await SystemMonitorTest.RunTest(args);
var builder = Host.CreateApplicationBuilder(args);
Console.ForegroundColor = ConsoleColor.Green;
Console.Title = "小智XiaoZhiSharp客户端";
string logoAndCopyright = @"
========================================================================
欢迎使用“小智XiaoZhiSharp客户端”
当前功能:
1. 语音消息 输入回车:开始录音;再次输入回车:结束录音
注意Windows系统下CapsLock键也可以控制录音状态按下CapsLock开始录音再次按下结束录音
录音结束后会自动发送语音消息到服务器,服务器会返回语音识别结果
2. 文字消息 可以随意输入文字对话
3. 全量往返协议输出,方便调试
要是你在使用中有啥想法或者遇到问题,别犹豫,找我们哟:
微信:狼行拂晓 电子邮箱123456789@qq.com
有任何动态请大家关注 https://www.baidu.com
========================================================================";
Console.WriteLine(logoAndCopyright);
Console.ForegroundColor = ConsoleColor.White;
XiaoZhiSharp.Global.IsDebug = true;
XiaoZhiSharp.Global.IsMcp = true;
_mcpService = new McpService();
string appsettingJson = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "Configs", "AppSettingConfig.json"));
// 快速从json文件中获取配置信息
var appsetting = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(appsettingJson);
_agent = new XiaoZhiAgent();
//XiaoZhiSharp.Global.SampleRate_WaveOut = 24000;
//_agent.WsUrl = "wss://coze.nbee.net/xiaozhi/v1/";
//_agent.WsUrl = "ws://192.168.110.113:4530/xiaozhi/v1/";
//_agent.OtaUrl = "http://192.168.110.214:48080/admin-api/pfa/ota/xiaozhi/receive";
//_agent.OtaUrl = "https://192.168.110.113:4530/xiaozhi/ota/";
//_agent.Token = "test-token";
_agent.OtaUrl = appsetting?["Server"]?["OtaUrl"]?.ToString();
LogConsole.InfoLine($"初始OTA URL: {_agent.OtaUrl}");
_agent.WsUrl = appsetting?["Server"]?["WsUrl"]?.ToString();
LogConsole.InfoLine($"初始WebSocket URL: {_agent.WsUrl}");
//_agent.AudioService = new
//_agent.OnAudioPcmEvent =
_agent.OnMessageEvent += Agent_OnMessageEvent;
_agent.OnOtaEvent += Agent_OnOtaEvent;
LogConsole.InfoLine($"设备ID: {_agent.DeviceId}");
LogConsole.InfoLine($"客户端ID: {_agent.ClientId}");
LogConsole.InfoLine($"User-Agent: {_agent.UserAgent}");
/*登录测试......*/
var loginJson = appsetting?["Server"]?["Login"]?.ToString();
if (string.IsNullOrWhiteSpace(loginJson))
{
LogConsole.InfoLine($"没有配置登录服务器的地址...");
return;
}
var loginMdl = Newtonsoft.Json.JsonConvert.DeserializeObject<LoginModel>(loginJson);
if (loginMdl == null)
{
LogConsole.InfoLine($"登录服务器的地址配置错误...");
return;
}
LogConsole.InfoLine($"初始登录服务器Url: {loginMdl.Url}");
while (true)
{
var loginRlt = await _agent.Login(loginMdl);
if (loginRlt == null || loginRlt.Code != 0)
{
Thread.Sleep(1000);
LogConsole.InfoLine($"登录失败,重新登录...");
continue;
}
break;
}
LogConsole.InfoLine($"登录服务器成功,开始启动 小智XiaoZhiSharp客户端...");
await _agent.Start();
TickTimer.TT.RunTimer(_agent);
_ = Task.Run(async () =>
{
while (true)
{
if (_agent.ConnectState != System.Net.WebSockets.WebSocketState.Open)
{
await _agent.Restart();
LogConsole.InfoLine("服务器重连...");
await Task.Delay(3000);
}
if (OperatingSystem.IsWindows())
{
bool isCapsLockOn = Console.CapsLock;//Console.CapsLock只支持Windows平台
//Console.WriteLine($"当前 Caps Lock 状态: {(isCapsLockOn ? "开启" : "关闭")}");
if (isCapsLockOn)
{
if (_agent.IsRecording == false)
{
_audioMode = "manual";
LogConsole.InfoLine("开始录音... 再次按Caps键结束录音");
await _agent.StartRecording("manual");
continue;
}
}
if (!isCapsLockOn)
{
if (_agent.IsRecording == true)
{
if (_audioMode == "manual")
{
await _agent.StopRecording();
LogConsole.InfoLine("结束录音");
continue;
}
}
}
}
await Task.Delay(100); // 避免过于频繁的检查
}
});
while (true)
{
string? input = Console.ReadLine();
if (!string.IsNullOrEmpty(input))
{
if (input.ToLower() == "restart")
{
await _agent.Restart();
}
else
{
await _agent.ChatMessage(input);
}
}
else
{
if (!_agent.IsRecording)
{
//Console.Title = "开始录音...";
//LogConsole.InfoLine("开始录音... 再次回车结束录音");
_audioMode = "auto";
LogConsole.InfoLine("开始录音... Auto");
await _agent.StartRecording("auto");
}
else
{
//await _agent.StopRecording();//auto模式下当检测到静音会自动结束录音
//Console.Title = "小智XiaoZhiSharp客户端";
LogConsole.InfoLine("结束录音");
}
}
}
}
private static async Task Agent_OnOtaEvent(OtaResponse? otaResponse)
{
if (otaResponse != null)
{
LogConsole.InfoLine("=== OTA检查结果 ===");
if (otaResponse.Activation != null)
{
LogConsole.InfoLine($"设备激活码: {otaResponse.Activation.Code}");
LogConsole.InfoLine($"激活消息: {otaResponse.Activation.Message}");
}
if (otaResponse.Firmware != null && !string.IsNullOrEmpty(otaResponse.Firmware.Url))
{
LogConsole.InfoLine($"发现固件更新: {otaResponse.Firmware.Version}");
LogConsole.InfoLine($"下载地址: {otaResponse.Firmware.Url}");
}
if (otaResponse.WebSocket != null)
{
LogConsole.InfoLine($"WebSocket服务器: {otaResponse.WebSocket.Url}");
}
if (otaResponse.Mqtt != null)
{
LogConsole.InfoLine($"MQTT服务器: {otaResponse.Mqtt.Endpoint}");
}
LogConsole.InfoLine("=== OTA检查完成 ===");
}
else
{
LogConsole.InfoLine("OTA检查失败将使用默认配置");
}
}
private static async Task Agent_OnMessageEvent(string type, string message)
{
switch (type.ToLower())
{
case "question":
LogConsole.WriteLine(MessageType.Send, $"[{type}] {message}");
break;
case "answer":
LogConsole.WriteLine(MessageType.Recv, $"[{type}] {message}");
break;
case "mcp":
string resultMessage = await _mcpService.McpMessageHandle(message);
if (!string.IsNullOrEmpty(resultMessage))
await _agent.McpMessage(resultMessage);
break;
default:
LogConsole.InfoLine($"[{type}] {message}");
break;
}
}
}