public void Open(string _ip, int _port, int _timeout, Action <byte[]> _getDataCallBack, Action _disconnectCallBack, Action <bool, string> _connectOverCallBack) { getDataCallBack = _getDataCallBack; disconnectCallBack = _disconnectCallBack; connectOverCallBack = _connectOverCallBack; IPAddress ipa = Dns.GetHostAddresses(_ip)[0]; socket = new Socket(ipa.AddressFamily, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipe = new IPEndPoint(ipa, _port); IAsyncResult ar = null; connectStatus = CONNECT_STATUS.CONNECTING; try { ar = socket.BeginConnect(ipe, ConnectCallBack, null); } catch (Exception e) { Action <bool, string> dele = connectOverCallBack; Clear(); dele(false, "error"); return; } StartCoroutine(CheckConnectTimeout(ar, _timeout)); }
private void ProcessNetStatus(CONNECT_STATUS st, object o) { D("processDiscovery : st : " + st + "object : " + o + "ConnectStatusCallBackHandler:" + UpdateUiHandler); UpdateUiHandler?.Invoke(st, new object[] { o }); switch (st) { case CONNECT_STATUS.DISCOVERY_INIT_OK: break; case CONNECT_STATUS.DISCOVERY_GET_PCB: _PcbTcpServerEndPoint = (IPEndPoint)o; _TcpCmdClient = new TcpCmdClient(_PcbTcpServerEndPoint); _TcpCmdClient.TcpStatusChangeHandler += ProcessNetStatus; break; case CONNECT_STATUS.TCP_CONNECT_OK: //network is ok. so I open TcpServer. if (ProgramInfo.PCIPaddr != null && !_hasFtprun) { FtpInstanceServer.instance.Start(ProgramInfo.FtpServerRootPath, ProgramInfo.PCIPaddr); FtpInstanceServer.instance.FtpServerStatusChangeeHandler += ProcessNetStatus; _hasFtprun = true; } break; case CONNECT_STATUS.TCP_RECEIVE_MSG: _RxMsgDispatch.ProcessRxMsg((string)o); break; default: break; } }
// Update is called once per frame void Update() { if (connectStatus == CONNECT_STATUS.CONNECTED) { connectStatus = CONNECT_STATUS.CONNECTOVER; connectOverCallBack(true, string.Empty); } else if (connectStatus == CONNECT_STATUS.CONNECTOVER) { if (socket.Poll(10, SelectMode.SelectRead) && socket.Available == 0) { Action dele = disconnectCallBack; Clear(); dele(); } else { if (socket.Available > 0) { byte[] bytes = new byte[socket.Available]; socket.Receive(bytes, 0, socket.Available, SocketFlags.None); getDataCallBack(bytes); } } } }
private void ConnectCallBack(IAsyncResult _ar) { lock (locker) { if (connectStatus == CONNECT_STATUS.CONNECTING) { socket.EndConnect(_ar); connectStatus = CONNECT_STATUS.CONNECTED; } } }
private void CheckStatus() // 检查当前状态 { while (true) { if (_TestProject._Comm.IsOpen()) { _Connect_Status = CONNECT_STATUS.Connected; Dispatcher.Invoke(new Action(() => { ChangeUI(CONNECT_STATUS.Connected); })); return; } } }
private bool BootInitialize() // 启动初始化 { // 按键初始化 _Project_Status = PROJECT_STATUS.None; _Plan_Status = PLAN_STATUS.None; _Connect_Status = CONNECT_STATUS.Disconnected; ChangeUI(); // 计划列表初始化 cbPlanList.SelectedValuePath = "_GUID"; cbPlanList.DisplayMemberPath = "_Name"; return(true); }
private void UpdateUi(CONNECT_STATUS c, object[] o) { D("UpdateUi: " + c); if (!IsHandleCreated) { return; } switch (c) { case CONNECT_STATUS.DISCOVERY_INIT_OK: Invoke((MethodInvoker) delegate() { AdbStatusToollable.Text = "discovery 初始化成功"; }); break; case CONNECT_STATUS.DISCOVERY_INIT_ERROR: Invoke((MethodInvoker) delegate() { AdbStatusToollable.Text = "discovery 初始化失败"; }); break; case CONNECT_STATUS.DISCOVERY_GET_PCB: IPEndPoint ip = (IPEndPoint)o[0]; Invoke((MethodInvoker) delegate() { AdbStatusToollable.Text = "连接: " + ip.Address; }); break; case CONNECT_STATUS.TCP_CONNECT_OK: Invoke((MethodInvoker) delegate() { //statusTcpStatus.Text = "tcp 已经初始化成功"; }); break; case CONNECT_STATUS.TCP_CONNECT_ERROR: case CONNECT_STATUS.TCP_SEND_MSG_ERROR: case CONNECT_STATUS.TCP_RECV_MSG_ERROR: Invoke((MethodInvoker) delegate() { // statusTcpStatus.Text = "tcp 连接断开"; }); break; case CONNECT_STATUS.TCP_RECEIVE_MSG: break; default: break; } }
private void Clear() { connectStatus = CONNECT_STATUS.CLOSED; if (socket != null) { socket.Close(); socket = null; } connectOverCallBack = null; getDataCallBack = null; disconnectCallBack = null; }
private void ChangeUI(object _Status = null) // 根据当前状态改变UI { if (_Status != null) { if (_Status is PROJECT_STATUS) { _Project_Status = (PROJECT_STATUS)_Status; } else if (_Status is PLAN_STATUS) { _Plan_Status = (PLAN_STATUS)_Status; } else if (_Status is CONNECT_STATUS) { _Connect_Status = (CONNECT_STATUS)_Status; } } // 工具栏按钮 btnCreateProject.IsEnabled = true; // 新建项目 btnOpenProject.IsEnabled = true; // 打开项目 if (_Project_Status != PROJECT_STATUS.None && _Connect_Status == CONNECT_STATUS.Disconnected) // 配置 { btnConfig.IsEnabled = true; } else { btnConfig.IsEnabled = false; } if (_Project_Status == PROJECT_STATUS.ConfigOnly || _Project_Status == PROJECT_STATUS.Entire) // 连接 { if (_Connect_Status == CONNECT_STATUS.Disconnected) { btnConnect.IsEnabled = true; btnConnect.ToolTip = "连接"; imgBtnConnect.Source = new BitmapImage(new Uri("Images/toolbar_connect.ico", UriKind.Relative)); } else if (_Connect_Status == CONNECT_STATUS.Connected || _Connect_Status == CONNECT_STATUS.Listening) { btnConnect.IsEnabled = true; btnConnect.ToolTip = "断开连接"; imgBtnConnect.Source = new BitmapImage(new Uri("Images/toolbar_disconnect.ico", UriKind.Relative)); } } else { btnConnect.IsEnabled = false; btnConnect.ToolTip = "连接"; imgBtnConnect.Source = new BitmapImage(new Uri("Images/toolbar_connect.ico", UriKind.Relative)); } if (_Project_Status == PROJECT_STATUS.Entire) // 监听 { if (_Connect_Status == CONNECT_STATUS.Disconnected) { btnListen.IsEnabled = false; btnListen.ToolTip = "开始监听"; imgBtnListen.Source = new BitmapImage(new Uri("Images/toolbar_start_listening.ico", UriKind.Relative)); } else if (_Connect_Status == CONNECT_STATUS.Connected) { btnListen.IsEnabled = true; btnListen.ToolTip = "开始监听"; imgBtnListen.Source = new BitmapImage(new Uri("Images/toolbar_start_listening.ico", UriKind.Relative)); } else if (_Connect_Status == CONNECT_STATUS.Listening) { btnListen.IsEnabled = true; btnListen.ToolTip = "结束监听"; imgBtnListen.Source = new BitmapImage(new Uri("Images/toolbar_stop_listening.ico", UriKind.Relative)); } } else { btnListen.IsEnabled = false; btnListen.ToolTip = "开始监听"; imgBtnListen.Source = new BitmapImage(new Uri("Images/toolbar_start_listening.ico", UriKind.Relative)); } if (_Project_Status == PROJECT_STATUS.PlanOnly || _Project_Status == PROJECT_STATUS.Entire) // 图表 { btnChart.IsEnabled = true; } else { btnChart.IsEnabled = false; } if (_Project_Status == PROJECT_STATUS.PlanOnly || _Project_Status == PROJECT_STATUS.Entire) // 报告 { btnReport.IsEnabled = true; } else { btnReport.IsEnabled = false; } if (_Project_Status == PROJECT_STATUS.PlanOnly || _Project_Status == PROJECT_STATUS.Entire) // 清空计划 { btnClear.IsEnabled = true; } else { btnClear.IsEnabled = false; } if (_Project_Status != PROJECT_STATUS.None) // 导入 { btnImport.IsEnabled = true; } else { btnImport.IsEnabled = false; } if (_Project_Status == PROJECT_STATUS.PlanOnly || _Project_Status == PROJECT_STATUS.Entire) // 导出 { btnExport.IsEnabled = true; } else { btnExport.IsEnabled = false; } btnSetting.IsEnabled = true; // 设置 btnClose.IsEnabled = true; // 退出 // 测试计划栏 if (_Project_Status != PROJECT_STATUS.None) // 测试计划下拉框 { cbPlanList.IsEnabled = true; } if (_Project_Status != PROJECT_STATUS.None) // 添加测试计划 { btnPlanAdd.IsEnabled = true; } if ((_Project_Status != PROJECT_STATUS.PlanOnly || _Project_Status != PROJECT_STATUS.Entire) && _Plan_Status != PLAN_STATUS.None) // 删除测试计划 { btnPlanDelete.IsEnabled = true; } if ((_Project_Status != PROJECT_STATUS.PlanOnly || _Project_Status != PROJECT_STATUS.Entire) && _Plan_Status != PLAN_STATUS.None) // 查看测试计划 { btnPlanView.IsEnabled = true; } if (_Project_Status != PROJECT_STATUS.None) // 导入测试计划 { btnPlanImport.IsEnabled = true; } if ((_Project_Status != PROJECT_STATUS.PlanOnly || _Project_Status != PROJECT_STATUS.Entire) && _Plan_Status != PLAN_STATUS.None) // 导出测试计划 { btnPlanExport.IsEnabled = true; } if ((_Project_Status != PROJECT_STATUS.PlanOnly || _Project_Status != PROJECT_STATUS.Entire) && _Plan_Status != PLAN_STATUS.None) // 测试计划生成图表 { btnPlanBuildChart.IsEnabled = true; } // 数据帧栏 if ((_Project_Status != PROJECT_STATUS.PlanOnly || _Project_Status != PROJECT_STATUS.Entire) && _Plan_Status == PLAN_STATUS.Nonempty) // 数据帧 { lstReceiveFrameList.IsEnabled = true; } // 简单数据交互栏 if ((_Project_Status != PROJECT_STATUS.ConfigOnly || _Project_Status != PROJECT_STATUS.Entire) && _Connect_Status == CONNECT_STATUS.Listening && chkSimpleReceived.IsChecked == true) // 简单数据接收 { txtSimpleReceived.IsEnabled = true; } if ((_Project_Status != PROJECT_STATUS.ConfigOnly || _Project_Status != PROJECT_STATUS.Entire) && (_Connect_Status == CONNECT_STATUS.Connected || _Connect_Status == CONNECT_STATUS.Listening)) // 简单数据接收使能 { chkSimpleReceived.IsEnabled = true; } if ((_Project_Status != PROJECT_STATUS.ConfigOnly || _Project_Status != PROJECT_STATUS.Entire) && (_Connect_Status == CONNECT_STATUS.Connected || _Connect_Status == CONNECT_STATUS.Listening)) // 简单数据发送框 { txtSimpleSend.IsEnabled = true; } if ((_Project_Status != PROJECT_STATUS.ConfigOnly || _Project_Status != PROJECT_STATUS.Entire) && (_Connect_Status == CONNECT_STATUS.Connected || _Connect_Status == CONNECT_STATUS.Listening)) // 简单数据发送按钮 { btnSimpleSend.IsEnabled = true; } if ((_Project_Status != PROJECT_STATUS.ConfigOnly || _Project_Status != PROJECT_STATUS.Entire) && (_Connect_Status == CONNECT_STATUS.Connected || _Connect_Status == CONNECT_STATUS.Listening)) // 简单数据发送设置 { btnSimpleSendConfig.IsEnabled = true; } }