Browse Source

提交串口连接硬件客户端

master
胡超1 1 year ago
parent
commit
51f997c249
  1. 2
      CPF_Cef/AKS.EnterpriseLibrary.WebBrowser.csproj
  2. 276
      CPF_Cef/Common/COMUtils.cs
  3. 21
      CPF_Cef/Common/Utils.cs
  4. 38
      CPF_Cef/CusWebBrowser.cs
  5. 94
      CPF_Cef/FrmMain.cs
  6. 1033
      CPF_Cef/MainModel.cs
  7. 25
      CPF_Cef/Parame.cs
  8. 2
      CPF_Cef/Program.cs

2
CPF_Cef/AKS.EnterpriseLibrary.WebBrowser.csproj

@ -35,6 +35,8 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="NAudio" Version="2.2.1" />
<PackageReference Include="NAudio.Core" Version="2.2.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.IO.Ports" Version="8.0.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="8.0.0" />

276
CPF_Cef/Common/COMUtils.cs

@ -1,11 +1,14 @@
using AKS.EnterpriseLibrary.WebBrowser;
using AksWebBrowser;
using AKSWebBrowser.Commen;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using Timer = System.Timers.Timer;
@ -17,60 +20,83 @@ namespace AKSWebBrowser.Common
public string jsonstr = string.Empty;
public string jsontemp = string.Empty;
public int maxCHunkSize = 1024;
public string callback = string.Empty;
public string ml = "COM4";
public COMUtils()
{
try
{
OpenCOM();
}
if (!serialPort.IsOpen)
{
OpenCOM("/dev/ttyCH341USB0");
}
}
catch (Exception ex)
//打开COM口
public void OpenCOM()
{
try
{
try
//要执行的Linux命令
string[] cmd = LinuxCmdArea("ls /dev");
if (cmd.Length > 0)
{
Log.Info("服务启动异常ex: " + ex.Message + "");
if (!serialPort.IsOpen)
string parm = string.Empty;
foreach (string line in cmd)
{
OpenCOM("/dev/ttyCH341USB1");
if (line.Contains("ttyCH341USB"))
{
parm = line;
break;
}
}
if (!string.IsNullOrEmpty(parm))
{
ml = "/dev/" + parm;
Log.Info("输出结果:" + ml);
//给管理权限
LinuxCmd(ml);
//打开串口
// 设置COM口,波特率,奇偶校验,数据位,停止位
serialPort.PortName = ml; // 请替换为你的串口名称
serialPort.BaudRate = 115200; // 设置波特率
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Handshake = Handshake.None;
serialPort.DtrEnable = true; //启用控制终端就续信号
//serialPort.ReadTimeout = 18000;
//serialPort.RtsEnable = true; //启用请求发送信号
serialPort.NewLine = "\n";
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
if (!serialPort.IsOpen)
{
serialPort.Open();
}
Timer timer = new Timer(3000);//1秒钟的时间间隔
timer.Elapsed += OnTimedEvent;
timer.AutoReset = true;//重复执行
timer.Enabled = true;//启动定时器
Log.Info("浏览器COM服务启动成功");
}
else
{
Log.Info("串口类型不匹配");
}
}
catch (Exception ex1)
else
{
Log.Info("服务启动异常ex1: " + ex1.Message + "");
Log.Info("当前设备没有串口设备");
}
}
}
//打开COM口
public void OpenCOM(string comName)
{
// 设置COM口,波特率,奇偶校验,数据位,停止位
serialPort.PortName = comName; // 请替换为你的串口名称
serialPort.BaudRate = 115200; // 设置波特率
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Handshake = Handshake.None;
serialPort.DtrEnable = true; //启用控制终端就续信号
serialPort.ReadTimeout = 50000;
//serialPort.RtsEnable = true; //启用请求发送信号
serialPort.NewLine = "\n";
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
if (!serialPort.IsOpen)
catch (Exception ex)
{
serialPort.Open();
Log.Info("服务启动异常ex: " + ex.Message + "");
}
Timer timer = new Timer(3000);//1秒钟的时间间隔
timer.Elapsed += OnTimedEvent;
timer.AutoReset = true;//重复执行
timer.Enabled = true;//启动定时器
Log.Info("浏览器COM服务启动成功");
}
//接受数据
public static string bsid = string.Empty;
public static string bsext = string.Empty;
public static string bspath = string.Empty;
public static bool sfjswc = false;
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
try
@ -82,7 +108,10 @@ namespace AKSWebBrowser.Common
if (_jsonstr.Contains("\n"))
{
jsonstr = jsontemp + _jsonstr;
jsontemp = string.Empty;
//向js发送数据
//CShaseBJavaScript(jsonstr);
//jsontemp = string.Empty;
//jsonstr = string.Empty;
}
else
{
@ -92,19 +121,9 @@ namespace AKSWebBrowser.Common
}
catch (Exception ex)
{
Log.Error("接受数据数据异常: " + ex.Message + "");
jsonstr= MainModel.str2Base64("{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" +"接受数据异常:"+ ex.Message + "\"}");
}
}
// 处理接收到的数据
private void ProcessReceivedData(byte[] data)
{
// 例如,打印出每个字节的值
foreach (byte b in data)
{
Log.Info("串口接收byte数据:" + b.ToString());
Log.Info("接受数据数据异常: " + ex.Message + "");
jsonstr = MainModel.str2Base64("{\"callback\":\"" + this.callback + "\",\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "接受数据数据超时:" + ex.Message + "\"}");
// CShaseBJavaScript(jsonstr);
}
}
@ -120,38 +139,63 @@ namespace AKSWebBrowser.Common
}
catch (Exception ex)
{
Log.Error("打开串口异常: " + ex.Message + "");
Log.Info("定时任务打开串口异常: " + ex.Message + "");
}
}
//发送数据
public string SendData(string data)
public string SendData(string data, string callback)
{
try
{
this.callback = callback;
if (serialPort.IsOpen)
{
jsonstr = string.Empty;
jsontemp = string.Empty;
jsonstr = string.Empty;
//写入数据并以换行符结束
serialPort.WriteLine(data);
Log.Info("发送数据成功: " + data + "");
while (string.IsNullOrEmpty(jsonstr))
{
Task.Delay(10).Wait();
Task.Delay(10).Wait();
}
return jsonstr;
}
else
{
return "";
//重新打开串口
OpenCOM();
if (serialPort.IsOpen)
{
jsontemp = string.Empty;
jsonstr = string.Empty;
//写入数据并以换行符结束
serialPort.WriteLine(data);
Log.Info("发送数据成功: " + data + "");
while (string.IsNullOrEmpty(jsonstr))
{
Task.Delay(10).Wait();
}
}
else
{
jsontemp = string.Empty;
jsonstr = string.Empty;
Log.Info("发送数据失败");
jsonstr = MainModel.str2Base64("{\"callback\":\"" + this.callback + "\",\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "串口未打开" + "\"}");
//CShaseBJavaScript(jsonstr);
}
}
}
catch (Exception ex)
{
Log.Error("发送数据异常3: " + ex.Message + "");
return "";
jsontemp = string.Empty;
jsonstr = string.Empty;
Log.Info("发送数据异常3: " + ex.Message + "");
jsonstr = MainModel.str2Base64("{\"callback\":\"" + this.callback + "\",\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "发送数据异常:" + ex.Message + "\"}");
//CShaseBJavaScript(jsonstr);
}
return jsonstr;
}
//关闭
@ -169,5 +213,109 @@ namespace AKSWebBrowser.Common
Log.Error("关闭异常: " + ex.Message + "");
}
}
/// <summary>
/// COM接收文件
/// </summary>
public void NewMethod1(SerialPort sp, string path)
{
byte[] buffer = new byte[sp.ReadBufferSize];
int bytesRead = sp.Read(buffer, 0, buffer.Length);
using (FileStream fileStream = new FileStream(path, FileMode.Append))
{
fileStream.Write(buffer, 0, bytesRead);
fileStream.Close();
fileStream.Dispose();
}
}
/// <summary>
/// COM口公共发送文件
/// </summary>
/// <param name="url"></param>
public void NewMethod(string url, string id)
{
string ext = Path.GetExtension(url);
serialPort.WriteLine("Start_" + id + "_" + ext);
// 发送端
byte[] documentBytes = File.ReadAllBytes(url);
serialPort.Write(documentBytes, 0, documentBytes.Length);
serialPort.WriteLine("End");
}
//向js传输数据
public void CShaseBJavaScript(string param)
{
Task.Run(async () =>
{
param = MainModel.Base64str2(param);
Log.Info("返回数据:" + param);
JObject jo = (JObject)JsonConvert.DeserializeObject(param);
bool fieldExists = jo.ContainsKey("callback");
if (fieldExists)
{
string callback = jo["callback"].ToString();
Log.Info("回调js方法:" + callback);
string _parm = callback + "('" + param + "')";
await Parame.webBrowser.ExecuteJavaScript(_parm);
}
else
{
Log.Info("回调js方法为空");
}
});
}
//执行命令
public void LinuxCmd(string command)
{
command = $"echo 'aks@123456' sudo -S chmod 777 {command}";
Log.Info("执行命令:" + command);
// 启动进程
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "/bin/bash",
Arguments = $"-c \"{command}\"",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
}
};
process.Start();
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
process.WaitForExit();
Log.Info("执行命令结果返回:" + output);
Log.Info("执行命令错误结果返回:" + error);
}
//执行命令返回数组
public string[] LinuxCmdArea(string command)
{
// 使用ProcessStartInfo设置启动参数
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "/bin/bash", // 指定bash shell
Arguments = $"-c \"{command}\"", // 要执行的命令
RedirectStandardOutput = true, // 重定向标准输出
UseShellExecute = false, // 不使用系统外壳程序启动
CreateNoWindow = true // 不创建新窗口
};
// 启动进程
using (Process process = Process.Start(startInfo))
{
using (System.IO.StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd(); // 读取全部输出
return result.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); // 转换为字符串数组
}
}
}
}
}

