v9.10.2019.0101  全面巩固批量Insert/Update/Upsert,支持数据备份、恢复和同步,支持实体列表保存到文件以及加载
大石头 authored at 2019-01-01 13:38:33
10.22 KiB
X
# »úÆ÷ÐÅÏ¢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/dev/Doc/setting-ºËÐÄÅäÖÃSetting.md) --- ## ¸üÐÂÈÕÖ¾ - **2025-01**: ÍêÉÆÎĵµ£¬²¹³äÏêϸ˵Ã÷ - **2024**: Ö§³Ö .NET 9.0£¬ÓÅ»¯¿çƽ̨֧³Ö - **2023**: Çø·Ö AvailableMemory ºÍ FreeMemory - **2022**: Ôö¼ÓÍøÂçËÙ¶È¡¢Î¶ȡ¢µç³ØµÈ¶¯Ì¬ÐÅÏ¢ - **2020**: ³õʼ°æ±¾£¬Ö§³Ö»ù´¡Ó²¼þÐÅÏ¢»ñÈ¡