FeederService.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using Team.FFFeederService.Interfaces;
  9. using TouchSocket.Core;
  10. using TouchSocket.Sockets;
  11. namespace Team.FFFeederService
  12. {
  13. public class FeederService : IFeederService
  14. {
  15. private readonly Dictionary<Guid, IVoiceCoilMotorFeeder> _feederCollection;
  16. private readonly object _sync = new object();
  17. public FeederService()
  18. {
  19. _feederCollection = new Dictionary<Guid, IVoiceCoilMotorFeeder>();
  20. }
  21. public bool CreateFeeder(Guid id, int feederNo, string name, string ip, int port, FeederBrand feederBrand)
  22. {
  23. IVoiceCoilMotorFeeder feeder;
  24. if (feederBrand == FeederBrand.TEAM)
  25. {
  26. var tcpClient = new TouchSocket.Sockets.TcpClient();
  27. var config = new TouchSocketConfig();
  28. config.SetRemoteIPHost(new IPHost(IPAddress.Parse(ip), port));
  29. config.SetTcpDataHandlingAdapter(() => { return new TerminatorPackageAdapter("\r\n"); }); //设置结束符
  30. config.ConfigurePlugins(a => { a.UseTcpReconnection(); }); ////如需永远尝试连接,tryCount设置为-1即可。
  31. //载入配置
  32. tcpClient.Setup(config);
  33. feeder = new TeamFeeder(id, feederNo, name, tcpClient);
  34. }
  35. else
  36. {
  37. feeder = new AfagFeeder(id, feederNo, name, ip, port);
  38. }
  39. feeder.Id = id;
  40. lock (_sync)
  41. {
  42. if (_feederCollection.ContainsKey(id))
  43. {
  44. try
  45. {
  46. // 移除旧事件并释放
  47. var old = _feederCollection[id];
  48. old.Dispose();
  49. }
  50. catch
  51. {
  52. // 忽略个别释放异常
  53. }
  54. _feederCollection[id] = feeder;
  55. }
  56. else
  57. {
  58. _feederCollection.Add(id, feeder);
  59. }
  60. }
  61. return true;
  62. }
  63. public Task<bool> CreateFeederAsync(Guid id, int feederNo, string name, string ip, int port, FeederBrand feederBrand)
  64. {
  65. return Task.Run(() => CreateFeeder(id, feederNo, name, ip, port, feederBrand));
  66. }
  67. /// <summary>
  68. /// Feeder断开连接时
  69. /// </summary>
  70. private void FeederService_FeederDisconnectedEvent(Guid feederId, ITcpClient client, ClosedEventArgs e)
  71. {
  72. // 可在这里转发或记录断开事件
  73. }
  74. /// <summary>
  75. /// Feeder连接上时
  76. /// </summary>
  77. private void FeederService_FeederConnectedEvent(Guid feederId, ITcpClient client, ConnectedEventArgs e)
  78. {
  79. // 可在这里转发或记录连接事件
  80. }
  81. public IVoiceCoilMotorFeeder GetFeeder(Guid id)
  82. {
  83. lock (_sync)
  84. {
  85. if (_feederCollection.TryGetValue(id, out var feeder)) return feeder;
  86. }
  87. return null;
  88. }
  89. public Task<IVoiceCoilMotorFeeder> GetFeederAsync(Guid id)
  90. {
  91. return Task.Run(() => { return GetFeeder(id); });
  92. }
  93. public IVoiceCoilMotorFeeder GetFeederByIndex(int feederNo)
  94. {
  95. lock (_sync)
  96. {
  97. foreach (var kvp in _feederCollection)
  98. {
  99. var f = kvp.Value;
  100. if (f == null) continue;
  101. try
  102. {
  103. if (f.FeederNo == feederNo) return f;
  104. }
  105. catch
  106. {
  107. // 忽略访问异常
  108. }
  109. }
  110. }
  111. return null;
  112. }
  113. public Task<IVoiceCoilMotorFeeder> GetFeederByIndexAsync(int feederNo)
  114. {
  115. return Task.Run(() => { return GetFeederByIndex(feederNo); });
  116. }
  117. public Task UnRegisterFeederAsync(Guid id)
  118. {
  119. return Task.Run(() => UnRegisterFeeder(id));
  120. }
  121. public void UnRegisterFeeder(Guid id)
  122. {
  123. IVoiceCoilMotorFeeder feeder = null;
  124. lock (_sync)
  125. {
  126. if (_feederCollection.TryGetValue(id, out feeder))
  127. {
  128. _feederCollection.Remove(id);
  129. }
  130. }
  131. if (feeder != null)
  132. {
  133. try
  134. {
  135. feeder.Dispose();
  136. }
  137. catch
  138. {
  139. // 忽略释放异常
  140. }
  141. }
  142. }
  143. public Task UnRegisterFeederByIndexAsync(int feederNo)
  144. {
  145. return Task.Run(() => UnRegisterFeederByIndex(feederNo));
  146. }
  147. public void UnRegisterFeederByIndex(int feederNo)
  148. {
  149. Guid foundId = Guid.Empty;
  150. lock (_sync)
  151. {
  152. foreach (var kvp in _feederCollection)
  153. {
  154. try
  155. {
  156. if (kvp.Value != null && kvp.Value.FeederNo == feederNo)
  157. {
  158. foundId = kvp.Key;
  159. break;
  160. }
  161. }
  162. catch { }
  163. }
  164. }
  165. if (foundId != Guid.Empty)
  166. {
  167. UnRegisterFeeder(foundId);
  168. }
  169. }
  170. public IReadOnlyCollection<IVoiceCoilMotorFeeder> GetAllFeeders()
  171. {
  172. lock (_sync)
  173. {
  174. return _feederCollection.Values.ToList().AsReadOnly();
  175. }
  176. }
  177. public Task<IReadOnlyCollection<IVoiceCoilMotorFeeder>> GetAllFeedersAsync()
  178. {
  179. return Task.Run(() => { return GetAllFeeders(); });
  180. }
  181. public bool TryGetFeeder(Guid id, out IVoiceCoilMotorFeeder feeder)
  182. {
  183. lock (_sync)
  184. {
  185. return _feederCollection.TryGetValue(id, out feeder);
  186. }
  187. }
  188. public Task<(bool found, IVoiceCoilMotorFeeder feeder)> TryGetFeederAsync(Guid id)
  189. {
  190. return Task.Run(() =>
  191. {
  192. IVoiceCoilMotorFeeder feeder;
  193. bool found;
  194. lock (_sync)
  195. {
  196. found = _feederCollection.TryGetValue(id, out feeder);
  197. }
  198. return (found, feeder);
  199. });
  200. }
  201. public bool ContainsFeeder(Guid id)
  202. {
  203. lock (_sync)
  204. {
  205. return _feederCollection.ContainsKey(id);
  206. }
  207. }
  208. public Task<bool> ContainsFeederAsync(Guid id)
  209. {
  210. return Task.Run(() => { return ContainsFeeder(id); });
  211. }
  212. public bool RemoveFeeder(Guid id)
  213. {
  214. IVoiceCoilMotorFeeder feeder = null;
  215. lock (_sync)
  216. {
  217. if (_feederCollection.TryGetValue(id, out feeder))
  218. {
  219. _feederCollection.Remove(id);
  220. }
  221. }
  222. if (feeder != null)
  223. {
  224. try
  225. {
  226. feeder.Dispose();
  227. }
  228. catch
  229. {
  230. // 忽略释放异常
  231. }
  232. return true;
  233. }
  234. return false;
  235. }
  236. public Task<bool> RemoveFeederAsync(Guid id)
  237. {
  238. return Task.Run(() => { return RemoveFeeder(id); });
  239. }
  240. public void RemoveAllFeeders()
  241. {
  242. List<IVoiceCoilMotorFeeder> feeders;
  243. lock (_sync)
  244. {
  245. feeders = _feederCollection.Values.ToList();
  246. _feederCollection.Clear();
  247. }
  248. foreach (var f in feeders)
  249. {
  250. try
  251. {
  252. f.Dispose();
  253. }
  254. catch { }
  255. }
  256. }
  257. /// <summary>
  258. /// 更新Feeder编号
  259. /// </summary>
  260. /// <param name="id"></param>
  261. /// <param name="newFeederNo"></param>
  262. public void UpdateFeederNo(Guid id, int newFeederNo)
  263. {
  264. lock (_sync)
  265. {
  266. if (_feederCollection.TryGetValue(id, out var feeder))
  267. {
  268. feeder.FeederNo = newFeederNo;
  269. }
  270. }
  271. }
  272. }
  273. }