小米miio协议 C#代码 并且需要使用token
时间: 2024-06-08 20:07:54 浏览: 3
以下是使用C#调用小米Miio协议并需要token的代码示例:
```csharp
using System;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RestSharp;
namespace MiioClient
{
public class MiioClient
{
private readonly string _ip;
private readonly string _token;
public MiioClient(string ip, string token)
{
_ip = ip;
_token = token;
}
public object Send(string method, params object[] parameters)
{
var request = new RestRequest("/", Method.POST);
var data = new JObject
{
["id"] = DateTime.Now.Ticks,
["method"] = method,
["params"] = parameters
};
request.AddParameter("application/json", JsonConvert.SerializeObject(data), ParameterType.RequestBody);
var client = new RestClient($"http://{_ip}:54321");
var response = client.Execute(request);
if (response.IsSuccessful)
{
var json = JObject.Parse(response.Content);
if (json.ContainsKey("result"))
{
return json["result"];
}
else if (json.ContainsKey("error"))
{
throw new Exception(json["error"].ToString());
}
else
{
throw new Exception("Invalid response from device.");
}
}
else
{
throw new Exception($"Connection error: {response.StatusCode}");
}
}
public string GetToken()
{
var response = Send("miIO.info");
var json = JObject.Parse(response.ToString());
return json["token"].ToString();
}
public static string ComputeMd5Hash(string input)
{
using (var md5 = MD5.Create())
{
var inputBytes = Encoding.ASCII.GetBytes(input);
var hashBytes = md5.ComputeHash(inputBytes);
var sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
sb.Append(hashBytes[i].ToString("x2"));
}
return sb.ToString();
}
}
public static string GenerateToken(string deviceId, string deviceKey)
{
var timestamp = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
var str = $"{timestamp}{deviceId}{deviceKey}";
return ComputeMd5Hash(str);
}
public static string GetDeviceId(string token)
{
var data = Convert.FromBase64String(token);
var deviceId = Encoding.ASCII.GetString(data, 0, 16);
return deviceId;
}
}
}
```
使用方法:
```csharp
var client = new MiioClient("192.168.1.1", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
var result = client.Send("get_prop", new[] { "power" });
Console.WriteLine(result.ToString());
```
需要替换掉ip和token,并且注意修改调用的方法及参数。如果要获取设备的token,可以调用`GetToken`方法。如果需要生成token,可以使用`GenerateToken`方法。获取设备ID可以使用`GetDeviceId`方法。