NetworkManager.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Management;
  7. using System.Management.Automation;
  8. using System.Net;
  9. using System.Net.NetworkInformation;
  10. using System.Text;
  11. using System.Threading;
  12. using System.Threading.Tasks;
  13. using Vinno.FIS.Sonopost.Features.Network;
  14. using Vinno.FIS.Sonopost.Features.Oled;
  15. using Vinno.FIS.Sonopost.Helpers;
  16. using Vinno.FIS.Sonopost.Managers.Interfaces;
  17. using Vinno.FIS.Sonopost.Settings;
  18. using Vinno.IUS.Common.Log;
  19. using Vinno.IUS.Common.Utilities;
  20. namespace Vinno.FIS.Sonopost.Managers
  21. {
  22. internal enum DefaultNetworkMode
  23. {
  24. Ethernet,
  25. Wireless
  26. }
  27. internal class NetworkManager : SonopostManager, INetworkManager
  28. {
  29. private NetworkInterfaceInfo _currentNetwork;
  30. private int _currentWifiLevel;
  31. private int _timingRefreshInterval;//unit:second.
  32. private readonly object _networkInterfaceInfolocker = new object();
  33. private readonly object _networkAddresslocker = new object();
  34. private DefaultNetworkMode _defaultNetworkMode;
  35. private readonly IDeviceManager _deviceManager;
  36. private readonly IConfigManager _configManager;
  37. private readonly ManualResetEvent _timingRefreshManualResetEvent = new ManualResetEvent(false);
  38. private readonly List<NetworkInterfaceInfo> _networkInterfaceInfos;
  39. public event EventHandler<NetworkInterfaceInfo> CurrentNetworkChanged;
  40. public event EventHandler<int> CurrentWifiLevelChanged;
  41. public List<NetworkInterfaceInfo> _currentNetworkInterfaces;
  42. public NetworkInterfaceInfo CurrentNetwork
  43. {
  44. get => _currentNetwork;
  45. private set
  46. {
  47. if (_currentNetwork != value)
  48. {
  49. _currentNetwork = value;
  50. CurrentNetworkChanged?.Invoke(this, _currentNetwork);
  51. CurrentWifiLevelChanged?.Invoke(this, _currentWifiLevel);
  52. }
  53. }
  54. }
  55. public int CurrentWifiLevel
  56. {
  57. get => _currentWifiLevel;
  58. private set
  59. {
  60. if (_currentWifiLevel != value)
  61. {
  62. _currentWifiLevel = value;
  63. CurrentWifiLevelChanged?.Invoke(this, _currentWifiLevel);
  64. }
  65. }
  66. }
  67. public NetworkManager()
  68. {
  69. _networkInterfaceInfos = new List<NetworkInterfaceInfo>();
  70. _defaultNetworkMode = DefaultNetworkMode.Ethernet;
  71. _configManager = AppManager.Instance.GetManager<IConfigManager>();
  72. _deviceManager = AppManager.Instance.GetManager<IDeviceManager>();
  73. _deviceManager.WifiModuleInserted += OnWifiModuleInserted;
  74. _deviceManager.NetworkAddressChanged += OnNetworkAddressChanged;
  75. RefreshAllNetworks(true);
  76. _timingRefreshInterval = 15;
  77. StartTimerRefreshTask();
  78. AutoReconnectWifi(false);
  79. }
  80. private void OnWifiModuleInserted(object sender, EventArrivedEventArgs e)
  81. {
  82. lock (_networkAddresslocker)
  83. {
  84. AutoReconnectWifi(true);
  85. }
  86. }
  87. private void AutoReconnectWifi(bool needRefresh)
  88. {
  89. if (needRefresh)
  90. {
  91. RefreshAllNetworks(true);
  92. }
  93. var isAutoConnect = SonopostUserDefinedSettings.Instance.NetworkSetting.IsAutoConnect;
  94. var wifiName = SonopostUserDefinedSettings.Instance.NetworkSetting.WifiName;
  95. var wifiPassword = DesBuilder.Decrypt(SonopostUserDefinedSettings.Instance.NetworkSetting.WifiPassword);
  96. var wifiMacAddress = SonopostUserDefinedSettings.Instance.NetworkSetting.WifiMacAddress;
  97. Logger.WriteLineInfo($"Network Manager Auto Conncect Wifi :{isAutoConnect},MacAddress:{wifiMacAddress}");
  98. if (!string.IsNullOrWhiteSpace(wifiMacAddress) && isAutoConnect)
  99. {
  100. var wifiInfo = GetAllNetworkInterfaceInfos().FirstOrDefault(x => x.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && x.MacAddress == wifiMacAddress);
  101. if (wifiInfo == null)
  102. {
  103. Logger.WriteLineError($"Network Manager Auto Conncect Wifi Fail,Because the Wifi MacAdress : {wifiMacAddress} is not exist");
  104. }
  105. else if (wifiInfo.OperationalStatus == OperationStatus.Connected)
  106. {
  107. Logger.WriteLineError($"Network Manager Auto Conncect Wifi Fail,Because the Wifi MacAdress : {wifiMacAddress} already connected");
  108. }
  109. else
  110. {
  111. var point = ((WirelessNetworkInterfaceInfo)wifiInfo).GetAccessPoints()?.FirstOrDefault(x => x.Name.Equals(wifiName));
  112. if (point == null)
  113. {
  114. Logger.WriteLineError($"Network Manager Auto Conncect Wifi Fail,Because the Wifi {wifiName} is not exist");
  115. }
  116. else
  117. {
  118. var result = ((WirelessNetworkInterfaceInfo)wifiInfo).Connect(point, wifiName, wifiPassword);
  119. if (result)
  120. {
  121. Logger.WriteLineInfo($"Network Manager Auto Conncect Wifi Success");
  122. }
  123. else
  124. {
  125. Logger.WriteLineError($"Network Manager Auto Conncect Wifi Fail,Because Connect Failed");
  126. }
  127. }
  128. }
  129. }
  130. }
  131. public void OnNetworkAddressChanged(object sender, EventArgs e)
  132. {
  133. lock (_networkAddresslocker)
  134. {
  135. RefreshAllNetworks(false);
  136. }
  137. }
  138. public void RefreshAllNetworks(bool wlanReScan)
  139. {
  140. try
  141. {
  142. foreach (var existNetwork in _networkInterfaceInfos)
  143. {
  144. existNetwork.Dispose();
  145. }
  146. _networkInterfaceInfos.Clear();
  147. var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
  148. var interfaces = networkInterfaces.Where(c => !c.Description.ToUpper().Contains("VIRTUAL") && !c.Description.ToUpper().Contains("BLUETOOTH") && !c.Description.ToUpper().Contains("LOOPBACK")).OrderBy(x => x.Description).ToList();
  149. var allInterfaces = new List<NetworkInterface>();
  150. var i219List = interfaces.Where(x => x.Description.ToLower().Contains("i219")).OrderBy(x => x.Description).ToList();
  151. allInterfaces.AddRange(i219List);//219为主网卡
  152. var i211List = interfaces.Where(x => x.Description.ToLower().Contains("i211")).OrderBy(x => x.Description).ToList();
  153. allInterfaces.AddRange(i211List);//211已停产
  154. var i210List = interfaces.Where(x => x.Description.ToLower().Contains("i210")).OrderBy(x => x.Description).ToList();
  155. allInterfaces.AddRange(i210List);//210为副网卡
  156. foreach (var restInterface in interfaces)
  157. {
  158. if (!i211List.Contains(restInterface) && !i219List.Contains(restInterface) && !i210List.Contains(restInterface))
  159. {
  160. allInterfaces.Add(restInterface);
  161. }
  162. }
  163. foreach (var network in allInterfaces)
  164. {
  165. if (network.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
  166. {
  167. var networkInterfaceInfo = new NetworkInterfaceInfo(network);
  168. _networkInterfaceInfos.Add(networkInterfaceInfo);
  169. }
  170. else if (network.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
  171. {
  172. var wirelessInterfaceInfo = new WirelessNetworkInterfaceInfo(network, wlanReScan);
  173. _networkInterfaceInfos.Add(wirelessInterfaceInfo);
  174. }
  175. }
  176. lock (_networkInterfaceInfolocker)
  177. {
  178. _currentNetworkInterfaces = _networkInterfaceInfos.ToList();
  179. }
  180. if (wlanReScan)
  181. {
  182. Thread.Sleep(3000);//扫描网络会卡顿3秒左右
  183. }
  184. SetCurrentNetwork();
  185. }
  186. catch (Exception ex)
  187. {
  188. Logger.WriteLineError($"Refresh all network error:{ex}");
  189. }
  190. }
  191. public IList<NetworkInterfaceInfo> GetAllNetworkInterfaceInfos()
  192. {
  193. lock (_networkInterfaceInfolocker)
  194. {
  195. return _currentNetworkInterfaces.ToList();
  196. }
  197. }
  198. private void SetCurrentNetwork()
  199. {
  200. var outsideAddress = SonopostUserDefinedSettings.Instance.NetworkSetting.OutsideNetworkMacAddress;
  201. NetworkInterfaceInfo networkInterfaceInfo = null;
  202. NetworkInterfaceInfo outsideNetworkInfo = null;
  203. var networkInterfaceInfos = GetAllNetworkInterfaceInfos();
  204. var connectedList = networkInterfaceInfos.Where(x => x.OperationalStatus == OperationStatus.Connected);
  205. if (connectedList.Count() == 0)
  206. {
  207. _defaultNetworkMode = DefaultNetworkMode.Ethernet;
  208. }
  209. else if (connectedList.Count() == 1)
  210. {
  211. _defaultNetworkMode = connectedList.FirstOrDefault().NetworkInterfaceType == NetworkInterfaceType.Ethernet ? DefaultNetworkMode.Ethernet : DefaultNetworkMode.Wireless;
  212. }
  213. else if (!connectedList.Any(x => x.NetworkInterfaceType == NetworkInterfaceType.Ethernet) && _defaultNetworkMode == DefaultNetworkMode.Ethernet)
  214. {
  215. _defaultNetworkMode = DefaultNetworkMode.Wireless;
  216. }
  217. else if (!connectedList.Any(x => x.NetworkInterfaceType == NetworkInterfaceType.Wireless80211) && _defaultNetworkMode == DefaultNetworkMode.Wireless)
  218. {
  219. _defaultNetworkMode = DefaultNetworkMode.Ethernet;
  220. }
  221. if (!string.IsNullOrEmpty(outsideAddress))
  222. {
  223. outsideNetworkInfo = networkInterfaceInfos.FirstOrDefault(c => string.Equals(c.MacAddress, outsideAddress));
  224. if (outsideNetworkInfo != null && outsideNetworkInfo.OperationalStatus != OperationStatus.Connected)
  225. {
  226. outsideNetworkInfo = null;
  227. }
  228. }
  229. if (outsideNetworkInfo == null)
  230. {
  231. if (connectedList.Count() <= 1)
  232. {
  233. networkInterfaceInfo = connectedList.FirstOrDefault();
  234. }
  235. else
  236. {
  237. var currentNetworkMacAddress = CurrentNetwork?.MacAddress;
  238. if (!string.IsNullOrWhiteSpace(currentNetworkMacAddress))
  239. {
  240. if (_defaultNetworkMode == DefaultNetworkMode.Ethernet)
  241. {
  242. networkInterfaceInfo = connectedList.FirstOrDefault(x => x.NetworkInterfaceType == NetworkInterfaceType.Ethernet && x.MacAddress == currentNetworkMacAddress);
  243. }
  244. else if (_defaultNetworkMode == DefaultNetworkMode.Wireless)
  245. {
  246. networkInterfaceInfo = connectedList.FirstOrDefault(x => x.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && x.MacAddress == currentNetworkMacAddress);
  247. }
  248. }
  249. if (networkInterfaceInfo == null)
  250. {
  251. if (_defaultNetworkMode == DefaultNetworkMode.Ethernet)
  252. {
  253. networkInterfaceInfo = connectedList.FirstOrDefault(x => x.NetworkInterfaceType == NetworkInterfaceType.Ethernet);
  254. }
  255. else if (_defaultNetworkMode == DefaultNetworkMode.Wireless)
  256. {
  257. networkInterfaceInfo = connectedList.FirstOrDefault(x => x.NetworkInterfaceType == NetworkInterfaceType.Wireless80211);
  258. }
  259. }
  260. }
  261. }
  262. if (outsideNetworkInfo != null)
  263. {
  264. CurrentNetwork = outsideNetworkInfo;
  265. }
  266. else
  267. {
  268. if (networkInterfaceInfo == null)
  269. {
  270. CurrentNetwork = networkInterfaceInfos.FirstOrDefault(c => c.NetworkInterfaceType == NetworkInterfaceType.Ethernet);
  271. }
  272. else
  273. {
  274. CurrentNetwork = networkInterfaceInfo;
  275. }
  276. }
  277. }
  278. private int GetWifiLevel(WirelessNetworkInterfaceInfo network)
  279. {
  280. var currentWifi = network.GetAccessPoints().FirstOrDefault(c => c.IsConnected == true);
  281. if (currentWifi == null)
  282. {
  283. return 1;
  284. }
  285. int level;
  286. if (currentWifi.SignalStrength > 85)
  287. {
  288. level = 4;
  289. }
  290. else if (currentWifi.SignalStrength > 55)
  291. {
  292. level = 3;
  293. }
  294. else
  295. {
  296. level = 2;
  297. }
  298. return level;
  299. }
  300. public bool SetNetworkInfo(string macAddress, bool enableDhcp, string ip = "", string subnetMask = "", string gateway = "", string preferredDns = "", string standbyDns = "")
  301. {
  302. lock (_networkAddresslocker)
  303. {
  304. try
  305. {
  306. var networkInterfaceInfos = GetAllNetworkInterfaceInfos();
  307. var network = networkInterfaceInfos.FirstOrDefault(c => c.MacAddress == macAddress);
  308. if (network == null)
  309. {
  310. Logger.WriteLineError($"Can not find network {macAddress}");
  311. return false;
  312. }
  313. if (enableDhcp == false)
  314. {
  315. if (IsAddressValid(ip) == false) return false;
  316. if (IsAddressValid(subnetMask) == false) return false;
  317. if (IsAddressValid(gateway) == false) return false;
  318. if (IsAddressValid(preferredDns) == false) return false;
  319. if (!string.IsNullOrEmpty(standbyDns))
  320. {
  321. if (IsAddressValid(standbyDns) == false) return false;
  322. }
  323. network.IpAddress.Value = ip;
  324. network.SubnetMask.Value = subnetMask;
  325. network.GateWay.Value = gateway;
  326. network.PreferredDNSServer.Value = preferredDns;
  327. network.StandbyDNSServer.Value = standbyDns;
  328. }
  329. network.SaveChanges(enableDhcp);
  330. Logger.WriteLineInfo($"Set Network Info Success:MacAddress:{macAddress},EnableDHCP:{enableDhcp},IP:{ip},SubnetMask:{subnetMask},GateWay:{gateway},PreferredDNS:{preferredDns},StandbyDNS:{standbyDns}");
  331. return true;
  332. }
  333. catch (Exception ex)
  334. {
  335. Logger.WriteLineError($"Set Network Info Error:{ex}");
  336. }
  337. return false;
  338. }
  339. }
  340. public bool FlushDns()
  341. {
  342. var flushdns = "ipconfig /flushdns";
  343. var cmdOutPut = DoCmd(flushdns);
  344. return !string.IsNullOrWhiteSpace(cmdOutPut);
  345. }
  346. public bool ResetWinSock()
  347. {
  348. var resetWinsock = "netsh winsock reset";
  349. var cmdOutPut = DoCmd(resetWinsock);
  350. return !string.IsNullOrWhiteSpace(cmdOutPut);
  351. }
  352. public IPStatus Ping(string address, int timeOut = 5000)
  353. {
  354. try
  355. {
  356. Ping myPing = new Ping();
  357. PingReply reply = myPing.Send(address, timeOut);
  358. if (reply == null)
  359. {
  360. return IPStatus.Unknown;
  361. }
  362. return reply.Status;
  363. }
  364. catch (Exception ex)
  365. {
  366. Logger.WriteLineError($"NetworkManager Ping Error,IpAddress:{address}, Ex:{ex}");
  367. return IPStatus.Unknown;
  368. }
  369. }
  370. public bool SetDualNetwork(string outsideMacAddress)
  371. {
  372. lock (_networkAddresslocker)
  373. {
  374. try
  375. {
  376. if (string.IsNullOrEmpty(outsideMacAddress))
  377. {
  378. Logger.WriteLineError("mac address is empty");
  379. return false;
  380. }
  381. var networkInterfaceInfos = GetAllNetworkInterfaceInfos();
  382. var availableNetworks = networkInterfaceInfos.Where(c => c.OperationalStatus == OperationStatus.Connected && !string.IsNullOrEmpty(c.IpAddress.Value)).ToList();
  383. var outsideNetwork = availableNetworks.FirstOrDefault(c => c.MacAddress == outsideMacAddress);
  384. if (outsideNetwork == null)
  385. {
  386. Logger.WriteLineError($"Can not find network:{outsideMacAddress}");
  387. return false;
  388. }
  389. var insideNetworks = availableNetworks.Where(c => c.MacAddress != outsideMacAddress);
  390. if (!insideNetworks.Any())
  391. {
  392. Logger.WriteLineError("Can not find other networks,no need set dual network!");
  393. return false;
  394. }
  395. var deleteRoute = "route -p delete 0.0.0.0";
  396. var outsideRoute = $"route -p add 0.0.0.0 mask 0.0.0.0 {GetGateWay(outsideNetwork.IpAddress.Value)}";
  397. var insideRoute = "route -p add {0} mask 255.255.255.0 {1}";
  398. DoCmd(deleteRoute);
  399. DoCmd(outsideRoute);
  400. foreach (var network in insideNetworks)
  401. {
  402. var index = network.GateWay.Value.LastIndexOf('.');
  403. var insideTarget = network.GateWay.Value.Substring(0, index + 1) + "0";
  404. var routeCmd = string.Format(insideRoute, insideTarget, GetGateWay(network.IpAddress.Value));
  405. DoCmd(routeCmd);
  406. }
  407. SetNetworkPriority(outsideNetwork.MacAddress);
  408. return true;
  409. }
  410. catch (Exception e)
  411. {
  412. Logger.WriteLineError($"SetDualNetworkEnable Error:{e}");
  413. }
  414. return false;
  415. }
  416. }
  417. public SetDualNetworkResult SetDualNetworkEnable(string outsideMacAddress)
  418. {
  419. lock (_networkAddresslocker)
  420. {
  421. try
  422. {
  423. if (string.IsNullOrEmpty(outsideMacAddress))
  424. {
  425. Logger.WriteLineError("mac address is empty");
  426. return new SetDualNetworkResult
  427. {
  428. IsSuccess = false,
  429. NeedReboot = false,
  430. };
  431. }
  432. var networkInterfaceInfos = GetAllNetworkInterfaceInfos();
  433. var availableNetworks = networkInterfaceInfos.Where(c => c.OperationalStatus == OperationStatus.Connected && !string.IsNullOrEmpty(c.IpAddress.Value)).ToList();
  434. var outsideNetwork = availableNetworks.FirstOrDefault(c => c.MacAddress == outsideMacAddress);
  435. if (outsideNetwork == null)
  436. {
  437. Logger.WriteLineError($"Can not find network:{outsideMacAddress}");
  438. return new SetDualNetworkResult
  439. {
  440. IsSuccess = false,
  441. NeedReboot = false,
  442. };
  443. }
  444. var insideNetworks = availableNetworks.Where(c => c.MacAddress != outsideMacAddress);
  445. if (!insideNetworks.Any())
  446. {
  447. Logger.WriteLineError("Can not find other networks,no need set dual network!");
  448. return new SetDualNetworkResult
  449. {
  450. IsSuccess = false,
  451. NeedReboot = false,
  452. };
  453. }
  454. if (SonopostUserDefinedSettings.Instance.NetworkSetting.NeedDoubleNetwork && string.Equals(SonopostUserDefinedSettings.Instance.NetworkSetting.OutsideNetworkMacAddress, outsideMacAddress))
  455. {
  456. return new SetDualNetworkResult
  457. {
  458. IsSuccess = true,
  459. NeedReboot = false,
  460. };
  461. }
  462. SonopostUserDefinedSettings.Instance.NetworkSetting.NeedDoubleNetwork = true;
  463. SonopostUserDefinedSettings.Instance.NetworkSetting.OutsideNetworkMacAddress = outsideNetwork.MacAddress;
  464. _configManager.Save();
  465. StartRebootTask();
  466. return new SetDualNetworkResult
  467. {
  468. IsSuccess = true,
  469. NeedReboot = true,
  470. };
  471. }
  472. catch (Exception e)
  473. {
  474. Logger.WriteLineError($"SetDualNetworkEnable Error:{e}");
  475. }
  476. return new SetDualNetworkResult
  477. {
  478. IsSuccess = false,
  479. NeedReboot = false,
  480. };
  481. }
  482. }
  483. public SetDualNetworkResult SetDualNetworkDisable()
  484. {
  485. try
  486. {
  487. if (!SonopostUserDefinedSettings.Instance.NetworkSetting.NeedDoubleNetwork)
  488. {
  489. return new SetDualNetworkResult
  490. {
  491. IsSuccess = true,
  492. NeedReboot = false,
  493. };
  494. }
  495. SonopostUserDefinedSettings.Instance.NetworkSetting.NeedDoubleNetwork = false;
  496. SonopostUserDefinedSettings.Instance.NetworkSetting.OutsideNetworkMacAddress = string.Empty;
  497. _configManager.Save();
  498. var deleteaAll = $"route delete *";
  499. DoCmd(deleteaAll);
  500. var routeCmd = "route -p add 0.0.0.0 mask 0.0.0.0 {0}";
  501. var networkInterfaceInfos = GetAllNetworkInterfaceInfos();
  502. var staticNetworks = networkInterfaceInfos.Where(c => c.EnableDhcp.Value == true);
  503. foreach (var item in staticNetworks)
  504. {
  505. var cmd = string.Format(routeCmd, GetGateWay(item.IpAddress.Value));
  506. DoCmd(cmd);
  507. }
  508. StartRebootTask();
  509. return new SetDualNetworkResult
  510. {
  511. IsSuccess = true,
  512. NeedReboot = true,
  513. };
  514. }
  515. catch (Exception e)
  516. {
  517. Logger.WriteLineError($"SetDualNetworkDisEnable Error:{e}");
  518. }
  519. return new SetDualNetworkResult
  520. {
  521. IsSuccess = false,
  522. NeedReboot = false,
  523. };
  524. }
  525. private void StartRebootTask()
  526. {
  527. Task.Run(() =>
  528. {
  529. Thread.Sleep(1000);
  530. AppManager.Instance.GetManager<IOledManager>().ShowStatus(OledMessage.Reboot);
  531. SystemHelper.RebootSystem();
  532. });
  533. }
  534. private void StartTimerRefreshTask()
  535. {
  536. Logger.WriteLineInfo("NetworkManager Start Timer Refresh Task");
  537. Task.Run(() =>
  538. {
  539. _timingRefreshManualResetEvent.Reset();
  540. try
  541. {
  542. while (!_timingRefreshManualResetEvent.WaitOne(_timingRefreshInterval * 1000))
  543. {
  544. try
  545. {
  546. if (CurrentNetwork == null || string.IsNullOrEmpty(CurrentNetwork?.IpAddress?.Value))
  547. {
  548. lock (_networkAddresslocker)
  549. {
  550. RefreshAllNetworks(false);
  551. }
  552. }
  553. if (CurrentNetwork is WirelessNetworkInterfaceInfo wireless)
  554. {
  555. CurrentWifiLevel = GetWifiLevel(wireless);
  556. }
  557. }
  558. catch (Exception ex)
  559. {
  560. Logger.WriteLineError($"NetworkManager Timer Refresh Task Error, ex:{ex}");
  561. }
  562. }
  563. }
  564. catch (Exception ex)
  565. {
  566. Logger.WriteLineError($"NetworkManager Timer Refresh Task Error, ex:{ex}");
  567. }
  568. finally
  569. {
  570. Logger.WriteLineInfo($"NetworkManager Timer Refresh Task Finshed");
  571. }
  572. });
  573. }
  574. /// <summary>
  575. /// 网关可能为空
  576. /// </summary>
  577. /// <param name="ip"></param>
  578. /// <returns></returns>
  579. private string GetGateWay(string ip)
  580. {
  581. var index = ip.LastIndexOf('.');
  582. return ip.Substring(0, index + 1) + "1";
  583. }
  584. private Dictionary<string, string> GetNetworkAdapterIndexs()
  585. {
  586. Dictionary<string, string> networkAdapters = new Dictionary<string, string>();
  587. var result = DoPowerShell("Get-NetAdapter", null);
  588. foreach (var item in result)
  589. {
  590. var index = item.Members["InterfaceIndex"]?.Value.ToString();
  591. var address = item.Members["PermanentAddress"]?.Value.ToString();
  592. var macAddress = ConvertMacAddress(address);
  593. networkAdapters.Add(macAddress, index);
  594. }
  595. return networkAdapters;
  596. }
  597. private void SetNetworkPriority(string mainMacAddress)
  598. {
  599. var networkAdapters = GetNetworkAdapterIndexs();
  600. if (!networkAdapters.TryGetValue(mainMacAddress, out var ifindex))
  601. {
  602. return;
  603. }
  604. int mainMetric = 10;
  605. var paramters = new Dictionary<string, object>
  606. {
  607. { "InterfaceIndex", ifindex },
  608. { "InterfaceMetric", mainMetric }
  609. };
  610. DoPowerShell("Set-NetIPInterface", paramters);
  611. var othernetworks = networkAdapters.Where(c => c.Key != mainMacAddress);
  612. foreach (var item in othernetworks)
  613. {
  614. paramters["InterfaceIndex"] = item.Value;
  615. paramters["InterfaceMetric"] = ++mainMetric;
  616. DoPowerShell("Set-NetIPInterface", paramters);
  617. }
  618. }
  619. private void DisableAutoMetric()
  620. {
  621. var networkAdapters = GetNetworkAdapterIndexs();
  622. var paramters = new Dictionary<string, object>
  623. {
  624. { "InterfaceIndex", "0" },
  625. { "AutomaticMetric ", "enabled" }
  626. };
  627. foreach (var item in networkAdapters)
  628. {
  629. paramters["InterfaceIndex"] = item.Value;
  630. DoPowerShell("Set-NetIPInterface", paramters);
  631. }
  632. }
  633. public string ConvertMacAddress(string address)
  634. {
  635. StringBuilder sb = new StringBuilder();
  636. var len = address.Length;
  637. for (int i = 0; i < len; i++)
  638. {
  639. sb.Append(address[i]);
  640. if (i % 2 != 0 && i != len - 1)
  641. {
  642. sb.Append('-');
  643. }
  644. }
  645. return sb.ToString();
  646. }
  647. private bool IsAddressValid(string address)
  648. {
  649. if (string.IsNullOrEmpty(address))
  650. {
  651. return false;
  652. }
  653. return IPAddress.TryParse(address, out _);
  654. }
  655. public string DoCmd(string shell)
  656. {
  657. try
  658. {
  659. Process p = new Process();
  660. p.StartInfo.CreateNoWindow = true;
  661. p.StartInfo.UseShellExecute = false;
  662. p.StartInfo.FileName = "cmd";
  663. p.StartInfo.Verb = "runas";
  664. var flushDnsArguments = "/C " + shell;
  665. p.StartInfo.Arguments = flushDnsArguments;
  666. p.StartInfo.RedirectStandardInput = true;
  667. p.StartInfo.RedirectStandardOutput = true;
  668. if (p.Start())
  669. {
  670. string str = p.StandardOutput.ReadToEnd();
  671. p.Close();
  672. p.Dispose();
  673. Logger.WriteLineInfo($"DoCmd Arguments:{shell}, Output:{str}");
  674. return str;
  675. }
  676. }
  677. catch (Exception ex)
  678. {
  679. Logger.WriteLineError($"DoCmd Arguments:{shell} failed: {ex}");
  680. }
  681. return string.Empty;
  682. }
  683. public Collection<PSObject> DoPowerShell(string shell, Dictionary<string, object> parameters)
  684. {
  685. using (PowerShell powerShell = PowerShell.Create())
  686. {
  687. powerShell.AddCommand(shell);
  688. if (parameters?.Count > 0)
  689. {
  690. foreach (var item in parameters)
  691. {
  692. powerShell.AddParameter(item.Key, item.Value);
  693. }
  694. }
  695. return powerShell.Invoke();
  696. }
  697. }
  698. public override void DoDispose()
  699. {
  700. try
  701. {
  702. _deviceManager.WifiModuleInserted -= OnWifiModuleInserted;
  703. _deviceManager.NetworkAddressChanged -= OnNetworkAddressChanged;
  704. _timingRefreshManualResetEvent.Set();
  705. lock (_networkInterfaceInfolocker)
  706. {
  707. _currentNetworkInterfaces.Clear();
  708. }
  709. foreach (var existNetwork in _networkInterfaceInfos)
  710. {
  711. existNetwork.Dispose();
  712. }
  713. _networkInterfaceInfos.Clear();
  714. }
  715. catch (Exception ex)
  716. {
  717. Logger.WriteLineError($"NetworkManager DoDispose Error:{ex}");
  718. }
  719. base.DoDispose();
  720. }
  721. }
  722. }