/// <summary>
        /// 接收客户端发送的消息
        /// </summary>
        /// <param name="newSocket"></param>
        void Receive(Socket newSocket)
        {
            while (newSocket.Connected)
            {
                try
                {
                    byte[] requetData1 = new byte[8];
                    //读取客户端发送过来的数据
                    requetData1 = SocketRead(newSocket, requetData1.Length);
                    byte[] requetData2 = new byte[requetData1[5] - 2];
                    requetData2 = SocketRead(newSocket, requetData2.Length);
                    var    requetData    = requetData1.Concat(requetData2).ToArray();
                    byte[] responseData1 = new byte[8];
                    //复制请求报文中的报文头
                    Buffer.BlockCopy(requetData, 0, responseData1, 0, responseData1.Length);
                    var addressKey       = $"{requetData[6]}-{requetData[8] * 256 + requetData[9]}"; //站号-寄存器地址
                    var stationNumberKey = $"{requetData[6]}-key";                                   //站号
                    var address          = requetData[8] * 256 + requetData[9];                      //寄存器地址
                    var registerLenght   = requetData[10] * 256 + requetData[11];                    //寄存器的长度
                    switch (requetData[7])
                    {
                    //读取线圈
                    case 1:
                    {
                        var value     = dataPersist.Read(stationNumberKey + "-Coil");    // 数据存在 8、9
                        var byteArray = JsonConvert.DeserializeObject <byte[]>(value) ?? new byte[65536];

                        var blenght = (byte)Math.Ceiling(registerLenght / 8f);
                        //当前位置到最后的长度
                        responseData1[5] = (byte)(3 + blenght);
                        byte[] responseData2 = new byte[1 + blenght];

                        var tempData = new byte[registerLenght];
                        Buffer.BlockCopy(byteArray, address, tempData, 0, tempData.Length);
                        responseData2[0] = blenght;        //显示数据所占长度
                        for (int i = 0; i < blenght; i++)
                        {
                            responseData2[1 + i] = (byte)DataConvert.BinaryArrayToInt(string.Join("", tempData.Skip(i * 8).Take(8).Reverse()));
                        }
                        var responseData = responseData1.Concat(responseData2).ToArray();
                        newSocket.Send(responseData);
                    }
                    break;

                    //写入线圈
                    case 5:
                    {
                        var value = new byte[2];
                        Buffer.BlockCopy(requetData, 10, value, 0, value.Length);
                        var byteArray = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(stationNumberKey + "-Coil")) ?? new byte[65536];
                        if (value[0] == 0 && value[1] == 0)
                        {
                            byteArray[address] = 0;
                        }
                        else
                        {
                            byteArray[address] = 1;
                        }
                        dataPersist.Write(stationNumberKey + "-Coil", JsonConvert.SerializeObject(byteArray));
                        var responseData = new byte[10];
                        Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length);
                        responseData[5] = 4;        //后面的长度
                        newSocket.Send(responseData);
                    }
                    break;

                    //读取
                    case 3:
                    {
                        var value     = dataPersist.Read(stationNumberKey);    // 数据存在 8、9
                        var byteArray = JsonConvert.DeserializeObject <byte[]>(value) ?? new byte[65536];
                        //当前位置到最后的长度
                        responseData1[4] = (byte)((3 + registerLenght * 2) / 256);
                        responseData1[5] = (byte)((3 + registerLenght * 2) % 256);
                        byte[] responseData2 = new byte[1 + registerLenght * 2];
                        responseData2[0] = (byte)(registerLenght * 2);
                        Buffer.BlockCopy(byteArray, address * 2, responseData2, 1, registerLenght * 2);
                        var responseData = responseData1.Concat(responseData2).ToArray();
                        newSocket.Send(responseData);
                    }
                    break;

                    //写入
                    case 16:
                    {
                        var value = new byte[requetData[12]];
                        Buffer.BlockCopy(requetData, 13, value, 0, value.Length);
                        var byteArray = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(stationNumberKey)) ?? new byte[65536];
                        value.CopyTo(byteArray, address * 2);
                        dataPersist.Write(stationNumberKey, JsonConvert.SerializeObject(byteArray));
                        var responseData = new byte[12];
                        Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length);
                        responseData[5] = 6;        //后面的长度
                        newSocket.Send(responseData);
                    }
                    break;

                    //读离散
                    case 2:
                    {
                        //只返回false
                        var bytes = new byte[2];
                        //当前位置到最后的长度
                        responseData1[5] = (byte)(2 + bytes.Length);
                        byte[] responseData2 = new byte[2] {
                            bytes[1], bytes[0]
                        };
                        var responseData = responseData1.Concat(responseData2).ToArray();
                        newSocket.Send(responseData);
                    }
                    break;
                    }
                }
                catch (Exception ex)
                {
                    //if (newSocket?.Connected ?? false) newSocket?.Shutdown(SocketShutdown.Both);
                    //newSocket?.Close();
                    //throw ex;
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// 接收客户端发送的消息
        /// </summary>
        /// <param name="newSocket"></param>
        void Receive(Socket newSocket)
        {
            while (newSocket.Connected)
            {
                try
                {
                    byte[] requetData1 = new byte[4];
                    //读取客户端发送过来的数据
                    int readLeng = newSocket.Receive(requetData1, 0, requetData1.Length, SocketFlags.None);
                    if (readLeng == 0)//客户端断开连接
                    {
                        newSocket.Shutdown(SocketShutdown.Both);
                        newSocket.Close();
                        return;
                    }
                    byte[] requetData2 = new byte[requetData1[3] - 4];
                    readLeng = newSocket.Receive(requetData2, 0, requetData2.Length, SocketFlags.None);
                    if (readLeng == 0)//客户端断开连接
                    {
                        if (newSocket?.Connected ?? false)
                        {
                            newSocket.Shutdown(SocketShutdown.Both);
                        }
                        newSocket?.Close();
                        return;
                    }
                    var requetData = requetData1.Concat(requetData2).ToArray();

                    //如果是连接的时候发送的两次初始化指令 则直接跳过
                    if (requetData[3] == SiemensConstant.Command1_200Smart.Length || requetData[3] == SiemensConstant.Command2_200Smart.Length)
                    {
                        newSocket.Send(requetData);
                        continue;
                    }
                    var address = requetData[28] * 256 * 256 + requetData[29] * 256 + requetData[30];
                    switch (requetData[17])
                    {
                    //读
                    case 4:
                    {
                        var value = dataPersist.Read(address);        //TODO 数据存在 25、26
                        //把存储的数据转为字节数组
                        var bytes = JsonConvert.DeserializeObject <byte[]>(value);
                        if (string.IsNullOrWhiteSpace(value))
                        {
                            bytes = BitConverter.GetBytes(0);
                        }
                        var dataContent = new byte[4 + bytes.Length];                 //可以从报文中获取Length?
                        DataConvert.StringToByteArray("FF 09 00 04").CopyTo(dataContent, 0);
                        dataContent[1] = bytes.Length == 1 ? (byte)0x03 : (byte)0x04; //04 byte(字节) 03bit(位)
                        dataContent[2] = (byte)(bytes.Length / 256);
                        dataContent[3] = (byte)(bytes.Length % 256);
                        //dataContent[0] 固定
                        //dataContent[2] dataContent[3] 后半截数据数组的Length
                        //dataContent[4]-[7] 返回给客户端的数据
                        byte[] responseData1 = new byte[21 + dataContent.Length];
                        DataConvert.StringToByteArray("03 00 00 1A 02 F0 80 32 03 00 00 00 01 00 02 00 00 00 00 04 01").CopyTo(responseData1, 0);
                        //responseData1[0] = 0x03;
                        //responseData1[1] = 0x00; //固定协议头
                        //responseData1[8] = 0x03;//1  客户端发送命令 3 服务器回复命令
                        responseData1[2]  = (byte)(responseData1.Length / 256);
                        responseData1[3]  = (byte)(responseData1.Length % 256);
                        responseData1[15] = (byte)(requetData.Length / 256);
                        responseData1[16] = (byte)(requetData.Length % 256);
                        responseData1[20] = requetData[18];
                        dataContent.CopyTo(responseData1, 21);
                        Buffer.BlockCopy(bytes, 0, responseData1, responseData1.Length - bytes.Length, bytes.Length);
                        newSocket.Send(responseData1);
                    }
                    break;

                    //写
                    case 5:
                    {
                        var valueByte = new byte[requetData.Length - 35];
                        Buffer.BlockCopy(requetData, 35, valueByte, 0, valueByte.Length);
                        //存储字节数据到内存
                        dataPersist.Write(address, JsonConvert.SerializeObject(valueByte));

                        byte[] responseData1 = new byte[22];
                        DataConvert.StringToByteArray("03 00 00 16 02 F0 80 32 03 00 00 00 01 00 02 00 01 00 00 05 01 FF").CopyTo(responseData1, 0);
                        //responseData1[15] = (byte)(responseData1.Length / 256);
                        //responseData1[16] = (byte)(responseData1.Length % 256);
                        newSocket.Send(responseData1);
                    }
                    break;
                    }
                }
                catch (SocketException ex)
                {
                    //todo
                    //if (ex.SocketErrorCode != SocketError.ConnectionRefused &&
                    //    ex.SocketErrorCode != SocketError.ConnectionReset)
                    //    throw ex;
                }
            }
        }
        /// <summary>
        /// 接收数据回调用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                byte[] requetData = new byte[serialPort.BytesToRead];
                serialPort.Read(requetData, 0, requetData.Length);
                var address = requetData[2] * 256 + requetData[3];
                switch (requetData[1])
                {
                //读取线圈
                case 1:
                {
                    var value    = dataPersist.Read(address);
                    var bytes    = JsonConvert.DeserializeObject <byte[]>(value).Reverse().ToArray();
                    var tempData = new byte[4];
                    tempData[0] = 1;
                    tempData[1] = 1;
                    Buffer.BlockCopy(bytes, 0, tempData, 2, 2);
                    var responseData = CRC16.GetCRC16(tempData);
                    serialPort.Write(responseData, 0, responseData.Length);
                }
                break;

                //写入线圈
                case 5:
                {
                    var value = new byte[2];
                    Buffer.BlockCopy(requetData, requetData.Length - 4, value, 0, value.Length);
                    dataPersist.Write(address, JsonConvert.SerializeObject(value));
                    serialPort.Write(requetData, 0, requetData.Length);
                }
                break;

                //读取
                case 3:
                {
                    var value = dataPersist.Read(address);
                    var bytes = JsonConvert.DeserializeObject <byte[]>(value);
                    if (bytes == null)
                    {
                        var length = requetData[4] * 256 + requetData[5];
                        bytes = new byte[length * 2];
                    }
                    var dataHead     = new byte[] { 1, 3, (byte)bytes.Length };
                    var tempData     = dataHead.Concat(bytes).ToArray();
                    var responseData = CRC16.GetCRC16(tempData);
                    serialPort.Write(responseData, 0, responseData.Length);
                }
                break;

                //写入
                case 16:
                {
                    var value = new byte[requetData[6]];
                    Buffer.BlockCopy(requetData, 7, value, 0, value.Length);
                    dataPersist.Write(address, JsonConvert.SerializeObject(value));
                    var tempData = new byte[6];
                    Buffer.BlockCopy(requetData, 0, tempData, 0, tempData.Length);
                    var responseData = CRC16.GetCRC16(tempData);
                    serialPort.Write(responseData, 0, responseData.Length);
                }
                break;
                }
            }
            catch (Exception ex)
            { }
        }
