解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# »úÆ÷ÐÅÏ¢MachineInfo
## ¸ÅÊö
`NewLife.MachineInfo` ÓÃÓÚ»ñÈ¡»úÆ÷µÄÓ²¼þºÍϵͳÐÅÏ¢£¬Ö§³ÖWindows¡¢Linux¡¢MacµÈ¶àÖÖ²Ù×÷ϵͳ¡£
**Ö÷Òª¹¦ÄÜ**£º
- »ñÈ¡²Ù×÷ϵͳÐÅÏ¢£¨Ãû³Æ¡¢°æ±¾£©
- »ñȡӲ¼þÐÅÏ¢£¨CPU¡¢ÄÚ´æ¡¢´ÅÅÌ£©
- »ñȡΨһ±êʶ£¨UUID¡¢GUID¡¢ÐòÁкţ©
- »ñÈ¡¶¯Ì¬ÐÅÏ¢£¨CPUÕ¼ÓÃÂÊ¡¢ÄÚ´æÊ¹Óá¢ÍøÂçËÙ¶È£©
**ÃüÃû¿Õ¼ä**: `NewLife`
**Ô´Âë**: [NewLife.Core/Common/MachineInfo.cs](https://github.com/NewLifeX/X/blob/master/NewLife.Core/Common/MachineInfo.cs)
**Îĵµ**: https://newlifex.com/core/machine_info
---
## ¿ìËÙÈëÃÅ
### »ù´¡Ó÷¨
```csharp
using NewLife;
// »ñÈ¡µ±Ç°»úÆ÷ÐÅÏ¢£¨Ê״ε÷Óûá³õʼ»¯£©
var machine = MachineInfo.GetCurrent();
Console.WriteLine($"²Ù×÷ϵͳ£º{machine.OSName} {machine.OSVersion}");
Console.WriteLine($"´¦ÀíÆ÷£º{machine.Processor}");
Console.WriteLine($"ÄÚ´æ×ÜÁ¿£º{machine.Memory / 1024 / 1024 / 1024}GB");
Console.WriteLine($"Ó²¼þ±êʶ£º{machine.UUID}");
Console.WriteLine($"ϵͳ±êʶ£º{machine.Guid}");
```
### Òì²½³õʼ»¯
```csharp
// Òì²½×¢²á»úÆ÷ÐÅÏ¢£¨ÍƼöÔÚÓ¦ÓÃÆô¶¯Ê±µ÷Óã©
var machine = await MachineInfo.RegisterAsync();
Console.WriteLine($"CPUÕ¼Óãº{machine.CpuRate:P2}");
Console.WriteLine($"¿ÉÓÃÄڴ棺{machine.AvailableMemory / 1024 / 1024}MB");
```
### ˢж¯Ì¬Êý¾Ý
```csharp
var machine = MachineInfo.GetCurrent();
// ˢж¯Ì¬Êý¾Ý£¨CPU¡¢ÄÚ´æ¡¢ÍøÂçµÈ£©
machine.Refresh();
Console.WriteLine($"CPUÕ¼Óãº{machine.CpuRate:P2}");
Console.WriteLine($"¿ÕÏÐÄڴ棺{machine.FreeMemory / 1024 / 1024}MB");
Console.WriteLine($"ÏÂÔØËÙ¶È£º{machine.DownlinkSpeed / 1024}KB/s");
Console.WriteLine($"ÉÏ´«ËÙ¶È£º{machine.UplinkSpeed / 1024}KB/s");
```
---
## ºËÐÄÊôÐÔ
### ¾²Ì¬ÐÅÏ¢£¨³õʼ»¯ºó²»±ä£©
| ÊôÐÔ | ÀàÐÍ | ˵Ã÷ | ʾÀý |
|-----|------|------|------|
| `OSName` | String | ²Ù×÷ϵͳÃû³Æ | "Windows 11", "Ubuntu 22.04" |
| `OSVersion` | String | ϵͳ°æ±¾ºÅ | "10.0.22000", "5.15.0" |
| `Product` | String | ²úÆ·Ãû³Æ | "ThinkPad X1 Carbon" |
| `Vendor` | String | ÖÆÔìÉÌ | "Lenovo", "Dell" |
| `Processor` | String | ´¦ÀíÆ÷ÐͺŠ| "Intel Core i7-1165G7" |
| `UUID` | String | Ó²¼þΨһ±êʶ£¨Ö÷°åÐòÁкţ© | "xxxx-xxxx-xxxx" |
| `Guid` | String | Èí¼þΨһ±êʶ£¨ÏµÍ³ID£© | "xxxx-xxxx-xxxx" |
| `Serial` | String | ¼ÆËã»úÐòÁкŠ| "PF2ABCDE" |
| `Board` | String | Ö÷°åÐÅÏ¢ | "20XWCTO1WW" |
| `DiskID` | String | ´ÅÅÌÐòÁкŠ| "1234567890" |
| `Memory` | UInt64 | ÄÚ´æ×ÜÁ¿£¨×Ö½Ú£© | 17179869184 (16GB) |
### ¶¯Ì¬ÐÅÏ¢£¨ÐèҪˢУ©
| ÊôÐÔ | ÀàÐÍ | ˵Ã÷ |
|-----|------|------|
| `AvailableMemory` | UInt64 | ¿ÉÓÃÄڴ棨×Ö½Ú£© |
| `FreeMemory` | UInt64 | ¿ÕÏÐÄڴ棨×Ö½Ú£© |
| `CpuRate` | Double | CPUÕ¼ÓÃÂÊ£¨0-1£© |
| `UplinkSpeed` | UInt64 | ÍøÂçÉÏÐÐËÙ¶È£¨×Ö½Ú/Ã룩 |
| `DownlinkSpeed` | UInt64 | ÍøÂçÏÂÐÐËÙ¶È£¨×Ö½Ú/Ã룩 |
| `Temperature` | Double | ζȣ¨¶È£© |
| `Battery` | Double | µç³ØÊ£Óࣨ0-1£© |
---
## ºËÐÄ·½·¨
### RegisterAsync - Òì²½×¢²á
```csharp
/// <summary>Òì²½×¢²áÒ»¸ö³õʼ»¯ºóµÄ»úÆ÷ÐÅϢʵÀý</summary>
public static Task<MachineInfo> RegisterAsync()
```
**ÌØµã**£º
- Òì²½Ö´ÐУ¬²»×èÈûÖ÷Ïß³Ì
- Ê״ε÷ÓÃʱ³õʼ»¯£¬ºóÐøÖ±½Ó·µ»Ø»º´æ½á¹û
- ×Ô¶¯»º´æµ½Îļþ£¨`machine_info.json`£©£¬¼Ó¿ìºóÐøÆô¶¯ËÙ¶È
- ×¢²áµ½¶ÔÏóÈÝÆ÷ `ObjectContainer`
**ʾÀý**£º
```csharp
// Ó¦ÓÃÆô¶¯Ê±Òì²½×¢²á
await MachineInfo.RegisterAsync();
// ºóÐøÖ±½ÓʹÓÃ
var machine = MachineInfo.Current;
```
### GetCurrent - »ñÈ¡µ±Ç°ÊµÀý
```csharp
/// <summary>»ñÈ¡µ±Ç°ÐÅÏ¢£¬Èç¹ûδÉèÖÃÔòµÈ´ýÒì²½×¢²á½á¹û</summary>
public static MachineInfo GetCurrent()
```
**ʾÀý**£º
```csharp
var machine = MachineInfo.GetCurrent();
Console.WriteLine(machine.OSName);
```
### Refresh - ˢж¯Ì¬Êý¾Ý
```csharp
/// <summary>ˢж¯Ì¬Êý¾Ý£¨CPU¡¢ÄÚ´æ¡¢ÍøÂçµÈ£©</summary>
public void Refresh()
```
**ʾÀý**£º
```csharp
var machine = MachineInfo.GetCurrent();
machine.Refresh(); // ¸üÐÂCPUÕ¼Óá¢ÄÚ´æÊ¹ÓõÈ
Console.WriteLine($"CPU: {machine.CpuRate:P}");
```
---
## Ψһ±êʶ˵Ã÷
### UUID£¨Ó²¼þ±êʶ£©
- **À´Ô´**£ºÖ÷°åÐòÁкÅ
- **ÌØµã**£ºÓëÓ²¼þ°ó¶¨£¬¸ü»»Ö÷°åºó±ä»¯
- **×¢Òâ**£º²¿·ÖÆ·ÅÆ£¨ÈçijЩ°×ÅÆ»ú£©¿ÉÄÜÖØ¸´
```csharp
var uuid = machine.UUID; // Èç "A1B2C3D4-E5F6-..."
```
### Guid£¨ÏµÍ³±êʶ£©
- **À´Ô´**£º
- Windows£º×¢²á±í `MachineGuid`
- Linux£º`/etc/machine-id`
- Android£º`android_id`
- **ÌØµã**£ºÓë²Ù×÷ϵͳ°²×°°ó¶¨£¬ÖØ×°ÏµÍ³ºó±ä»¯
- **×¢Òâ**£ºGhostϵͳ¿ÉÄÜÖØ¸´
```csharp
var guid = machine.Guid; // Èç "B1C2D3E4-F5A6-..."
```
### Serial£¨ÐòÁкţ©
- **À´Ô´**£º¼ÆËã»úÐòÁкţ¨BIOS£©
- **ÌØµã**£ºÆ·ÅÆ»ú¶ÀÓУ¬Óë±Ê¼Ç±¾±êǩһÖÂ
- **×¢Òâ**£º×é×°»úͨ³£Îª¿Õ
```csharp
var serial = machine.Serial; // Èç "PF2ABCDE"
```
### DiskID£¨´ÅÅÌÐòÁкţ©
- **À´Ô´**£ºÏµÍ³ÅÌÐòÁкÅ
- **ÌØµã**£ºÓë´ÅÅÌÓ²¼þ°ó¶¨
- **×¢Òâ**£º¸ü»»Ó²Å̺ó±ä»¯
---
## ÄÚ´æÐÅÏ¢Ïê½â
### AvailableMemory£¨¿ÉÓÃÄڴ棩
**ÍÆ¼öÓÃÓÚÓ¦ÓÃ×ÔÎÒ±£»¤ºÍ¼à¿Ø¸æ¾¯**
- **Linux**£º`MemAvailable`£¨ÄÚºËÆÀ¹À¿É°²È«·ÖÅäµÄÄڴ棩
- **Windows**£º`ullAvailPhys`£¨µ±Ç°¿ÉÓÃÎïÀíÄڴ棩
```csharp
if (machine.AvailableMemory < 100 * 1024 * 1024) // СÓÚ100MB
{
Console.WriteLine("ÄÚ´æ²»×㣬¾Ü¾øÐÂÈÎÎñ");
}
```
### FreeMemory£¨¿ÕÏÐÄڴ棩
**ÊʺÏÓÃÓÚ¼à¿ØÕ¹Ê¾ºÍÈ˹¤·ÖÎö**
- **Linux**£º`MemFree + Buffers + Cached + SReclaimable - Shmem`
- **Windows**£ºÓë `AvailableMemory` Ò»ÖÂ
```csharp
Console.WriteLine($"¿ÕÏÐÄڴ棺{machine.FreeMemory / 1024 / 1024}MB");
```
---
## ʹÓó¡¾°
### 1. Ó¦ÓÃ¼à¿Ø
```csharp
var timer = new TimerX(async _ =>
{
var machine = MachineInfo.GetCurrent();
machine.Refresh();
// Éϱ¨¼à¿ØÊý¾Ý
await ReportMetrics(new
{
CpuRate = machine.CpuRate,
AvailableMemory = machine.AvailableMemory,
DownlinkSpeed = machine.DownlinkSpeed,
UplinkSpeed = machine.UplinkSpeed
});
}, null, 0, 60000); // ÿ·ÖÖÓÉϱ¨
```
### 2. É豸ע²á
```csharp
var machine = await MachineInfo.RegisterAsync();
var device = new Device
{
UUID = machine.UUID,
Guid = machine.Guid,
OSName = machine.OSName,
OSVersion = machine.OSVersion,
Processor = machine.Processor,
Memory = machine.Memory
};
await RegisterDevice(device);
```
### 3. ÊÚȨÑéÖ¤
```csharp
var machine = MachineInfo.GetCurrent();
// »ùÓÚÓ²¼þ±êʶÑéÖ¤ÊÚȨ
if (!IsLicenseValid(machine.UUID))
{
throw new UnauthorizedAccessException("δÊÚȨµÄÉ豸");
}
```
### 4. ×ÔÊÊÓ¦×ÊÔ´·ÖÅä
```csharp
var machine = MachineInfo.GetCurrent();
var cpuCount = Environment.ProcessorCount;
var memoryGB = machine.Memory / 1024 / 1024 / 1024;
// ¸ù¾Ý»úÆ÷ÅäÖõ÷ÕûÏ̳߳شóС
ThreadPool.SetMinThreads(cpuCount * 2, cpuCount * 2);
// ¸ù¾ÝÄÚ´æ´óСµ÷Õû»º´æÈÝÁ¿
var cacheSize = (Int32)(memoryGB * 0.1 * 1024 * 1024 * 1024); // 10%ÄÚ´æ
```
### 5. ÐÔÄܸ澯
```csharp
var machine = MachineInfo.GetCurrent();
machine.Refresh();
if (machine.CpuRate > 0.9)
{
SendAlert("CPUʹÓÃÂʹý¸ß£º" + machine.CpuRate.ToString("P"));
}
if (machine.AvailableMemory < 100 * 1024 * 1024)
{
SendAlert("¿ÉÓÃÄÚ´æ²»×㣺" + machine.AvailableMemory / 1024 / 1024 + "MB");
}
```
---
## ×î¼Ñʵ¼ù
### 1. Ó¦ÓÃÆô¶¯Ê±Òì²½×¢²á
```csharp
class Program
{
static async Task Main(String[] args)
{
// Òì²½×¢²á»úÆ÷ÐÅÏ¢£¨²»×èÈûÆô¶¯£©
_ = MachineInfo.RegisterAsync();
// ¼ÌÐøÓ¦Óóõʼ»¯
await StartApplication();
}
}
```
### 2. ʹÓõ¥Àýģʽ
```csharp
// MachineInfo ÄÚ²¿ÒÑʵÏÖµ¥Àý
var machine = MachineInfo.Current; // ʹÓÃÒÑ×¢²áµÄʵÀý
```
### 3. ¶¨ÆÚˢж¯Ì¬Êý¾Ý
```csharp
// ²»ÒªÆµ·±Ë¢Ð£¬½¨Òé¼ä¸ôÖÁÉÙ1Ãë
var timer = new TimerX(_ =>
{
MachineInfo.Current?.Refresh();
}, null, 0, 1000);
```
### 4. ÀûÓÃÎļþ»º´æ
```csharp
// »úÆ÷ÐÅÏ¢»á×Ô¶¯»º´æµ½£º
// - {Temp}/machine_info.json
// - {DataPath}/machine_info.json
// ÏÂ´ÎÆô¶¯Ê±×Ô¶¯¼ÓÔØ»º´æ£¬¼Ó¿ì³õʼ»¯ËÙ¶È
```
---
## À©Õ¹¹¦ÄÜ
### ×Ô¶¨Òå»úÆ÷ÐÅÏ¢ÌṩÕß
```csharp
public class CustomMachineInfo : IMachineInfo
{
public void Init(MachineInfo info)
{
// ×Ô¶¨Òå³õʼ»¯Âß¼
info["CustomField"] = "CustomValue";
}
public void Refresh(MachineInfo info)
{
// ×Ô¶¨ÒåË¢ÐÂÂß¼
info["Timestamp"] = DateTime.Now;
}
}
// ×¢²á×Ô¶¨ÒåÌṩÕß
MachineInfo.Provider = new CustomMachineInfo();
await MachineInfo.RegisterAsync();
```
### ʹÓÃÀ©Õ¹ÊôÐÔ
```csharp
var machine = MachineInfo.GetCurrent();
// ÉèÖÃÀ©Õ¹ÊôÐÔ
machine["AppVersion"] = "1.0.0";
machine["DeployTime"] = DateTime.Now;
// »ñÈ¡À©Õ¹ÊôÐÔ
var version = machine["AppVersion"] as String;
```
---
## ×¢ÒâÊÂÏî
### 1. Òì²½³õʼ»¯
```csharp
// ÍÆ¼ö£ºÒì²½×¢²á
await MachineInfo.RegisterAsync();
// ²»ÍƼö£ºÍ¬²½µÈ´ý
var machine = MachineInfo.GetCurrent(); // ¿ÉÄÜ×èÈû
```
### 2. ȨÏÞÒªÇó
ijЩÐÅÏ¢ÐèÒªÌØ¶¨È¨ÏÞ£º
- **Windows**£º¶Áȡע²á±íÐèÒª¹ÜÀíԱȨÏÞ£¨²¿·Ö¼ü£©
- **Linux**£º¶ÁÈ¡ `/sys` ºÍ `/proc` ͨ³£ÐèÒª root ȨÏÞ
- **½¨Òé**£ºÒÔÆÕͨÓû§ÔËÐУ¬¶Áȡʧ°ÜʱʹÓÃĬÈÏÖµ
### 3. Ψһ±êʶ¿ÉÄÜÖØ¸´
- **UUID**£º²¿·Ö°×ÅÆ»ú/ÐéÄâ»ú¿ÉÄÜÖØ¸´
- **Guid**£ºGhostϵͳ¿ÉÄÜÖØ¸´
- **½¨Òé**£º×éºÏ¶à¸ö±êʶÉú³ÉΨһID
```csharp
var uniqueId = $"{machine.UUID}_{machine.Guid}_{machine.DiskID}".MD5();
```
### 4. ÐÔÄÜ¿¼ÂÇ
- **³õʼ»¯**£ºÊ×´ÎÖ´ÐнÏÂý£¨100-500ms£©£¬ºóÐøÊ¹Óûº´æ
- **Ë¢ÐÂ**£ºÃ¿´Îµ÷ÓÃÓÐÐÔÄÜ¿ªÏú£¬±ÜÃâ¸ßƵµ÷ÓÃ
- **½¨Òé**£º¶¨Ê±Ë¢Ð£¨ÈçÿÃëÒ»´Î£©¶ø·ÇʵʱˢÐÂ
---
## ¿çƽ̨֧³Ö
### Windows
Ö§³Ö£º
- ? OSName, OSVersion
- ? Processor, Memory
- ? UUID£¨Ö÷°åÐòÁкţ©
- ? Guid£¨MachineGuid£©
- ? Serial, Product, Vendor
- ? CpuRate, AvailableMemory
- ? UplinkSpeed, DownlinkSpeed
### Linux
Ö§³Ö£º
- ? OSName, OSVersion
- ? Processor, Memory
- ? UUID£¨DMI£©
- ? Guid£¨/etc/machine-id£©
- ? CpuRate, AvailableMemory
- ? UplinkSpeed, DownlinkSpeed
- ?? Serial, Product£¨²¿·ÖÉ豸²»Ö§³Ö£©
### macOS
Ö§³Ö£º
- ? OSName, OSVersion
- ? Processor, Memory
- ? UUID£¨Hardware UUID£©
- ?? ÆäËûÐÅÏ¢Ö§³ÖÓÐÏÞ
---
## ³£¼ûÎÊÌâ
### 1. UUID ΪʲôÊǿգ¿
¿ÉÄÜÔÒò£º
- ÐéÄâ»ú»·¾³
- °×ÅÆ»úûÓÐÖ÷°åÐòÁкÅ
- ȨÏÞ²»×ã
½â¾ö£ºÊ¹Óà `Guid` »ò×éºÏ¶à¸ö±êʶ¡£
### 2. Guid Ϊ `0-xxxx` ¸ñʽ£¿
±íʾÎÞ·¨¶Áȡϵͳ±êʶ£¬×Ô¶¯Éú³ÉµÄËæ»úGUID¡£
### 3. ˢкóÊý¾Ý²»±ä£¿
¼ì²é£º
- ÊÇ·ñÓÐȨÏÞ¶ÁȡϵͳÐÅÏ¢
- ˢмä¸ôÊÇ·ñ¹ý¶Ì£¨½¨Òé¡Ý1Ã룩
### 4. ÈçºÎ»ñÈ¡ËùÓÐÍø¿¨ËÙ¶È£¿
```csharp
var interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (var ni in interfaces)
{
var stats = ni.GetIPv4Statistics();
Console.WriteLine($"{ni.Name}: {stats.BytesReceived} / {stats.BytesSent}");
}
```
---
## ²Î¿¼×ÊÁÏ
- **ÔÚÏßÎĵµ**: https://newlifex.com/core/machine_info
- **Ô´Âë**: https://github.com/NewLifeX/X/blob/master/NewLife.Core/Common/MachineInfo.cs
- **ÅäÖÃ**: [setting-ºËÐÄÅäÖÃSetting.md](/NewLife/X/Blob/master/Doc/setting-ºËÐÄÅäÖÃSetting.md)
---
## ¸üÐÂÈÕÖ¾
- **2025-01**: ÍêÉÆÎĵµ£¬²¹³äÏêϸ˵Ã÷
- **2024**: Ö§³Ö .NET 9.0£¬ÓÅ»¯¿çƽ̨֧³Ö
- **2023**: Çø·Ö AvailableMemory ºÍ FreeMemory
- **2022**: Ôö¼ÓÍøÂçËÙ¶È¡¢Î¶ȡ¢µç³ØµÈ¶¯Ì¬ÐÅÏ¢
- **2020**: ³õʼ°æ±¾£¬Ö§³Ö»ù´¡Ó²¼þÐÅÏ¢»ñÈ¡
|