using Application.Domain.Entities; using Application.Models; using Infrastructure.Data; using Infrastructure.Extensions; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; namespace IoTNode.DeviceServices.SerialPortManager { public class SerialPortService : BaseDeviceService { private const string _productNumber = "serialport"; public SerialPortService(IServiceProvider applicationServices, IConfiguration configuration) : base(applicationServices, configuration) { } public override void Execute() { this.Notify(); } public void Exec(string id, string name) { using var scope = _applicationServices.CreateScope(); var repo = scope.ServiceProvider.GetService>(); var deviceNumber = $"serialportonHelper.Instance.GetCPUNumber()"; var device = repo.ReadOnlyTable().Include(o => o.Data).FirstOrDefault(o => o.Number == deviceNumber); var buttons = device.Data.FirstOrDefault(o => o.Key == "Buttons")?.Value.FromJson>(); ; var button = buttons.FirstOrDefault(o => o.Name == name); ExecInternal(button.PortName, button.BaudRate, button.DataBits, button.Parity, button.StopBits, button.Message); } internal void UpdateButtons(string number, string buttons) { using (var scope = _applicationServices.CreateScope()) { var deviceRepo = scope.ServiceProvider.GetService>(); var device = deviceRepo.Table().Include(o => o.Data).FirstOrDefault(o => o.Number == number); if (device != null) { var data = device.Data.FirstOrDefault(o => o.Key == "Buttons"); if (data != null) { data.Value = buttons.FromJson>().ToJson(); if (deviceRepo.SaveChanges() > 0) { this.SendDataToServer(data); } } } } } [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "<挂起>")] public static void ExecInternal(string port, int baud, int dataBits, int partity, int stopBits, string message) { try { using var sp = new SerialPort(port, baud, (Parity)partity, dataBits, (StopBits)stopBits); sp.Open(); var bytes = message.HexToBytes(); sp.Write(bytes, 0, bytes.Length); sp.Close(); } catch (Exception ex) { ex.PrintStack(); } } public void Notify() { this.UpdateProduct("串口控制器", _productNumber, "/SerialPort/", "20", "serialport"); using var scope = _applicationServices.CreateScope(); var repo = scope.ServiceProvider.GetService>(); var deviceNumber = $"serialporton{Helper.Instance.GetCPUNumber()}"; var device = repo.ReadOnlyTable().Include(o => o.Data).FirstOrDefault(o => o.Number == deviceNumber); if (device == null) { var productRepo = scope.ServiceProvider.GetService>(); var nodeRepo = scope.ServiceProvider.GetService>(); var node = nodeRepo.ReadOnlyTable().FirstOrDefault(); var product = productRepo.ReadOnlyTable().FirstOrDefault(o => o.Number == _productNumber); var name = "串口控制器"; device = new Device { Id = deviceNumber.ToGuid(), Number = deviceNumber, Name = name, DisplayName = name, ProductId = product.Id, NodeId = node.Id, IsOnline = true, Icon = "serialport" }; repo.Add(device); this.UpdateDevice(repo, device); var buttons = new List() { new SPCommandModel { Name = "测试", PortName = "/dev/ttyS0", BaudRate = 9600, Parity = 0, DataBits = 8, StopBits = 1, Message = "" } }.ToJson(); this.UpdateData(repo, device, device.CreateData("Buttons", buttons, DeviceDataType.String, "指令", timestamp: DateTimeOffset.Now.ToUnixTimeMilliseconds())); } } } }