NetworkController.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net.NetworkInformation;
  5. using System.Threading.Tasks;
  6. using Vinno.FIS.Sonopost.Features.Config;
  7. using Vinno.FIS.Sonopost.Features.Network;
  8. using Vinno.FIS.Sonopost.WebApi.Models;
  9. using Vinno.IUS.Common.Log;
  10. using Vinno.IUS.Common.Utilities;
  11. namespace Vinno.FIS.Sonopost.WebApi.Controllers
  12. {
  13. [WebApiController]
  14. internal class NetworkController : BaseController
  15. {
  16. /// <summary>
  17. /// 获取有线网络信息
  18. /// </summary>
  19. /// <returns></returns>
  20. [WebApiAction]
  21. public Result GetWireInfos()
  22. {
  23. var infos = NetworkManager.GetAllNetworkInterfaceInfos().Where(x => x.NetworkInterfaceType == NetworkInterfaceType.Ethernet);
  24. var result = new NetworkWireListModel();
  25. if (infos != null && infos.Any())
  26. {
  27. int index = 1;
  28. foreach (var info in infos)
  29. {
  30. result.Interfaces.Add(new NetworkInterfaceModel
  31. {
  32. Guid = info.Guid,
  33. Description = info.Description,
  34. Name = $"EthernetInterface{index}",
  35. MacAddress = info.MacAddress,
  36. IPAddress = info.IpAddress.Value,
  37. SubnetMask = info.SubnetMask.Value,
  38. Gateway = info.GateWay.Value,
  39. PreferredDNS = info.PreferredDNSServer.Value,
  40. StandbyDNS = info.StandbyDNSServer.Value,
  41. EnableDHCP = info.EnableDhcp.Value,
  42. });
  43. index++;
  44. }
  45. }
  46. return Result.Success(result);
  47. }
  48. /// <summary>
  49. /// 保存有线网络信息
  50. /// </summary>
  51. /// <returns></returns>
  52. [WebApiAction]
  53. public Result SaveWireInfos(NetworkWireListModel model)
  54. {
  55. var staticIpList = model.Interfaces.Where(x => !x.EnableDHCP);
  56. if (staticIpList != null && staticIpList.Count() > 0)
  57. {
  58. var interfaceInfoList = NetworkManager.GetAllNetworkInterfaceInfos();
  59. bool hasIpConflict = false;
  60. Parallel.ForEach(staticIpList, x =>
  61. {
  62. var currentIp = interfaceInfoList?.FirstOrDefault(y => y.MacAddress == x.MacAddress && y.NetworkInterfaceType == NetworkInterfaceType.Ethernet)?.IpAddress.Value;
  63. if (currentIp != x.IPAddress)
  64. {
  65. if (NetworkManager.Ping(x.IPAddress, 1500) == IPStatus.Success)
  66. {
  67. hasIpConflict = true;
  68. }
  69. }
  70. });
  71. if (hasIpConflict)
  72. {
  73. return Result.Fail("IPAddressExist");
  74. }
  75. }
  76. if (model.Interfaces != null && model.Interfaces.Any())
  77. {
  78. foreach (var item in model.Interfaces)
  79. {
  80. if (!NetworkManager.SetNetworkInfo(item.MacAddress, item.EnableDHCP, item.IPAddress
  81. , item.SubnetMask, item.Gateway, item.PreferredDNS, item.StandbyDNS))
  82. {
  83. return Result.Fail("SaveFailed");
  84. }
  85. }
  86. NetworkManager.OnNetworkAddressChanged(this, EventArgs.Empty);
  87. }
  88. return Result.Success();
  89. }
  90. /// <summary>
  91. /// 获取Wifi信息
  92. /// </summary>
  93. /// <returns></returns>
  94. [WebApiAction]
  95. public Result GetWifiInfo()
  96. {
  97. var info = NetworkManager.GetAllNetworkInterfaceInfos().FirstOrDefault(x => x.NetworkInterfaceType == NetworkInterfaceType.Wireless80211);
  98. if (info == null)
  99. {
  100. return Result.Fail("WifiDeviceNotFound");
  101. }
  102. var wifiInfo = info as WirelessNetworkInterfaceInfo;
  103. var points = wifiInfo.GetAccessPoints()
  104. ?.Where(x => !string.IsNullOrWhiteSpace(x.Name))
  105. ?.OrderByDescending(x => x.IsConnected)
  106. ?.ThenByDescending(x => x.SignalStrength);
  107. NetworkWifiInfoResult result = new NetworkWifiInfoResult
  108. {
  109. Guid = info.Guid,
  110. Description = info.Description,
  111. Name = info.Description,
  112. MacAddress = info.MacAddress,
  113. IPAddress = info.IpAddress.Value,
  114. SubnetMask = info.SubnetMask.Value,
  115. Gateway = info.GateWay.Value,
  116. PreferredDNS = info.PreferredDNSServer.Value,
  117. StandbyDNS = info.StandbyDNSServer.Value,
  118. EnableDHCP = info.EnableDhcp.Value,
  119. Points = points?.Select(x => new WifiPointModel
  120. {
  121. Name = x.Name,
  122. IsSecure = x.IsSecure,
  123. IsConnected = x.IsConnected,
  124. SignalStrength = x.SignalStrength,
  125. HasProfile = x.HasProfile,
  126. })?.ToList() ?? new List<WifiPointModel>()
  127. };
  128. return Result.Success(result);
  129. }
  130. /// <summary>
  131. /// 连接Wifi网络
  132. /// </summary>
  133. /// <param name="request"></param>
  134. /// <returns></returns>
  135. [WebApiAction]
  136. public Result ConnectWifi(NetworkConnectWifiRequest request)
  137. {
  138. var info = NetworkManager.GetAllNetworkInterfaceInfos().FirstOrDefault(x => x.NetworkInterfaceType == NetworkInterfaceType.Wireless80211);
  139. if (info == null)
  140. {
  141. return Result.Fail("WifiDeviceNotFound");
  142. }
  143. var wifiInfo = info as WirelessNetworkInterfaceInfo;
  144. var point = wifiInfo.GetAccessPoints()?.FirstOrDefault(x => x.Name.Equals(request.Name));
  145. if (point == null)
  146. {
  147. return Result.Fail("ConnectFailed");
  148. }
  149. bool success = wifiInfo.Connect(point, point.Name, request.Password);
  150. if (success)
  151. {
  152. SonopostUserDefinedSettings.Instance.NetworkSetting.IsAutoConnect = true;
  153. SonopostUserDefinedSettings.Instance.NetworkSetting.WifiName = point.Name;
  154. SonopostUserDefinedSettings.Instance.NetworkSetting.WifiPassword = DesBuilder.Encrypt(request.Password);
  155. SonopostUserDefinedSettings.Instance.NetworkSetting.WifiMacAddress = wifiInfo.MacAddress; ;
  156. ConfigManager.Save();
  157. }
  158. Logger.WriteLineInfo($"Connect Wifi Invoke,Wifi Name:{request.Name},success:{success}");
  159. return success ? Result.Success() : Result.Fail("ConnectFailed");
  160. }
  161. /// <summary>
  162. /// 断开Wifi网络连接
  163. /// </summary>
  164. /// <param name="request"></param>
  165. /// <returns></returns>
  166. [WebApiAction]
  167. public Result DisconnectWifi(NetworkConnectWifiRequest request)
  168. {
  169. var info = NetworkManager.GetAllNetworkInterfaceInfos().FirstOrDefault(x => x.NetworkInterfaceType == NetworkInterfaceType.Wireless80211);
  170. if (info == null)
  171. {
  172. return Result.Fail("WifiDeviceNotFound");
  173. }
  174. var wifiInfo = info as WirelessNetworkInterfaceInfo;
  175. bool success = wifiInfo.Disconnect();
  176. SonopostUserDefinedSettings.Instance.NetworkSetting.IsAutoConnect = false;
  177. SonopostUserDefinedSettings.Instance.NetworkSetting.WifiName = null;
  178. SonopostUserDefinedSettings.Instance.NetworkSetting.WifiPassword = null;
  179. SonopostUserDefinedSettings.Instance.NetworkSetting.WifiMacAddress = null;
  180. ConfigManager.Save();
  181. Logger.WriteLineInfo($"Disconnect Wifi Invoke,success:{success}");
  182. return success ? Result.Success() : Result.Fail();
  183. }
  184. /// <summary>
  185. /// 忘记密码
  186. /// </summary>
  187. /// <param name="request"></param>
  188. /// <returns></returns>
  189. [WebApiAction]
  190. public Result ForgetPassword(NetworkConnectWifiRequest request)
  191. {
  192. var info = NetworkManager.GetAllNetworkInterfaceInfos().FirstOrDefault(x => x.NetworkInterfaceType == NetworkInterfaceType.Wireless80211);
  193. if (info == null)
  194. {
  195. return Result.Fail("WifiDeviceNotFound");
  196. }
  197. var wifiInfo = info as WirelessNetworkInterfaceInfo;
  198. var point = wifiInfo.GetAccessPoints().FirstOrDefault(x => x.Name.Equals(request.Name));
  199. if (point == null)
  200. {
  201. return Result.Fail("OperateFailed");
  202. }
  203. wifiInfo.DeleteProfile(point);
  204. if (wifiInfo.MacAddress == SonopostUserDefinedSettings.Instance.NetworkSetting.WifiMacAddress && SonopostUserDefinedSettings.Instance.NetworkSetting.IsAutoConnect && SonopostUserDefinedSettings.Instance.NetworkSetting.WifiName == request.Name)
  205. {
  206. SonopostUserDefinedSettings.Instance.NetworkSetting.IsAutoConnect = false;
  207. SonopostUserDefinedSettings.Instance.NetworkSetting.WifiName = null;
  208. SonopostUserDefinedSettings.Instance.NetworkSetting.WifiPassword = null;
  209. SonopostUserDefinedSettings.Instance.NetworkSetting.WifiMacAddress = null;
  210. ConfigManager.Save();
  211. }
  212. return Result.Success();
  213. }
  214. /// <summary>
  215. /// 保存wifi网络信息
  216. /// </summary>
  217. /// <returns></returns>
  218. [WebApiAction]
  219. public Result SaveWifiInfo(NetworkInterfaceModel model)
  220. {
  221. if (!model.EnableDHCP)
  222. {
  223. var currentIp = NetworkManager.GetAllNetworkInterfaceInfos().FirstOrDefault(x => x.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)?.IpAddress.Value;
  224. if (currentIp != model.IPAddress)
  225. {
  226. if (NetworkManager.Ping(model.IPAddress, 1500) == IPStatus.Success)
  227. {
  228. return Result.Fail("IPAddressExist");
  229. }
  230. }
  231. }
  232. if (NetworkManager.SetNetworkInfo(model.MacAddress, model.EnableDHCP, model.IPAddress
  233. , model.SubnetMask, model.Gateway, model.PreferredDNS, model.StandbyDNS))
  234. {
  235. NetworkManager.OnNetworkAddressChanged(this, EventArgs.Empty);
  236. return Result.Success();
  237. }
  238. else
  239. {
  240. return Result.Fail("SaveFailed");
  241. }
  242. }
  243. /// <summary>
  244. /// 刷新DNS
  245. /// </summary>
  246. /// <returns></returns>
  247. [WebApiAction]
  248. public Result FlushDNS()
  249. {
  250. bool success = NetworkManager.FlushDns();
  251. return success ? Result.Success() : Result.Fail();
  252. }
  253. /// <summary>
  254. /// Ping
  255. /// </summary>
  256. /// <param name="request"></param>
  257. /// <returns></returns>
  258. [WebApiAction]
  259. public Result Ping(NetworkBaseRequest request)
  260. {
  261. IPStatus status = NetworkManager.Ping(request.Ipv4, 3000);
  262. if (status == IPStatus.Success)
  263. {
  264. return Result.Success();
  265. }
  266. Result failRst = Result.Fail(Enum.GetName(typeof(IPStatus), status));
  267. failRst.Data = status.GetHashCode();
  268. return failRst;
  269. }
  270. [WebApiAction]
  271. public Result GetNetworkInterfaces()
  272. {
  273. var allNetworkInterfaceInfos = NetworkManager.GetAllNetworkInterfaceInfos();
  274. var ethernetInfos = allNetworkInterfaceInfos.Where(x => x.NetworkInterfaceType == NetworkInterfaceType.Ethernet).ToList();
  275. var wifilessInfo = allNetworkInterfaceInfos.FirstOrDefault(x => x.NetworkInterfaceType == NetworkInterfaceType.Wireless80211);
  276. var connectedEthernetInfos = ethernetInfos.Where(c => c.OperationalStatus == OperationStatus.Connected);
  277. NetworkAdvaneSettingListModel result = new NetworkAdvaneSettingListModel();
  278. var outsideAddress = SonopostUserDefinedSettings.Instance.NetworkSetting.OutsideNetworkMacAddress;
  279. if (connectedEthernetInfos != null)
  280. {
  281. foreach (var info in connectedEthernetInfos)
  282. {
  283. if (info.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
  284. {
  285. var index = ethernetInfos.IndexOf(info);
  286. result.Interfaces.Add(new NetworkAdvanceSettingItem()
  287. {
  288. Description = $"EthernetInterface{index + 1}",
  289. MacAddress = info.MacAddress,
  290. IsOutSideNetwork = string.Equals(info.MacAddress, outsideAddress)
  291. });
  292. }
  293. }
  294. }
  295. if (wifilessInfo != null)
  296. {
  297. result.Interfaces.Add(new NetworkAdvanceSettingItem()
  298. {
  299. Description = $"WifiInterface1",
  300. MacAddress = wifilessInfo.MacAddress,
  301. IsOutSideNetwork = string.Equals(wifilessInfo.MacAddress, outsideAddress)
  302. });
  303. }
  304. return Result.Success(result);
  305. }
  306. [WebApiAction]
  307. public Result SaveAdvanceSetting(NetworkAdvanceSettingItem settingItem)
  308. {
  309. SetDualNetworkResult success = null;
  310. if (settingItem != null)
  311. {
  312. if (settingItem.IsOutSideNetwork && !string.IsNullOrEmpty(settingItem.MacAddress))
  313. {
  314. success = NetworkManager.SetDualNetworkEnable(settingItem.MacAddress);
  315. }
  316. }
  317. else
  318. {
  319. success = NetworkManager.SetDualNetworkDisable();
  320. }
  321. return success != null && success.IsSuccess ? Result.Success(success) : Result.Fail();
  322. }
  323. }
  324. }