Exemple #4
0
        /// <summary>
        /// 接收客户端发送的消息
        /// </summary>
        /// <param name="newSocket"></param>
        void Receive(Socket newSocket)
        {
            while (newSocket.Connected)
            {
                try
                {
                    byte[] requetData1 = new byte[4];
                    //读取客户端发送过来的数据
                    requetData1 = SocketRead(newSocket, requetData1.Length);
                    byte[] requetData2 = new byte[requetData1[2] * 256 + requetData1[3] - 4];
                    requetData2 = SocketRead(newSocket, requetData2.Length);
                    var requetData = requetData1.Concat(requetData2).ToArray();

                    //如果是连接的时候发送的两次初始化指令 则直接跳过
                    if (requetData[3] == SiemensConstant.Command1_200Smart.Length || requetData[3] == SiemensConstant.Command2_200Smart.Length)
                    {
                        newSocket.Send(requetData);
                        continue;
                    }

                    switch (requetData[17])
                    {
                    //读
                    case 4:
                    {
                        //数据块个数
                        var dbNumber = requetData[18];
                        //读取数据总长度
                        var readLength = 0;

                        for (int i = 0; i < dbNumber; i++)
                        {
                            //访问数据的个数,以byte为单位
                            var byteLength = requetData[23 + i * 12] * 256 + requetData[24 + i * 12];
                            if (byteLength == 1 && i < dbNumber - 1)        //非最后一个bit/byte,需要补全。
                            {
                                byteLength += 1;
                            }
                            readLength += byteLength;
                        }

                        var dataContent = new byte[4 * dbNumber + readLength];        //数据报文总长度
                        var cursor      = 0;
                        for (int i = 0; i < dbNumber; i++)
                        {
                            //DB块的偏移量
                            var beginAddress = requetData[28 + i * 12] * 256 * 256 + requetData[29 + i * 12] * 256 + requetData[30 + i * 12];
                            //访问数据的个数
                            var byteLength = requetData[23 + i * 12] * 256 + requetData[24 + i * 12];
                            if (byteLength == 1 && i < dbNumber - 1)        //非最后一个bit/byte,需要补全。
                            {
                                byteLength += 1;
                            }
                            //是否是bit类型
                            var isBit = requetData[22 + i * 12] == 0x01;
                            //访问数据块的类型(V、I、DB...)
                            var dbType    = requetData[27 + i * 12];
                            var dataKey   = $"s200-{dbType}";
                            var dataValue = dataPersist.Read(dataKey);
                            var byteArray = JsonConvert.DeserializeObject <byte[]>(dataValue) ?? new byte[65536];

                            //DataConvert.StringToByteArray("FF 09 00 04").CopyTo(dataContent, cursor);
                            dataContent[0 + cursor] = 0xFF;
                            //dataContent[1 + cursor] = readLength == 1 ? (byte)0x03 : (byte)0x04;//04 byte(字节) 03bit(位)
                            dataContent[1 + cursor] = isBit ? (byte)0x03 : (byte)0x04; //04 byte(字节) 03bit(位)
                            dataContent[2 + cursor] = (byte)(byteLength / 256);        //后半截数据数的Length
                            dataContent[3 + cursor] = (byte)(byteLength % 256);        //后半截数据数的Length
                            if (isBit)                                                 //按bit
                            {
                                var  bitOffset      = beginAddress % 8;
                                byte bitOffsetValue = (byte)Math.Pow(2, bitOffset);
                                var  oldBitValue    = byteArray[beginAddress / 8];
                                //转成bit的形式所需的返回值
                                var bitValue = (oldBitValue & bitOffsetValue) != 0 ? 0x01 : 0x00;
                                //[4 + cursor]返回给客户端的数据
                                new byte[] { (byte)bitValue }.CopyTo(dataContent, 4 + cursor);
                            }
                            else
                            {
                                //[4 + cursor]返回给客户端的数据
                                Buffer.BlockCopy(byteArray, beginAddress / 8, dataContent, 4 + cursor, byteLength);
                            }

                            cursor += 4 + byteLength;
                        }

                        byte[] responseData = new byte[21 + dataContent.Length];
                        DataConvert.StringToByteArray("03 00 00 1A 02 F0 80 32 03 00 00 00 01 00 02 00 00 00 00 04 01").CopyTo(responseData, 0);
                        responseData[8]  = 0x03;                              //1  客户端发送命令 3 服务器回复命令
                        responseData[2]  = (byte)(responseData.Length / 256); //返回数据长度
                        responseData[3]  = (byte)(responseData.Length % 256);
                        responseData[15] = (byte)(requetData.Length / 256);   //读取数据长度
                        responseData[16] = (byte)(requetData.Length % 256);
                        responseData[20] = requetData[18];                    //读取数据块个数
                        dataContent.CopyTo(responseData, 21);
                        newSocket.Send(responseData);
                    }
                    break;

                    //写
                    case 5:
                    {
                        var writesLength = requetData[18];        //写如数据的个数 Item count
                        int cursor       = 0;
                        for (int i = 0; i < writesLength; i++)
                        {
                            //DB块的偏移量(存储数据的地址)
                            var beginAddress = requetData[28 + i * 12] * 256 * 256 + requetData[29 + i * 12] * 256 + requetData[30 + i * 12];
                            //访问数据块的类型(V、I、DB...)
                            var dbType  = requetData[27 + i * 12];
                            var dataKey = $"s200-{dbType}";

                            //Data之前的下标
                            var dataBeforeIndex = 18 + writesLength * 12;
                            //[2 + index]是否是bit类型
                            var isBit       = requetData[dataBeforeIndex + 4 * (i + 1) - 2 + cursor] == 0x03;
                            var coefficient = isBit ? 1 : 8;
                            //初始化要写入的字节数组长度
                            var writeValue = new byte[requetData[dataBeforeIndex + 4 * (i + 1) + cursor] / coefficient];
                            //开始写入的地址(报文中的数据的位置)
                            var requetBeginLocation = dataBeforeIndex + 4 * (i + 1) + cursor + 1;

                            //非最后一个bit,需要补全。
                            if (writeValue.Length == 1 && i < writesLength - 1)
                            {
                                cursor++;
                            }
                            cursor += writeValue.Length;
                            //数据赋值到writeValue中
                            Buffer.BlockCopy(requetData, requetBeginLocation, writeValue, 0, writeValue.Length);

                            var byteArray = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(dataKey)) ?? new byte[65536];
                            if (isBit)
                            {
                                var  oldBitValue    = byteArray[beginAddress / 8];
                                var  bitOffset      = beginAddress % 8;
                                byte bitOffsetValue = (byte)Math.Pow(2, bitOffset);
                                if (writeValue[0] == 0x01)                               //true
                                {
                                    oldBitValue = (byte)(oldBitValue | bitOffsetValue);  //组合bitOffsetValue
                                }
                                else                                                     //false
                                {
                                    oldBitValue = (byte)(oldBitValue & ~bitOffsetValue); //去掉bitOffsetValue
                                }
                                new byte[] { oldBitValue }.CopyTo(byteArray, beginAddress / 8);
                            }
                            else
                            {
                                writeValue.CopyTo(byteArray, beginAddress / 8);
                            }

                            //存储字节数据到内存
                            dataPersist.Write(dataKey, JsonConvert.SerializeObject(byteArray));
                        }

                        byte[] responseData1 = new byte[22];
                        DataConvert.StringToByteArray("03 00 00 16 02 F0 80 32 03 00 00 00 01 00 02 00 01 00 00 05 01 FF").CopyTo(responseData1, 0);
                        newSocket.Send(responseData1);
                    }
                    break;
                    }
                }
                catch (Exception ex)
                {
                    //if (newSocket?.Connected ?? false) newSocket?.Shutdown(SocketShutdown.Both);
                    //newSocket?.Close();
                    //throw ex;
                }
            }
        }
