Пример #1
0
        //enum CrcType
        //{
        //    KS = 0,
        //    CRC = 1
        //};

        byte[] MakeBaseRequest(List <byte> Data)
        {
            //var crcType = CrcType.CRC;

            var bytes = new List <byte> {
            };

            if (NetworkAddress > 0xFF)
            {
                bytes.Add((byte)0xFC);
                bytes.AddRange(BitConverter.GetBytes(NetworkAddress).Reverse());
            }
            else
            {
                bytes.Add((byte)NetworkAddress);
            };
            bytes.AddRange(Data);

            //if (crcType == CrcType.CRC)
            {
                Crc crc = Crc.Calc(bytes.ToArray(), new Crc16Modbus());
                bytes.Add(crc.CrcData[0]);
                bytes.Add(crc.CrcData[1]);
            }
            //else if (crcType == CrcType.KS)
            //{
            //    Crc crc = Crc.Calc(bytes.ToArray(), new SetCrc8());
            //    bytes.Add(crc.CrcData[0]);
            //}

            return(bytes.ToArray());
        }
Пример #2
0
        public override byte[] GetBytes()
        {
            var e = Encoding.ASCII;

            var bytes = new List <byte>();

            bytes.Add(SOH);
            bytes.AddRange(e.GetBytes("R1"));
            bytes.Add(STX);
            bytes.AddRange(e.GetBytes(Str));
            bytes.Add(ETX);
            bytes.AddRange(Crc.Calc(bytes.ToArray(), 1, bytes.Count - 1, new BccCalculator()).CrcData);
            return(bytes.ToArray());
        }
Пример #3
0
        public override byte[] GetBytes()
        {
            var bytes = new byte[]
            {
                Request.SOH,
                0x42, 0x30, //B0
                Request.ETX,
                0x00
            };
            var crc = Crc.Calc(bytes, 1, 3, new BccCalculator()).CrcData;

            bytes[4] = crc[0];
            return(bytes);
        }
Пример #4
0
        public byte[] GetBytes()
        {
            var data = new List <byte>();

            data.Add(NetworkAddress);
            data.Add(Function);

            data.AddRange(Data);

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

            data.Add(crc.CrcData[0]);
            data.Add(crc.CrcData[1]);
            return(data.ToArray());
        }
Пример #5
0
        public List <byte> SendAnswer(byte byte0, byte[] bytesCId, byte func, byte ErrorOrEvent, byte[] byteTime)
        {
            List <byte> sendByte = new List <byte>();

            sendByte.Add(byte0);
            sendByte.AddRange(bytesCId);        //cid 12 byte   1-12
            sendByte.Add(func);                 //                13
            sendByte.Add(ErrorOrEvent);         //                14
            sendByte.AddRange(byteTime);        //time          15-18
            var crc = Crc.Calc(sendByte.ToArray(), new Crc16Modbus());

            sendByte.Add(crc.CrcData[0]);                       //19
            sendByte.Add(crc.CrcData[1]);
            return(sendByte);
        }
Пример #6
0
        byte[] MakeBootloaderPstartRequest()
        {
            var Data = new List <byte>();

            var function = (byte)ModbusFunction.MODBUS_USER_FUNCTION_BOOTLOADER_PSTART;

            UInt32 sizeProgram = (UInt32)fileBytes.Length;
            var    crc         = Crc.Calc(fileBytes, new Crc16Modbus());

            log(string.Format("коммит размер={0} (0x{0:X8}) crc16 прошивки=0x{1:X2}{2:X2}", sizeProgram, crc.CrcData[1], crc.CrcData[0]), 1);

            Data.AddRange(BitConverter.GetBytes(sizeProgram).Reverse());
            Data.Add(crc.CrcData[1]);
            Data.Add(crc.CrcData[0]);

            return(MakeBaseRequest(function, Data));
        }
Пример #7
0
        public override byte[] GetBytes()
        {
            var e = Encoding.ASCII;

            var bytes = new List <byte>();

            bytes.Add(SOH);
            bytes.AddRange(e.GetBytes("R3"));
            bytes.Add(STX);
            var parameters = string.Format("{0}:V.{1}({2};{3:yyyy-MM-dd,HH:mm:ss};{4:yyyy-MM-dd,HH:mm:ss};{5})", ArchiveNumber, 0, 3, Start, End, Count);

            //var parameters = string.Format("{0}:V.{1}({2};{3:yyyy-MM-dd,HH:mm:ss};;{5})", ArchiveNumber, 0, 3, Start, End, Count);
            bytes.AddRange(e.GetBytes(parameters));
            bytes.Add(ETX);
            bytes.AddRange(Crc.Calc(bytes.ToArray(), 1, bytes.Count - 1, new BccCalculator()).CrcData);
            return(bytes.ToArray());
        }
Пример #8
0
        byte[] MakeRequest(byte function, List <byte> Data = null)
        {
            var data = new List <byte>();

            data.Add(NetworkAddress);
            data.Add(function);

            if (Data != null)
            {
                data.AddRange(Data);
            }

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

            data.Add(crc.CrcData[0]);
            data.Add(crc.CrcData[1]);
            return(data.ToArray());
        }
Пример #9
0
        public byte[] MakeBaseRequest(byte networkAddress, byte Function, List <byte> Data)// = null
        {
            List <byte> bytes = new List <byte>();

            bytes.Add(networkAddress);
            bytes.Add(Function);

            if (Data != null)
            {
                bytes.AddRange(Data);
            }

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

            bytes.Add(crc.CrcData[0]);
            bytes.Add(crc.CrcData[1]);

            return(bytes.ToArray());
        }
Пример #10
0
        byte[] MakeModbusRequest3(UInt16 register, UInt16 count)
        {
            var data = new List <byte>();

            data.Add(networkAddress);
            data.Add(0x03);

            data.Add(GetHighByte(register));
            data.Add(GetLowByte(register));
            data.Add(GetHighByte(count));
            data.Add(GetLowByte(count));

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

            data.Add(crc.CrcData[0]);
            data.Add(crc.CrcData[1]);

            return(data.ToArray());
        }
Пример #11
0
        public byte[] MakeBaseRequest(byte RequestCode, List <byte> Data)// = null
        {
            var bytes = new List <byte>();

            bytes.Add(NetworkAddress);
            bytes.Add(RequestCode);

            if (Data != null)
            {
                bytes.AddRange(Data);
            }

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

            bytes.Add(crc.CrcData[0]);
            bytes.Add(crc.CrcData[1]);

            return(bytes.ToArray());
        }
Пример #12
0
        byte[] MakeBaseRequest(byte function, List <byte> data = null)
        {
            if (data == null)
            {
                data = new List <byte>();
            }

            List <byte> bytes = new List <byte>();

            bytes.Add(NetworkAddress);
            bytes.Add(function);

            bytes.AddRange(data);

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

            bytes.AddRange(crc.CrcData);

            bytes.Insert(0, 0x0ff);
            bytes.Insert(0, 0x0ff);

            return(bytes.ToArray());
        }
Пример #13
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, "опрос успешно завершен"));
        }
Пример #14
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);
            }
        }