public static MOTOR_DATA_KV_SP ToStruct(byte[] bytes) { GCHandle gch = GCHandle.Alloc(bytes, GCHandleType.Pinned); MOTOR_DATA_KV_SP result = (MOTOR_DATA_KV_SP)Marshal.PtrToStructure(gch.AddrOfPinnedObject(), typeof(MOTOR_DATA_KV_SP)); gch.Free(); return(result); }
static byte[] ToBytes(MOTOR_DATA_KV_SP obj) { int size = Marshal.SizeOf(typeof(MOTOR_DATA_KV_SP)); IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(obj, ptr, false); byte[] bytes = new byte[size]; Marshal.Copy(ptr, bytes, 0, size); Marshal.FreeHGlobal(ptr); return(bytes); }
// // 別スレッド処理(UDP) //IP 192.168.1.214 // private void worker_udp_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bw = (BackgroundWorker)sender; //バインドするローカルポート番号 int localPort = appSettings.UdpPortRecieve;// mmFsiUdpPortSpCam;// 24410 broadcast System.Net.Sockets.UdpClient udpc = null;; try { udpc = new System.Net.Sockets.UdpClient(localPort); } catch (Exception ex) { //匿名デリゲートで表示する this.Invoke(new dlgSetString(ShowRText), new object[] { richTextBox1, ex.ToString() }); } // ベースブロードバンドポートなら転送 System.Net.Sockets.UdpClient udpc2 = null;; if (localPort == mmUdpPortBroadCast) { int localPortSent = mmUdpPortBroadCastSent; try { udpc2 = new System.Net.Sockets.UdpClient(localPortSent); } catch (Exception ex) { //匿名デリゲートで表示する this.Invoke(new dlgSetString(ShowRText), new object[] { richTextBox1, ex.ToString() }); } } //文字コードを指定する System.Text.Encoding enc = System.Text.Encoding.UTF8; string str; MOTOR_DATA_KV_SP kmd3 = new MOTOR_DATA_KV_SP(); int size = Marshal.SizeOf(kmd3); KV_DATA kd = new KV_DATA(); int sizekd = Marshal.SizeOf(kd); //データを受信する System.Net.IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, localPort); while (bw.CancellationPending == false) { byte[] rcvBytes = udpc.Receive(ref remoteEP); if (rcvBytes.Length == sizekd) { kd = ToStruct1(rcvBytes); bw.ReportProgress(0, kd); // ベースブロードバンドポートなら転送 if (localPort == mmUdpPortBroadCast) { //データを送信するリモートホストとポート番号 string remoteHost = "localhost"; //string remoteHost = "192.168.1.204"; int remotePort = 24441; // アプリ1 udpc2.Send(rcvBytes, rcvBytes.Length, remoteHost, remotePort); remotePort = 24442; // アプリ2 udpc2.Send(rcvBytes, rcvBytes.Length, remoteHost, remotePort); remotePort = 24443; // アプリ3 udpc2.Send(rcvBytes, rcvBytes.Length, remoteHost, remotePort); } } else if (rcvBytes.Length == size) { kmd3 = ToStruct(rcvBytes); if (kmd3.cmd == 1) //mmMove:1 { Mode = DETECT; //this.Invoke(new dlgSetColor(SetTimer), new object[] { timerSaveMainTime, RUN }); this.Invoke(new dlgSetColor(SetTimer), new object[] { timerSaveTimeOver, RUN }); //保存処理開始 if (this.States == RUN) { ImgSaveFlag = TRUE; this.States = SAVE; kalman_init(); pos_mes.init(); } } else if (kmd3.cmd == 90) //mmPidTest:90 { Mode = PID_TEST; test_start_id = pid_data.id; //this.Invoke(new dlgSetColor(SetTimer), new object[] { timerSaveMainTime, RUN }); this.Invoke(new dlgSetColor(SetTimer), new object[] { timerSaveTimeOver, RUN }); //保存処理開始 if (this.States == RUN) { ImgSaveFlag = TRUE; this.States = SAVE; } } else if (kmd3.cmd == 16) //mmLost:16 { //Mode = LOST; //ButtonSaveEnd_Click(sender, e); //匿名デリゲートで表示する this.Invoke(new dlgSetColor(SetTimer), new object[] { timerSaveMainTime, STOP }); this.Invoke(new dlgSetColor(SetTimer), new object[] { timerSavePostTime, RUN }); } else if (kmd3.cmd == 17) // mmMoveEnd 17 // 位置決め完了 { Mode = DETECT_IN; } else if (kmd3.cmd == 18) // mmTruckEnd 18 // 追尾完了 { //保存処理終了 timerSaveTimeOver.Stop(); Mode = LOST; ButtonSaveEnd_Click(sender, e); } else if (kmd3.cmd == 20) //mmData 20 // send fish pos data { //匿名デリゲートで表示する //this.Invoke(new dlgSetColor(SetTimer), new object[] { timerSaveMainTime, STOP }); //this.Invoke(new dlgSetColor(SetTimer), new object[] { timerSaveMainTime, RUN }); // main timer 延長 } str = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + " UDP " + kmd3.cmd.ToString("CMD:00") + " Az:" + kmd3.az + " Alt:" + kmd3.alt + " VAz:" + kmd3.vaz + " VAlt:" + kmd3.valt + "\n"; this.Invoke(new dlgSetString(ShowRText), new object[] { richTextBox1, str }); //bw.ReportProgress(0, kmd3); } else { string rcvMsg = enc.GetString(rcvBytes); str = DateTime.Now.ToString("yyyyMMdd_HHmmss_fff") + "受信したデータ:[" + rcvMsg + "]\n"; this.Invoke(new dlgSetString(ShowRText), new object[] { richTextBox1, str }); } //str = DateTime.Now.ToString("yyyyMMdd_HHmmss_fff") + "送信元アドレス:{0}/ポート番号:{1}/Size:{2}\n" + remoteEP.Address + "/" + remoteEP.Port + "/" + rcvBytes.Length; //this.Invoke(new dlgSetString(ShowRText), new object[] { richTextBox1, str }); } //UDP接続を終了 udpc.Close(); }