241 lines
9.0 KiB
C#
Raw Normal View History

2025-10-11 18:25:59 +08:00
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;
}
}
}