private void WriteStream(Byte[] packageData, string packageId) { var parameters = Aramis.Net.PackageConvertation.GetStrPatametersFromArray(new object[] { packageId }); var packageOfDeliveryConfirmation = new PackageViaWireless(0, true); packageOfDeliveryConfirmation.DefineQueryAndParams(PACKAGE_CONFIRMATION_NAME, parameters); lock (this) { packageConfirmation = packageOfDeliveryConfirmation.GetPackage(); lastPackage = packageData; lastPackageId = packageId; actualLastPackageTime = DateTime.Now; if (!TCPStream.CanWrite) { CloseChannels(); return; } try { TCPStream.Write(packageData, 0, packageData.Length); } catch { CloseChannels(); return; } } waitForConfirmationReply = true; }
public PackageViaWireless CreateAlertAboutFile() { PackageViaWireless alertPackage = new PackageViaWireless(); string parameters = String.Format("3{0}\r2{1}", FileName, FileSize.ToString()); alertPackage.DefineQueryAndParams("FileTransmit", parameters); return alertPackage; }
public PackageViaWireless CreateAlertAboutFile() { PackageViaWireless alertPackage = new PackageViaWireless(); string parameters = String.Format("3{0}\r2{1}", FileName, FileSize.ToString()); alertPackage.DefineQueryAndParams("FileTransmit", parameters); return(alertPackage); }
internal object[] PerformQuery(string query, params object[] parameters) { PackageViaWireless package = new PackageViaWireless(); try { client = new TcpClient(Settings.Default.ServerIPAddress, SERVER_PORT); NetworkStream stream = client.GetStream(); if ( !Connected(stream)) { return null; } package.DefineQueryAndParams(query, PackageConvertation.GetStrPatametersFromArray(parameters)); byte[] buffer = package.GetPackage(); stream.Write(buffer, 0, buffer.Length); package = ReadData(stream); if ( package.QueryName == "GetSMS" ) { PackageViaWireless okPackage = new PackageViaWireless(); okPackage.DefineQueryAndParams("OK", PackageConvertation.GetStrPatametersFromArray(new object[0])); buffer = okPackage.GetPackage(); stream.Write(buffer, 0, buffer.Length); } } catch (Exception exp) { if ( OnError != null ) { OnError(exp.ToString()); } } finally { if ( client != null ) { client.Close(); } } return package == null || package.Parameters == null ? null :PackageConvertation.GetPatametersFromStr(package.Parameters); }
public void Start(object state) { Console.Write("Устройство '{0}' подключено!", IPAddress); #region Defining variables string StorekeeperQueryHead = ""; #endregion while (true) { #region Checking topicality of connection, closing the thread if connection dead if (!TCPClient.Connected) { CloseChannels(); return; } #endregion #region Reading storekeeper query from network stream string StorekeeperQuery; if (PackageViaWireless.isCompletelyPackage(StorekeeperQueryHead)) { StorekeeperQuery = StorekeeperQueryHead; } else { StorekeeperQuery = ReadStream(StorekeeperQueryHead); if (StorekeeperQuery == null) { continue; } } #endregion PackageViaWireless package = new PackageViaWireless(); if (!package.SetPackage(StorekeeperQuery, out StorekeeperQueryHead)) { // We have recived package with wrong data format or uncompletely package continue; } object[] ResultParameters = Aramis.Net.PackageConvertation.GetPatametersFromStr(package.Parameters); if (package.QueryName == PACKAGE_CONFIRMATION_NAME) { string packageId = ResultParameters[0] as string; bool delivered = (bool)(ResultParameters[1]); Trace.WriteLine(string.Format("Pack id: {0};\tquery = {1};\t{2}", packageId, PACKAGE_CONFIRMATION_NAME, DateTime.Now.ToString("mm:ss"))); if (packageId.Equals(lastPackageId)) { if (delivered) { waitForConfirmationReply = false; } else { RepeateLastPackage(); } } else { // если пакет потерян, то его нельзя переслать waitForConfirmationReply = false; } continue; } Trace.WriteLine(string.Format("Pack id: {0};\tquery = {1};\t{2}", package.PackageID, package.QueryName, DateTime.Now.ToString("mm:ss"))); CurrentUserId = package.ClientCode; object[] resultArray = receiveMessage(package.QueryName, ResultParameters, package.ClientCode); string resultStr = Aramis.Net.PackageConvertation.GetStrPatametersFromArray(resultArray); package.DefineQueryAndParams("Answer", resultStr); WritePackage(package); //#region Handling via 1C server //bool registration = false; //PackageViaWireless package = new PackageViaWireless(); //if (!package.SetPackage(StorekeeperQuery, out StorekeeperQueryHead)) //{ // // We have recived package with wrong data format or uncompletely package // continue; //} //if (package.QueryName == "PingReply") //{ // double delay = ((Double)(DateTime.Now.Ticks - Convert.ToInt64(PackageConvertation.GetPatametersFromStr(package.Parameters)[0]))) / 10000000; // package.Parameters = "3" + System.Math.Round(delay, 2).ToString(); // WriteStream(package.GetPackage()); // lastTimePingSent = DateTime.Now.Ticks; // PingSent = false; // continue; //} //#region Playing //if (package.QueryName == "PageDown") //{ // KeyEmulation.PressKey(System.Windows.Forms.Keys.PageDown); // continue; //} //if (package.QueryName == "PageUp") //{ // KeyEmulation.PressKey(System.Windows.Forms.Keys.PageUp); // continue; //} //if (package.QueryName == "MouseMove") //{ // object[] XYParameters = PackageConvertation.GetPatametersFromStr(package.Parameters); // System.Drawing.Point P = System.Windows.Forms.Cursor.Position; // P.X += 3 * Convert.ToInt32(XYParameters[0]); // P.Y += 3 * Convert.ToInt32(XYParameters[1]); // System.Windows.Forms.Cursor.Position = P; // continue; //} //if (package.QueryName == "DoMouseClick") //{ // DoMouseClick(); // continue; //} //#endregion //if (Updating) //{ // if (package.QueryName == "FileAccepted") // { // // Файл принят успешно // InformAboutUpdateComplete(GetClientIP()); // Updating = false; // Console.WriteLine(String.Format("Update has recived by machine: [{0}] ", IPAddress)); // continue; // } //} //// Console.WriteLine(String.Format("id: {0}\t{1}", package.PackageID, DateTime.Now.ToString())); //Trace1C.WriteParameters(package.ClientCode.ToString(), package.QueryName, package.Parameters.Replace("\r", "^")); //if (package.QueryName == "ConnectionRecovery") //{ // ClientCode = Convert.ToString(package.ClientCode); // continue; //} //if (package.QueryName == "BreakConnection") //{ // Console.WriteLine(String.Format("Machine [{0}] disconnected", IPAddress)); // CloseChannels(); // return; //} //if (package.QueryName == "Message") //{ // int MessageId = Convert.ToInt32(package.Parameters); // Server1CAgent.QueryTo1CServer(ClientCode, "SetMessageStatus", "2" + MessageId.ToString() + "\r22"); // continue; //registration = package.QueryName == "Registration"; //string Result = Server1CAgent.QueryTo1CServer(package.ClientCode.ToString(), package.QueryName, package.Parameters); //if (result == null) //{ // package.DefineQueryAndParams("Answer", "#ERROR:1C_AGENT_DISABLE#"); // WriteStream(package.GetPackage()); // continue; //} //if (package.QueryName == "UserGetOut") //{ // continue; //} //if (package.QueryName == "PrintLabel" || package.QueryName == "RepeatPrinting" || package.QueryName == "SlittingManagement") //{ // int StartIndex = Result.IndexOf("P#$$"); // // P#$$ - чтобы не возникло никаких случайностей, защита от совпадения с другой строкой // if (StartIndex != -1) // { // string PrintingParameters = Result.Substring(StartIndex + 4); // Result = Result.Substring(0, StartIndex); // if (PrintingParameters.Length > 0) // { // System.Diagnostics.Process.Start("ftp", PrintingParameters); // } // } //} //if (registration) //{ // object[] ResultParameters = PackageConvertation.GetPatametersFromStr(Result); // if ((int)ResultParameters[0] == 0) // { // this.ClientCode = ((int)ResultParameters[1]).ToString(); // } //} //package.DefineQueryAndParams("Answer", Result); ////Console.WriteLine("{1} - StorekeeperQueryHead.Length = {0}", StorekeeperQueryHead.Length, DateTime.Now.ToString()); //#endregion } }
private PackageViaWireless ReadData(NetworkStream stream) { StringBuilder data; byte[] buffer; string head; PackageViaWireless package = new PackageViaWireless(); data = new StringBuilder(); buffer = new byte[256]; do { int streamLength = stream.Read(buffer, 0, buffer.Length); data.Append(Encoding.GetEncoding(1251).GetString(buffer, 0, streamLength)); } while ( stream.DataAvailable ); if ( !package.SetPackage(data.ToString(), out head) ) { client.Close(); package = null; } return package; }
public object[] PerformQuery(string QueryName, params object[] Parameters) { PackageViaWireless Package = new PackageViaWireless(0, true); Package.DefineQueryAndParams(QueryName, PackageConvertation.GetStrPatametersFromArray(Parameters)); Package.ClientCode = User; ConnectionAgent.WaitingPackageID = Package.PackageID; ConnectionAgent.Executed = false; MainForm.ShowQueryWait(); if (ConnectionAgent.SendPackage(Package.GetPackage())) { while (!ConnectionAgent.RequestReady & ConnectionAgent.OnLine) { Thread.Sleep(300); } MainForm.ShowQueryComplated(); if (ConnectionAgent.Package == null || !ConnectionAgent.Executed) { Process.ShowMessage("Пропала связь с сервером!"); return null; } if (ConnectionAgent.Package.Parameters == "#ERROR:1C_AGENT_DISABLE#") { ConnectionAgent.Package.Parameters = string.Empty; ConnectionAgent.RequestReady = false; Process.ShowMessage("1С-агент неактивен. Обратитесь к оператору!"); return null; } object[] result = PackageConvertation.GetPatametersFromStr(ConnectionAgent.Package.Parameters); ConnectionAgent.RequestReady = false; if (result.Length == 0) { return null; } if (result.GetType() == typeof(object[]) && result.Length == 1 && result[0] == null) return null; return result; } return null; }
private void ReadPackages() { #region Define local variables string StorekeeperQuery = "", StorekeeperQueryHead = ""; //Byte[] emptyData = System.Text.Encoding.GetEncoding(1251).GetBytes(""); //int streamLength; #endregion while (wifiEnabled) { #region Getting package if (PackageViaWireless.isCompletelyPackage(StorekeeperQueryHead)) { StorekeeperQuery = StorekeeperQueryHead; StorekeeperQueryHead = ""; } else { StorekeeperQuery = ReadStream(); } Package = null; if (StorekeeperQuery == null) return; StorekeeperQuery = StorekeeperQueryHead + StorekeeperQuery; WriteToFile(" << Read Query [" + StorekeeperQuery + "]", false); if (!PackageViaWireless.isCompletelyPackage(StorekeeperQuery)) continue; Package = new PackageViaWireless(StorekeeperQuery, out StorekeeperQueryHead); StorekeeperQuery = ""; #endregion #region Pinging server if (Package.QueryName == "Ping") { Package.QueryName = "PingReply"; SendPackage(Package.GetPackage()); continue; } if (Package.QueryName == "PingReply") { WriteToFile("? ShowPingResult"); DataRepresent.ShowPingValue(PackageConvertation.GetPatametersFromStr(Package.Parameters)[0] as string); //Client.MainForm.ShowPingResult(PackageConvertation.GetPatametersFromStr(Package.Parameters)[0] as string); WriteToFile("OK ShowPingResult"); continue; } #endregion if (Package.QueryName == "KeyPressing") { SendKeyCode = (int)PackageConvertation.GetPatametersFromStr(Package.Parameters)[0]; var CallTimer = new CallTimer(SendKey, 1, true); continue; } if (Package.QueryName == "BarcodeEvent") { SendBarcode = PackageConvertation.GetPatametersFromStr(Package.Parameters)[0] as string; var CallTimer = new CallTimer(SendKey, 1, true); continue; } if (Package.QueryName == "TimeSynchronization") { SetTime(PackageConvertation.GetPatametersFromStr(Package.Parameters)[0] as string); continue; } if (Package.QueryName == "FileTransmit") { object[] Params = PackageConvertation.GetPatametersFromStr(Package.Parameters); StorekeeperQueryHead = AcceptFile(Params[0] as string, (int)Params[1], StorekeeperQueryHead, Convert.ToBoolean(Params[2])); continue; } #region Message handling if (Package.QueryName == "Message") { object[] Parameters = PackageConvertation.GetPatametersFromStr(Package.Parameters); System.Windows.Forms.MessageBox.Show(Parameters[0] as string); // В параметры записывается только ID, текс сообщения уже не нужен Package.Parameters = ((int)Parameters[1]).ToString(); SendPackage(Package.GetPackage()); continue; } #endregion #region PackageHandling if (Package.PackageID != WaitingPackageID) continue; Executed = true; RequestReady = true; while (RequestReady) { Thread.Sleep(100); } #endregion } }
private string ReadStream(string line) { Byte[] recivedData = new Byte[1024]; Byte[] emptyData = Encoding.GetEncoding(1251).GetBytes(""); try { if (TCPClient.Available > 0) { StringBuilder SB = new StringBuilder(); while (TCPClient.Available > 0) { int streamLength = TCPStream.Read(recivedData, 0, recivedData.Length); SB.Append(Encoding.GetEncoding(1251).GetString(recivedData, 0, streamLength)); } string sbResult = SB.ToString(); if (!string.IsNullOrEmpty(line)) { return(string.Concat(line, sbResult)); } return(sbResult); } else if (waitForConfirmationReply) { lock (this) { int milisecondsElapsed = (int)((TimeSpan)(DateTime.Now - actualLastPackageTime)).TotalMilliseconds; if (milisecondsElapsed > 500) { //Trace.WriteLine(string.Format("WaitForConfirmationReply package.PackageID = {0};\t{1}", // lastPackageId, DateTime.Now)); TCPStream.Write(packageConfirmation, 0, packageConfirmation.Length); actualLastPackageTime = DateTime.Now; } } } lock (this) { TCPStream.Write(emptyData, 0, emptyData.Length); } // if anybody comment next string, CPU will die with five or more client connections if (NeedToUpdate) { SendUpdate(); return(null); } string packageId; long MSecDiff = (DateTime.Now.Ticks - lastTimePingSent) / 10000; if ( //false && (NeedToPing && !PingSent && MSecDiff >= 700)) { // TestString length is 100 bytes const string TestString = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"; StringBuilder sb = new StringBuilder(TestString); for (int i = 0; i < 0; i++) { sb.Append(TestString); } WriteStream(PackageViaWireless.BuildPackage(0, "Ping", Aramis.Net.PackageConvertation.GetStrPatametersFromArray(DateTime.Now.Ticks.ToString(), sb.ToString()), false, out packageId), packageId); PingSent = true; return(null); } //MSecDiff = (DateTime.Now.Ticks - lastTimeMessageCheck) / 10000; if (ClientCode == "") { // Еще не известно для кого проверять наличие сообщения Byte[] answer; if (NewConnection) { answer = PackageViaWireless.BuildPackage(0, "TimeSynchronization", Aramis.Net.PackageConvertation.GetStrPatametersFromArray(DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")), false, out packageId); // Sending answer WriteStream(answer, packageId); NewConnection = false; } if (KeyPress != 0) { answer = PackageViaWireless.BuildPackage(0, "KeyPressing", Aramis.Net.PackageConvertation.GetStrPatametersFromArray(KeyPress), false, out packageId); WriteStream(answer, packageId); KeyPress = 0; } if (SendBarcode != null) { answer = PackageViaWireless.BuildPackage(0, "BarcodeEvent", Aramis.Net.PackageConvertation.GetStrPatametersFromArray(SendBarcode), false, out packageId); WriteStream(answer, packageId); SendBarcode = null; } Thread.Sleep(100); return(null); } } catch (Exception exp) { /* I just was unable to find other way for inform TcpClient about connection death. * /* Without attempt of writing empty string to stream the property "Available" return * /* wrong value, for example "TRUE" when client went to dining room :) */ Console.Write("Disconnecting for machine [ {0} ], thread {1}. Exp:{2}", IPAddress, Thread.CurrentThread.GetHashCode(), exp.Message); CloseChannels(); return(""); } }
public object[] PerformQuery(string QueryName, params object[] Parameters) { Current.LastQueryIsSuccessfull = false; if (!Current.OnLine && Current.MainForm.IsMainThread) { //"Нет подключения к серверу".Warning(); return null; } PackageViaWireless Package = new PackageViaWireless(0, true); Package.DefineQueryAndParams(QueryName, PackageConvertation.GetStrPatametersFromArray(Parameters)); Package.ClientCode = User; ConnectionAgent.WaitingPackageID = Package.PackageID; ConnectionAgent.Executed = false; MainForm.ShowQueryWait(); if (ConnectionAgent.SendPackage(Package.GetPackage())) { var stopWatch = new Stopwatch(); stopWatch.Start(); while (!ConnectionAgent.RequestReady & ConnectionAgent.OnLine) { Thread.Sleep(300); const int MAX_WAIT_TIME_MILISEC = 5000; if (stopWatch.ElapsedMilliseconds > MAX_WAIT_TIME_MILISEC) { RemoteCallDialog.WaitForServerResponse(); break; } } if (!Current.ConnectionAgent.WifiEnabled) { Thread.Sleep(1000); Current.StartConnectionAgent(); } MainForm.ShowQueryComplated(); if (ConnectionAgent.Package == null || !ConnectionAgent.Executed) { "Пропала связь с сервером!".ShowMessage(); return null; } //if (ConnectionAgent.Package.Parameters == "#ERROR:1C_AGENT_DISABLE#") // { // ConnectionAgent.Package.Parameters = string.Empty; // ConnectionAgent.RequestReady = false; // "1С-агент неактивен. Обратитесь к оператору!".ShowMessage(); // return null; // } object[] result = PackageConvertation.GetPatametersFromStr(ConnectionAgent.Package.Parameters); ConnectionAgent.RequestReady = false; if (result.Length == 0 || (result.GetType() == typeof(object[]) && result.Length == 1 && result[0] == null)) { return null; } LastQueryIsSuccessfull = true; return result; } return null; }
private void ReadPackages() { #region Define local variables string StorekeeperQuery = "", StorekeeperQueryHead = ""; lastPackageResived = DateTime.Now.Ticks; //Byte[] emptyData = System.Text.Encoding.GetEncoding(1251).GetBytes(""); //int streamLength; #endregion while ( !NeedAbortThread ) { #region Getting package if ( PackageViaWireless.isCompletelyPackage(StorekeeperQueryHead) ) { StorekeeperQuery = StorekeeperQueryHead; StorekeeperQueryHead = ""; } else { StorekeeperQuery = ReadStream(); } Console.WriteLine("Прочитано " + StorekeeperQuery); Package = null; if ( StorekeeperQuery == null ) { return; } StorekeeperQuery = StorekeeperQueryHead + StorekeeperQuery; if ( !PackageViaWireless.isCompletelyPackage(StorekeeperQuery) ) continue; Package = new PackageViaWireless(StorekeeperQuery, out StorekeeperQueryHead); StorekeeperQuery = ""; #endregion switch ( Package.QueryName ) { case "Ping": Package.QueryName = "PingReply"; SendPackage(Package.GetPackage()); continue; case "PingReply": PingValue = ( PackageConvertation.GetPatametersFromStr(Package.Parameters)[0] as string ); continue; case "Message": object[] Parameters = PackageConvertation.GetPatametersFromStr(Package.Parameters); System.Windows.Forms.MessageBox.Show(Parameters[0] as string); // В параметры записывается только ID, текс сообщения уже не нужен Package.Parameters = ( ( int ) Parameters[1] ).ToString(); SendPackage(Package.GetPackage()); continue; } #region PackageHandling if ( Package.PackageID != WaitingPackageID ) continue; Executed = true; RequestReady = true; while ( RequestReady ) { Thread.Sleep(100); } #endregion } }
private void sentDeliveryReport(string sentPackageId) { object[] parameters = new object[] { sentPackageId, lastPackageId.Equals(sentPackageId) }; var package = new PackageViaWireless(0, true); package.DefineQueryAndParams(PackageConvertation.PACKAGE_CONFIRMATION_NAME, PackageConvertation.GetStrPatametersFromArray(parameters)); SendPackage(package.GetPackage()); }
/// <summary> /// Отправить пакет клиенту (ТСД) /// </summary> /// <param name="package"></param> private void WritePackage(PackageViaWireless package) { Trace.WriteLine(string.Format("WritePackage package.PackageID = {0};\tQueryNema = {1};\t{2}", package.PackageID, package.QueryName, DateTime.Now)); WriteStream(package.GetPackage(), package.PackageID); }
private bool Connect() { try { TCPClient = new TcpClient(IPAddress, PortNumber); } catch (Exception exc) { Console.WriteLine("Can't connect: " + exc.Message); return false; } String ConnResult = ""; try { TCPStream = TCPClient.GetStream(); byte[] StreamTest = new byte[10]; IAsyncResult NetStreamReadRes = TCPStream.BeginRead(StreamTest, 0, StreamTest.Length, null, null); if (NetStreamReadRes.AsyncWaitHandle.WaitOne(1500, false)) { int streamLength = TCPStream.EndRead(NetStreamReadRes); ConnResult = Encoding.GetEncoding(1251).GetString(StreamTest, 0, streamLength); } } catch (Exception exc) { Console.WriteLine("Can't create the network stream: " + exc.Message); return false; } if (ConnResult != "$M$_$ERVER") return false; SetConnectionStatus(true); if (Client.User != 0) { PackageViaWireless Package = new PackageViaWireless(0, true); Package.DefineQueryAndParams("ConnectionRecovery", ""); Package.ClientCode = Client.User; SendPackage(Package.GetPackage()); } // Запуск пинга сервера //PingAgent = new CallTimer(PingServer, 500); return true; }
public void SendToServer(string QueryName, params object[] Parameters) { PackageViaWireless Package = new PackageViaWireless(0, true); Package.DefineQueryAndParams(QueryName, PackageConvertation.GetStrPatametersFromArray(Parameters)); Package.ClientCode = User; ConnectionAgent.WaitingPackageID = Package.PackageID; ConnectionAgent.SendPackage(Package.GetPackage()); }
private void InformFileAccepted(bool update) { // Отправка сообщение серверу, что файл получен PackageViaWireless Package = new PackageViaWireless(Client.User, true); Package.DefineQueryAndParams("FileAccepted", ""); SendPackage(Package.GetPackage()); System.Threading.Thread.Sleep(1000); if (update) lock (Client) { Client.TryToUpdate(); } }