Exemple #5
0
        /// <summary>
        /// 接收客户端发送的消息
        /// </summary>
        /// <param name="newSocket"></param>
        void Receive(Socket newSocket)
        {
            while (newSocket.Connected)
            {
                try
                {
                    byte[] requetData1 = new byte[8];
                    //读取客户端发送过来的数据
                    int readLeng = newSocket.Receive(requetData1, 0, requetData1.Length, SocketFlags.None);
                    if (readLeng == 0)//客户端断开连接
                    {
                        if (newSocket.Connected)
                        {
                            newSocket.Shutdown(SocketShutdown.Both);
                        }
                        newSocket.Close();
                        return;
                    }
                    byte[] requetData2 = new byte[requetData1[5] - 2];
                    readLeng = newSocket.Receive(requetData2, 0, requetData2.Length, SocketFlags.None);
                    if (readLeng == 0)//客户端断开连接
                    {
                        if (newSocket.Connected)
                        {
                            newSocket.Shutdown(SocketShutdown.Both);
                        }
                        newSocket.Close();
                        return;
                    }
                    var requetData = requetData1.Concat(requetData2).ToArray();

                    byte[] responseData1 = new byte[8];
                    //复制请求报文中的报文头
                    Buffer.BlockCopy(requetData, 0, responseData1, 0, responseData1.Length);
                    var address = requetData[8] * 256 + requetData[9];
                    switch (requetData[7])
                    {
                    //读取线圈
                    case 1:
                    {
                        var value = dataPersist.Read(address);        // 数据存在 8、9
                        var bytes = JsonConvert.DeserializeObject <byte[]>(value);
                        //当前位置到最后的长度
                        responseData1[5] = (byte)(2 + bytes.Length);
                        //TODO
                        byte[] responseData2 = new byte[2] {
                            bytes[1], bytes[0]
                        };
                        var responseData = responseData1.Concat(responseData2).ToArray();
                        newSocket.Send(responseData);
                    }
                    break;

                    //写入线圈
                    case 5:
                    {
                        var value = new byte[2];
                        Buffer.BlockCopy(requetData, 10, value, 0, value.Length);
                        dataPersist.Write(address, JsonConvert.SerializeObject(value));
                        var responseData = new byte[10];
                        Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length);
                        responseData[5] = 4;        //后面的长度
                        newSocket.Send(responseData);
                    }
                    break;

                    //读取
                    case 3:
                    {
                        var value = dataPersist.Read(address);        // 数据存在 8、9
                        var bytes = JsonConvert.DeserializeObject <byte[]>(value);
                        if (bytes == null)
                        {
                            var length = requetData[requetData.Length - 2] * 256 + requetData[requetData.Length - 1];
                            bytes = new byte[length * 2];
                        }
                        //当前位置到最后的长度
                        responseData1[5] = (byte)(3 + bytes.Length);
                        byte[] responseData2 = new byte[1 + bytes.Length];
                        responseData2[0] = (byte)bytes.Length;
                        bytes.CopyTo(responseData2, 1);
                        var responseData = responseData1.Concat(responseData2).ToArray();
                        newSocket.Send(responseData);
                    }
                    break;

                    //写入
                    case 16:
                    {
                        var value = new byte[requetData[12]];
                        Buffer.BlockCopy(requetData, 13, value, 0, value.Length);
                        dataPersist.Write(address, JsonConvert.SerializeObject(value));
                        var responseData = new byte[12];
                        Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length);
                        responseData[5] = 6;        //后面的长度
                        newSocket.Send(responseData);
                    }
                    break;
                    }
                }
                catch (SocketException ex)
                {
                    if (newSocket?.Connected ?? false)
                    {
                        newSocket?.Shutdown(SocketShutdown.Both);
                    }
                    newSocket?.Close();
                }
                catch (Exception ex)
                {
                    if (newSocket?.Connected ?? false)
                    {
                        newSocket?.Shutdown(SocketShutdown.Both);
                    }
                    newSocket?.Close();
                }
            }
        }