/// <summary> /// socket发送 /// </summary> /// <param name="msg"></param> void send(string msg) { writeListBox("发送内容:" + msg); try { //byte[] buffer = new byte[1024 * 1024 * 3]; //buffer = Encoding.UTF8.GetBytes(msg) /** * * 接触网 * SocketDateStruct data = new SocketDateStruct(); * data.devId = "ID133"; * data.temperature = -12; * data.valueB = 11; * data.accelerationX = 33; * data.accelerationY = 44; * data.accelerationZ = 55; * data.pitchAngle = 180; * data.rollAngle = 120; * data.headingAngle = 90; * //data.isAlarm = 1; * //byte[] sendStruct = MarshalHelper.StructToBytes(data); * //byte[] mybtye = SoftCRC16.CRC16(sendStruct); * //socketSend.Send(mybtye); * * byte[] zhaiTeacherDate = new byte[] { 0x00, 0x0D, 0xC9, 0x42, 0x01, 0x47, 0x7F, 0xEF, 0x00, 0x00, 0x03, 0xB2, 0xCF, 0x00, 0x3B, 0x00, 0x79, 0x00, 0x5C, 0x00, 0x20, 0xF9, 0x24, 0x3D, 0x00, 0x00, 0x00, 0xF2, 0xFF }; * byte[] mybtye = SoftCRC16.CRC16(zhaiTeacherDate); * socketSend.Send(mybtye); */ //byte[] zhaiTeacherDate = new byte[] { 0x00, 0x0D}; //byte[] mybtye = SoftCRC16.CRC16(zhaiTeacherDate); //socketSend.Send(mybtye); //Array.Copy(sendStruct, sendStruct.Length, mybtye,0, mybtye.Length); //发送数据 //byte[] sendData = new byte[sendStruct.Length + 2]; //sendData[sendData.Length - 1] = DataCheck(sendData); //Agv测试 R_CarStatus r_CarStatus = new R_CarStatus(); r_CarStatus.AgvCarId = "123"; r_CarStatus.CarAction = 1; r_CarStatus.CarState = 1; r_CarStatus.PositionX = 12.01f; byte[] sendStruct = MarshalHelper.StructToBytes(r_CarStatus); sendStruct[0] = 255; sendStruct[1] = 3; sendStruct[2] = 0; sendStruct[5] = 49; byte[] mybtye = SoftCRC16.CRC16(sendStruct); socketSend.Send(mybtye); } catch { } }
private OperateResult <byte[]> BuildWriteOneRegisterCommand(string address, byte[] data) { OperateResult <int> analysis = AnalysisAddress(address); if (!analysis.IsSuccess) { return(OperateResult.CreateFailedResult <byte[]>(analysis)); } byte[] buffer = new byte[6]; buffer[0] = station; buffer[1] = ModbusInfo.WriteOneRegister; buffer[2] = (byte)(analysis.Content / 256); buffer[3] = (byte)(analysis.Content % 256); buffer[4] = data[1]; buffer[5] = data[0]; return(OperateResult.CreateSuccessResult(SoftCRC16.CRC16(buffer))); }
private OperateResult <byte[]> BuildWriteOneCoilCommand(string address, bool value) { OperateResult <int> analysis = AnalysisAddress(address); if (!analysis.IsSuccess) { return(OperateResult.CreateFailedResult <byte[]>(analysis)); } byte[] buffer = new byte[6]; buffer[0] = station; buffer[1] = ModbusInfo.WriteOneCoil; buffer[2] = (byte)(analysis.Content / 256); buffer[3] = (byte)(analysis.Content % 256); buffer[4] = (byte)(value ? 0xFF : 0x00); buffer[5] = 0x00; return(OperateResult.CreateSuccessResult(SoftCRC16.CRC16(buffer))); }
/// <summary> /// 读取数据的基础指令,需要指定指令码,地址,长度 /// </summary> /// <param name="code"></param> /// <param name="address"></param> /// <param name="count"></param> /// <returns></returns> private OperateResult <byte[]> BuildReadCommandBase(byte code, string address, ushort count) { OperateResult <int> analysis = AnalysisAddress(address); if (!analysis.IsSuccess) { return(OperateResult.CreateFailedResult <byte[]>(analysis)); } byte[] buffer = new byte[6]; buffer[0] = station; buffer[1] = code; buffer[2] = (byte)(analysis.Content / 256); buffer[3] = (byte)(analysis.Content % 256); buffer[4] = (byte)(count / 256); buffer[5] = (byte)(count % 256); return(OperateResult.CreateSuccessResult(SoftCRC16.CRC16(buffer))); }
private OperateResult <byte[]> BuildWriteCoilCommand(string address, bool[] values) { byte[] data = SoftBasic.BoolArrayToByte(values); OperateResult <int> analysis = AnalysisAddress(address); if (!analysis.IsSuccess) { return(OperateResult.CreateFailedResult <byte[]>(analysis)); } byte[] buffer = new byte[7 + data.Length]; buffer[0] = station; buffer[1] = ModbusInfo.WriteCoil; buffer[2] = (byte)(analysis.Content / 256); buffer[3] = (byte)(analysis.Content % 256); buffer[4] = (byte)(values.Length / 256); buffer[5] = (byte)(values.Length % 256); buffer[6] = (byte)(data.Length); data.CopyTo(buffer, 7); return(OperateResult.CreateSuccessResult(SoftCRC16.CRC16(buffer))); }
/// <summary> /// 接收客户端发来的信息,客户端套接字对象 /// </summary> /// <param name="socketclientpara"></param> private void recv(object socketclientpara) { Socket socketServer = socketclientpara as Socket; while (true) { //创建字节数组接收客户端的数据 返回值length表示接收了多少字节的数据,根据结构体计算出来长度大小 byte[] arrServerRecMsg = new byte[Marshal.SizeOf(typeof(SocketDateStruct)) + 2]; //将接收到的信息存入到内存缓冲区,并返回其字节数组的长度 try { int length = socketServer.Receive(arrServerRecMsg); byte[] dataValue = new byte[Marshal.SizeOf(typeof(SocketDateStruct))]; //数据用于crc Array.Copy(arrServerRecMsg, 0, dataValue, 0, length - 2); byte[] myCRC = SoftCRC16.CRC16(dataValue); if (myCRC[myCRC.Length - 1] == arrServerRecMsg[myCRC.Length - 1] && myCRC[myCRC.Length - 2] == arrServerRecMsg[myCRC.Length - 2]) //验证CRC高位和地位是否相等 { SocketDateStruct socketDateStruct = new SocketDateStruct(); socketDateStruct = MarshalHelper.BytesToStruct <SocketDateStruct>(arrServerRecMsg); string strStruct = socketDateStruct.devId + ";" + socketDateStruct.Temperature.ToString() + ";" + socketDateStruct.Humidity.ToString() + ";" + socketDateStruct.Distance.ToString() + ";" + socketDateStruct.XAxisAcceleration.ToString() + ";" + socketDateStruct.YAxisAcceleration.ToString() + ";" + socketDateStruct.ZAxisAcceleration.ToString() + ";" + socketDateStruct.PitchAngle.ToString() + ";" + socketDateStruct.RollAngle.ToString() + ";" + socketDateStruct.CourseAngle.ToString(); writeListBox("接收到了一条消息:结构体数据->" + strStruct); } else { writeListBox("接收到了一条消息:收到的数据CRC错误"); } string strData2 = BitConverter.ToString(arrServerRecMsg); //只把接收到的数据(0 - length)进行转化 writeListBox("接收到了一条消息:原始的byte->" + strData2); //将机器接受到的字节数组转换为人可以读懂的字符串 //string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 0, length); string strSRecMsg = "12345"; //将发送的字符串信息附加到文本框txtMsg上 writeListBox("\r\n[客户端:" + socketServer.RemoteEndPoint + " 时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "]\r\n" + strSRecMsg); //Thread.Sleep(3000); //socketServer.Send(Encoding.UTF8.GetBytes("[" + socketServer.RemoteEndPoint + "]:"+strSRecMsg)); //发送客户端数据 if (ClientConnectionItems.Count > 0) { foreach (var socketTemp in ClientConnectionItems) { socketTemp.Value.Send(Encoding.UTF8.GetBytes("[" + socketServer.RemoteEndPoint + "]:" + strSRecMsg)); } } } catch (Exception) { ClientConnectionItems.Remove(socketServer.RemoteEndPoint.ToString()); //提示套接字监听异常 writeListBox("\r\n[客户端\"" + socketServer.RemoteEndPoint + "\"已经中断连接! 客户端数量:" + ClientConnectionItems.Count + "]"); //关闭之前accept出来的和客户端进行通信的套接字 socketServer.Close(); break; } } }