예제 #1
0
파일: ZipUtil.cs 프로젝트: Top-Cat/SteamBot
        public static byte[] Compress( byte[] buffer )
        {
            using ( MemoryStream ms = new MemoryStream() )
            using ( BinaryWriter writer = new BinaryWriter( ms ) )
            {
                uint checkSum = 0;

                using ( Crc crc = new Crc( CrcParameters.GetParameters( CrcStandard.Crc32Bit ) ) )
                {
                    checkSum = BitConverter.ToUInt32( crc.ComputeHash( buffer ), 0 );
                }

                byte[] compressed = DeflateBuffer( buffer );

                Int32 poslocal = WriteHeader( writer, LocalFileHeader );
                WriteLocalFile( writer, "z", checkSum, ( UInt32 )buffer.Length, compressed );

                Int32 posCDR = WriteHeader( writer, CentralDirectoryHeader );
                UInt32 CDRSize = WriteCentralDirectory( writer, "z", checkSum, ( UInt32 )compressed.Length, ( UInt32 )buffer.Length, poslocal );

                Int32 posEOD = WriteHeader( writer, EndOfDirectoryHeader );
                WriteEndOfDirectory( writer, 1, CDRSize, posCDR );

                return ms.ToArray();
            }
        }
예제 #2
0
파일: CRC.cs 프로젝트: Ciphra333/Osu-Bot
 private static uint CalculateDigest(byte[] data, uint offset, uint size)
 {
     var crc = new Crc();
     // crc.Init();
     crc.Update(data, offset, size);
     return crc.GetDigest();
 }
예제 #3
0
파일: RxFrame.cs 프로젝트: Roog/ember-plus
        void ReceiveByteWithEscaping(byte b, MessageCallback framingErrorCallback)
        {
            if (b == Constants.Bof)
            {
                if (framingErrorCallback != null)
                {
                    framingErrorCallback("S101: BOF in frame!");
                }

                _stream.SetLength(0);
                _isDataLinkEscaped = false;
                _crc = Crc.InitialValue;

                if (_outOfFrameByteCount > 0 && framingErrorCallback != null)
                {
                    framingErrorCallback(String.Format("S101: {0} out of frame data bytes!", _outOfFrameByteCount));
                }

                _outOfFrameByteCount = 0;
                return;
            }

            if (b == Constants.Eof)
            {
                var length = (int)_stream.Length;
                _stream.Write(Constants.Eofs, 0, Constants.Eofs.Length);

                if (length >= 3)
                {
                    if (_crc == 0xF0B8)
                    {
                        _stream.SetLength(length - 2);
                        var memory = _stream.ToArray();
                        OnMessageReceived(new MessageReceivedArgs(memory.Length, memory, false), true);
                    }
                    else
                    {
                        if (framingErrorCallback != null)
                        {
                            framingErrorCallback("S101: CRC error!");
                        }
                    }
                }
                else if (length == 0)
                {
                    if (framingErrorCallback != null)
                    {
                        framingErrorCallback("S101: EOF out of frame!");
                    }
                }

                _isInFrame = false;
                _stream.SetLength(0);
                return;
            }

            if (b == Constants.Ce)
            {
                _isDataLinkEscaped = true;
                return;
            }

            if (b >= Constants.Invalid)
            {
                if (framingErrorCallback != null)
                {
                    framingErrorCallback("S101: Invalid character received!");
                }

                _isInFrame = false;
                _stream.SetLength(0);
                return;
            }

            if (_isDataLinkEscaped)
            {
                _isDataLinkEscaped = false;
                b ^= 0x20;
            }

            _stream.WriteByte(b);
            _crc = Crc.CrcCCITT16(_crc, b);
        }
