using Application.Domain.Entities; using Infrastructure.Data; using Infrastructure.Extensions; using IoT.Shared.Application.Models; using Microsoft.AspNetCore.Hosting; 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"; private static readonly object lockObject = new object(); public SerialPortService(IServiceProvider applicationServices, IWebHostEnvironment env) : base(applicationServices, env) { } public override void Execute() { this.Notify(); } public void SendMessage(string deviceNumber, string name) { var deviceId = this.GetIoTDeviceId(deviceNumber); if(deviceId.HasValue) { var value = this.GetIoTDataValue(deviceId.Value, DataKeys.Buttons); var buttons = value?.FromJson>(); ; var button = buttons?.FirstOrDefault(o => o.Name == name); if (button != null) { ExecInternal(button.PortName, button.BaudRate, button.DataBits, button.Parity, button.StopBits, button.Message); } } } #pragma warning disable CA1822 // Mark members as static public void ExecCommand(string port, int baud, int dataBits, int partity, int stopBits, string message) { ExecInternal(port, baud, dataBits, partity, stopBits, message); } public void UpdateButtons(string number, string buttons) { var deviceId = this.GetIoTDeviceId(number); if(deviceId.HasValue) { this.UpdateIoTData(deviceId.Value, DataKeys.Buttons, buttons.FromJson>()); } } public static void ExecInternal(string port, int baud, int dataBits, int partity, int stopBits, string message) { try { lock (lockObject) { 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(); } } /// /// //var buttons = new List() { // new SPCommandModel { // Name = "测试", // PortName = "/dev/ttyS0", // BaudRate = 9600, // Parity = 0, // DataBits = 8, // StopBits = 1, // Message = "0123456789ABCDEF" // } //}.ToJson(true); /// public void Notify() { //上传产品信息 this.UpdateProduct("串口控制器", _productNumber, "/SerialPort/", "serialport"); using var scope = _applicationServices.CreateScope(); var repo = scope.ServiceProvider.GetService>(); var deviceNumber = $"serialporton{Helper.Instance.GetMacAddress()}"; var device = repo.Table().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 IoTDevice { Id = deviceNumber.ToGuid(), Number = deviceNumber, Name = name, DisplayName = name, IoTProductId = product.Id, IoTGatewayId = node.Id, IsOnline = true, Icon = "serialport" }; repo.Add(device); repo.SaveChanges(); this.UpdateIoTData(device.Id, DataKeys.Buttons, new List()); } } } }