21
CPF_Cef/Common/Utils.cs

@ -0,0 +1,21 @@
using CPF.Controls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AksWebBrowser.Common
{
public class Utils
{
/// <summary>
/// 消息弹框
/// </summary>
/// <param name="mes"></param>
public static void MessagesBox(string mes) {
MessageBox.ShowSync(mes);
}
}
}

38
CPF_Cef/CusWebBrowser.cs

@ -1,9 +1,12 @@
using CPF;
using CPF.Cef;
using CPF.Cef.JSExtenstions;
using CPF.Mac.CoreText;
using CPF.Reflection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.ConstrainedExecution;
using System.Text;
using System.Threading.Tasks;
@ -19,6 +22,8 @@ namespace AKS.EnterpriseLibrary.WebBrowser
{
CpfCefClient cefClient = base.OnCreateWebBrowser(settings);
cefClient.RequestHandler = CusRequest;
cefClient.ContextMenuHandler = new MenuHandler();
cefClient.DragHandler = new DragHandler();
return cefClient;
}
}
@ -36,4 +41,37 @@ namespace AKS.EnterpriseLibrary.WebBrowser
return null;
}
}
public class DragHandler : CpfCefDragHandler
{
protected override bool OnDragEnter(CefBrowser browser, CefDragData dragData, CefDragOperationsMask mask)
{
return true;
}
protected override void OnDraggableRegionsChanged(CefBrowser browser, CefFrame frame, CefDraggableRegion[] regions)
{
}
}
public class MenuHandler : CpfCefContextMenuHandler
{
protected override void OnBeforeContextMenu(CefBrowser browser, CefFrame frame, CefContextMenuParams state, CefMenuModel model)
{
model.Clear();
}
protected override bool OnContextMenuCommand(CefBrowser browser, CefFrame frame, CefContextMenuParams state, int commandId, CefEventFlags eventFlags)
{
return false;
}
protected override void OnContextMenuDismissed(CefBrowser browser, CefFrame frame)
{
}
protected override bool RunContextMenu(CefBrowser browser, CefFrame frame, CefContextMenuParams parameters, CefMenuModel model, CefRunContextMenuCallback callback)
{
return false;
}
}
}

