diff --git a/CPF_Cef/AKS.EnterpriseLibrary.WebBrowser.csproj b/CPF_Cef/AKS.EnterpriseLibrary.WebBrowser.csproj index 9e4a5de..077af2d 100644 --- a/CPF_Cef/AKS.EnterpriseLibrary.WebBrowser.csproj +++ b/CPF_Cef/AKS.EnterpriseLibrary.WebBrowser.csproj @@ -1,4 +1,4 @@ - + WinExe diff --git a/CPF_Cef/Common/ChunkedUpload.cs b/CPF_Cef/Common/ChunkedUpload.cs index f6f9759..935c3c2 100644 --- a/CPF_Cef/Common/ChunkedUpload.cs +++ b/CPF_Cef/Common/ChunkedUpload.cs @@ -9,6 +9,8 @@ using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; using CPF.Controls; +using AKSWebBrowser.Commen; +using System.Collections; namespace AksWebBrowser.Common { @@ -54,5 +56,65 @@ namespace AksWebBrowser.Common } return ret; } + + /// + /// get请求 Task + /// + /// + + public async Task getReq(string query) + { + string ret = string.Empty; + using (var httpClient = new HttpClient()) + { + // 构建带参数的请求URI + var uri = Parame.gpyUrl + query; + try + { + // 发送GET请求 + HttpResponseMessage response = await httpClient.GetAsync(uri); + response.EnsureSuccessStatusCode(); + if (response.StatusCode.ToString() == "OK") + { + // 读取响应内容 + string body = await response.Content.ReadAsStringAsync(); + ret = body; + } + } + catch (HttpRequestException e) + { + Log.Error(" get请求: " + e.Message); + } + } + return ret; + } + + /// + /// 获取签字版数据 + /// + /// + public async Task PostSign() { + string ret = string.Empty; + try + { + var client = new HttpClient(); + var request = new HttpRequestMessage(HttpMethod.Post, "http://127.0.0.1:9399/device"); + var content = new StringContent("{\r\n command: \"sign\",\r\n command_num: 111,\r\n data: {\r\n operation: \"open\",\r\n operation_code: 1,\r\n parameters: {\r\n data_type: 1,\r\n title_name: \"\",\r\n }\r\n }\r\n }", null, "text/plain"); + request.Content = content; + var response = await client.SendAsync(request); + response.EnsureSuccessStatusCode(); + if (response.StatusCode.ToString() == "OK") + { + // 读取响应内容 + string body = await response.Content.ReadAsStringAsync(); + ret = body; + } + } + catch (Exception ex) + { + Log.Error("签字版post请求: " + ex.Message); + } + return ret; + } } } diff --git a/CPF_Cef/Common/IDCardModel.cs b/CPF_Cef/Common/IDCardModel.cs new file mode 100644 index 0000000..ffe1110 --- /dev/null +++ b/CPF_Cef/Common/IDCardModel.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AksWebBrowser.Common +{ + public class IDCardModel + { + public string Name { get; set; } + public string Sex { get; set; } + public string Nation_Code { get; set; } + public string Nation { get; set; } + public string Id { get; set; } + public string BirthDay { get; set; } + public string Addr { get; set; } + public string Regorg { get; set; } + public string StartDate { get; set; } + public string EndDate { get; set; } + public string Reserv { get; set; } + public string WltFileName { get; set; } + public string BmpFilePath { get; set; } + public string Status { get; set; } + public string ImageBase64 { get; set; } + } +} diff --git a/CPF_Cef/Common/Utils.cs b/CPF_Cef/Common/Utils.cs index 434f5a7..94d1574 100644 --- a/CPF_Cef/Common/Utils.cs +++ b/CPF_Cef/Common/Utils.cs @@ -1,12 +1,8 @@ -using CPF.Controls; -using CPF.Windows; -using NAudio.Wave; +using AKSWebBrowser.Commen; +using CPF.Controls; using System; -using System.Collections.Generic; +using System.Drawing; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace AksWebBrowser.Common { diff --git a/CPF_Cef/Devices/IDCard.cs b/CPF_Cef/Devices/IDCard.cs new file mode 100644 index 0000000..c2ae26e --- /dev/null +++ b/CPF_Cef/Devices/IDCard.cs @@ -0,0 +1,206 @@ +using AksWebBrowser.Common; +using AKSWebBrowser.Commen; +using CPF.Linux; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; +using static CPF.Mac.CoreMedia.CMTime; + +namespace AksWebBrowser.Devices +{ + public class IDCard + { + public static long icdev = -1; + public IDCard() + { + //打开设备 + icdev = LibClass.ICReaderOpenUsbByFD(0); + //读序列号 + byte[] pVer = new byte[64]; + LibClass.ICReaderReadDevSnr(Convert.ToInt32(icdev), 20, pVer); + //获取版本 + LibClass.ICReaderGetVer(Convert.ToInt32(icdev), pVer); + //蜂鸣器 + LibClass.ICReaderBeep(icdev, 1, 1, 1); + + } + /// + /// 获取身份证 + /// + /// + public string getIdCard() + { + try + { + if (icdev > 0) + { + IDCardModel iDCardModel = new IDCardModel(); + int iLen = 0; + byte[] id = new byte[260]; + int status = LibClass.GetIDCardUID(Convert.ToInt32(icdev), ref iLen, id); + byte[] pID = new byte[64]; + LibClass.Hex2Asc(id, pID, iLen); + byte[] CHMsg = new byte[260]; + byte[] PHMsg = new byte[1032]; + byte[] FPMsg = new byte[1032]; + int cLen = 0, pLen = 0, fLen = 0; + status = LibClass.ReadIDCardBaseMsg(Convert.ToInt32(icdev), 1, CHMsg, ref cLen, PHMsg, ref pLen, FPMsg, ref fLen); + if (status == 0) + { + //获取图片 + byte[] FileName = new byte[65536]; + status = LibClass.ParseIDCardPic(PHMsg, 1024, 3, FileName); + if (status == 0) + { + iDCardModel.ImageBase64 = Encoding.UTF8.GetString(FileName); + + } + byte[] sCHMsg = new byte[520]; + int itype = 0; + status = LibClass.ParseIDCardInfo(CHMsg, cLen, ref itype, sCHMsg); + if (status == 0) + { + string[] baseinfo = Encoding.UTF8.GetString(sCHMsg).Split("|"); + iDCardModel.Name = baseinfo[0]; + iDCardModel.Sex = baseinfo[1]; + iDCardModel.Nation = baseinfo[2]; + iDCardModel.BirthDay = baseinfo[3]; + iDCardModel.Addr = baseinfo[4]; + iDCardModel.Id = baseinfo[5]; + iDCardModel.Regorg = baseinfo[6]; + iDCardModel.StartDate = baseinfo[7]; + iDCardModel.EndDate = baseinfo[8]; + } + //关闭 + LibClass.ICReaderClose(icdev); + return "{\"message\":\"seccse\",\"code\":\"200\",\"status\":true,\"data\":\"" + JsonConvert.SerializeObject(iDCardModel) + "\"}"; + } + else + { + //关闭 + LibClass.ICReaderClose(icdev); + return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "读取身份证失败" + "\"}"; + } + } + else + { + //关闭 + LibClass.ICReaderClose(icdev); + return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "读取身份证失败" + "\"}"; + } + } + catch (Exception ex) + { + Log.Info("获取身份证异常:" + ex.Message); + if (icdev != -1) + { + LibClass.ICReaderClose(icdev); + } + return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; + } + } + + // 转化字节码 + public static string BytesToString(byte[] characters) + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + var encoding = Encoding.UTF8; + string constructedString = encoding.GetString(characters); + + constructedString = constructedString.Trim(new char[] { '\'', '\"', '\\', '\0', '\a', '\b', '\f', '\n', '\r', '\t', '\v' }); + return (constructedString); + } + } +} + +class LibClass +{ + /// + /// //打开设备 默认成0 + /// + /// + /// + [DllImport("libtmz", EntryPoint = "ICReaderOpenUsbByFD", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] + public static extern long ICReaderOpenUsbByFD(int uiFD); + /// + /// //关闭设备 + /// + /// + /// + [DllImport("libtmz", EntryPoint = "ICReaderClose", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] + public static extern int ICReaderClose(long icdev); + /* + * 0 正常 + 1 接触卡通道异常 + 2 非接卡通道异常 + 3 接触卡和非接卡通道异常 + 4 安全模块通道异常 + 5 接触卡和安全模块通道异常 + 6 非接卡和安全模块通道异常 + 7 接触卡、非接卡和安全模块通道异常 + */ + [DllImport("libtmz", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int ICReaderDevStatus(long icdev, ref int uStatus); //获取设备状态 + //uLEDCtrl,默认 0;低半字节:0-关,1-开,2-闪烁;如控制灯 2 开: 0x21 + //uDelay:闪烁间隔时间,单位:50ms,如 1 代表闪烁间隔时间为 50ms. + [DllImport("libtmz", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int ICReaderLEDCtrl(long icdev, int uLEDCtrl, int uDelay); //灯光状态 + //获取身份证 UID + [DllImport("libtmz", EntryPoint = "GetIDCardUID", SetLastError = true, + CharSet = CharSet.Auto, ExactSpelling = false, + CallingConvention = CallingConvention.StdCall)] + //说明: 获取身份证UID + public static extern int GetIDCardUID(int icdev, ref int uLen, [MarshalAs(UnmanagedType.LPArray)] byte[] pIDData); + + [DllImport("libtmz", EntryPoint = "ReadIDCardBaseMsg", SetLastError = true, + CharSet = CharSet.Auto, ExactSpelling = false, + CallingConvention = CallingConvention.StdCall)] + //说明: 获取身份证原始数据 + public static extern int ReadIDCardBaseMsg(int icdev, int iFlag, [MarshalAs(UnmanagedType.LPArray)] byte[] pucCHMsg, ref int puiCHMsgLen, [MarshalAs(UnmanagedType.LPArray)] byte[] pucPHMsg, ref int puiPHMsgLen, [MarshalAs(UnmanagedType.LPArray)] byte[] pucFPMsg, ref int puiFPMsgLen); + + //蜂鸣器 + [DllImport("libtmz", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int ICReaderBeep(long icdev, int uMsec, int uDelay, int uNum); + + [DllImport("libtmz", EntryPoint = "ICReaderReadDevSnr", SetLastError = true, + CharSet = CharSet.Auto, ExactSpelling = false, + CallingConvention = CallingConvention.StdCall)] + //说明: 获取设备序列号 + public static extern int ICReaderReadDevSnr(int icdev, int rLen, [MarshalAs(UnmanagedType.LPArray)] byte[] pVer); + + [DllImport("libtmz", EntryPoint = "ICReaderGetVer", SetLastError = true, + CharSet = CharSet.Auto, ExactSpelling = false, + CallingConvention = CallingConvention.StdCall)] + //说明: 获取设备版本号 + public static extern int ICReaderGetVer(int icdev, [MarshalAs(UnmanagedType.LPArray)] byte[] pVer); + + //说明: 解析身份证文字信息 + [DllImport("libtmz", EntryPoint = "ParseIDCardInfo", SetLastError = true, + CharSet = CharSet.Auto, ExactSpelling = false, + CallingConvention = CallingConvention.StdCall)] + public static extern int ParseIDCardInfo(byte[] pucCHMsg, int puiCHMsgLen, ref int iType, [MarshalAs(UnmanagedType.LPArray)] byte[] pSFZInfo); + + //说明: 解析身份证照片信息 + [DllImport("libtmz", EntryPoint = "ParseIDCardPic", SetLastError = true, + CharSet = CharSet.Auto, ExactSpelling = false, + CallingConvention = CallingConvention.StdCall)] + public static extern int ParseIDCardPic(byte[] pucPHMsg, int puiPHMsgLen, int iBmpFormat, byte[] pBmpFile); + + [DllImport("libtmz", EntryPoint = "Hex2Asc", SetLastError = true, + CharSet = CharSet.Auto, ExactSpelling = false, + CallingConvention = CallingConvention.StdCall)] + //说明: 16进制 转ASCII字符串 + public static extern int Hex2Asc(byte[] hex, [MarshalAs(UnmanagedType.LPArray)] byte[] asc, int hexlen); + + + + [DllImport("libtmz", EntryPoint = "ReadIDCardBaseInfo", SetLastError = true, + CharSet = CharSet.Auto, ExactSpelling = false, + CallingConvention = CallingConvention.StdCall)] + public static extern int ReadIDCardBaseInfo(int icdev, int iFlag, int iBmpFormat, byte[] pBmpFile, ref int iType, [MarshalAs(UnmanagedType.LPArray)] byte[] pSFZInfo, [MarshalAs(UnmanagedType.LPArray)] byte[] pFingerInfo); +} \ No newline at end of file diff --git a/CPF_Cef/Devices/SignDll.cs b/CPF_Cef/Devices/SignDll.cs index 0049ef1..bd28989 100644 --- a/CPF_Cef/Devices/SignDll.cs +++ b/CPF_Cef/Devices/SignDll.cs @@ -1,210 +1,130 @@ -using AKSWebBrowser.Commen; +using AksWebBrowser; +using AksWebBrowser.Common; +using AKSWebBrowser.Commen; using System; using System.Globalization; using System.IO; using System.Runtime.InteropServices; using System.Text; -//0816加实时报点 -[StructLayout(LayoutKind.Sequential)] +using System.Threading.Tasks; public struct TOUCH_INFO { - public int X; - public int Y; - public int Pressure; - public int SN; public int btnID;//5寸 确定 重签 取消按钮 } namespace DevicesService.Devices { - - public class SignDll { - //public static PointF endPos; - //public static PointF beginPos; - //public static PointF frontPos; - //private static int xypointcount = 0; - //private static int[] lastpointx = new int[3]; - //private static int[] lastpointy = new int[3]; - //Point mPoint = new Point(-1, -1); - //private static System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Red); - //private Graphics mGraphicsBuffer; - //private static Pen pen = new Pen(Color.Black); // public static int status = -1; - //private static Bitmap bitmap = new Bitmap(594, 392); + public static string callback; public SignDll() + { + //OpenSDK(); + } + //打开签字版 + public void OpenSDK() { try { - //endPos = new PointF(-1F, -1f); - //beginPos = new PointF(-1F, -1f); - //frontPos = new PointF(-1F, -1f); - //lastpointx[0] = -1; - //lastpointy[0] = -1; - //lastpointx[1] = -1; - //lastpointy[1] = -1; - //lastpointx[2] = -1; - //lastpointy[2] = -1; - //xypointcount = 0; + status = FiveInchDll.GWQ_Init(); + Log.Info("初始化SDK:" + status.ToString()); + string UIFile = System.IO.Directory.GetCurrentDirectory(); + UIFile = UIFile + @"/aks/adv_ui.jpg"; + FiveInchDll.GWQ_SetImage(UIFile); + FiveInchDll.GWQ_ShowImage(); + //加载回调 + FiveInchDll.GWQ_setCallback(callback_str_receive); + FiveInchDll.GWQ_OnOffPointReporting(0); + //FiveInchDll.GWQ_setSignatureData(callback_signatureData); } - catch (Exception ex) { } + catch (Exception ex) { Log.Error(ex.Message); } finally { } } - public static void DevGetTouchNumber(int number) + public void callback_str_receive(int number, byte[] data, byte[] path) { try { - Log.Info(number.ToString()); + //Log.Info(number.ToString()); //1 签字确定按钮 2签字取消按钮 3 签字重签按钮(清空界面) - if (number == 1) + if (number == 0x10) { - int ret = FiveInchDll.ComSignOK(); - Log.Info("ComSignOK:" + ret); - FiveInchDll.ComSetBackGroundAdv(); + //確認 + int ret = FiveInchDll.GWQ_GetImage(); + Log.Info("GWQ_GetImage:" + ret); + FiveInchDll.GWQ_ShowImage(); } - else if (number == 3) + else if (number == 0x40) { - string UIFile = Environment.CurrentDirectory + @"/sign_ui.jpg"; - int ret = FiveInchDll.ComSetSignBackgroundImage(UIFile); - Log.Info("ComSetSignBackgroundImage:" + ret); + //重簽 + int ret = FiveInchDll.GWQ_ReSign(); + Log.Info("GWQ_ReSign:" + ret); } - else + else if (number == 0xB0) { - //lastpointx[0] = -1; - //lastpointy[0] = -1; - //lastpointx[1] = -1; - //lastpointy[1] = -1; - //lastpointx[2] = -1; - //lastpointy[2] = -1; - FiveInchDll.ComSetBackGroundAdv(); + //Task.Run(async () => + //{ + // Log.Info(callback); + // Log.Info(path); + // byte[] img = File.ReadAllBytes(path); + // string base64 = Convert.ToBase64String(img); + // Log.Info(base64); + // //完成圖片保存 + // string result = "{\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"png\",\"data\":\"" + base64 + "\"}"; + // Log.Info(result); + // string _parm = callback + "('" + result + "')"; + // await Parame.webBrowser.ExecuteJavaScript(_parm); + //}); + + } + else if (number == 0x30) + { + //取消 + FiveInchDll.GWQ_ShowImage(); } } - catch { } + catch (Exception ex) { Log.Error(ex.Message); } finally { } } //0816加报点 - public static void GetTouchPoint(TOUCH_INFO[] info1) + public void callback_signatureData(int x, int y, int p, int sn) { return; } //打开签字版 - public static int OpenComDevice() + public void OpenComDevice(string _callback) { - //GetTouchNumber m_GetTouchCB = new(DevGetTouchNumber); try { - status = FiveInchDll.OpenComDevice(DevGetTouchNumber); - Log.Info(status.ToString()); - //Console.WriteLine("OpenComDevice:" + status); - //清空界面 - // GetTouchNumber(2); - if (status == 0) - { - //关闭报点 - int ret = FiveInchDll.ComSendPoint(0, GetTouchPoint); - Log.Info(ret.ToString()); - if (true) - { - string UIFile = Environment.CurrentDirectory + @"/adv_ui.jpg"; - Log.Info(UIFile.ToString()); - int ret1 = FiveInchDll.ComSendAdvantageImage(UIFile); - Log.Info(ret1.ToString()); - // Console.WriteLine("ComSendAdvantageImage:" + ret1); - FiveInchDll.ComSetBackGroundAdv(); - } - - if (true) - { - string UIFile = Environment.CurrentDirectory + @"/sign_ui.jpg"; - Log.Info(UIFile.ToString()); - int ret1 = FiveInchDll.ComSetSignBackgroundImage(UIFile); - Log.Info(ret1.ToString()); - //Console.WriteLine("ComSetSignBackgroundImage:" + ret1); - } - } - ////status = FiveInchDll.OpenComDevice(DevGetTouchNumber); - //if (status == -1) - //{ - // status = FiveInchDll.OpenComDevice(DevGetTouchNumber); - // Log.Info(status.ToString()); - // //Console.WriteLine("OpenComDevice:" + status); - // //清空界面 - // // GetTouchNumber(2); - // if (status == 0) - // { - // //关闭报点 - // int ret = FiveInchDll.ComSendPoint(0, GetTouchPoint); - // Log.Info(ret.ToString()); - // if (true) - // { - // string UIFile = Environment.CurrentDirectory + @"/adv_ui.jpg"; - // Log.Info(UIFile.ToString()); - // int ret1 = FiveInchDll.ComSendAdvantageImage(UIFile); - // Log.Info(ret1.ToString()); - // // Console.WriteLine("ComSendAdvantageImage:" + ret1); - // FiveInchDll.ComSetBackGroundAdv(); - // } - - // if (true) - // { - // string UIFile = Environment.CurrentDirectory + @"/adv_ui.jpg"; - // Log.Info(UIFile.ToString()); - // int ret1 = FiveInchDll.ComSetSignBackgroundImage(UIFile); - // Log.Info(ret1.ToString()); - // //Console.WriteLine("ComSetSignBackgroundImage:" + ret1); - // } - // } - //} - //else - //{ - // //清空界面 - // //GetTouchNumber(2); - // if (status == 0) - // { - // //关闭报点 - // int ret = FiveInchDll.ComSendPoint(0, GetTouchPoint); - // if (true) - // { - // string UIFile = Environment.CurrentDirectory + @"/adv_ui.jpg"; - // int ret1 = FiveInchDll.ComSendAdvantageImage(UIFile); - // //Console.WriteLine("ComSendAdvantageImage:" + ret1); - // FiveInchDll.ComSetBackGroundAdv(); - // } - - // if (true) - // { - // string UIFile = Environment.CurrentDirectory + @"/adv_ui.jpg"; - // int ret1 = FiveInchDll.ComSetSignBackgroundImage(UIFile); - // //Console.WriteLine("ComSetSignBackgroundImage:" + ret1); - // } - // } - //} + callback = _callback; + OpenSDK(); + FiveInchDll.GWQ_SwitchLanguage(0); } - catch { } + catch (Exception ex) { Log.Error(ex.Message); } finally { } - return status; } - //关闭签字版 - public static int CloseComDevice() + //釋放簽字版 + public int ReleaseComDevice() { int ret = -1; - try - { - if (status == 0) - { - ret = FiveInchDll.CloseComDevice(); - if (ret == 0) - { - status = -1; - } - } - } - catch { } - finally { } + //try + //{ + // if (status == 0) + // { + // ret = FiveInchDll.GWQ_Release(); + // if (ret == 0) + // { + // status = -1; + // //取消 + // FiveInchDll.GWQ_ShowImage(); + // } + // } + //} + //catch { } + //finally { } return ret; } } @@ -213,48 +133,56 @@ namespace DevicesService.Devices { [System.Runtime.InteropServices.UnmanagedFunctionPointerAttribute(System.Runtime.InteropServices.CallingConvention.StdCall)] - public delegate void GetTouchNumber(int number); + public delegate void callback_str_receive(int type, byte[] data, byte[] path);// (int number); + [System.Runtime.InteropServices.UnmanagedFunctionPointerAttribute(System.Runtime.InteropServices.CallingConvention.StdCall)] + public delegate void callback_signatureData(int x, int y, int p, int sn); //0816加报点 [System.Runtime.InteropServices.UnmanagedFunctionPointerAttribute(System.Runtime.InteropServices.CallingConvention.StdCall)] public delegate void TOUCH_INFO_FUNC([MarshalAs(UnmanagedType.LPArray, SizeConst = 160)] TOUCH_INFO[] info); - [DllImport("libdevice5_hid_sdk.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] - public static extern int ComSendPoint(int nState, [MarshalAs(UnmanagedType.FunctionPtr)] TOUCH_INFO_FUNC callback); //0816加报点 - - [DllImport("libdevice5_hid_sdk.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] - public static extern int OpenComDevice([MarshalAs(UnmanagedType.FunctionPtr)] GetTouchNumber callback); - - [DllImport("libdevice5_hid_sdk.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] - public static extern int CloseComDevice(); + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_Init(); //1.1SDK初始化 - [DllImport("libdevice5_hid_sdk.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] - public static extern int ComSetSignBackgroundImage(string UIFile); + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_Release();//SDK释放 [DllImport("libdevice5_hid_sdk.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] - public static extern int ComSetPictureSavePath(string PicturePath, int PicturePathLen); + public static extern int GWQ_DeviceOnline();//检查设备是否在线 - [DllImport("libdevice5_hid_sdk.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] - public static extern int ComSignOK(); + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_setCallback(callback_str_receive cb); + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_setSignatureData(callback_signatureData cb); - [DllImport("libdevice5_hid_sdk.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] - public static extern int ComSetPenStyle(int PenStyle); + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_SwitchLanguage(int language);//语言切换 + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_GetImage();//获取签字图片(用户点击确定后发送) - [DllImport("libdevice5_hid_sdk.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] - public static extern int ComGetDevSN(StringBuilder pDevSN, int iSync); + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_SetImage(string uifile);//设置签字图片 - [DllImport("libdevice5_hid_sdk.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] - public static extern int ComGetDevSN_Async(StringBuilder pDevSN); + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_ShowImage();//显示设置的图片 - [DllImport("libdevice5_hid_sdk.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] - public static extern int ComWhiteScreen(); + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_OnOffScreen(int type);//亮屏熄屏 1 熄屏 0亮屏 - [DllImport("libdevice5_hid_sdk.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] - public static extern int ComSendAdvantageImage(string UIFile); + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_Reboot();//重启设备 + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_ReSign();// 重新签字 + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_OnOffPointReporting(int type);//开启关闭报点(同屏报点) 1 开启 0关闭 - [DllImport("libdevice5_hid_sdk.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] - public static extern int ComSetBackGroundAdv(); + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_SetStartUpLogo(string path);//设置开机logo + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_SetSigningBackground(byte[] path, int len);//发送签字背景 + [DllImport("libdevice5_hid_sdk", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern int GWQ_SetSigningBackground2(byte[] path, int len);//设置开机logo } } diff --git a/CPF_Cef/MainModel.cs b/CPF_Cef/MainModel.cs index 3230e91..0e5fbc0 100644 --- a/CPF_Cef/MainModel.cs +++ b/CPF_Cef/MainModel.cs @@ -7,6 +7,8 @@ using CPF.Mac.AppKit; using DevicesService.Devices; using NAudio.Wave; using NAudio.Wave.SampleProviders; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json; using SkiaSharp; using System; using System.Buffers.Text; @@ -24,6 +26,7 @@ using System.Threading.Tasks; using System.Web; using System.Xml.Linq; using static System.Net.Mime.MediaTypeNames; +using AksWebBrowser.Devices; namespace AKS.EnterpriseLibrary.WebBrowser { @@ -35,6 +38,9 @@ namespace AKS.EnterpriseLibrary.WebBrowser public static Process recordingProcess; public static Process Typrocess; public TcpClients tcpClients = new TcpClients(); + public SignDll sign = new SignDll(); + + public bool isStart = true; /// /// 读取身份证卡号 /// @@ -45,25 +51,10 @@ namespace AKS.EnterpriseLibrary.WebBrowser { try { - if (!isFuncisFuncObject("IDCardRead")) - { - Utils.MessagesBox("读取身份证设备未授权使用"); - return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "读取身份证设备未授权使用" + "\"}"; - } - else if (Parame.tcpClient == null) - { - return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "硬件服务未启动" + "\"}"; - } - else - { - paramsString = "{\"callback\":\"" + callback + "\",\"type\":\"1\",\"param\":{\"data\":\"" + "" + "\"}}"; - //Log.Info("读取身份证卡号: " + paramsString + ""); - string base64 = str2Base64(paramsString); - string str = tcpClients.SendDataWithHeader(Parame.tcpClient.GetStream(), base64); - string result = Base64str2(str); - SubmitLogs(result, "IDCardRead"); - return result; - } + IDCard iDCard = new IDCard(); + string result = iDCard.getIdCard(); + SubmitLogs(result, "IDCardRead"); + return result; } catch (Exception ex) { @@ -87,6 +78,10 @@ namespace AKS.EnterpriseLibrary.WebBrowser { try { + if (isStart) + { + return "{\"message\":\"success\",\"code\":\"200\",\"status\":true,\"data\":\"" + "打印成功" + "\"}"; + } if (!isFuncisFuncObject("SendByPrint")) { Utils.MessagesBox("打印排队票据设备未授权使用"); @@ -131,6 +126,10 @@ namespace AKS.EnterpriseLibrary.WebBrowser { try { + if (isStart) + { + return "{\"message\":\"success\",\"code\":\"200\",\"status\":true,\"data\":\"" + "操作成功" + "\"}"; + } if (!isFuncisFuncObject("payleText")) { Utils.MessagesBox("文字语音播报设备未授权使用"); @@ -237,6 +236,10 @@ namespace AKS.EnterpriseLibrary.WebBrowser { try { + if (isStart) + { + return "{\"message\":\"success\",\"code\":\"200\",\"status\":true,\"data\":\"" + "操作成功" + "\"}"; + } if (!isFuncisFuncObject("SendSSM")) { Utils.MessagesBox("发送短信设备未授权使用"); @@ -276,78 +279,54 @@ namespace AKS.EnterpriseLibrary.WebBrowser { try { - if (!isFuncisFuncObject("openCamera")) + if (isStart) { - Utils.MessagesBox("高拍仪设备未授权使用"); - return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "高拍仪设备未授权使用" + "\"}"; + return "{\"message\":\"success\",\"code\":\"200\",\"status\":true,\"data\":\"" + "操作成功" + "\"}"; } - else if (Parame.tcpClient == null) + + else { - tcpClients = new TcpClients(); - if (Parame.tcpClient != null) + //获取设备信息 + string devIndex = GetSnIndex(); + if (string.IsNullOrEmpty(devIndex)) + { + string result = "{\"callback\":\"" + callback + "\",\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"suffix\":\"jpg\",\"data\":\"" + "扫描仪打开失败" + "\"}"; + SubmitLogs(result, "openCamera"); + return result; + } + else { - string paramsString = "{\"callback\":\"" + callback + "\",\"type\":\"5\",\"param\":{\"url\":\"" + url + "\"}}"; - //Log.Info("打开高拍仪并且进行快速扫描文件: " + paramsString + ""); - string base64 = str2Base64(paramsString); - string str = tcpClients.SendDataWithHeader(Parame.tcpClient.GetStream(), base64); - string data = Base64str2(str); - if (data == "400" || data.Contains("fali")) + //打开高拍仪 + string param = OpenSn(devIndex); + if (string.IsNullOrEmpty(param)) { - str = tcpClients.SendDataWithHeader(Parame.tcpClient.GetStream(), base64); - data = Base64str2(str); - if (data == "400" || data.Contains("fali")) + string result = "{\"callback\":\"" + callback + "\",\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"suffix\":\"jpg\",\"data\":\"" + "扫描仪打开失败" + "\"}"; + SubmitLogs(result, "openCamera"); + return result; + } + else + { + //拍照 + param = getFrame(); + if (string.IsNullOrEmpty(param)) { - string result = "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "扫描文件失败,请重新扫描!" + "\"}"; + string result = "{\"callback\":\"" + callback + "\",\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"suffix\":\"jpg\",\"data\":\"" + "获取图片失败" + "\"}"; SubmitLogs(result, "openCamera"); return result; } else { - string result = "{\"callback\":\"" + callback + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"jpg\",\"data\":\"" + str + "\"}"; + Task.Run(() => + { + //关闭 + StopSn(devIndex); + }); + string result = "{\"callback\":\"" + callback + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"jpg\",\"data\":\"" + param + "\"}"; SubmitLogs(result, "openCamera"); return result; } + } - else - { - string result = "{\"callback\":\"" + callback + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"jpg\",\"data\":\"" + str + "\"}"; - SubmitLogs(result, "openCamera"); - return result; - } - } - else { - return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "硬件服务未启动" + "\"}"; - } - } - else - { - string paramsString = "{\"callback\":\"" + callback + "\",\"type\":\"5\",\"param\":{\"url\":\"" + url + "\"}}"; - //Log.Info("打开高拍仪并且进行快速扫描文件: " + paramsString + ""); - string base64 = str2Base64(paramsString); - string str = tcpClients.SendDataWithHeader(Parame.tcpClient.GetStream(), base64); - string data = Base64str2(str); - if (data == "400" || data.Contains("fali")) - { - str = tcpClients.SendDataWithHeader(Parame.tcpClient.GetStream(), base64); - data = Base64str2(str); - if (data == "400" || data.Contains("fali")) - { - string result = "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "扫描文件失败,请重新扫描!" + "\"}"; - SubmitLogs(result, "openCamera"); - return result; - } - else - { - string result = "{\"callback\":\"" + callback + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"jpg\",\"data\":\"" + str + "\"}"; - SubmitLogs(result, "openCamera"); - return result; - } - } - else - { - string result = "{\"callback\":\"" + callback + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"jpg\",\"data\":\"" + str + "\"}"; - SubmitLogs(result, "openCamera"); - return result; } } } @@ -361,12 +340,12 @@ namespace AKS.EnterpriseLibrary.WebBrowser } /// - /// 打开签字版 + /// 打开签字版 sudo apt-get install libgdiplus /// /// /// [JSFunction] - public string OpenSign(string paramsString) + public string OpenSign(string paramsString, string callback) { try { @@ -375,24 +354,13 @@ namespace AKS.EnterpriseLibrary.WebBrowser Utils.MessagesBox("签字版设备未授权使用"); return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "签字版设备未授权使用" + "\"}"; } - else if (Parame.tcpClient == null) - { - return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "硬件服务未启动" + "\"}"; - } else { - paramsString = "{\"callback\":\"" + callback + "\",\"type\":\"6\",\"param\":{\"data\":\"" + "" + "\"}}"; - //Log.Info("打开签字版: " + paramsString + ""); - string base64 = str2Base64(paramsString); - string str = tcpClients.SendDataWithHeader(Parame.tcpClient.GetStream(), base64); - string result = Base64str2(str); + + sign.OpenComDevice(callback); + string result = "{\"callback\":\"" + callback + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"png\",\"data\":\"" + "成功" + "\"}"; SubmitLogs(result, "OpenSign"); return result; - - //SignDll.OpenComDevice(); - //string result = "{\"callback\":\"" + callback + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"png\",\"data\":\"" + "成功" + "\"}"; - //SubmitLogs(result, "OpenSign"); - //return result; } } catch (Exception ex) @@ -425,11 +393,15 @@ namespace AKS.EnterpriseLibrary.WebBrowser } else { - paramsString = "{\"callback\":\"" + callback + "\",\"type\":\"7\",\"param\":{\"data\":\"" + "" + "\"}}"; - //Log.Info("关闭签字版: " + paramsString + ""); - string base64 = str2Base64(paramsString); - string str = tcpClients.SendDataWithHeader(Parame.tcpClient.GetStream(), base64); - string result = Base64str2(str); + //paramsString = "{\"callback\":\"" + callback + "\",\"type\":\"7\",\"param\":{\"data\":\"" + "" + "\"}}"; + ////Log.Info("关闭签字版: " + paramsString + ""); + //string base64 = str2Base64(paramsString); + //string str = tcpClients.SendDataWithHeader(Parame.tcpClient.GetStream(), base64); + //string result = Base64str2(str); + //SubmitLogs(result, "OpenSign"); + //return result; + sign.ReleaseComDevice(); + string result = "{\"callback\":\"" + callback + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"png\",\"data\":\"" + "成功" + "\"}"; SubmitLogs(result, "OpenSign"); return result; } @@ -443,57 +415,6 @@ namespace AKS.EnterpriseLibrary.WebBrowser } } - /// - /// 获取签字版数据 - /// - /// - /// - [JSFunction] - public string GetSignData(string url) - { - try - { - if (!isFuncisFuncObject("OpenSign")) - { - Utils.MessagesBox("签字版设备未授权使用"); - return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "签字版设备未授权使用" + "\"}"; - } - else - { - string paramsString = "{\"callback\":\"" + callback + "\",\"type\":\"8\",\"param\":{\"url\":\"" + url + "\"}}"; - //Log.Info("获取签字版数据: " + paramsString + ""); - string base64 = str2Base64(paramsString); - string str = tcpClients.SendDataWithHeader(Parame.tcpClient.GetStream(), base64); - string data = Base64str2(str); - if (data == "400" || data.Contains("fali")) - { - string result = "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "获取签字失败" + "\"}"; - SubmitLogs(result, "OpenSign"); - return result; - } - else - { - string result = "{\"callback\":\"" + callback + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"png\",\"data\":\"" + str + "\"}"; - SubmitLogs(result, "OpenSign"); - return result; - } - - - - //string result = "{\"callback\":\"" + callback + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"png\",\"data\":\"" + "成功" + "\"}"; - //SubmitLogs(result, "OpenSign"); - //return result; - } - } - catch (Exception ex) - { - Log.Error("获取签字版数据异常: " + ex.Message + ""); - string result = "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; - SubmitLogs(result, "OpenSign"); - return result; - } - } - /// /// 开始录音、取消录音、结束录音 /// sudo apt-get update @@ -507,6 +428,10 @@ namespace AKS.EnterpriseLibrary.WebBrowser { try { + if (isStart) + { + return "{\"message\":\"success\",\"code\":\"200\",\"status\":true,\"data\":\"" + "操作成功" + "\"}"; + } if (!isFuncisFuncObject("SoundRecording")) { Utils.MessagesBox("录音设备未授权使用"); @@ -591,10 +516,6 @@ namespace AKS.EnterpriseLibrary.WebBrowser Utils.MessagesBox("打印机设备未授权使用"); return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "打印机设备未授权使用" + "\"}"; } - else if (Parame.tcpClient == null) - { - return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "硬件服务未启动" + "\"}"; - } else { Task.Run(async () => @@ -654,10 +575,6 @@ namespace AKS.EnterpriseLibrary.WebBrowser Utils.MessagesBox("打印机设备未授权使用"); return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "打印机设备未授权使用" + "\"}"; } - else if (Parame.tcpClient == null) - { - return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "硬件服务未启动" + "\"}"; - } else { Task.Run(async () => @@ -931,6 +848,253 @@ namespace AKS.EnterpriseLibrary.WebBrowser return result; } + /// + /// 获取设备index + /// + /// + public string GetSnIndex() + { + //获取设备信息 + string param = "/GetAllDisplayInfo"; + Task.Run(() => HttpResponse(param)); + @event6.WaitOne(); + if (string.IsNullOrEmpty(gpyStr)) + { + return ""; + } + else + { + JObject jo = (JObject)JsonConvert.DeserializeObject(gpyStr); + if (jo["returnCode"].ToString() == "0") + { + string result = jo["data"].ToString(); + Log.Info(result); + JArray jo1 = (JArray)JsonConvert.DeserializeObject(result); + string devidx = string.Empty; + string name = string.Empty; + foreach (JObject jo2 in jo1) + { + devidx = jo2["dev_idx"].ToString(); + name = jo2["name"].ToString(); + Log.Info(name); + break; + } + return devidx; + } + else + { + Log.Info(jo["returnMsg"].ToString()); + return ""; + } + } + } + + /// + /// 打开高拍仪 + /// + /// + public string OpenSn(string dev_idx) + { + //获取设备信息 + string param = "/StartPreview?dev_idx=" + dev_idx + "&res_id=0"; + Task.Run(() => HttpResponse(param)); + @event6.WaitOne(); + if (string.IsNullOrEmpty(gpyStr)) + { + return ""; + } + else + { + JObject jo = (JObject)JsonConvert.DeserializeObject(gpyStr); + if (jo["returnCode"].ToString() == "0") + { + return "200"; + } + if (jo["returnCode"].ToString() == "2") + { + return "200"; + } + else + { + Log.Info(jo["returnMsg"].ToString()); + return ""; + } + } + } + + /// + /// 关闭高拍仪 + /// + /// + public string StopSn(string dev_idx) + { + //获取设备信息 + string param = "/StopPreview?dev_idx=" + dev_idx; + Task.Run(() => HttpResponse(param)); + @event6.WaitOne(); + if (string.IsNullOrEmpty(gpyStr)) + { + return ""; + } + else + { + JObject jo = (JObject)JsonConvert.DeserializeObject(gpyStr); + if (jo["returnCode"].ToString() == "0") + { + return "200"; + } + else + { + Log.Info(jo["returnMsg"].ToString()); + return ""; + } + } + } + + /// + /// 拍照 + /// + /// + public string getFrame() + { + //获取设备信息 + string param = "/getFrame"; + Task.Run(() => HttpResponse(param)); + @event6.WaitOne(); + if (string.IsNullOrEmpty(gpyStr)) + { + return ""; + } + else + { + JObject jo = (JObject)JsonConvert.DeserializeObject(gpyStr); + if (jo["returnCode"].ToString() == "0") + { + string result = jo["data"].ToString(); + JObject jo1 = (JObject)JsonConvert.DeserializeObject(result); + return jo1["img"].ToString(); + } + else + { + Log.Info(jo["returnMsg"].ToString()); + return ""; + } + } + } + + /// + /// 右转 + /// + /// + public string RotateRight() + { + //获取设备信息 + string param = "/rotate/right"; + Task.Run(() => HttpResponse(param)); + @event6.WaitOne(); + if (string.IsNullOrEmpty(gpyStr)) + { + return ""; + } + else + { + JObject jo = (JObject)JsonConvert.DeserializeObject(gpyStr); + if (jo["returnCode"].ToString() == "0") + { + return "200"; + } + else + { + Log.Info(jo["returnMsg"].ToString()); + return ""; + } + } + } + + /// + /// 左转 + /// + /// + public string RotateLeft() + { + //获取设备信息 + string param = "/rotate/left"; + Task.Run(() => HttpResponse(param)); + @event6.WaitOne(); + if (string.IsNullOrEmpty(gpyStr)) + { + return ""; + } + else + { + JObject jo = (JObject)JsonConvert.DeserializeObject(gpyStr); + if (jo["returnCode"].ToString() == "0") + { + return "200"; + } + else + { + Log.Info(jo["returnMsg"].ToString()); + return ""; + } + } + } + + /// + /// 高拍仪 + /// + private string gpyStr = string.Empty; + private AutoResetEvent @event6 = new AutoResetEvent(false); + private async void HttpResponse(string param) + { + var httpClient = new HttpClient(); + var uploader = new ChunkedUpload(httpClient); + gpyStr = await uploader.getReq(param); + @event6.Set(); + } + + /// + /// 获取签字版base64 + /// + /// + public string GetSignBase64() + { + //获取设备信息 + + Task.Run(() => HttpPostResponseBySign()); + @event6.WaitOne(); + if (string.IsNullOrEmpty(qzbStr)) + { + return ""; + } + else + { + JObject jo = (JObject)JsonConvert.DeserializeObject(qzbStr); + if (jo["code"].ToString() == "0") + { + return jo["data"].ToString(); + } + else + { + Log.Info(jo["returnMsg"].ToString()); + return ""; + } + } + } + + /// + /// 签字版 + /// + private string qzbStr = string.Empty; + private AutoResetEvent @event7 = new AutoResetEvent(false); + private async void HttpPostResponseBySign() + { + var httpClient = new HttpClient(); + var uploader = new ChunkedUpload(httpClient); + qzbStr = await uploader.PostSign(); + @event7.Set(); + } + /// /// 初始文件上传 /// diff --git a/CPF_Cef/Parame.cs b/CPF_Cef/Parame.cs index 6dc3d36..3744879 100644 --- a/CPF_Cef/Parame.cs +++ b/CPF_Cef/Parame.cs @@ -19,6 +19,8 @@ namespace AksWebBrowser public static string key = "1"; //硬件Ip public static string Ip = "192.168.1.166"; + //高拍仪url + public static string gpyUrl = "http://127.0.0.1:6543"; } public struct Func {