//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()); }
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()); }
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); }
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()); }
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); }
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)); }
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()); }
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()); }
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()); }
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()); }
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()); }
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()); }
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, "опрос успешно завершен")); }
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); } }