94
CPF_Cef/FrmMain.cs

@ -1,27 +1,25 @@
using AksWebBrowser;
using AKSWebBrowser.Commen;
using CPF;
using CPF.Animation;
using CPF.Cef;
using CPF.Charts;
using CPF.Controls;
using CPF.Drawing;
using CPF.Platform;
using CPF.Shapes;
using CPF.Styling;
using CPF.Svg;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using AKSWebBrowser.Commen;
using System.Collections.Generic;
using System.Reflection.Metadata;
using AksWebBrowser.Common;
namespace AKS.EnterpriseLibrary.WebBrowser
{
public class FrmMain : Window
{
protected override void InitializeComponent()
{
LoadStyleFile("res://AksWebBrowser/StyleSheet.css");
@ -43,7 +41,7 @@ namespace AKS.EnterpriseLibrary.WebBrowser
new CusWebBrowser
{
PresenterFor = this,
Name = nameof(webBrowser),
Name = nameof(Parame.webBrowser),
Bindings =
{
{
@ -64,7 +62,6 @@ namespace AKS.EnterpriseLibrary.WebBrowser
);
}
private TextBox textBox;
private CusWebBrowser webBrowser;
protected override async void OnInitialized()
{
//窗体大小
@ -72,35 +69,37 @@ namespace AKS.EnterpriseLibrary.WebBrowser
this.Height = 1920;
//SetTaskStatus.Hidetask();
base.OnInitialized();
webBrowser = FindPresenterByName<CusWebBrowser>(nameof(webBrowser));
Parame.webBrowser = FindPresenterByName<CusWebBrowser>(nameof(Parame.webBrowser));
textBox = FindPresenterByName<TextBox>(nameof(textBox));
webBrowser.CusRequest.CusResquestEvent += CusRequest_CusResquestEvent;
Parame.webBrowser.CusRequest.CusResquestEvent += CusRequest_CusResquestEvent;
//浏览器大小
webBrowser.Width = 1080;
webBrowser.Height = 1920;
webBrowser.Url = "http://192.168.0.57:5173/";
//webBrowser.Url = Application.StartupPath + @"\html\index.html";
Parame.webBrowser.Width = 1080;
Parame.webBrowser.Height = 1920;
Parame.webBrowser.Url = "http://192.168.0.34:8078/#/main-out";
//Parame.webBrowser.Url = Application.StartupPath + @"\html\index.html";
//开发者工具暂时只能支持Windows
//webBrowser.ShowDev();
//SetTaskStatus.Showtask();
webBrowser.LoadEnd += WebBrowser_LoadEnd;
Parame.webBrowser.LoadEnd += WebBrowser_LoadEnd;
this.Closing += MainWindow_Closing;
}
//关闭事件
private void MainWindow_Closing(object sender, ClosingEventArgs e)
{
MainModel.KillProcessByName("AksWebBrowser");
new MainModel().CLoseCOM();
MainModel.KillProcessByName("AksWebBrowser");
}
bool showDev = true;
bool showDev = false;
private void WebBrowser_LoadEnd(object sender, LoadEndEventArgs e)
{
if (!showDev)
{
showDev = true;
webBrowser.ShowDev();
Parame.webBrowser.ShowDev();
}
//获取授权
GetSQObject();
}
public void Writelog(string str, string dirName = @"logs")
@ -148,7 +147,56 @@ namespace AKS.EnterpriseLibrary.WebBrowser
//调用JS内的JS方法
async void InvokeJS(CpfObject obj, RoutedEventArgs eventArgs)
{
var r = await webBrowser.ExecuteJavaScript("callback('调用绑定到JS里的C#方法')");
var r = await Parame.webBrowser.ExecuteJavaScript("callback('调用绑定到JS里的C#方法')");
}
/// <summary>
/// 或者可以用授权接口
/// </summary>
public void GetSQObject()
{
Task.Run(async () =>
{
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, $"{Parame.apiUrl}/api/Interface/Getlist?Ytjbm={Parame.key}");
var response = await client.SendAsync(request);
List<Func> list = new List<Func>();
if (response.StatusCode.ToString() == "200")
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
JObject jo = (JObject)JsonConvert.DeserializeObject(body);
if (jo["IsSucceed"].ToString() == "True")
{
string result = jo["result"].ToString();
if (!string.IsNullOrEmpty("result"))
{
JArray array = (JArray)JsonConvert.DeserializeObject(result);
foreach (JObject item in array)
{
Func func = new Func()
{
Id = item["Id"].ToString(),
Platform = item["Platform"].ToString(),
Interfaceaddress = item["Interfaceaddress"].ToString(),
};
list.Add(func);
}
}
else
{
Log.Info("未获取授权");
Utils.MessagesBox("未获取授权");
}
}
else
{
Log.Info("未获取授权");
Utils.MessagesBox("未获取授权");
}
}
Parame.FuncObject = list;
});
}
}
}

1033
CPF_Cef/MainModel.cs

File diff suppressed because it is too large Load Diff

25
CPF_Cef/Parame.cs

@ -0,0 +1,25 @@
using AKS.EnterpriseLibrary.WebBrowser;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AksWebBrowser
{
public class Parame
{
public static CusWebBrowser webBrowser { get; set; }
public static List<Func> FuncObject { get; set; }
//接口地址
public static string apiUrl = "http://192.168.0.34:92";
//授权key
public static string key = "1";
}
public struct Func
{
public string Id { get; set; }
public string Platform { get; set; }
public string Interfaceaddress { get; set; }
};
}

2
CPF_Cef/Program.cs

@ -27,7 +27,7 @@ namespace AKS.EnterpriseLibrary.WebBrowser
{
return;
}
CefRuntime.Initialize(mainArgs, new CefSettings { }, app, IntPtr.Zero);
CefRuntime.Initialize(mainArgs, new CefSettings{ }, app, IntPtr.Zero);
var model = new MainModel();
Application.Run(new FrmMain { DataContext = model, CommandContext = model });

Loading…
Cancel
Save