133 lines
4.7 KiB
C#
133 lines
4.7 KiB
C#
using System.Net.Http;
|
||
using System.Text;
|
||
using System.Text.Json; // 適用於 .NET Core 3.0+ / .NET 5/6/7/8
|
||
using System.Net;
|
||
using System.Net.Sockets;
|
||
|
||
namespace HeartbeatSender
|
||
{
|
||
|
||
public class HeartbeatData
|
||
{
|
||
public string branch_name { get; set; }
|
||
public string room_name { get; set; }
|
||
public string room_ip { get; set; }
|
||
public string email { get; set; }
|
||
public string password { get; set; }
|
||
}
|
||
public class heartbeatSender
|
||
{
|
||
private readonly HttpClient httpClient = new HttpClient();
|
||
private string token;
|
||
private string heartbeatUrl;
|
||
|
||
public heartbeatSender(string heartbeatUrl)
|
||
{
|
||
this.heartbeatUrl = heartbeatUrl;
|
||
}
|
||
public static string GetLocalIPv4()
|
||
{
|
||
foreach (var ip in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
|
||
{
|
||
if (ip.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(ip))
|
||
{
|
||
return ip.ToString();
|
||
}
|
||
}
|
||
return "127.0.0.1"; // fallback
|
||
}
|
||
public async Task<bool> LoginAndGetTokenAsync()
|
||
{
|
||
var loginUrl = "http://zqd.superstar.dnsnet.cc/api/room/receiveRegister";
|
||
string hostName = System.Net.Dns.GetHostName();
|
||
|
||
var loginPayload = new
|
||
{
|
||
branch_name = "測試",
|
||
room_name = "PC" + hostName.Substring(Math.Max(0, hostName.Length - 3)),
|
||
room_ip = GetLocalIPv4(),
|
||
email = "MachineKTV@gmail.com",
|
||
password = "aa147258-"
|
||
};
|
||
|
||
var json = JsonSerializer.Serialize(loginPayload);
|
||
var content = new StringContent(json, Encoding.UTF8, "application/json");
|
||
|
||
try
|
||
{
|
||
var response = await httpClient.PostAsync(loginUrl, content);
|
||
response.EnsureSuccessStatusCode();
|
||
|
||
var responseJson = await response.Content.ReadAsStringAsync();
|
||
// Console.WriteLine("API 回傳內容:" + responseJson);
|
||
|
||
using var doc = JsonDocument.Parse(responseJson);
|
||
if (doc.RootElement.TryGetProperty("data", out JsonElement dataElement) &&
|
||
dataElement.ValueKind == JsonValueKind.Object)
|
||
{
|
||
if (dataElement.TryGetProperty("token", out JsonElement tokenElement))
|
||
{
|
||
token = tokenElement.GetString();
|
||
}
|
||
}
|
||
// Console.WriteLine("登入成功,取得 token:" + token);
|
||
return true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Console.WriteLine($"登入失敗:{ex.Message}");
|
||
return false;
|
||
}
|
||
}
|
||
|
||
public async Task SendHeartbeatAsync()
|
||
{
|
||
if (string.IsNullOrEmpty(token))
|
||
{
|
||
Console.WriteLine("請先登入取得 token");
|
||
return;
|
||
}
|
||
//Console.WriteLine(GetLocalIPv4());
|
||
string hostName = System.Net.Dns.GetHostName();
|
||
|
||
var heartbeatData = new
|
||
{
|
||
branch_name = "測試",
|
||
hostname = "PC" + hostName.Substring(Math.Max(0, hostName.Length - 3)),
|
||
ip = GetLocalIPv4(),
|
||
};
|
||
|
||
var json = JsonSerializer.Serialize(heartbeatData);
|
||
var content = new StringContent(json, Encoding.UTF8, "application/json");
|
||
heartbeatUrl = "http://zqd.superstar.dnsnet.cc/api/room/heartbeat";
|
||
var request = new HttpRequestMessage(HttpMethod.Post, heartbeatUrl);
|
||
request.Content = content;
|
||
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
|
||
// Console.WriteLine("送出的 JSON:");
|
||
// Console.WriteLine(json);
|
||
var response = await httpClient.SendAsync(request);
|
||
try
|
||
{
|
||
|
||
// Console.WriteLine($"心跳送出狀態:{response.StatusCode}");
|
||
|
||
response.EnsureSuccessStatusCode();
|
||
|
||
var responseJson = await response.Content.ReadAsStringAsync();
|
||
|
||
using var doc = JsonDocument.Parse(responseJson);
|
||
// Console.WriteLine("API 回傳內容:" + responseJson);
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
var errorContent = await response.Content.ReadAsStringAsync();
|
||
Console.WriteLine($"送出心跳錯誤:{ex.Message}");
|
||
Console.WriteLine($"後端回應內容:{errorContent}");
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
}
|