예제 #4
0
        private void Idle()
        {
            try
            {
                while (true)
                {
                    var buffer = new byte[BUFFER_SIZE];
                    var readed = socket.Receive(buffer);

                    if (readed == 0)
                    {
                        throw new Exception("пришло 0 байт");
                        //log.Debug(string.Format("[{0}] пришло 0 байт", GetImei()));
                    }
                    else
                    {
                        byte[] bytes = buffer.Take(readed).ToArray();
                        subscriber?.Invoke(bytes);
                        if (subscriber == null) // 12.03.2019
                        {
                            if (bytes.Length < 5)
                            {
                                if (bytes.Length == 2 && (bytes[0] + bytes[1] == 0xFF))
                                {
                                    SendDataToSocket(bytes);
                                }
                                else if (bytes.Length == 3 && ((byte)((bytes[1] >> 4) | (bytes[1] << 4)) == bytes[2]))
                                {
                                    try
                                    {
                                        Guid objectId = GetObjectId(GetImei(), bytes[0]);
                                        ModbusControl.Instance.Request(new Guid[] { objectId }, bytes[1].ToString(), GetImei(), "Abnormal");
                                    }
                                    catch (Exception ex)
                                    {
                                    }
                                    log.Error("событие");
                                }

                                log.Error($"количество байтов пришло {bytes.Length} < 5");
                            }
                            else if (Crc.Check(bytes, new Crc16Modbus()))
                            {
                                SendDataToSocket(ModbusControl.Instance.TeleofisWrx(bytes, GetImei()));
                            }
                            else
                            {
                                if ((bytes[0] == 0x0A && bytes[1] == 0x0D) || (bytes[bytes.Length - 2] == 0x0A && bytes[bytes.Length - 1] == 0x0D))
                                {
                                    List <byte> bufferTmp = bytes.ToList();
                                    while (bufferTmp.Count > 5 && (bufferTmp[0] == 0x0A && bufferTmp[1] == 0x0D))
                                    {
                                        bufferTmp.RemoveRange(0, 2);
                                    }
                                    while (bufferTmp.Count > 5 && (bufferTmp[bufferTmp.Count - 2] == 0x0A && bufferTmp[bufferTmp.Count - 1] == 0x0D))
                                    {
                                        bufferTmp.RemoveRange(bufferTmp.Count - 2, 2);
                                    }
                                    bytes = null;
                                    bytes = bufferTmp.ToArray();
                                    if (!Crc.Check(bytes, new Crc16Modbus()))
                                    {
                                        log.Error("контрольная сумма кадра не сошлась");
                                    }
                                    else
                                    {
                                        SendDataToSocket(ModbusControl.Instance.TeleofisWrx(bytes, GetImei()));
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception oex)
            {
                log.Error(string.Format("[{0}] поток слушающий сокет остановлен", GetImei()), oex);
                CloseSocket();
            }
        }
예제 #5
0
        private dynamic Send(byte[] datasend, int attempts_total = SEND_ATTEMPTS)
        {
            dynamic answer = new ExpandoObject();

            answer.success   = false;
            answer.error     = string.Empty;
            answer.errorcode = DeviceError.NO_ERROR;

            byte[] buffer = null;

            for (var attempts = 0; attempts < attempts_total && answer.success == false; attempts++)
            {
                buffer = SendSimple(datasend);
                if (buffer.Length == 0)
                {
                    answer.error     = "Нет ответа";
                    answer.errorcode = DeviceError.NO_ANSWER;
                }
                else
                {
                    if (buffer.Length < 4)
                    {
                        answer.error     = "в кадре ответа не может содержаться менее 4 байт";
                        answer.errorcode = DeviceError.TOO_SHORT_ANSWER;
                    }
                    else if (!Crc.Check(buffer, new Crc16Modbus()))
                    {
                        answer.error     = "контрольная сумма кадра не сошлась";
                        answer.errorcode = DeviceError.CRC_ERROR;
                    }
                    else
                    {
                        answer.success   = true;
                        answer.error     = string.Empty;
                        answer.errorcode = DeviceError.NO_ERROR;
                    }
                }
            }

            if (answer.success)
            {
                answer.NetworkAddress = buffer[0];
                answer.Body           = buffer.Skip(1).Take(buffer.Length - 3).ToArray();
                var tmp = buffer.Skip(1).Take(buffer.Length - 3);

                /*
                 * log($"buffer, {string.Join(",", buffer.Select(b => b.ToString("X2")))}");
                 * log($"Body, {string.Join(",", tmp.Select(b => b.ToString("X2")))}");
                 *
                 * List<byte> tmpByte = (tmp.Select(b => b)).ToList();
                 * log($"tmpByte до удаления, {string.Join(",", tmpByte.Select(b => b.ToString("X2")))}");
                 * try
                 * {
                 *  int firstIndexFF = tmpByte.IndexOf(0xFF);
                 *  log($"Индекс1: {firstIndexFF}");
                 *  if (firstIndexFF > 40)
                 *  {
                 *      tmpByte.RemoveAt(firstIndexFF);
                 *  }
                 * }
                 * catch
                 * {
                 * }
                 * log($"tmpByte после удаления, {string.Join(",", tmpByte.Select(b => b.ToString("X2")))}");
                 */
                //answer.Body = tmpByte.ToArray();
                //modbus error
                if (buffer.Length == 4)
                {
                    answer.success   = false;
                    answer.errorcode = DeviceError.DEVICE_EXCEPTION;
                    switch (buffer[1] & 0x0F)
                    {
                    case 0x00:
                        answer.success   = true;
                        answer.errorcode = DeviceError.NO_ERROR;
                        answer.error     = "все нормально";
                        break;

                    case 0x01:
                        answer.error = "недопустимая команда или параметр";
                        break;

                    case 0x02:
                        answer.error = "внутренняя ошибка счетчика";
                        break;

                    case 0x03:
                        answer.error = "не достаточен уровень доступа для удовлетворения запроса";
                        break;

                    case 0x04:
                        answer.error = "внутренние часы счетчика уже корректировались в течении текущих суток";
                        break;

                    case 0x05:
                        answer.error = "не открыт канал связи";
                        break;

                    case 0x0F:
                        answer.error = "счётчик не отвечает (коммуникатор)";
                        break;

                    default:
                        answer.error = "неизвестная ошибка";
                        break;
                    }
                }
            }

            return(answer);
        }
예제 #6
0
            public void Execute()
            {
                ValidateFacets();


                var facetsByName = new Dictionary <string, Dictionary <string, FacetValue> >();

                bool isDistinct = IndexQuery.IsDistinct;

                if (isDistinct)
                {
                    _fieldsCrc = IndexQuery.FieldsToFetch.Aggregate <string, uint>(0, (current, field) => Crc.Value(field, current));
                }

                _currentState = Database.IndexStorage.GetCurrentStateHolder(Index);
                using (_currentState)
                {
                    var currentIndexSearcher = _currentState.IndexSearcher;

                    var baseQuery       = Database.IndexStorage.GetDocumentQuery(Index, IndexQuery, Database.IndexQueryTriggers);
                    var returnedReaders = GetQueryMatchingDocuments(currentIndexSearcher, baseQuery);

                    foreach (var facet in Facets.Values)
                    {
                        if (facet.Mode != FacetMode.Default)
                        {
                            continue;
                        }

                        Dictionary <string, HashSet <IndexSearcherHolder.StringCollectionValue> > distinctItems = null;
                        HashSet <IndexSearcherHolder.StringCollectionValue> alreadySeen = null;
                        if (isDistinct)
                        {
                            distinctItems = new Dictionary <string, HashSet <IndexSearcherHolder.StringCollectionValue> >();
                        }

                        foreach (var readerFacetInfo in returnedReaders)
                        {
                            var termsForField = IndexedTerms.GetTermsAndDocumentsFor(readerFacetInfo.Reader, readerFacetInfo.DocBase, facet.Name, Database.Name, Index);

                            Dictionary <string, FacetValue> facetValues;

                            if (facetsByName.TryGetValue(facet.DisplayName, out facetValues) == false)
                            {
                                facetsByName[facet.DisplayName] = facetValues = new Dictionary <string, FacetValue>();
                            }

                            foreach (var kvp in termsForField)
                            {
                                if (isDistinct)
                                {
                                    if (distinctItems.TryGetValue(kvp.Key, out alreadySeen) == false)
                                    {
                                        alreadySeen            = new HashSet <IndexSearcherHolder.StringCollectionValue>();
                                        distinctItems[kvp.Key] = alreadySeen;
                                    }
                                }

                                var needToApplyAggregation = (facet.Aggregation == FacetAggregation.None || facet.Aggregation == FacetAggregation.Count) == false;
                                var intersectedDocuments   = GetIntersectedDocuments(new ArraySegment <int>(kvp.Value), readerFacetInfo.Results, alreadySeen, needToApplyAggregation);
                                var intersectCount         = intersectedDocuments.Count;
                                if (intersectCount == 0)
                                {
                                    continue;
                                }

                                FacetValue facetValue;
                                if (facetValues.TryGetValue(kvp.Key, out facetValue) == false)
                                {
                                    facetValue = new FacetValue
                                    {
                                        Range = GetRangeName(facet.Name, kvp.Key)
                                    };
                                    facetValues.Add(kvp.Key, facetValue);
                                }
                                facetValue.Hits += intersectCount;
                                facetValue.Count = facetValue.Hits;

                                if (needToApplyAggregation)
                                {
                                    var docsInQuery = new ArraySegment <int>(intersectedDocuments.Documents, 0, intersectedDocuments.Count);
                                    ApplyAggregation(facet, facetValue, docsInQuery, readerFacetInfo.Reader, readerFacetInfo.DocBase);
                                }
                            }
                        }
                    }

                    foreach (var range in Ranges)
                    {
                        var facet = Facets[range.Key];
                        var needToApplyAggregation = (facet.Aggregation == FacetAggregation.None || facet.Aggregation == FacetAggregation.Count) == false;

                        Dictionary <string, HashSet <IndexSearcherHolder.StringCollectionValue> > distinctItems = null;
                        HashSet <IndexSearcherHolder.StringCollectionValue> alreadySeen = null;
                        if (isDistinct)
                        {
                            distinctItems = new Dictionary <string, HashSet <IndexSearcherHolder.StringCollectionValue> >();
                        }

                        foreach (var readerFacetInfo in returnedReaders)
                        {
                            var termsForField = IndexedTerms.GetTermsAndDocumentsFor(readerFacetInfo.Reader, readerFacetInfo.DocBase, facet.Name, Database.Name, Index);
                            if (isDistinct)
                            {
                                if (distinctItems.TryGetValue(range.Key, out alreadySeen) == false)
                                {
                                    alreadySeen = new HashSet <IndexSearcherHolder.StringCollectionValue>();
                                    distinctItems[range.Key] = alreadySeen;
                                }
                            }

                            var facetResult = Results.Results[range.Key];
                            var ranges      = range.Value;
                            foreach (var kvp in termsForField)
                            {
                                for (int i = 0; i < ranges.Count; i++)
                                {
                                    var parsedRange = ranges[i];
                                    if (parsedRange.IsMatch(kvp.Key))
                                    {
                                        var facetValue = facetResult.Values[i];

                                        var intersectedDocuments = GetIntersectedDocuments(new ArraySegment <int>(kvp.Value), readerFacetInfo.Results, alreadySeen, needToApplyAggregation);
                                        var intersectCount       = intersectedDocuments.Count;
                                        if (intersectCount == 0)
                                        {
                                            continue;
                                        }

                                        facetValue.Hits += intersectCount;
                                        facetValue.Count = facetValue.Hits;

                                        if (needToApplyAggregation)
                                        {
                                            var docsInQuery = new ArraySegment <int>(intersectedDocuments.Documents, 0, intersectedDocuments.Count);
                                            ApplyAggregation(facet, facetValue, docsInQuery, readerFacetInfo.Reader, readerFacetInfo.DocBase);
                                            IntArraysPool.Instance.FreeArray(intersectedDocuments.Documents);
                                            intersectedDocuments.Documents = null;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    UpdateFacetResults(facetsByName);

                    CompleteFacetCalculationsStage();

                    foreach (var readerFacetInfo in returnedReaders)
                    {
                        IntArraysPool.Instance.FreeArray(readerFacetInfo.Results.Array);
                    }
                }
            }
예제 #7
0
        private dynamic Send(byte[] data, int attempts_total = 8)   //4
        {
            if (gate228)
            {
                dynamic answer = new ExpandoObject();
                answer.success   = false;
                answer.error     = string.Empty;
                answer.errorcode = DeviceError.NO_ERROR;

                byte[] buffer = null;
                if (firstStart == 0)
                {
                    byte[] extraBytes1 = new byte[] { 0xDE, 0x65, 0x71, 0x01, 0x00, 0x00, 0x80, 0x7F, 0x20, 0x3F };
                    byte[] extraBytes2 = new byte[] { 0x27, 0xB7, 0xFC, 0x01, 0x00, 0x04, 0x00, 0x00, 0x01, 0x16, 0x22, 0x04, 0x3C };

                    SendSimple(extraBytes1);
                    SendSimple(extraBytes2);

                    firstStart++;
                }


                List <byte> dataGate228 = new List <byte>();
                dataGate228.Add(01);
                dataGate228.Add(00);
                if (data.Length > 255)
                {
                    dataGate228.AddRange(BitConverter.GetBytes(data.Length));
                }
                else
                {
                    dataGate228.Add((byte)(data.Length));
                    //dataGate228.Add(4);
                    dataGate228.Add(0);
                }
                // dataGate228.Add(0);
                dataGate228.Add(1);
                UInt32 crc24 = Crc24.Compute(dataGate228.ToArray());

                dataGate228.InsertRange(0, BitConverter.GetBytes(crc24).Take(3));
                byte csLast = (byte)(data.Sum(d => d) - 1);
                dataGate228.AddRange(data);
                dataGate228.Add(csLast);

                for (var attempts = 0; attempts < attempts_total && answer.success == false; attempts++)
                {
                    buffer = SendSimple(dataGate228.ToArray());
                    buffer = buffer.Skip(8).Take(buffer[5]).ToArray();

                    log(string.Format("< {0}", string.Join(",", buffer.Select(b => b.ToString("X2")))), level: 3);

                    if (buffer.Length == 0)
                    {
                        answer.error     = "Нет ответа";
                        answer.errorcode = DeviceError.NO_ANSWER;
                    }
                    else
                    {
                        buffer = buffer.SkipWhile(b => b == 0xff).ToArray();
                        if (buffer.Length < 4)
                        {
                            answer.error     = "в кадре ответа не может содежаться менее 4 байт";
                            answer.errorcode = DeviceError.TOO_SHORT_ANSWER;
                        }
                        else
                        {
                            UInt32 crc24forcheck = BitConverter.ToUInt32(new byte[] { buffer[0], buffer[1], buffer[2], 0x00 }, 0);
                            byte   cs            = (byte)(buffer.Skip(8).Take(buffer.Length - 9).Sum(b => b) - 1);
                            //if (crc24forcheck != Crc24.Compute(buffer, 3, 5))
                            //{
                            //    answer.error = "контрольная сумма заголовка не сошлась";
                            //    answer.errorcode = DeviceError.CRC_ERROR;
                            //}
                            //else if (cs != buffer[buffer.Length - 1])
                            //{
                            //    answer.error = "контрольная сумма данных не сошлась";
                            //    answer.errorcode = DeviceError.CRC_ERROR;
                            //}
                            answer.success   = true;
                            answer.error     = string.Empty;
                            answer.errorcode = DeviceError.NO_ERROR;
                            //else
                            //{

                            //}
                        }
                    }
                }

                if (answer.success)
                {
                    answer.Body = buffer.Skip(1).ToArray();
                    //answer.Payload = buffer.Skip(8).Take(buffer.Length - 9).ToArray();

                    //modbus error
                    if (buffer.Length == 4)
                    {
                        answer.errorcode     = DeviceError.DEVICE_EXCEPTION;
                        answer.exceptioncode = buffer[1];
                        answer.success       = false;
                        switch (buffer[1])
                        {
                        case 0x00:
                            answer.errorcode = DeviceError.NO_ERROR;
                            answer.success   = true;
                            answer.error     = "все нормально";
                            break;

                        case 0x01:
                            answer.error = "недопустимая команда или параметр";
                            break;

                        case 0x02:
                            answer.error = "внутренняя ошибка счетчика";
                            break;

                        case 0x03:
                            answer.error = "не достаточен уровень доступа для удовлетворения запроса";
                            break;

                        case 0x04:
                            answer.error = "внутренние часы счетчика уже корректировались в течении текущих суток";
                            break;

                        case 0x05:
                            answer.error = "не открыт канал связи";
                            break;

                        default:
                            answer.error = "неизвестная ошибка";
                            break;
                        }
                    }
                }

                return(answer);
            }
            else
            {
                dynamic answer = new ExpandoObject();
                answer.success   = false;
                answer.error     = string.Empty;
                answer.errorcode = DeviceError.NO_ERROR;

                byte[] buffer = null;

                for (var attempts = 0; attempts < attempts_total && answer.success == false; attempts++)
                {
                    buffer = SendSimple(data);
                    if (buffer.Length == 0)
                    {
                        answer.error     = "Нет ответа";
                        answer.errorcode = DeviceError.NO_ANSWER;
                    }
                    else
                    {
                        buffer = buffer.SkipWhile(b => b == 0xff).ToArray();
                        if (buffer.Length < 4)
                        {
                            answer.error     = "в кадре ответа не может содежаться менее 4 байт";
                            answer.errorcode = DeviceError.TOO_SHORT_ANSWER;
                        }
                        else if (buffer[0] != NetworkAddress)
                        {
                            answer.error     = "Несовпадение сетевого адреса";
                            answer.errorcode = DeviceError.ADDRESS_ERROR;
                        }
                        else if (buffer.Length == 4 && buffer[1] == 0x05)
                        {
                            answer.error     = "Закрыт канал связи";
                            answer.errorcode = DeviceError.CHANNEL_CLOSED;
                        }
                        else if (!Crc.Check(buffer, new Crc16Modbus()))
                        {
                            answer.error     = "контрольная сумма кадра не сошлась";
                            answer.errorcode = DeviceError.CRC_ERROR;

                            for (int i = 0; i < buffer.Length - 1; i++)
                            {
                                if ((buffer[i] == 0x0d) && (buffer[i + 1] == 0x0a))
                                {
                                    for (int j = i + 2; j < buffer.Length - 1; j++)
                                    {
                                        if ((buffer[j] == 0x0d) && (buffer[j + 1] == 0x0a))
                                        {
                                            //var tmp = buffer.Take(i);
                                            //buffer = null;
                                            //buffer = tmp.ToArray();
                                            buffer = buffer.Take(i).ToArray();
                                            if (Crc.Check(buffer, new Crc16Modbus()))
                                            {
                                                answer.success   = true;
                                                answer.error     = string.Empty;
                                                answer.errorcode = DeviceError.NO_ERROR;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            answer.success   = true;
                            answer.error     = string.Empty;
                            answer.errorcode = DeviceError.NO_ERROR;
                        }
                    }
                }

                if (answer.success)
                {
                    answer.Body           = buffer.Skip(1).Take(buffer.Count() - 3).ToArray();
                    answer.NetworkAddress = buffer[0];

                    //modbus error
                    if (buffer.Length == 4)
                    {
                        answer.errorcode     = DeviceError.DEVICE_EXCEPTION;
                        answer.exceptioncode = buffer[1];
                        answer.success       = false;
                        switch (buffer[1])
                        {
                        case 0x00:
                            answer.errorcode = DeviceError.NO_ERROR;
                            answer.success   = true;
                            answer.error     = "все нормально";
                            break;

                        case 0x01:
                            answer.error = "недопустимая команда или параметр";
                            break;

                        case 0x02:
                            answer.error = "внутренняя ошибка счетчика";
                            break;

                        case 0x03:
                            answer.error = "не достаточен уровень доступа для удовлетворения запроса";
                            break;

                        case 0x04:
                            answer.error = "внутренние часы счетчика уже корректировались в течении текущих суток";
                            break;

                        case 0x05:
                            answer.error = "не открыт канал связи";
                            break;

                        default:
                            answer.error = "неизвестная ошибка";
                            break;
                        }
                    }
                }

                return(answer);
            }
        }
예제 #8
0
        private dynamic Send(byte[] dataSend)
        {
            dynamic answer = new ExpandoObject();

            answer.success = false;
            answer.error   = string.Empty;

            byte[] data = null;

            for (var attempts = 0; attempts < 3 && answer.success == false; attempts++)
            {
                if (attempts == 0)
                {
                    data = SendSimple(dataSend, 10000, 3);
                }
                else if (attempts == 1)
                {
                    data = SendSimple(dataSend, 10000, 6);
                }
                else
                {
                    data = SendSimple(dataSend, 10000, 6);
                }

                if (data.Length == 0)
                {
                    answer.error = "Нет ответа";
                }
                else
                {
                    if (data.Length < 5)
                    {
                        answer.error = "в кадре ответа не может содежаться менее 5 байт";
                    }
                    else if (!Crc.Check(data, new Crc16Modbus()))
                    {
                        answer.error = "контрольная сумма кадра не сошлась";
                    }
                    else if ((data[1] < 0x80) && (data[1] != dataSend[1]))
                    {
                        answer.error = "пришёл ответ на другой запрос";
                    }
                    else
                    {
                        answer.success = true;
                    }
                }
            }

            if (answer.success)
            {
                answer.NetworkAddress = data[0];
                answer.Function       = data[1];
                answer.Length         = data[2];
                answer.Body           = data.Skip(3).Take(data.Length - 5).ToArray();
                answer.data           = data;

                //modbus error
                if (answer.Function > 0x80)
                {
                    answer.exceptionCode = (ModbusExceptionCode)data[2];
                    answer.success       = false;
                    answer.error         = string.Format("устройство вернуло ошибку: {0}", answer.exceptionCode);
                }
            }

            return(answer);
        }
예제 #9
0
 /// <inheritdoc />
 public override string ToString()
 {
     return string.Format(CultureInfo.InvariantCulture, "Name: '{0}', CRC: 0x{1}", Description, Crc.ToString("X8", CultureInfo.InvariantCulture));
 }
예제 #10
0
        public bool ReadOneTransaction(StorageEnvironmentOptions options, bool checkCrc = true)
        {
            if (_readingPage >= _pager.NumberOfAllocatedPages)
            {
                return(false);
            }

            TransactionHeader *current;

            if (!TryReadAndValidateHeader(options, out current))
            {
                return(false);
            }

            var compressedPages = (current->CompressedSize / AbstractPager.PageSize) + (current->CompressedSize % AbstractPager.PageSize == 0 ? 0 : 1);

            if (current->TransactionId <= _lastSyncedTransactionId)
            {
                LastTransactionHeader = current;
                _readingPage         += compressedPages;
                return(true); // skipping
            }

            if (checkCrc)
            {
                uint crc = Crc.Value(_pager.AcquirePagePointer(_readingPage), 0, compressedPages * AbstractPager.PageSize);

                if (crc != current->Crc)
                {
                    RequireHeaderUpdate = true;
                    options.InvokeRecoveryError(this, "Invalid CRC signature for transaction " + current->TransactionId, null);

                    return(false);
                }
            }

            _recoveryPager.EnsureContinuous(null, _recoveryPage, (current->PageCount + current->OverflowPageCount) + 1);
            var dataPage = _recoveryPager.AcquirePagePointer(_recoveryPage);

            NativeMethods.memset(dataPage, 0, (current->PageCount + current->OverflowPageCount) * AbstractPager.PageSize);
            try
            {
                LZ4.Decode64(_pager.AcquirePagePointer(_readingPage), current->CompressedSize, dataPage, current->UncompressedSize, true);
            }
            catch (Exception e)
            {
                options.InvokeRecoveryError(this, "Could not de-compress, invalid data", e);
                RequireHeaderUpdate = true;

                return(false);
            }

            var tempTransactionPageTranslaction = new Dictionary <long, JournalFile.PagePosition>();

            for (var i = 0; i < current->PageCount; i++)
            {
                Debug.Assert(_pager.Disposed == false);
                Debug.Assert(_recoveryPager.Disposed == false);

                var page = _recoveryPager.Read(_recoveryPage);

                tempTransactionPageTranslaction[page.PageNumber] = new JournalFile.PagePosition
                {
                    JournalPos    = _recoveryPage,
                    TransactionId = current->TransactionId
                };

                if (page.IsOverflow)
                {
                    var numOfPages = _recoveryPager.GetNumberOfOverflowPages(page.OverflowSize);
                    _recoveryPage += numOfPages;
                }
                else
                {
                    _recoveryPage++;
                }
            }

            _readingPage += compressedPages;

            LastTransactionHeader = current;

            foreach (var pagePosition in tempTransactionPageTranslaction)
            {
                _transactionPageTranslation[pagePosition.Key] = pagePosition.Value;
            }

            return(true);
        }
예제 #11
0
        public bool DecodeFrame(byte[] buffer, int bufferLen)
        {
            ushort bufferIndex = 0;

            if (buffer[bufferIndex] != 0xAA)
            {
                return(false);
            }
            bufferIndex += 1;

            CmdType      = buffer[bufferIndex];
            bufferIndex += 1;

            CmdByte      = buffer[bufferIndex];
            bufferIndex += 1;

            Array.Copy(buffer, bufferIndex, Pwd, 0, 8);
            bufferIndex += 8;

            NodeId       = Utility.BytesToUint32(buffer, bufferIndex, false);
            bufferIndex += 4;

            Array.Copy(buffer, bufferIndex, Description, 0, 12);
            bufferIndex += 12;

            SrcAddr      = buffer[bufferIndex];
            bufferIndex += 1;

            DstAddr      = buffer[bufferIndex];
            bufferIndex += 1;

            DataLen      = Utility.BytesToUint16(buffer, bufferIndex, false);
            bufferIndex += 2;

            Array.Copy(buffer, bufferIndex, Data, 0, DataLen);
            bufferIndex += DataLen;

            var crc1 = Crc.GetUsmbcrc16(buffer, bufferIndex);

            var crc2 = Utility.BytesToUint16(buffer, bufferIndex, false);

            bufferIndex += 2;

            if (crc1 != crc2)
            {
                return(false);
            }

            if (buffer[bufferIndex] != 0xDD)
            {
                return(false);
            }

            bufferIndex += 1;

            if (bufferLen != bufferIndex)
            {
                return(false);
            }

            return(true);
        }
예제 #12
0
        //public Guid GetObjectId(byte[] bytesObjectId, string imei, UInt32 networkAddress)
        //{
        //    Guid nullGuid = new Guid();
        //    Guid objectId = new Guid(bytesObjectId);
        //    if (objectId == nullGuid || (bytesObjectId[0] == 0xFF && bytesObjectId[1] == 0xFF))
        //    {
        //        objectId = GetObjectId(imei, networkAddress);
        //    }
        //    return objectId;
        //}
        private void Idle()
        {
            try
            {
                while (true)
                {
                    var buffer = new byte[BUFFER_SIZE];
                    var readed = socket.Receive(buffer);

                    if (readed == 0)
                    {
                        throw new Exception("пришло 0 байт");
                        //log.Debug(string.Format("[{0}] пришло 0 байт", GetImei()));
                    }
                    else
                    {
                        byte[] bytes = buffer.Take(readed).ToArray();
                        subscriber?.Invoke(bytes);
                        if (subscriber == null) // 12.03.2019
                        {
                            if (bytes.Length < 5)
                            {
                                if (bytes.Length == 2 && (bytes[0] + bytes[1] == 0xFF))
                                {
                                    SendDataToSocket(bytes);
                                }
                                else if (bytes.Length == 3 && ((byte)((bytes[1] >> 4) | (bytes[1] << 4)) == bytes[2]))
                                {
                                    try
                                    {
                                        Guid objectId = GetObjectId <byte>(GetImei(), bytes[0]);
                                        ModbusControl.Instance.Request(new Guid[] { objectId }, bytes[1].ToString(), GetImei(), "Abnormal");
                                    }
                                    catch (Exception ex)
                                    {
                                    }
                                    log.Error("событие");
                                }

                                log.Error($"количество байтов пришло {bytes.Length} < 5");
                            }

                            else if (Crc.Check(bytes, new Crc16Modbus()))
                            {
                                if (bytes[0] == 0xFB) //вместо СА используется CID
                                {
                                    //if (bytes[13] == 0x60) // не работает еще
                                    //{
                                    //    byte[] byteConfig = bytes.Skip(1).Take(bytes.Length - 4).ToArray();
                                    //    //tsConfig conf = setBytes(byteConfig);
                                    //    EditNode(BitConverter.ToString(byteConfig));
                                    //}
                                    if (bytes[13] == 0x4D) //длинный СА
                                    {
                                        DateTime dt1970         = new DateTime(1970, 1, 1, 0, 0, 0, 0);
                                        byte[]   bytesCId       = bytes.Skip(1).Take(12).ToArray();
                                        string   strCId         = BitConverter.ToString(bytesCId).Replace("-", "");
                                        byte     func           = bytes[13];
                                        byte[]   bytesObjectId  = bytes.Skip(14).Take(16).ToArray();
                                        UInt32   networkAddress = Helper.ToUInt32(bytes, 30);
                                        //byte networkAddress = bytes[30];
                                        Guid       objectId     = GetObjectId <UInt32>(bytesObjectId, GetImei(), networkAddress);
                                        byte[]     byteTime     = bytes.Skip(34).Take(4).ToArray(); //31
                                        UInt32     uInt32Time   = (UInt32)(byteTime[3] << 24) | (UInt32)(byteTime[2] << 16) | (UInt32)(byteTime[1] << 8) | byteTime[0];
                                        DateTime   dtContollers = dt1970.AddSeconds(uInt32Time);
                                        UInt16     code         = Helper.ToUInt16(bytes, 38);
                                        DateTime[] dtEvent      = new DateTime[16];
                                        for (int i = 0; i < 16; i++)
                                        {
                                            if (i == 7)
                                            {
                                                byte[] byteTime1   = bytes.Skip(40 + i * 4).Take(4).ToArray(); //31
                                                UInt32 uInt32Time1 = (UInt32)(byteTime1[3] << 24) | (UInt32)(byteTime1[2] << 16) | (UInt32)(byteTime1[1] << 8) | byteTime1[0];
                                                dtEvent[i] = dt1970.AddSeconds(uInt32Time1);
                                            }
                                            else
                                            {
                                                dtEvent[i] = u32ToBytes(bytes.Skip(40 + i * 4).Take(4).ToArray());
                                            }
                                            //byte[] byteTime1 = bytes.Skip(37 + i*4 ).Take(4).ToArray();
                                            //UInt32 uInt32Time1 = (UInt32)(byteTime1[3] << 24) | (UInt32)(byteTime1[2] << 16) | (UInt32)(byteTime1[1] << 8) | byteTime1[0];
                                            //dtEvent[i] = dt1970.AddSeconds(uInt32Time1);
                                        }
                                        byte[]         arrParams = new byte[] { 0x01, 0x02, 0x07, 0x08, 0x0A, 0x12, 0x13, 0x00 };
                                        List <dynamic> records   = new List <dynamic>();
                                        for (int i = 0; i < arrParams.Length; i++)
                                        {
                                            if (((byte)(code >> i) & 1) == 1 && dtEvent[i] != DateTime.MinValue)
                                            {
                                                records.Add(MakeAbnormalRecord(objectId, ParamName(arrParams[i]), MessageParam(arrParams[i]), dtEvent[i], 1));
                                            }
                                        }
                                        if (records.Any())
                                        {
                                            RecordsAcceptor.Instance.Save(records);
                                        }
                                    }
                                }
                                else
                                {
                                    if (bytes[1] == 0x60)
                                    {
                                        byte[] byteConfig = bytes.Skip(2).Take(bytes.Length - 4).ToArray();
                                        EditNode(BitConverter.ToString(byteConfig));
                                    }
                                }
                                //tsConfig conf = setBytes(bytes);
                                //SendDataToSocket(ModbusControl.Instance.TeleofisWrx(bytes, GetImei()));
                            }
                            else
                            {
                                if ((bytes[0] == 0x0A && bytes[1] == 0x0D) || (bytes[bytes.Length - 2] == 0x0A && bytes[bytes.Length - 1] == 0x0D))
                                {
                                    List <byte> bufferTmp = bytes.ToList();
                                    while (bufferTmp.Count > 5 && (bufferTmp[0] == 0x0A && bufferTmp[1] == 0x0D))
                                    {
                                        bufferTmp.RemoveRange(0, 2);
                                    }
                                    while (bufferTmp.Count > 5 && (bufferTmp[bufferTmp.Count - 2] == 0x0A && bufferTmp[bufferTmp.Count - 1] == 0x0D))
                                    {
                                        bufferTmp.RemoveRange(bufferTmp.Count - 2, 2);
                                    }
                                    bytes = null;
                                    bytes = bufferTmp.ToArray();
                                    if (!Crc.Check(bytes, new Crc16Modbus()))
                                    {
                                        log.Error("контрольная сумма кадра не сошлась");
                                    }
                                    else
                                    {
                                        SendDataToSocket(ModbusControl.Instance.TeleofisWrx(bytes, GetImei()));
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception oex)
            {
                log.Error(string.Format("[{0}] поток слушающий сокет остановлен", GetImei()), oex);
                CloseSocket();
            }
        }
예제 #13
0
    public System.Collections.IEnumerator UnzipProcess(object obj)
    {
        float step = 0.5f / ResManager.RES_NUM;

        for (int i = 0; i < ResManager.RES_NUM; ++i)
        {
            ResType rt           = (ResType)i;
            string  path         = RuntimeInfo.GetResStreamingPath(rt);
            string  destPath     = RuntimeInfo.GetResPersistentPath(rt);
            string  destPathTemp = destPath + ".temp";
            WWW     www          = new WWW(path);
            while (www.isDone == false)
            {
                yield return(new WaitForEndOfFrame());
            }
            if (www.bytes == null || www.bytes.Length == 0)
            {
                m_Error = "资源解压失败:" + path;
                LogMgr.Log("解压失败,未找到文件:" + www.error + ", Path:" + path);
                yield break;
            }
            try
            {
                FileInfo fi = new FileInfo(destPathTemp);
                if (fi.Exists)
                {
                    fi.Delete();
                }
                FileStream fss = fi.Create();
                fss.Write(www.bytes, 0, www.bytes.Length);
                fss.Flush();
                fss.Close();
                LZMA.DecompressFile(destPathTemp, destPath);
                if (fi.Exists)
                {
                    fi.Delete();
                }
                m_Progress += step;
            }
            catch (System.Exception e)
            {
                m_Error = "资源解压失败:" + path;
                ReportException.Instance.AddException("Exception:解压文件失败: " + e.ToString());
                yield break;
            }
            yield return(new WaitForEndOfFrame());

            try
            {
                m_ResVer[i].ResCrc = Crc.Crc32FromFile(destPathTemp);
                FileInfo ff = new FileInfo(destPath);
                m_ResVer[i].ResSize = (uint)ff.Length;
                m_Progress         += step;
            }
            catch (System.Exception e)
            {
                m_Error = "计算CRC失败:" + path;
                ReportException.Instance.AddException("Exception:计算文件CRC失败: " + e.ToString());
                yield break;
            }
            File.Delete(destPathTemp);
            yield return(new WaitForEndOfFrame());
        }
        m_bHasVerFile = true;
        m_Progress    = 1.0f;
        if (!SaveVersion())
        {
            ReportException.Instance.AddException("Exception:保存版本文件失败:");
        }
        yield break;
    }
예제 #14
0
        public MainWindow()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(InitSerialPort);  //Serial 받기

            Thread thread = new Thread(processMain);

            thread.Start();

            //Thread thread_uwb = new Thread(process_UWB);
            //thread_uwb.Start();

            //Thread thread_uwb2 = new Thread(process_UWB_2);
            //thread_uwb2.Start();

            Thread thread_ui = new Thread(Update_ui);

            thread_ui.Start();



            timer          = new System.Windows.Forms.Timer();
            timer.Tick    += timer_Tick;
            timer.Interval = 100;
            timer.Start();

            //Box_In_Event.Interval = new TimeSpan(0, 0, 0, 0, 100);
            //Box_In_Event.Tick += new EventHandler(Text_box_in);
            //Box_In_Event.Start();

            //   COP_Draw_Event.Interval = new TimeSpan(0, 0, 0, 0, 30);
            //   COP_Draw_Event.Tick += new EventHandler(COP_Cal);
            //   COP_Draw_Event.Start();

            crc = new CRC.Crc(CRC.CrcStdParams.StandartParameters[CRC.CrcAlgorithms.Crc32Mpeg2]);
            //COP 계산 변수

            //Left position
            posx[0] = -162.35f + 0.25f * w;
            posx[1] = -162.35f + 0.25f * w;
            posx[2] = -162.35f - 0.25f * w;
            posx[3] = -162.35f - 0.25f * w;
            posx[4] = -162.35f;

            //Right position
            posx[5] = 162.35f - 0.25f * w;
            posx[6] = 162.35f - 0.25f * w;
            posx[7] = 162.35f + 0.25f * w;
            posx[8] = 162.35f + 0.25f * w;
            posx[9] = 162.35f;

            posy[0] = 0.7f * l;
            posy[1] = 0.58f * l;
            posy[2] = 0.49f * l;
            posy[3] = 0.35f * l;
            posy[4] = 0f;
            posy[5] = 0.7f * l;
            posy[6] = 0.58f * l;
            posy[7] = 0.49f * l;
            posy[8] = 0.35f * l;
            posy[9] = 0f;
        }
예제 #15
0
        private void CheckConnection(object arg)
        {
            try
            {
                Thread.CurrentThread.IsBackground = true;

                var socket = arg as Socket;

                socket.Send(TELEOFIS_TCP_AUTH_START);

                var    buffer = new byte[64 * 1024];
                var    readed = socket.Receive(buffer);
                string imei   = "";

                if (readed == 71 && buffer[0] == 0xC0 && buffer[1] == 0x00 && buffer[2] == 0x07 && buffer[3] == 0x00 && buffer[4] == 0x3F && buffer[70] == 0xC2)
                {
                    byte[] data      = buffer.Skip(5).Take(63).ToArray();
                    byte   authCount = data[0];
                    imei = Encoding.ASCII.GetString(data.Skip(1).Take(15).ToArray());
                }

                var regex  = new Regex(@"[0-9]{15}");
                var match  = regex.Match(imei);
                var remote = socket.RemoteEndPoint.ToString();

                //проверяем имей ли это
                if (match.Success)
                {
                    socket.Send(TELEOFIS_TCP_AUTH_END);

                    var terminal = NodeManager.Instance.GetNodes <MatrixTerminalConnectionNode>().FirstOrDefault(m => m.GetImei() == imei);
                    if (terminal == null)
                    {
                        log.Warn(string.Format("контроллер с imei '{0}' не зарегистрирован на сервере, идет сохранение", imei));
                        var     api     = UnityManager.Instance.Resolve <IConnector>();
                        dynamic message = Helper.BuildMessage("edit");
                        var     id      = Guid.NewGuid();
                        dynamic rule1   = new ExpandoObject();
                        rule1.action               = "add";
                        rule1.target               = "node";
                        rule1.content              = new ExpandoObject();
                        rule1.content.id           = id;
                        rule1.content.type         = "MatrixTerminalConnection";
                        rule1.content.body         = new ExpandoObject();
                        rule1.content.body.id      = id;
                        rule1.content.body.imei    = imei;
                        rule1.content.body.type    = "MatrixTerminalConnection";
                        rule1.content.body.created = DateTime.Now;

                        dynamic rule2 = new ExpandoObject();
                        rule2.action        = "add";
                        rule2.target        = "relation";
                        rule2.content       = new ExpandoObject();
                        rule2.content.start = id;
                        rule2.content.end   = GetId();
                        rule2.content.type  = "contains";
                        rule2.content.body  = new ExpandoObject();
                        message.body.rules  = new List <dynamic>();
                        message.body.rules.Add(rule1);
                        message.body.rules.Add(rule2);
                        api.SendMessage(message);
                        //socket.Close();
                        return;
                    }
                    terminal.OpenSocket(socket);
                    log.InfoFormat("[{0}] получено соединение контроллера: IMEI={1}, IP={2}", this, imei, remote);
                    var         crc         = Crc.Calc(MATRIX_TERMINAL_GET_CONFIG, new Crc16Modbus());
                    List <byte> byteForSend = new List <byte>();
                    byteForSend.AddRange(MATRIX_TERMINAL_GET_CONFIG);
                    byteForSend.Add(crc.CrcData[1]);
                    byteForSend.Add(crc.CrcData[0]);
                    Thread.Sleep(1000 * 2);
                    socket.Send(byteForSend.ToArray());
                    return;
                }
                else
                {
                    log.WarnFormat("[{0}] соединение не соответствующее протоколу ({1}); соединение разорвано", this, imei);
                    socket.Close();
                }
            }
            catch (Exception ex)
            {
                log.Error(string.Format("[{0}] ошибка при приеме соединения", this), ex);
            }
        }
예제 #16
0
        public Dictionary <string, string> GetFilterDictionary(List <string> values)
        {
            Dictionary <string, string> d = new Dictionary <string, string>();

            foreach (string s in values)
            {
                if (d.ContainsKey(s))
                {
                    continue;
                }

                if (s == "name")
                {
                    d.Add("name", Name);
                }
                else if (s == "hash")
                {
                    d.Add("hash", Hash.ToString());
                }
                else if (s == "crc")
                {
                    d.Add("crc", Crc.ToString());
                }
                else if (s == "type")
                {
                    d.Add("type", Type);
                }
                else if (s == "matched")
                {
                    d.Add("matched", Matched.ToString());
                }
                else if (s == "valid")
                {
                    d.Add("valid", Valid.ToString());
                }
                else if (s == "references")
                {
                    d.Add("references", ReferencesCount.ToString());
                }
                else if (s == "referenced")
                {
                    d.Add("referenced", ReferencedCount.ToString());
                }
                else if (s == "file")
                {
                    d.Add("file", Location);
                }
                else
                {
                    foreach (INIParameter p in parameters)
                    {
                        if (p.Name == s)
                        {
                            d.Add(s, p[0].Value);
                        }
                    }
                }
            }

            return(d);
        }
예제 #17
0
 private void EditButton_Click(object sender, EventArgs e)
 {
     bAddNew = false;
     ControlBehaviour(false);
     Crc.Focus();
 }
예제 #18
0
파일: Vfd.cs 프로젝트: luqizheng/raspberry
 static Vfd()
 {
     crc = new Crc(CrcStdParams.StandartParameters[CrcAlgorithms.Crc16Modbus]);
     crc.Initialize();
 }
예제 #19
0
파일: PngFile.cs 프로젝트: iainlane/f-spot
 public virtual void Save(System.IO.Stream stream)
 {
     byte [] name_bytes = System.Text.Encoding.ASCII.GetBytes (Name);
     byte [] length_bytes = BitConverter.GetBytes ((uint)data.Length, false);
     stream.Write (length_bytes, 0, length_bytes.Length);
     Crc crc = new Crc (stream);
     crc.Write (name_bytes);
     crc.Write (data);
     crc.WriteSum ();
 }
예제 #20
0
 /// <inheritdoc />
 public override int GetHashCode()
 {
     return Crc.GetHashCode();
 }
예제 #21
0
        private bool ReadByte(ReadBuffer readBuffer)
        {
            var currentByte = readBuffer[readBuffer.Index++];

            switch (this.state)
            {
            case State.BeforeFrame:
                if (currentByte == Frame.BeginOfFrame)
                {
                    this.state = State.InFrame;
                }
                else
                {
                    this.outOfFrameByteReceived(currentByte);
                }

                break;

            case State.InFrame:
                if (currentByte < Frame.InvalidStart)
                {
                    this.crc = Crc.AddCrcCcitt(this.crc, currentByte);
                    this.decodedQueue.Enqueue(currentByte);
                }
                else
                {
                    switch (currentByte)
                    {
                    case Frame.EscapeByte:
                        this.state = State.InFrameEscaped;
                        break;

                    case Frame.BeginOfFrame:
                        this.decodedQueue.Clear();
                        this.crc = 0xFFFF;
                        break;

                    case Frame.EndOfFrame:
                        this.state = State.AfterFrame;

                        if (this.crc != 0xF0B8)
                        {
                            this.decodedQueue.Clear();
                        }

                        return(false);

                    default:
                        this.state = State.AfterFrame;
                        this.decodedQueue.Clear();
                        break;
                    }
                }

                break;

            case State.InFrameEscaped:
                if (currentByte >= Frame.InvalidStart)
                {
                    this.state = State.AfterFrame;
                    this.decodedQueue.Clear();
                }

                currentByte = (byte)(currentByte ^ Frame.EscapeXor);
                this.crc    = Crc.AddCrcCcitt(this.crc, currentByte);
                this.decodedQueue.Enqueue(currentByte);
                this.state = State.InFrame;
                break;
            }

            return(true);
        }
예제 #22
0
파일: PngFile.cs 프로젝트: iainlane/f-spot
            public bool CheckCrc(uint value)
            {
                byte [] name = System.Text.Encoding.ASCII.GetBytes (Name);
                Crc crc = new Crc ();
                crc.Write (name);
                crc.Write (data);

                return crc.Value == value;
            }
예제 #23
0
        private dynamic Send(byte[] data)
        {
            dynamic answer = new ExpandoObject();

            answer.success   = false;
            answer.error     = string.Empty;
            answer.errorcode = DeviceError.NO_ERROR;
            answer.code      = 0;

            byte[] buffer = null;

            for (var attempt = 0; attempt < 3 && answer.success == false; attempt++)
            {
                buffer = SendSimple(data, attempt);
                if (buffer.Length == 0)
                {
                    answer.error     = "Нет ответа";
                    answer.errorcode = DeviceError.NO_ANSWER;
                }
                else
                {
                    if (buffer.Length <= 4)
                    {
                        answer.error     = "Слишком короткий ответ";
                        answer.errorcode = DeviceError.TOO_SHORT_ANSWER;
                    }
                    else if (!Crc.Check(buffer.ToArray(), new Crc16Modbus()))
                    {
                        answer.error     = "Не сошлась контрольная сумма";
                        answer.errorcode = DeviceError.CRC_ERROR;
                    }
                    else if (buffer[1] >= 0x80)
                    {
                        var code = buffer[2];
                        answer.errorcode = DeviceError.DEVICE_EXCEPTION;
                        switch (code)
                        {
                        case 2:
                            answer.error = "Несуществующий тип значений";
                            break;

                        case 3:
                            answer.error = "В архиве отсутствуют данные за эту дату";
                            break;

                        case 5:
                            answer.error = "Зафиксировано изменение схемы измерения";
                            break;
                        }
                        answer.code = code;
                    }
                    else
                    {
                        answer.success = true;
                        answer.error   = string.Empty;
                    }
                }
            }

            if (answer.success)
            {
                answer.code           = 0;
                answer.NetworkAddress = buffer[0];
                answer.Function       = buffer[1];
                answer.data           = buffer;
                answer.Body           = buffer.Skip(2).Take(buffer.Length - 4).ToArray();
            }

            return(answer);
        }
예제 #24
0
        private dynamic Send(byte[] data)
        {
            dynamic answer = new ExpandoObject();

            answer.success   = false;
            answer.error     = string.Empty;
            answer.errorcode = DeviceError.NO_ERROR;

            byte[] buffer = null;

            //var attempts_total = (packagesSent > 0) ? SEND_ATTEMPTS_COUNT : 1; // непонятный оператор 04.03.2019
            var attempts_total = SEND_ATTEMPTS_COUNT;

            for (var attempts = 0; (attempts < attempts_total) && (answer.success == false); attempts++)
            {
                var timeout = TIMEOUT_TIME_MIN * (attempts + 1);
                buffer = SendSimple(data, timeout);

                if (buffer.Length == 0)
                {
                    answer.error     = "Нет ответа";
                    answer.errorcode = DeviceError.NO_ANSWER;
                }
                else
                {
                    if (buffer.Length < 5)
                    {
                        answer.errorcode = DeviceError.TOO_SHORT_ANSWER;
                        answer.error     = "в кадре ответа не может содержаться менее 5 байт";
                    }
                    else if (!Crc.CheckReverse(buffer, new Crc16Modbus()))
                    {
                        answer.errorcode = DeviceError.CRC_ERROR;
                        answer.error     = "контрольная сумма кадра не сошлась";
                        answer           = xOAxOD(buffer);
                        if (answer.success)
                        {
                            buffer = answer.buffer;
                        }
                    }
                    else
                    {
                        answer.success   = true;
                        answer.error     = string.Empty;
                        answer.errorcode = DeviceError.NO_ERROR;
                    }
                }
            }

            if (answer.success)
            {
                var offset = 0;
                answer.NetworkAddress = buffer[0];
                if (answer.NetworkAddress == 251)
                {
                    offset = 12;
                }
                answer.Function = buffer.Skip(offset + 1).FirstOrDefault();
                answer.Body     = buffer.Skip(offset + 2).Take(buffer.Length - (offset + 2 + 2)).ToArray();
                //modbus error
                if (answer.Function > 0x80)//0xc1)
                {
                    answer.errorcode     = DeviceError.DEVICE_EXCEPTION;
                    answer.success       = false;
                    answer.exceptionCode = buffer.Skip(offset + 2).FirstOrDefault();
                    string exceptionMessage = deviceExceptionMessage.ContainsKey(answer.exceptionCode) ? deviceExceptionMessage[answer.exceptionCode] : "";
                    answer.error = $"устройство вернуло ошибку: {answer.exceptionCode} {exceptionMessage}";
                }
            }

            mid++;

            return(answer);
        }
예제 #25
0
        private dynamic All(string components, List <dynamic> hourRanges, List <dynamic> dayRanges, IEnumerable <int> channels)
        {
            var rules = new[] {
                //0
                new { offset = 0x00000000, length = 0x00000002 },
                new { offset = 0x00000011, length = 0x00000001 },
                new { offset = 0x00000023, length = 0x00000001 },
                new { offset = 0x00000028, length = 0x00000002 },
                new { offset = 0x00000033, length = 0x00000001 },
                new { offset = 0x0000003f, length = 0x00000001 },
                new { offset = 0x0000004d, length = 0x00000001 },
                new { offset = 0x00000059, length = 0x00000001 },
                new { offset = 0x0000006b, length = 0x00000001 },
                new { offset = 0x00000079, length = 0x00000001 },
                //10
                new { offset = 0x00000085, length = 0x00000001 },
                new { offset = 0x00000097, length = 0x00000001 },
                new { offset = 0x000000a5, length = 0x00000001 },
                new { offset = 0x000000b1, length = 0x00000001 },
                new { offset = 0x000000c1, length = 0x00000001 },
                new { offset = 0x000000cd, length = 0x00000001 },
                new { offset = 0x000000db, length = 0x00000001 },
                new { offset = 0x000000e7, length = 0x00000001 },
                new { offset = 0x000000f9, length = 0x00000001 },
                new { offset = 0x00000107, length = 0x00000001 },
                //20
                new { offset = 0x00000113, length = 0x00000001 },
                new { offset = 0x00000125, length = 0x00000001 },
                new { offset = 0x00000133, length = 0x00000001 },
                new { offset = 0x0000013f, length = 0x00000001 },
                new { offset = 0x00000147, length = 0x00000001 },
                new { offset = 0x00000200, length = 0x00000002 },
                new { offset = 0x00000211, length = 0x00000001 },
                new { offset = 0x00000223, length = 0x00000001 },
                new { offset = 0x00000228, length = 0x00000002 },
                new { offset = 0x00000204, length = 0x00000026 },
                //30
                new { offset = 0x0000022a, length = 0x00000001 },
                new { offset = 0x0000022e, length = 0x00000002 },
                new { offset = 0x000002b8, length = 0x00000001 },
                new { offset = 0x000002bc, length = 0x00000002 }
            };
            //var server = ParseReadServerVersionResponse(Send(MakeReadDataRequest()));

            int serverVersion = 1;
            //if (server.success)
            //{
            //    log(string.Format("Версия сервера: {0}", server.version));
            //    serverVersion = server.version;
            //}
            //else
            //{
            //    log(string.Format("Версия сервера не получена: {0}", server.error));
            //    serverVersion = 0;
            //}

            var     date = DateTime.MinValue;
            dynamic info = null;

            var constants = new List <dynamic>();
            var currents  = new List <dynamic>();

            info = ParseReadInfoResponse(Send(MakeReadInfoRequest()));
            if (!info.success)
            {
                log(string.Format("Ошибка при считывании текущей даты на вычислителе: {0}", info.error), level: 1);
                return(MakeResult(102, info.errorcode, info.error));
            }

            setContractDay(info.TotalDay);

            var curDate = ParseReadCurrentDateResponse(Send(MakeReadCurrentDateRequest()), info.Version);

            if (!curDate.success)
            {
                log(string.Format("Ошибка при считывании текущей даты на вычислителе: {0}", curDate.error), level: 1);
                return(MakeResult(102, curDate.errorcode, curDate.error));
            }

            date = curDate.Date;
            setTimeDifference(DateTime.Now - date);

            log(string.Format("Дата/время на вычислителе: {0:dd.MM.yy HH:mm:ss}", date));

            if (getEndDate == null)
            {
                getEndDate = (type) => date;
            }

            if (components.Contains("Constant"))
            {
                var constant = GetConstants(date, info);
                if (!constant.success)
                {
                    log(string.Format("Ошибка при считывании констант: {0}", constant.error));
                    return(MakeResult(103, constant.errorcode, constant.error));
                }

                constants = constant.records as List <dynamic>;

                byte[] db;
                {
                    List <byte> temp = new List <byte>();
                    for (int i = 0; i < 8; i++)
                    {
                        var writeDb1 = ParseWriteResponse(Send(MakeWriteRequest(0x3ff7, 2, BitConverter.GetBytes((UInt16)(1320 + i)))));
                        if (!writeDb1.success)
                        {
                            log(string.Format("Ошибка при считывании констант: {0}", writeDb1.error));
                            return(MakeResult(103, writeDb1.errorcode, writeDb1.error));
                        }

                        var readDb1 = ParseReadResponse(Send(MakeReadRequest(0x3ff8, 0x80)));
                        if (!readDb1.success)
                        {
                            log(string.Format("Ошибка при считывании констант: {0}", readDb1.error));
                            return(MakeResult(103, readDb1.errorcode, readDb1.error));
                        }
                        temp.AddRange(readDb1.Body as IEnumerable <byte>);
                        //byte[] data = (readDb1.Body as IEnumerable<byte>).ToArray();
                    }
                    db = temp.ToArray();
                }

                {
                    byte A = db[0x212];
                    byte B = db[0x213];

                    foreach (var r in rules)
                    {
                        for (int i = 0; i < r.length; i++)
                        {
                            db[r.offset + i] = 0;
                        }
                    }

                    if (info.Version >= 0x22)
                    {
                        db[0x212] = A;
                        db[0x213] = B;
                    }
                }


                var crc = Crc.Calc(db, new Crc16Modbus());


                constants.Add(MakeConstRecord("КС", $"0x{crc.CrcData[1]:X2}{crc.CrcData[0]:X2}", date));
                constants.Add(MakeConstRecord("tх, град. C", (double)BitConverter.ToInt16(db, 18) / 100.0, date));


                log(string.Format("Константы прочитаны: всего {0}, отчётный день={1}", constants.Count, constant.TotalDay));
                records(constants);
            }

            //

            MOCK_ZONE = true;
            var properties = GetProperties(serverVersion);

            if (!properties.success)
            {
                log(string.Format("Ошибка при считывании свойств: {0}", properties.error), level: 1);
                return(MakeResult(103, properties.errorcode, properties.error));
            }
            log(string.Format("Свойства прочитаны: всего - ед. измерений {0}, дробных частей {1}", properties.Units.Count, properties.Fracs.Count), level: 1);
            MOCK_ZONE = false;

            if (components.Contains("Current"))
            {
                var current = GetCurrents(properties, date, channels);
                if (!current.success)
                {
                    log(string.Format("Ошибка при считывании текущих и констант: {0}", current.error), level: 1);
                    return(MakeResult(102, current.errorcode, current.error));
                }

                currents = current.records;
                log(string.Format("Текущие на {0} прочитаны: всего {1}", current.date, currents.Count), level: 1);
                records(currents);
            }

            //records(cncs.constants);

            List <dynamic> hours  = new List <dynamic>();
            List <dynamic> days   = new List <dynamic>();
            List <dynamic> months = new List <dynamic>();

            if (components.Contains("Hour"))
            {
                if (hourRanges != null)
                {
                    foreach (var range in hourRanges)
                    {
                        var startH = range.start;
                        var endH   = range.end;

                        if (startH > date)
                        {
                            continue;
                        }
                        if (endH > date)
                        {
                            endH = date;
                        }

                        var hour = GetHours(startH, endH, date, properties, channels);
                        if (!hour.success)
                        {
                            log(string.Format("Ошибка при считывании часовых: {0}", hour.error), level: 1);
                            return(MakeResult(105, hour.errorcode, hour.error));
                        }
                        hours = hour.records;
                        log(string.Format("Прочитаны часовые с {0:dd.MM.yyyy HH:mm} по {1:dd.MM.yyyy HH:mm}: {2} записей", startH, endH, hours.Count), level: 1);
                    }
                }
                else
                {
                    //чтение часовых
                    var startH = getStartDate("Hour");
                    var endH   = getEndDate("Hour");

                    var hour = GetHours(startH, endH, date, properties, channels);
                    if (!hour.success)
                    {
                        log(string.Format("Ошибка при считывании часовых: {0}", hour.error), level: 1);
                        return(MakeResult(105, hour.errorcode, hour.error));
                    }
                    hours = hour.records;
                    log(string.Format("Прочитаны часовые с {0:dd.MM.yyyy HH:mm} по {1:dd.MM.yyyy HH:mm}: {2} записей", startH, endH, hours.Count), level: 1);
                }
            }

            if (components.Contains("Day"))
            {
                if (dayRanges != null)
                {
                    foreach (var range in dayRanges)
                    {
                        var startD = range.start;
                        var endD   = range.end;

                        if (startD > date)
                        {
                            continue;
                        }
                        if (endD > date)
                        {
                            endD = date;
                        }

                        var day = GetDays(startD, endD, date, properties, info.TotalDay, channels);
                        if (!day.success)
                        {
                            log(string.Format("Ошибка при считывании суточных: {0}", day.error), level: 1);
                            return(MakeResult(104, day.errorcode, day.error));
                        }
                        days = day.records;
                        log(string.Format("Прочитаны суточные с {0:dd.MM.yyyy} по {1:dd.MM.yyyy}: {2} записей", startD, endD, days.Count), level: 1);
                    }
                }
                else
                {
                    //чтение суточных
                    var startD = getStartDate("Day");
                    var endD   = getEndDate("Day");

                    var day = GetDays(startD, endD, date, properties, info.TotalDay, channels);
                    if (!day.success)
                    {
                        log(string.Format("Ошибка при считывании суточных: {0}", day.error), level: 1);
                        return(MakeResult(104, day.errorcode, day.error));
                    }
                    days = day.records;
                    log(string.Format("Прочитаны суточные с {0:dd.MM.yyyy} по {1:dd.MM.yyyy}: {2} записей", startD, endD, days.Count), level: 1);
                }
            }

            if (components.Contains("Day") && monthPoll)
            {
                //чтение ежемесячных
                var startM = date.AddMonths(-3);
                var endM   = date;

                var month = GetMonths(startM, endM, date, properties, info.TotalDay);
                if (!month.success)
                {
                    log(string.Format("Ошибка при считывании ежемесячных: {0}", month.error), level: 1);
                    return(MakeResult(104, month.errorcode, month.error));
                }
                months = month.records;
                log(string.Format("Прочитаны ежемесячные с {0:MM.yyyy} по {1:MM.yyyy}: {2} записей", startM, endM, months.Count), level: 1);
            }

            ///// Нештатные ситуации ///
            //var lastAbnormal = getLastTime("Abnormal");
            //DateTime startAbnormal = lastAbnormal.AddHours(-constant.contractHour).Date;
            //DateTime endAbnormal = current.date;

            //var abnormal = GetAbnormals(startAbnormal, endAbnormal);
            //if (!abnormal.success)
            //{
            //    log(string.Format("ошибка при считывании НС: {0}", abnormal.error));
            //    return;
            //}

            //log(string.Format("Успешно прочитано: {0}/{1}/{2}/{3}/{4} записей", constants.Count, currents.Count, days.Count, hours.Count, months.Count));
            return(MakeResult(0, DeviceError.NO_ERROR, "опрос успешно завершен"));
        }
예제 #26
0
        public void ToFile(StorageEnvironment env, string backupPath, CompressionLevel compression = CompressionLevel.Optimal, Action <string> infoNotify = null,
                           Action backupStarted = null)
        {
            if (env.Options.IncrementalBackupEnabled == false)
            {
                throw new InvalidOperationException("Incremental backup is disabled for this storage");
            }

            var pageNumberToPageInScratch = new Dictionary <long, long>();

            if (infoNotify == null)
            {
                infoNotify = str => { }
            }
            ;
            var toDispose = new List <IDisposable>();

            try
            {
                IncrementalBackupInfo backupInfo;
                long lastWrittenLogPage = -1;
                long lastWrittenLogFile = -1;

                using (var txw = env.NewTransaction(TransactionFlags.ReadWrite))
                {
                    backupInfo = env.HeaderAccessor.Get(ptr => ptr->IncrementalBackup);

                    if (env.Journal.CurrentFile != null)
                    {
                        lastWrittenLogFile = env.Journal.CurrentFile.Number;
                        lastWrittenLogPage = env.Journal.CurrentFile.WritePagePosition;
                    }

                    //txw.Commit(); - intentionally not committing
                }

                if (backupStarted != null)
                {
                    backupStarted();
                }

                infoNotify("Voron - reading storage journals for snapshot pages");

                var lastBackedUpFile     = backupInfo.LastBackedUpJournal;
                var lastBackedUpPage     = backupInfo.LastBackedUpJournalPage;
                var firstJournalToBackup = backupInfo.LastBackedUpJournal;

                if (firstJournalToBackup == -1)
                {
                    firstJournalToBackup = 0; // first time that we do incremental backup
                }
                var lastTransaction = new TransactionHeader {
                    TransactionId = -1
                };

                var recoveryPager = env.Options.CreateScratchPager("min-inc-backup.scratch");
                toDispose.Add(recoveryPager);
                int recoveryPage = 0;
                for (var journalNum = firstJournalToBackup; journalNum <= backupInfo.LastCreatedJournal; journalNum++)
                {
                    lastBackedUpFile = journalNum;
                    var journalFile = IncrementalBackup.GetJournalFile(env, journalNum, backupInfo);
                    try
                    {
                        using (var filePager = env.Options.OpenJournalPager(journalNum))
                        {
                            var reader = new JournalReader(filePager, recoveryPager, 0, null, recoveryPage);
                            reader.MaxPageToRead = lastBackedUpPage = journalFile.JournalWriter.NumberOfAllocatedPages;
                            if (journalNum == lastWrittenLogFile) // set the last part of the log file we'll be reading
                            {
                                reader.MaxPageToRead = lastBackedUpPage = lastWrittenLogPage;
                            }

                            if (lastBackedUpPage == journalFile.JournalWriter.NumberOfAllocatedPages) // past the file size
                            {
                                // move to the next
                                lastBackedUpPage = -1;
                                lastBackedUpFile++;
                            }

                            if (journalNum == backupInfo.LastBackedUpJournal) // continue from last backup
                            {
                                reader.SetStartPage(backupInfo.LastBackedUpJournalPage);
                            }
                            TransactionHeader *lastJournalTxHeader = null;
                            while (reader.ReadOneTransaction(env.Options))
                            {
                                // read all transactions here
                                lastJournalTxHeader = reader.LastTransactionHeader;
                            }

                            if (lastJournalTxHeader != null)
                            {
                                lastTransaction = *lastJournalTxHeader;
                            }

                            recoveryPage = reader.RecoveryPage;

                            foreach (var pagePosition in reader.TransactionPageTranslation)
                            {
                                var pageInJournal = pagePosition.Value.JournalPos;
                                var page          = recoveryPager.Read(null, pageInJournal);
                                pageNumberToPageInScratch[pagePosition.Key] = pageInJournal;
                                if (page.IsOverflow)
                                {
                                    var numberOfOverflowPages = recoveryPager.GetNumberOfOverflowPages(page.OverflowSize);
                                    for (int i = 1; i < numberOfOverflowPages; i++)
                                    {
                                        pageNumberToPageInScratch.Remove(page.PageNumber + i);
                                    }
                                }
                            }
                        }
                    }
                    finally
                    {
                        journalFile.Release();
                    }
                }

                if (pageNumberToPageInScratch.Count == 0)
                {
                    infoNotify("Voron - no changes since last backup, nothing to do");
                    return;
                }

                infoNotify("Voron - started writing snapshot file.");

                if (lastTransaction.TransactionId == -1)
                {
                    throw new InvalidOperationException("Could not find any transactions in the journals, but found pages to write? That ain't right.");
                }


                // it is possible that we merged enough transactions so the _merged_ output is too large for us.
                // Voron limit transactions to about 4GB each. That means that we can't just merge all transactions
                // blindly, for fear of hitting this limit. So we need to split things.
                // We are also limited to about 8 TB of data in general before we literally can't fit the number of pages into
                // pageNumberToPageInScratch even theoretically.
                // We're fine with saying that you need to run min inc backup before you hit 8 TB in your increment, so that works for now.
                // We are also going to use env.Options.MaxScratchBufferSize to set the actual transaction limit here, to avoid issues
                // down the road and to limit how big a single transaction can be before the theoretical 4GB limit.

                var nextJournalNum = lastBackedUpFile;
                using (var file = new FileStream(backupPath, FileMode.Create))
                {
                    using (var package = new ZipArchive(file, ZipArchiveMode.Create, leaveOpen: true))
                    {
                        var copier = new DataCopier(AbstractPager.PageSize * 16);

                        var finalPager = env.Options.CreateScratchPager("min-inc-backup-final.scratch");
                        toDispose.Add(finalPager);
                        finalPager.EnsureContinuous(null, 0, 1);//txHeader

                        foreach (var partition in Partition(pageNumberToPageInScratch.Values, env.Options.MaxNumberOfPagesInMergedTransaction))
                        {
                            int totalNumberOfPages = 0;
                            int overflowPages      = 0;
                            int start = 1;
                            foreach (var pageNum in partition)
                            {
                                var p    = recoveryPager.Read(null, pageNum);
                                var size = 1;
                                if (p.IsOverflow)
                                {
                                    size           = recoveryPager.GetNumberOfOverflowPages(p.OverflowSize);
                                    overflowPages += (size - 1);
                                }
                                totalNumberOfPages += size;
                                finalPager.EnsureContinuous(null, start, size); //maybe increase size

                                Memory.Copy(finalPager.AcquirePagePointer(null, start), p.Base, size * AbstractPager.PageSize);

                                start += size;
                            }


                            var txPage = finalPager.AcquirePagePointer(null, 0);
                            UnmanagedMemory.Set(txPage, 0, AbstractPager.PageSize);
                            var txHeader = (TransactionHeader *)txPage;
                            txHeader->HeaderMarker           = Constants.TransactionHeaderMarker;
                            txHeader->FreeSpace              = lastTransaction.FreeSpace;
                            txHeader->Root                   = lastTransaction.Root;
                            txHeader->OverflowPageCount      = overflowPages;
                            txHeader->PageCount              = totalNumberOfPages - overflowPages;
                            txHeader->PreviousTransactionCrc = lastTransaction.PreviousTransactionCrc;
                            txHeader->TransactionId          = lastTransaction.TransactionId;
                            txHeader->NextPageNumber         = lastTransaction.NextPageNumber;
                            txHeader->LastPageNumber         = lastTransaction.LastPageNumber;
                            txHeader->TxMarker               = TransactionMarker.Commit | TransactionMarker.Merged;
                            txHeader->Compressed             = false;
                            txHeader->UncompressedSize       = txHeader->CompressedSize = totalNumberOfPages * AbstractPager.PageSize;

                            txHeader->Crc = Crc.Value(finalPager.AcquirePagePointer(null, 1), 0, totalNumberOfPages * AbstractPager.PageSize);


                            var entry = package.CreateEntry(string.Format("{0:D19}.merged-journal", nextJournalNum), compression);
                            nextJournalNum++;
                            using (var stream = entry.Open())
                            {
                                copier.ToStream(finalPager.AcquirePagePointer(null, 0), (totalNumberOfPages + 1) * AbstractPager.PageSize, stream, CancellationToken.None);
                            }
                        }
                    }
                    file.Flush(true);// make sure we hit the disk and stay there
                }

                env.HeaderAccessor.Modify(header =>
                {
                    header->IncrementalBackup.LastBackedUpJournal     = lastBackedUpFile;
                    header->IncrementalBackup.LastBackedUpJournalPage = lastBackedUpPage;
                });
            }
            finally
            {
                foreach (var disposable in toDispose)
                {
                    disposable.Dispose();
                }
            }
        }
예제 #27
0
 /// <summary>
 /// Gets a hash code for the <see cref="Crc32"/>.
 /// </summary>
 /// <returns>The created hash code.</returns>
 public override int GetHashCode() => Crc.GetHashCode();
예제 #28
0
        /// <summary>
        /// Writes a byte to the s101 message, taking care of crc calculation and escaping.
        /// </summary>
        /// <param name="b">The byte to write</param>
        public void WriteByte(byte b)
        {
            _crc = Crc.CrcCCITT16(_crc, b);

            WriteEscapedByte(b);
        }
예제 #29
0
        public string GeneratePayload(MerchantPayload payload)
        {
            var sb = new StringBuilder();

            sb.Append(EncodeProperty(nameof(MerchantPayload.PayloadFormatIndicator), payload.PayloadFormatIndicator));
            sb.Append(EncodeProperty(nameof(MerchantPayload.PointOfInitializationMethod), payload.PointOfInitializationMethod));

            if (null != payload.MerchantAccountInformation)
            {
                foreach (var merchantAccountInfo in payload.MerchantAccountInformation)
                {
                    var merchantInfoBuilder = new StringBuilder();

                    merchantInfoBuilder.Append(EncodeProperty(typeof(MerchantAccountInformation).GetProperty("GlobalUniqueIdentifier"), merchantAccountInfo.Value.GlobalUniqueIdentifier));
                    foreach (var paymentNetworkItem in merchantAccountInfo.Value.PaymentNetworkSpecific)
                    {
                        merchantInfoBuilder.Append(EncodeKeyPair(paymentNetworkItem.Key, paymentNetworkItem.Value));
                    }

                    sb.AppendFormat("{0:D2}{1:D2}{2}", merchantAccountInfo.Key, merchantInfoBuilder.Length, merchantInfoBuilder);
                }
            }

            sb.Append(EncodeProperty(nameof(MerchantPayload.MerchantCategoryCode), payload.MerchantCategoryCode));
            sb.Append(EncodeProperty(nameof(MerchantPayload.CountyCode), payload.CountyCode));
            sb.Append(EncodeProperty(nameof(MerchantPayload.MerchantName), payload.MerchantName));
            sb.Append(EncodeProperty(nameof(MerchantPayload.MerchantCity), payload.MerchantCity));
            sb.Append(EncodeProperty(nameof(MerchantPayload.PostalCode), payload.PostalCode));

            if (null != payload.MerchantInformation)
            {
                var languateTemplateBuilder = new StringBuilder();
                languateTemplateBuilder.Append(EncodeProperty(typeof(MerchantInfoLanguageTemplate).GetProperty(nameof(MerchantInfoLanguageTemplate.LanguagePreference)), payload.MerchantInformation.LanguagePreference));
                languateTemplateBuilder.Append(EncodeProperty(typeof(MerchantInfoLanguageTemplate).GetProperty(nameof(MerchantInfoLanguageTemplate.MerchantNameAlternateLanguage)), payload.MerchantInformation.MerchantNameAlternateLanguage));
                languateTemplateBuilder.Append(EncodeProperty(typeof(MerchantInfoLanguageTemplate).GetProperty(nameof(MerchantInfoLanguageTemplate.MerchantCityAlternateLanguage)), payload.MerchantInformation.MerchantCityAlternateLanguage));

                sb.Append(EncodeProperty(nameof(MerchantPayload.MerchantInformation), languateTemplateBuilder.ToString()));
            }

            sb.Append(EncodeProperty(nameof(MerchantPayload.TransactionAmount), payload.TransactionAmount));
            sb.Append(EncodeProperty(nameof(MerchantPayload.TransactionCurrency), payload.TransactionCurrency));
            sb.Append(EncodeProperty(nameof(MerchantPayload.TipOrConvenienceIndicator), payload.TipOrConvenienceIndicator));
            sb.Append(EncodeProperty(nameof(MerchantPayload.ValueOfConvenienceFeeFixed), payload.ValueOfConvenienceFeeFixed));
            sb.Append(EncodeProperty(nameof(MerchantPayload.ValueOfConvenienceFeePercentage), payload.ValueOfConvenienceFeePercentage));

            if (null != payload.AdditionalData)
            {
                var additionalDataBuilder = new StringBuilder();
                additionalDataBuilder.Append(EncodeProperty(typeof(MerchantAdditionalData).GetProperty(nameof(MerchantAdditionalData.BillNumber)), payload.AdditionalData.BillNumber));
                additionalDataBuilder.Append(EncodeProperty(typeof(MerchantAdditionalData).GetProperty(nameof(MerchantAdditionalData.MobileNumber)), payload.AdditionalData.MobileNumber));
                additionalDataBuilder.Append(EncodeProperty(typeof(MerchantAdditionalData).GetProperty(nameof(MerchantAdditionalData.StoreLabel)), payload.AdditionalData.StoreLabel));
                additionalDataBuilder.Append(EncodeProperty(typeof(MerchantAdditionalData).GetProperty(nameof(MerchantAdditionalData.LoyaltyNumber)), payload.AdditionalData.LoyaltyNumber));
                additionalDataBuilder.Append(EncodeProperty(typeof(MerchantAdditionalData).GetProperty(nameof(MerchantAdditionalData.ReferenceLabel)), payload.AdditionalData.ReferenceLabel));
                additionalDataBuilder.Append(EncodeProperty(typeof(MerchantAdditionalData).GetProperty(nameof(MerchantAdditionalData.CustomerLabel)), payload.AdditionalData.CustomerLabel));
                additionalDataBuilder.Append(EncodeProperty(typeof(MerchantAdditionalData).GetProperty(nameof(MerchantAdditionalData.TerminalLabel)), payload.AdditionalData.TerminalLabel));
                additionalDataBuilder.Append(EncodeProperty(typeof(MerchantAdditionalData).GetProperty(nameof(MerchantAdditionalData.PurposeOfTransaction)), payload.AdditionalData.PurposeOfTransaction));
                additionalDataBuilder.Append(EncodeProperty(typeof(MerchantAdditionalData).GetProperty(nameof(MerchantAdditionalData.AdditionalConsumerDataRequest)), payload.AdditionalData.AdditionalConsumerDataRequest));

                sb.Append(EncodeProperty(nameof(MerchantPayload.AdditionalData), additionalDataBuilder.ToString()));
            }

            if (null != payload.UnreservedTemplate)
            {
                foreach (var unreservedTemplateItem in payload.UnreservedTemplate)
                {
                    var merchantInfoBuilder = new StringBuilder();

                    merchantInfoBuilder.Append(EncodeProperty(typeof(MerchantAccountInformation).GetProperty("GlobalUniqueIdentifier"), unreservedTemplateItem.Value.GlobalUniqueIdentifier));
                    foreach (var dataItem in unreservedTemplateItem.Value.ContextSpecificData)
                    {
                        merchantInfoBuilder.Append(EncodeKeyPair(dataItem.Key, dataItem.Value));
                    }

                    sb.AppendFormat("{0:D2}{1:D2}{2}", unreservedTemplateItem.Key, merchantInfoBuilder.Length, merchantInfoBuilder);
                }
            }

            /*
             * Add CRC
             *
             * The checksum shall be calculated according to [ISO/IEC 13239] using the polynomial '1021' (hex) and initial
             * value 'FFFF' (hex). The data over which the checksum is calculated shall cover all data objects, including their
             * ID, Length and Value, to be included in the QR Code, in their respective order, as well as the ID and Length of
             * the CRC itself (but excluding its Value).
             */
            sb.Append("6304"); //// {id:63}{length:04}
            var crc16ccittFalseParameters = CrcStdParams.StandartParameters[CrcAlgorithms.Crc16CcittFalse];
            var crc = new Crc(crc16ccittFalseParameters).ComputeHash(System.Text.Encoding.UTF8.GetBytes(sb.ToString()));

            sb.Append(crc.ToHex(true).GetLast(4));

            return(sb.ToString());
        }
예제 #30
0
    // Update is called once per frame
    void Update()
    {
        try
        {
            switch (Step)
            {
            case 0:
            {
                if (Timer.Match())
                {
                    // Create TCP client and asynchronously connect to server
                    Client      = new TcpClient();
                    ConnectTask = Client.ConnectAsync(IPAddress.Parse(address), port);
                    Debug.Log(string.Format("Connecting on {0} : {1}", address, port));
                    Step++;
                }
                break;
            }

            case 1:
            {
                if (ConnectTask.Status == TaskStatus.RanToCompletion)
                {
                    Debug.Log("Connected!");
                    Stream    = Client.GetStream();
                    LastColor = ColorPicker.Color;
                    Timer.Start(100);
                    Step++;
                }
                else if (ConnectTask.Exception != null)
                {
                    throw ConnectTask.Exception.InnerException;
                }
                break;
            }

            case 2:
            {
                if ((LastColor != ColorPicker.Color) && Timer.Match())
                {
                    LastColor = ColorPicker.Color;
                    Timer.Start(100);

                    int     startLed = 0;
                    int     stopLed  = 0;
                    Color32 color    = LastColor;

                    // Create packet
                    int n = 0;
                    Packet[n++] = (byte)Preample;
                    Packet[n++] = (byte)(Preample >> 8);
                    Packet[n++] = (byte)(Preample >> 16);
                    Packet[n++] = (byte)(Preample >> 24);

                    int packetLen = 8;
                    Packet[n++] = (byte)packetLen;
                    Packet[n++] = (byte)(packetLen >> 8);
                    int dataOffset = n;
                    Packet[n++] = (byte)Command_t.SET_LEDS;
                    Packet[n++] = (byte)startLed;
                    Packet[n++] = (byte)(startLed >> 8);
                    Packet[n++] = (byte)stopLed;
                    Packet[n++] = (byte)(stopLed >> 8);
                    Packet[n++] = color.r;
                    Packet[n++] = color.g;
                    Packet[n++] = color.b;

                    ushort crc = Crc.CRC16(Packet, dataOffset, n - dataOffset, 0);
                    Packet[n++] = (byte)crc;
                    Packet[n++] = (byte)(crc >> 8);

                    // Send packet
                    Debug.Log(string.Format("Sending color: {0}", color));
                    SendTask = Stream.WriteAsync(Packet, 0, n);
                    Step++;
                }

                break;
            }

            case 3:
            {
                if (SendTask.Status == TaskStatus.RanToCompletion)
                {
                    Debug.Log("Sended!");
                    Step--;
                }
                else if (SendTask.Exception != null)
                {
                    throw SendTask.Exception.InnerException;
                }
                break;
            }

            default:
            {
                break;
            }
            }
        }
        catch (Exception ex)
        {
            // if something went wrong - close everything and try to connect again
            if (Stream != null)
            {
                Stream.Close();
                Stream = null;
            }

            if (Client != null)
            {
                Client.Close();
                Client = null;
            }
            Timer.Start(5000);
            Step = 0;
            Debug.Log(ex.Message);
        }
    }
예제 #31
0
        private dynamic Send(byte[] data, byte cmd, int attempts = 3)
        {
            dynamic answer = new ExpandoObject();

            answer.success   = false;
            answer.error     = string.Empty;
            answer.errorcode = DeviceError.NO_ERROR;

            byte[] buffer = null;

            for (var attempt = 0; (attempt < attempts) && (answer.success == false); attempt++)
            {
                buffer = SendSimple(data);
                if (buffer.Length == 0)
                {
                    answer.error     = "Нет ответа";
                    answer.errorcode = DeviceError.NO_ANSWER;
                }
                else
                {
                    //buffer = buffer.SkipWhile(b => b == 0xff).ToArray();
                    var na = GetNaPacket();

                    if (buffer.Length < 6)
                    {
                        answer.error     = "в кадре ответа не может содежаться менее 6 байт";
                        answer.errorcode = DeviceError.TOO_SHORT_ANSWER;
                    }
                    else if ((buffer[0] != data[0]) || (buffer[1] != data[1]) || (buffer[2] != data[2]) || (buffer[3] != data[3]))
                    {
                        log("Несовпадение сетевого адреса", level: 1);
                        answer.error     = "Несовпадение сетевого адреса";
                        answer.errorcode = DeviceError.ADDRESS_ERROR;
                    }
                    else if (cmd != data[4])
                    {
                        answer.error     = "Несовпадение команды";
                        answer.errorcode = DeviceError.ADDRESS_ERROR;
                    }
                    else
                    {
                        do
                        {
                            if (Crc.Check(buffer, new Crc16Modbus()))
                            {
                                break;
                            }
                            buffer = buffer.Take(buffer.Length - 1).ToArray();
                        }while (buffer.Length > 6);

                        if (!Crc.Check(buffer, new Crc16Modbus()))
                        {
                            answer.error     = "контрольная сумма кадра не сошлась";
                            answer.errorcode = DeviceError.CRC_ERROR;
                        }
                        else
                        {
                            answer.success   = true;
                            answer.error     = string.Empty;
                            answer.errorcode = DeviceError.NO_ERROR;
                        }
                    }
                }
            }

            if (answer.success)
            {
                answer.Body = buffer.Take(buffer.Length - 2).Skip(5).ToArray();
            }

            return(answer);
        }
예제 #32
0
    bool SaveRes(MultiFileOK dd)
    {
        //验证crc
        DownResData drd = dd.Drd;

        if (drd.ResSize != dd.Data.Length)
        {
            LogMgr.Log("Res:" + drd.ResType + " 大小不匹配,localSize:" + dd.Data.Length + ", serverSize:" + drd.ResSize);
            return(false);
        }
        uint crc = Crc.Crc32(dd.Data, 0, dd.Data.Length);

        if (crc != drd.ResCrc)
        {
            LogMgr.Log("Res:" + drd.ResType + "资源检验失败, size:" + dd.Data.Length + ", localCrc:" + crc + ", serverCrc:" + drd.ResCrc);
            return(false);
        }

        System.Random rr       = new System.Random();
        int           name     = rr.Next(100, 10000);
        string        tempFile = RuntimeInfo.GetLocalPath(drd.ResType + name.ToString() + "_temp.dat");
        string        path     = RuntimeInfo.GetResPersistentPath(drd.ResType);

        try
        {
            File.Delete(tempFile);
        }
        catch
        {
        }
        try
        {
            File.Delete(path);
        }
        catch
        {
        }
        try
        {
            FileStream fsTemp = File.Create(tempFile);
            if (fsTemp == null)
            {
                LogMgr.Log("RES文件创建失败:" + drd.ResType);
                return(false);
            }
            //解压
            fsTemp.Write(dd.Data, 0, dd.Data.Length);
            fsTemp.Flush();
            fsTemp.Close();
            fsTemp = null;
            LZMA.DecompressFile(tempFile, path);
        }
        catch (System.Exception e)
        {
            ReportException.Instance.AddException("文件解压失败:" + e.ToString());
        }
        try
        {
            File.Delete(tempFile);
        }
        catch
        {
        }
        if (File.Exists(path) == false)
        {
            LogMgr.Log("RES文件解压失败:" + drd.ResType);
            return(false);
        }
        ResManager.Instance.VersionMgr.SetResVersion(drd.ResType, drd.ResCrc, drd.ResUnzipSize);
        return(ResManager.Instance.VersionMgr.SaveVersion());
    }
예제 #33
0
파일: Crc8.cs 프로젝트: softek/CRC
 public override string ToString()
 {
     return(Crc.ToString("x2"));
 }
예제 #34
0
        /// <summary>
        /// Performs CRC32 on an input byte array using the CrcStandard.Crc32Bit parameters
        /// </summary>
        public static byte[] CRCHash( byte[] input )
        {
            using ( Crc crc = new Crc( CrcParameters.GetParameters( CrcStandard.Crc32Bit ) ) )
            {
                byte[] hash = crc.ComputeHash( input );
                Array.Reverse( hash );

                return hash;
            }
        }
예제 #35
0
        private dynamic Send(byte[] dataSend)
        {
            dynamic answer = new ExpandoObject();

            answer.success   = false;
            answer.error     = string.Empty;
            answer.errorcode = DeviceError.NO_ERROR;

            byte[] data = null;

            for (var attempts = 0; (attempts < 2) && (answer.success == false); attempts++)
            {
                //if (attempts == 0)
                //{
                //    data = SendSimple(dataSend, 750, 1);
                //}
                //if (attempts < 2)
                //{
                data = SendSimple(dataSend);//, 15000, 6);
                //}
                //else
                //{
                //    data = SendSimple(dataSend, 10000, 6);
                //}

                if (data.Length == 0)
                {
                    answer.error     = "Нет ответа";
                    answer.errorcode = DeviceError.NO_ANSWER;
                }
                else
                {
                    if (data.Length < 5)
                    {
                        answer.error     = "в кадре ответа не может содежаться менее 5 байт";
                        answer.errorcode = DeviceError.TOO_SHORT_ANSWER;
                    }
                    else if (!Crc.Check(data, new Crc16Modbus()))
                    {
                        answer.error     = "контрольная сумма кадра не сошлась";
                        answer.errorcode = DeviceError.CRC_ERROR;
                    }
                    else
                    {
                        answer.success = true;
                    }
                }
            }

            if (answer.success)
            {
                answer.NetworkAddress = data[0];
                answer.Function       = data[1];
                answer.Length         = data[3];
                answer.Body           = data.Skip(3).Take(data.Length - 5).ToArray();
                answer.data           = data;

                //modbus error
                if (answer.Function > 0x80)
                {
                    var exceptionCode = (ModbusExceptionCode)data[2];
                    answer.success   = false;
                    answer.error     = string.Format("устройство вернуло ошибку: {0}", exceptionCode);
                    answer.errorcode = DeviceError.DEVICE_EXCEPTION;
                }
            }

            return(answer);
        }