using AksWebBrowser; using AksWebBrowser.Common; using AksWebBrowser.Devices; using AKSWebBrowser.Commen; using CPF.Cef; using CPF.Shapes; using CPF.Windows; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Security.Authentication; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Web; namespace AKS.EnterpriseLibrary.WebBrowser { public class MainModel : CPF.CpfObject { //初始化网络连接 public static void DeviceControllerInit() { List lit = new List(); SAEA.WebSocket.WSServer ws = new SAEA.WebSocket.WSServer(19983); ws.OnConnected += (s) => { string result = "{\"keycode\":\"" + "" + "\",\"message\":\"seccse\",\"code\":\"200\",\"status\":true,\"data\":\"连接成功\"}"; byte[] bytes = SerializeContent(result); ws.Reply(s.ToString(), new SAEA.WebSocket.Model.WSProtocal(SAEA.WebSocket.Type.WSProtocalType.Text, bytes)); Log.Error("请求连接" + s.ToString()); }; ws.OnMessage += (s, e) => { string content = Encoding.UTF8.GetString(e.Content); //读取参数 if (content != "ping" && !string.IsNullOrEmpty(content)) { //返回内容 string result = string.Empty; content = Base64str2(content); Log.Error("收到请求:" + s.ToString() + " 请求参数:" + content); if (!string.IsNullOrEmpty(content)) { try { var json = content.ConvertToAnonymousType(new { code = default(string) }); if (json != null) { //接收指令和参数 string keycode = json.code; switch (keycode) { //aks100101 //读取身份证卡号 {"code":"aks100101"} case "aks100101": result = IDCardRead(keycode); break; //aks100102 //打印排队票据 {"code":"aks100102","ph":"100101","ddrs":"中国检察","qrcode":"90087100100124433002","ywmc":"信访"} case "aks100102": result = SendByPrint(content); break; //aks100103 //文字语音播报 //播放:{ "code":"aks100103","text":"你好!","ispaye":false}, //停止播放:{ "code":"aks100104","text":"","ispaye":true} case "aks100103": result = payleText(content); break; //aks100104 //打开高拍仪并且进行快速扫描文件 {"code":"aks100104"} case "aks100104": result = openCamera(keycode); break; //aks100105 //打开签字版 {"code":"aks100105"} case "aks100105": result = "{\"keycode\":\"aks100105\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"png\",\"data\":\"iVBORw0KGgoAAAANSUhEUgAAAvQAAAEyCAYAAACVhUQiAAAgAElEQVR4AezBabOdVXqg6XsN77SHM0gIsuyojuroH+W0aaebxCBIAUJCs46OdJDQBAI0gBBmSMJZ4elDl/s32c4kkXSGPbzTWuvp3B3lClWVi2zbOWgfPddlRMShlFJKKaWUWkpGRBxKKaWUUkqppWRExKGUUkoppZRaSkZEHEoppZRSSqmlZETEoZRSSimllFpKRkQcSimllFJKqaVkRMShlFJKKaWUWkpGRBxKKaWUUkqppWRExKGUUkoppZRaSkZEHEoppZRSSqmlZETEoZRSSimllFpKRkQcSimllFJKqaVkRMShlFJKKaWUWkpGRBxKKaWUUkqppWRExKGUUkoppZRaSkZEHEoppZRSSqmlZETEoZRSSimllFpKRkQcSimllFJKqaVkRMShlFJKKaWUWkpGRBxKKaWUUkqppWRExKGUUkoppZRaSkZEHEoppZRSSqmlZETEoZRSSimllFpKRkQcSimllFJKqaVkRMShlFJKKaWUWkpGRBxKKaWUUkqppWRExKGUUkoppZRaSkZEHEoppZRSSqmlZETEoZRSSimllFpKRkQcSimllFJKqaVkRMShlFJKKaWUWkpGRBxKKaWUUkqppWRExKGUUkoppZRaSkZEHEoppZRSSqmlZETEoZRSSimllFpKRkQcSimllFJKqaVkRMShlFJKKaWUWkpGRBxKKaWUUkqppWRExKGUUkoppZRaSkZEHEoppZRSSqmlZETEoZRSSimllFpKRkQcSimllFJKqaVkRMShlFJKKaWUWkpGRBxKKaWUUkqppWRExKGUUkoppZRaSkZEHEoppZRSSqmlZETEoZRSSimllFpKRkQcSimllFJKqaVkRMShlFJKKaWUWkpGRBxKKaWUUkqppWRExKGUUkoppZRaSkZEHEoppZRSSqmlZETEoZRSSimllFpKRkQcSimllFJKqaVkRMShlFJKKaWUWkpGRBxKKaWUUkqppWRExKGUUkoppZRaSkZEHEoppZRSSqmlZETEoZRSSimllFpKRkQcSimllFJKqaVkRMShlFJKKaWUWkpGRBxKKaWUUkqppWRExKGUUkoppZRaSkZEHEoppZRSSqmlZETEoZRSSimllFpKRkQcSimllFJKqaVkRMShlFJKKaWUWkpGRBxK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\"}";// OpenSign(content); break; //aks100112 //关闭签字版 {"code":"aks100112"} case "aks100112": result = CloseSign(keycode); break; //aks100106 //指纹 {"code":"aks100106"} case "aks100106": result = ReadFingerData(keycode); break; //aks100107 开始录音、取消录音、结束录音 // 开始录音:{ "code":"aks100107","url":"","isopen":true} // 取消录音: { "code":"aks100107","url":"","isopen":false} // 结束录音: { "code":"aks100107","url":"http://127.0.0.1/Upload","isopen":false} case "aks100107": result = SoundRecording(content); break; //aks100108 //根据文件地址在线打印 { "code":"aks100108","url":"http://127.0.0.1/test.doc","ext":"doc"} case "aks100108": result = PrintFile(content); break; //aks100109 //根据文件base64打印(PDF) { "code":"aks100109","base64":"ADFJLAKSDJFLKASJF...","ext":"pdf"} case "aks100109": //result = PrintBase64(content); result = "{\"keycode\":\"" + "aks100109" + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"Base64打印保留原方式\"}"; break; //aks100110 //播放音频文件 { "code":"aks100110","url":"http://127.0.0.1/test.wav","ispaye":false} //停止播放音频文件 { "code":"aks100110","url":"","ispaye":true} case "aks100110": result = PalyFile(content); break; //aks100111 唤醒键盘 {"code":"aks100111"} case "aks100111": result = openKey(keycode); break; //aks100113 指纹 {"code":"aks100113"} case "aks100113": result = ReadFingerData(keycode); break; default: result = "{\"keycode\":\"" + "" + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"无效指令\"}"; break; } } else { result = "{\"keycode\":\"" + "hert" + "\",\"message\":\"seccse\",\"code\":\"400\",\"status\":true,\"data\":\"参数解析错误\"}"; } } catch { result = "{\"keycode\":\"" + "hert" + "\",\"message\":\"seccse\",\"code\":\"400\",\"status\":true,\"data\":\"参数解析错误\"}"; } finally { } } else { result = "{\"keycode\":\"" + "" + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"无效指令\"}"; } Log.Error("答复请求者:" + s.ToString() + " 返回数据:" + result); try { //答复请求者(处理完请求后在些答复) byte[] bytes = SerializeContent(result); ws.Reply(s.ToString(), new SAEA.WebSocket.Model.WSProtocal(SAEA.WebSocket.Type.WSProtocalType.Text, bytes)); } catch { result = "{\"keycode\":\"" + "hert" + "\",\"message\":\"seccse\",\"code\":\"400\",\"status\":true,\"data\":\"返回参数失败\"}"; } finally { } } //监听心跳并且回复客户端“已ping作为关键字” else if (content == "ping") { string result = "{\"keycode\":\"" + "hert" + "\",\"message\":\"seccse\",\"code\":\"200\",\"status\":true,\"data\":\"收到客户端心跳\"}"; byte[] bytes = SerializeContent(result); ws.Reply(s.ToString(), new SAEA.WebSocket.Model.WSProtocal(SAEA.WebSocket.Type.WSProtocalType.Text, bytes)); } else { string result = "{\"keycode\":\"" + "hert" + "\",\"message\":\"seccse\",\"code\":\"200\",\"status\":true,\"data\":\"收到客户端心跳\"}"; byte[] bytes = SerializeContent(result); ws.Reply(s.ToString(), new SAEA.WebSocket.Model.WSProtocal(SAEA.WebSocket.Type.WSProtocalType.Text, bytes)); } }; ws.OnDisconnected += (s) => { try { Log.Error("断开连接" + s.ToString()); } catch { } finally { } }; ws.Start(); } //解包 private static string DeserializeContent(byte[] param) { try { return Encoding.UTF8.GetString(param); } catch { return "参数无效"; } } //封包 private static byte[] SerializeContent(string param) { try { return Encoding.UTF8.GetBytes(param); } catch { return null; //return "参数无效"; } } public static string callback = string.Empty; public static string PrinterName = "Lexmark-MS430-Series"; public static Process recordingProcess; public static Process Typrocess; private static string srpath = string.Empty; /// /// aks100101 读取身份证卡号(已国产化) /// /// /// public static string IDCardRead(string code) { try { //Finger("",""); IDCard iDCard = new IDCard(); string result = iDCard.getIdCard(code); SubmitLogs(result, "IDCardRead"); return result; } catch (Exception ex) { //Log.Error("读取身份证卡号异常: " + ex.Message + ""); string result = "{\"keycode\":\"" + code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; SubmitLogs(result, "IDCardRead"); return result; } } /// /// aks100102 打印排队票据(已国产化) /// /// 排号 /// 等待人数 /// 二维码 /// 办理业务名称 /// public static string SendByPrint(string content) { var param = content.ConvertToAnonymousType(new { code = default(string), ph = default(string), ddrs = default(string), qrcode = default(string), ywmc = default(string) }); try { string ph = param.ph; string ddrs = param.ddrs; string qrcode = param.qrcode; string ywmc = param.ywmc; if (!isFuncisFuncObject("SendByPrint")) { Utils.MessagesBox("打印排队票据设备未授权使用"); return "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + "打印排队票据设备未授权使用" + "\"}"; } else { PrintPJ print = new PrintPJ(Parame.pritPj, Parame.pritPjPort); var data = print.SendPrint(ph, ddrs, qrcode, ywmc); if (data == 0) { string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"seccse\",\"code\":\"200\",\"status\":true,\"data\":\"" + "打印成功" + "\"}"; SubmitLogs(result, "SendByPrint"); return result; } else { string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + (data == 1 ? "打印失败" : (data == 2 ? "打印机未连接" : "打印机初始化失败")) + "\"}"; SubmitLogs(result, "SendByPrint"); return result; } } } catch (Exception ex) { //Log.Error("打印排队票据异常: " + ex.Message + ""); string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; SubmitLogs(result, "SendByPrint"); return result; } } /// /// 文字语音播报(已国产化) /// apt install sox /// apt install libsox-fmt-all /// /// /// /// public static string tempWav = string.Empty; /// /// aks100103文字语音播报 /// /// /// public static string payleText(string content) { var param = content.ConvertToAnonymousType(new { code = default(string), text = default(string), ispaye = default(bool), }); try { string text = param.text; bool ispaye = param.ispaye; if (!isFuncisFuncObject("payleText")) { Utils.MessagesBox("文字语音播报设备未授权使用"); return "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + "文字语音播报设备未授权使用" + "\"}"; } else { if (ispaye) { Task.Run(() => { try { if (Typrocess != null) { // 如果进程还在运行 if (!Typrocess.HasExited) { // 发送SIGTERM信号来停止进程 Typrocess.Kill(); // 等待进程真正停止 Typrocess.WaitForExit(); } } } catch (Exception ex) { //Log.Error("停止失败: " + ex.Message + ""); } // AutoAudio(false, ""); }); string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"data\":\"" + "停止播放成功" + "\"}"; SubmitLogs(result, "payleText"); return result; } else { Task.Run(() => { //形成语音 tempWav = GenerateWavFromText(text); //////开始播放 string command = $"sox {tempWav} -d"; ShllCommad(command); //AutoAudio(true, tempWav); }); string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"data\":\"" + "开始播放" + "\"}"; SubmitLogs(result, "payleText"); return result; } } } catch (Exception ex) { //Log.Error("文字语音播报异常2: " + ex.Message + ""); string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; SubmitLogs(result, "payleText"); return result; } } /// /// aks100104打开高拍仪并且进行快速扫描文件 (已国产化) /// /// /// public static string openCamera(string code) { try { string devIndex = GetSnIndex(); if (string.IsNullOrEmpty(devIndex)) { string result = "{\"keycode\":\"" + code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"suffix\":\"jpg\",\"data\":\"" + "扫描仪打开失败" + "\"}"; SubmitLogs(result, "openCamera"); return result; } else { //打开高拍仪 string param = OpenSn(devIndex); if (string.IsNullOrEmpty(param)) { string result = "{\"keycode\":\"" + code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"suffix\":\"jpg\",\"data\":\"" + "扫描仪打开失败" + "\"}"; SubmitLogs(result, "openCamera"); return result; } else { //拍照 param = getFrame(); if (string.IsNullOrEmpty(param)) { //关闭 StopSn(devIndex); string result = "{\"keycode\":\"" + code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"suffix\":\"jpg\",\"data\":\"" + "获取图片失败" + "\"}"; SubmitLogs(result, "openCamera"); return result; } else { //关闭 StopSn(devIndex); string result = "{\"keycode\":\"" + code + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"jpg\",\"data\":\"" + param + "\"}"; SubmitLogs(result, "openCamera"); return result; } } } } catch (Exception ex) { //Log.Error("打开高拍仪并且进行快速扫描文件异常: " + ex.Message + ""); string result = "{\"keycode\":\"" + code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; SubmitLogs(result, "openCamera"); return result; } } /// /// aks100105打开签字版 sudo apt-get install libgdiplus (已国产化) /// /// /// public static string OpenSign(string content) { var param = content.ConvertToAnonymousType(new { code = default(string) }); try { if (!isFuncisFuncObject("OpenSign")) { Utils.MessagesBox("签字版设备未授权使用"); return "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + "签字版设备未授权使用" + "\"}"; } else { Task.Run(() => { HttpPostResponseBySign("open", 1, param.code); }); event2.WaitOne(); string result = sginStr; SubmitLogs(result, "OpenSign"); return result; } } catch (Exception ex) { //Log.Error("打开签字版异常: " + ex.Message + ""); string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; SubmitLogs(result, "OpenSign"); return result; } } /// /// 关闭签字版 (已国产化) /// /// /// private static string CloseSign(string code) { try { if (!isFuncisFuncObject("OpenSign")) { Utils.MessagesBox("签字版设备未授权使用"); return "{\"keycode\":\"" + code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + "签字版设备未授权使用" + "\"}"; } else { Task.Run(() => HttpPostResponseBySign("close", 2, "")); string result = "{\"keycode\":\"" + code + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"jpg\",\"data\":\"" + "签字版已关闭" + "\"}"; SubmitLogs(result, "openCamera"); return result; } } catch (Exception ex) { //Log.Error("关闭签字版异常: " + ex.Message + ""); string result = "{\"keycode\":\"" + code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; SubmitLogs(result, "OpenSign"); return result; } } /// /// aks100106指纹 (已国产化,未完成测试) /// /// /// public static string ReadFingerData(string code) { try { if (false)//!isFuncisFuncObject("Finger") { Utils.MessagesBox("指纹设备未授权使用"); return "{\"keycode\":\"" + code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + "指纹设备未授权使用" + "\"}"; } else { string result = Fingerprint.LIVESCANFinger(code); SubmitLogs(result, "Finger"); return result; } } catch (Exception ex) { //Log.Error("指纹异常: " + ex.Message + ""); string result = "{\"keycode\":\"" + code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; SubmitLogs(result, "Finger"); return result; } } /// /// aks100107开始录音、取消录音、结束录音 (已国产化) /// sudo apt-get update /// sudo apt-get install alsa-utils /// /// /// /// public static string SoundRecording(string content) { var param = content.ConvertToAnonymousType(new { code = default(string), isopen = default(bool), url = default(string) }); try { bool isopen = param.isopen; string url = param.url; if (!isFuncisFuncObject("SoundRecording")) { Utils.MessagesBox("录音设备未授权使用"); return "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + "录音设备未授权使用" + "\"}"; } else { //结束录音上传文件 if (!string.IsNullOrEmpty(url) && !isopen) { if (StopRecording()) { Task.Run(async () => { UploadInfo(url, srpath); }); @event2.WaitOne(); Regex re = new Regex(@"(((?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:ww‌​w.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?‌​(?:[\w]*))?)"); MatchCollection mc = re.Matches(url);//获取的是一个数组 string reurl = mc[0].ToString() + "://" + mc[1].ToString() + urlpath; string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"wav\",\"data\":\"" + reurl + "\"}"; SubmitLogs(result, "SoundRecording"); return result; } else { string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"suffix\":\"wav\",\"data\":\"" + "结束录音失败" + "\"}"; SubmitLogs(result, "SoundRecording"); return result; } } else if (isopen)//开始录音 { if (StartRecording()) { string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"wav\",\"data\":\"" + "开始录音" + "\"}"; SubmitLogs(result, "SoundRecording"); return result; } else { string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"suffix\":\"wav\",\"data\":\"" + "录音失败" + "\"}"; SubmitLogs(result, "SoundRecording"); return result; } } else //取消录音 { if (StopRecording()) { srpath = string.Empty; string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"suffix\":\"wav\",\"data\":\"" + "取消录音" + "\"}"; SubmitLogs(result, "SoundRecording"); return result; } else { srpath = string.Empty; string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"suffix\":\"wav\",\"data\":\"" + "取消录音失败" + "\"}"; SubmitLogs(result, "SoundRecording"); return result; } } } } catch (Exception ex) { //Log.Error("开始录音、取消录音、结束录音异常: " + ex.Message + ""); string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; SubmitLogs(result, "SoundRecording"); return result; } } /// /// aks100108根据文件地址在线打印 (已国产化) /// /// /// public static string PrintFile(string content) { var param = content.ConvertToAnonymousType(new { code = default(string), url = default(string), ext = default(string) }); try { string url = param.url; string ext = param.ext; if (!isFuncisFuncObject("PrintFile")) { Utils.MessagesBox("打印机设备未授权使用"); return "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + "打印机设备未授权使用" + "\"}"; } else { Task.Run(async () => { DateTime dateTime = DateTime.Now; string time = DateTime.Now.ToString( "yyyyMMddHHmmss", DateTimeFormatInfo.InvariantInfo); string dirpath = Utils.getSystemPaht() + @"/wwwroot/PrintFile"; if (!Directory.Exists(dirpath)) { Directory.CreateDirectory(dirpath); } var filepath = System.IO.Path.Combine(dirpath, time); string path = dirpath + @"/" + time + "." + ext; WebRequest request = WebRequest.Create(url); WebResponse response = request.GetResponse(); using (Stream stream = response.GetResponseStream()) { using (FileStream fileStream = new FileStream(path, FileMode.Create)) { stream.CopyTo(fileStream); } } response.Close(); //Log.Info("根据文件base64打印: " + path + ""); string command = $"lp -d {PrinterName} {path}"; ShllCommad(command); }); string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"data\":\"" + "打印成功" + "\"}"; SubmitLogs(result, "PrintFile"); return result; } } catch (Exception ex) { //Log.Error("根据文件地址在线打印异常: " + ex.Message + ""); string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; SubmitLogs(result, "PrintFile"); return result; } } /// /// aks100109根据文件base64打印 (已国产化)PrintBase64 /// /// /// /// [JSFunction] public static string PrintBase64(string url, string base64, string ext) { try { if (!isFuncisFuncObject("PrintBase64")) { Utils.MessagesBox("打印机设备未授权使用"); return "{\"keycode\":\"" + "" + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + "打印机设备未授权使用" + "\"}"; } else { Task.Run(async () => { DateTime dateTime = DateTime.Now; string time = DateTime.Now.ToString( "yyyyMMddHHmmss", DateTimeFormatInfo.InvariantInfo); string dirpath = Utils.getSystemPaht() + @"/wwwroot/PrintFile"; if (!Directory.Exists(dirpath)) { Directory.CreateDirectory(dirpath); } var filepath = System.IO.Path.Combine(dirpath, time); string path = dirpath + @"/" + time + "." + ext; byte[] bytes = Convert.FromBase64String(base64); System.IO.FileStream stream = new System.IO.FileStream(path, System.IO.FileMode.CreateNew); System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream); writer.Write(bytes, 0, bytes.Length); writer.Close(); //Log.Info("根据文件base64打印: " + path + ""); string command = $"lp -d {PrinterName} {path}"; ShllCommad(command); }); string result = "{\"keycode\":\"" + "" + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"data\":\"" + "打印成功" + "\"}"; SubmitLogs(result, "PrintBase64"); return result; } } catch (Exception ex) { string result = "{\"keycode\":\"" + "" + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; SubmitLogs(result, "PrintBase64"); return result; } } /// /// aks100110播放音频文件 (已国产化) /// /// /// /// public static string PalyFile(string content) { var param = content.ConvertToAnonymousType(new { code = default(string), url = default(string), ispaly = default(bool) }); try { string url = param.url; bool ispaly = param.ispaly; if (!isFuncisFuncObject("PalyFile")) { Utils.MessagesBox("音频设备未授权使用"); return "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + "音频设备未授权使用" + "\"}"; } else { if (ispaly) { Task.Run(() => { if (Typrocess != null) { // 如果进程还在运行 if (!Typrocess.HasExited) { // 发送SIGTERM信号来停止进程 Typrocess.Kill(); // 等待进程真正停止 Typrocess.WaitForExit(); } } //AutoAudio(ispaly, ""); }); string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"data\":\"" + "停止播放成功" + "\"}"; SubmitLogs(result, "PalyFile"); return result; } else { Task.Run(() => { Uri uri = new Uri(url); //返回 123.xlsx var filename = HttpUtility.UrlDecode(uri.Segments.Last()); //获取文件后缀 string ext = System.IO.Path.GetExtension(filename); DateTime dateTime = DateTime.Now; string time = DateTime.Now.ToString( "yyyyMMddHHmmss", DateTimeFormatInfo.InvariantInfo); string dirpath = Utils.getSystemPaht() + @"/wwwroot/WaveOutFile"; if (!Directory.Exists(dirpath)) { Directory.CreateDirectory(dirpath); } string path = dirpath + @"/" + time + ext; WebRequest request = WebRequest.Create(url); WebResponse response = request.GetResponse(); using (Stream stream = response.GetResponseStream()) { using (FileStream fileStream = new FileStream(path, FileMode.Create)) { stream.CopyTo(fileStream); } } response.Close(); //开始播放 string command = $"sox {path} -d"; ShllCommad(command); //AutoAudio(ispaly, path); }); string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"success\",\"code\":\"200\",\"status\":true,\"data\":\"" + "开始播放" + "\"}"; SubmitLogs(result, "PalyFile"); return result; } } } catch (Exception ex) { string result = "{\"keycode\":\"" + param.code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; SubmitLogs(result, "PalyFile"); return result; } } /// /// aks100111唤醒键盘 (已国产化) /// /// /// public static string openKey(string code) { try { Task.Run(() => { Bash("/usr/bin/python3 /usr/bin/onboard"); }); return "{\"keycode\":\"" + code + "\",\"message\":\"seccse\",\"code\":\"200\",\"status\":true,\"data\":\"" + "唤醒键盘成功" + "\"}"; } catch (Exception ex) { //Log.Error("唤醒键盘异常: " + ex.Message + ""); return "{\"keycode\":\"" + code + "\",\"message\":\"Falied\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}"; } } /// /// 执行文件 /// /// /// public static string Bash(string command) { try { var escapedArgs = command.Replace("\"", "\\\""); var process = new Process() { StartInfo = new ProcessStartInfo { FileName = "/bin/bash", Arguments = $"-c \"{escapedArgs}\"", RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true, } }; process.Start(); string result = process.StandardOutput.ReadToEnd(); process.WaitForExit(); process.Dispose(); return result; } catch (Exception ex) { //Log.Error("执行文件异常:" + ex.Message); } return ""; } /// /// 获取设备index /// /// public static string GetSnIndex() { try { //获取设备信息 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 ""; } } } catch (Exception ex) { //Log.Error("获取设备index异常:" + ex.Message); } return ""; } /// /// 打开高拍仪 /// /// public static string OpenSn(string dev_idx) { try { //获取设备信息 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 ""; } } } catch (Exception ex) { //Log.Error("打开高拍仪异常:" + ex.Message); } return ""; } /// /// 关闭高拍仪 /// /// public static 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 static string getFrame() { try { //获取设备信息 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 ""; } } } catch (Exception ex) { //Log.Error("拍照异常:" + ex.Message); } return ""; } /// /// 右转 /// /// public static string RotateRight() { try { //获取设备信息 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 ""; } } } catch (Exception ex) { //Log.Error("右转异常:" + ex.Message); } return ""; } /// /// 左转 /// /// public static string RotateLeft() { try { //获取设备信息 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 ""; } } } catch (Exception ex) { //Log.Error("左转异常:" + ex.Message); } return ""; } /// /// 高拍仪 /// private static string gpyStr = string.Empty; private static AutoResetEvent @event6 = new AutoResetEvent(false); private static async void HttpResponse(string param) { try { var httpClient = new HttpClient(); var uploader = new ChunkedUpload(httpClient); gpyStr = await uploader.getReq(param); @event6.Set(); } catch (Exception ex) { //Log.Error("高拍仪异常:" + ex.Message); } } private static string sginStr = string.Empty; /// /// 签字版 /// private static async void HttpPostResponseBySign(string type, int typeCode, string code) { try { var httpClient = new HttpClient(); var uploader = new ChunkedUpload(httpClient); sginStr = await uploader.PostSign(type, typeCode, code); @event2.Set(); } catch (Exception ex) { //Log.Error("签字版异常:" + ex.Message); } } /// /// 初始文件上传 /// private static string urlpath = string.Empty; private static AutoResetEvent @event2 = new AutoResetEvent(false); private static async void UploadInfo(string url, string srpath) { try { var httpClient = new HttpClient(); var uploader = new ChunkedUpload(httpClient); urlpath = await uploader.UploadFileAsync(url, srpath); @event2.Set(); } catch (Exception ex) { //Log.Error("初始文件上传异常:" + ex.Message); } } //上传本地文件中转 private static string urlP = string.Empty; private static AutoResetEvent @event5 = new AutoResetEvent(false); private static async void UploadInfoByFile(string url, string strpath) { try { var httpClient = new HttpClient(); var uploader = new ChunkedUpload(httpClient); urlP = await uploader.UploadFileAsync(url, strpath); File.Delete(strpath); @event5.Set(); } catch (Exception ex) { //Log.Error("上传本地文件中转异常:" + ex.Message); } } //根据程序名称杀死进程 public static void KillProcessByName(string processName) { try { Process[] processes = Process.GetProcessesByName(processName); foreach (Process process in processes) { try { process.Kill(); process.WaitForExit(); // 等待进程退出 } catch (Exception ex) { } } } catch (Exception ex) { //Log.Error("根据程序名称杀死进程异常:" + ex.Message); } } /// /// 开始录音 /// /// public static bool StartRecording() { try { if (recordingProcess != null) { // 如果进程还在运行 if (!recordingProcess.HasExited) { // 发送SIGTERM信号来停止arecord进程 recordingProcess.Kill(); recordingProcess.WaitForExit(); // 等待进程真正停止 } } string time = DateTime.Now.ToString( "yyyyMMddHHmmss", DateTimeFormatInfo.InvariantInfo); string dirpath = Utils.getSystemPaht() + @"/wwwroot/Record"; if (!Directory.Exists(dirpath)) { Directory.CreateDirectory(dirpath); } srpath = dirpath + "/" + time + ".wav"; string outputFile = srpath; // 输出文件名 string device = "default"; // 音频设备,可以通过arecord -l来列出所有设备 // 构建arecord命令 string command = $"arecord --device={device} --file-type=wav --duration=10 --quiet {outputFile}"; // 启动进程 recordingProcess = new Process { StartInfo = new ProcessStartInfo { FileName = "/bin/bash", Arguments = $"-c \"{command}\"", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true } }; recordingProcess.Start(); return true; } catch (Exception ex) { //Log.Error("开始录音异常:" + ex.Message); return false; } } /// /// 结束录音 /// public static bool StopRecording() { try { if (recordingProcess != null) { // 如果进程还在运行 if (!recordingProcess.HasExited) { // 发送SIGTERM信号来停止arecord进程 recordingProcess.Kill(); recordingProcess.WaitForExit(); // 等待进程真正停止 } } return true; } catch (Exception ex) { //Log.Error("结束录音异常:" + ex.Message); return false; } } /// /// 执行命令 /// public static void ShllCommad(string command) { try { //Log.Info("执行命令:" + command); // 启动进程 Typrocess = new Process { StartInfo = new ProcessStartInfo { FileName = "/bin/bash", Arguments = $"-c \"{command}\"", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true } }; Typrocess.Start(); Typrocess.WaitForExit(); } catch (Exception ex) { //Log.Error("执行命令异常:" + ex.Message); } } /// /// 开源文字转语音 /// sudo apt-get install espeak /// /// /// static string GenerateWavFromText(string text) { string time = DateTime.Now.ToString( "yyyyMMddHHmmss", DateTimeFormatInfo.InvariantInfo); string dirpath = Utils.getSystemPaht() + @"/wwwroot/WavFile"; // Log.Info(dirpath); if (!Directory.Exists(dirpath)) { Directory.CreateDirectory(dirpath); } var tempFile = dirpath + "/" + time + ".wav"; try { text = text.Replace("(", "").Replace(")", "、"); ProcessStartInfo startInfo = new ProcessStartInfo { FileName = "espeak", Arguments = $" -vzh -s 150 \"{text}\" -w {tempFile}", // 设置语速为150,输出为WAV文件 UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true }; using (Process process = Process.Start(startInfo)) { process.WaitForExit(); // 等待进程结束 process.Close(); process.Dispose(); } } catch (Exception ex) { //Log.Error("文字转语音失败:" + ex.Message); } return tempFile; } /// /// 是否已获取收取 /// /// /// public static bool isFuncisFuncObject(string funcName) { bool isFunc = false; try { if (Parame.FuncObject != null) { if (Parame.FuncObject.Count > 0) { foreach (Func func in Parame.FuncObject) { if (func.Interfaceaddress.Contains(funcName)) { isFunc = true; break; } } } } } catch (Exception ex) { //Log.Error("是否已获取收取异常:" + ex.Message); } return isFunc; } /// /// 提交设备操作日志 /// /// /// public static void SubmitLogs(string Describer, string funcName) { try { Task.Run(async () => { string ApiId = string.Empty; string Name = string.Empty; string Interfaceaddress = string.Empty; bool isFunc = false; if (Parame.FuncObject != null) { if (Parame.FuncObject.Count > 0) { foreach (Func func in Parame.FuncObject) { if (func.Interfaceaddress.Contains(funcName)) { isFunc = true; ApiId = func.Id; Name = func.Platform; Interfaceaddress = func.Interfaceaddress; break; } } } } if (isFunc) { var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, $"{Parame.apiUrl}/api/Interface/JournalAdd"); var content = new StringContent("{\"Name\": \"" + Name + "\",\"Describer\": \"" + str2Base64(Describer) + "\", \"Interfaceaddress\": \"" + Interfaceaddress + "\", \"ApiId\": \"" + ApiId + "\"}", null, "application/json"); request.Content = content; var response = await client.SendAsync(request); if (response.StatusCode.ToString() == "200") { response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); //Log.Info(body); } } }); } catch (Exception ex) { //Log.Error("提交设备操作日志异常:" + ex.Message); } } /// /// 播放语音文件 /// /// public static void AutoAudio(bool ispaly, string path) { try { if (ispaly) { Parame.videoV.Play(new Uri(path));//播放 } else { Parame.videoV.Pause();//停止 } } catch (Exception ex) { //Log.Error("播放语音文件异常:" + ex.Message); } } /// /// string 转换为 base64 /// /// public static string str2Base64(string str) { try { byte[] b = System.Text.Encoding.UTF8.GetBytes(str); string result = Convert.ToBase64String(b); return result; } catch (Exception ex) { //Log.Error("string 转换为 base64异常:" + ex.Message); } return ""; } /// /// base64 转换为 string /// /// public static string Base64str2(string data) { try { byte[] c = Convert.FromBase64String(data); string result = System.Text.Encoding.UTF8.GetString(c); //Log.Info("接收返回数据:" + result); return result; } catch (Exception ex) { //Log.Error("base64 转换为 string异常:" + ex.Message); } return ""; } } }