public void OneConnection_PendingBeforeSyncAccept()
        {
            TestWcLsnrBluetoothFactory f      = new TestWcLsnrBluetoothFactory();
            TestLsnrRfCommIf           commIf = new TestLsnrRfCommIf();

            f.queueIRfCommIf.Enqueue(commIf);
            TestLsnrRfcommPort port0 = new TestLsnrRfcommPort();

            f.queueIRfCommPort.Enqueue(port0);
            BluetoothFactory.SetFactory(f);
            //
            port0.SetOpenServerResult(PORT_RETURN_CODE.SUCCESS);
            BluetoothListener lsnr = new BluetoothListener(BluetoothService.VideoSource);

            try {
                Assert.IsFalse(lsnr.Pending(), "!Pending before Start");
                lsnr.Start();
                port0.AssertOpenServerCalledAndClear(29);            //adter Start?
                TestLsnrRfcommPort port1 = new TestLsnrRfcommPort();
                port1.SetOpenServerResult(PORT_RETURN_CODE.SUCCESS); // now begun immediately
                f.queueIRfCommPort.Enqueue(port1);
                Assert.IsFalse(lsnr.Pending(), "!Pending before");
                port0.NewEvent(PORT_EV.CONNECTED);
                Thread.Sleep(100);
                Assert.IsTrue(lsnr.Pending(), "Pending");
                BluetoothClient cli    = lsnr.AcceptBluetoothClient();
                TestSdpService2 sdpSvc = f.GetTestSdpService();
                Assert.AreEqual(0, sdpSvc.NumDisposeCalls, "NumDisposeCalls");
                lsnr.Stop();
                Assert.AreEqual(1, sdpSvc.NumDisposeCalls, "NumDisposeCalls");
                //
                Assert.IsTrue(cli.Connected, "cli.Connected");
                //TODOAssert.AreEqual(0, f.queueIRfCommPort.Count, "Used both ports");
                //TODO port1.AssertCloseCalledOnce("second acceptor closed");
                cli.Close();
                port0.AssertCloseCalledOnce("first accepted connection now closed");
                //
                BluetoothEndPoint lep = lsnr.LocalEndPoint;
                sdpSvc.AssertCalls(
                    "AddServiceClassIdList: 00001303-0000-1000-8000-00805f9b34fb" + NewLine
                    + "AddRFCommProtocolDescriptor: " + lep.Port + NewLine
                    );
                //
                //
            } finally {
                lsnr.Stop(); // See errors that might otherwise occur on the Finalizer.
            }
        }
Example #2
0
        private void ListenerLoop()
        {
            if (_stringBuilder == null)
            {
                return;
            }

            BluetoothListener listener = new BluetoothListener(new Guid(c_socket_Guid))
            {
                Authenticate   = false
                , ServiceClass = ServiceClass.Network | ServiceClass.Information
            };

            try {
                listener.Start();
                while (!_needCancel)
                {
                    if (listener.Pending())
                    {
                        _clientSocket = listener.AcceptSocket();
                        if (_clientSocket == null)
                        {
                            throw new ArgumentNullException(nameof(_clientSocket));
                        }

                        UpdateMessages($"Получено клиентское соединение для {_clientSocket.RemoteEndPoint}");

                        byte[] buffer = new byte[4096];
                        while (_clientSocket.Connected)
                        {
                            try {
                                int bytes = _clientSocket.Receive(buffer);
                                if (bytes == 0)
                                {
                                    continue;
                                }

                                string message = Encoding.UTF8.GetString(buffer, 0, bytes);

                                _stringBuilder.Append(message);
                                string fullMessage = _stringBuilder.ToString();
                                int    endIndex    = fullMessage.IndexOf("\r\n", StringComparison.Ordinal);
                                if (endIndex < 0)
                                {
                                    continue;
                                }

                                _stringBuilder.Clear();
                                UpdateMessages(@"Принята команда: " + fullMessage);

                                dxCommand command = dxCommand.Deserialize(fullMessage);
                                if (command == null)
                                {
                                    continue;
                                }

                                // ReSharper disable once SwitchStatementMissingSomeCases
                                switch (command.Name)
                                {
                                case CommandNames.Get_Attributes:
                                {
                                    dxCommand result = new dxCommand(_mainForm.Data.Attributes)
                                    {
                                        Name = CommandNames.Get_Attributes
                                    };

                                    string reply  = result.Serialize() + "\r\n";
                                    byte[] toSend = Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(reply));
                                    _clientSocket.Send(toSend, toSend.Length, SocketFlags.None);
                                    UpdateMessages("Отправлен ответ: " + reply);
                                    break;
                                }

                                case CommandNames.Get_Parameters:
                                {
                                    dxCommand result = new dxCommand(_mainForm.Data.Parameters)
                                    {
                                        Name = CommandNames.Get_Parameters
                                    };

                                    string reply  = result.Serialize() + "\r\n";
                                    byte[] toSend = Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(reply));
                                    _clientSocket.Send(toSend, toSend.Length, SocketFlags.None);
                                    UpdateMessages("Отправлен ответ: " + reply);
                                    break;
                                }

                                case CommandNames.Set_Parameters:
                                {
                                    foreach (dxParameter parameter in command.Parameters.ParameterItem)
                                    {
                                        foreach (dxParameter deviceParameter in _mainForm.Data.Parameters.ParameterItem.Where(deviceParameter => deviceParameter.Id.Equals(parameter.Id)))
                                        {
                                            switch (deviceParameter.Type)
                                            {
                                            case ParameterType.Bool:
                                            {
                                                deviceParameter.BoolValue = parameter.BoolValue;
                                                break;
                                            }

                                            case ParameterType.Int:
                                            {
                                                deviceParameter.IntValue = parameter.IntValue;
                                                break;
                                            }

                                            default:
                                            {
                                                continue;
                                            }
                                            }

                                            UpdateParameterValue(_mainForm.Data.Parameters.ParameterItem.IndexOf(deviceParameter), deviceParameter);
                                            UpdateMessages(@"Установить значение параметра " + deviceParameter.Name);
                                        }
                                    }
                                    break;
                                }
                                }
                            }
                            catch (IOException ex) {
                                UpdateMessages(@"Соединение разорвано: " + ex);
                                break;
                            }
                        }
                    }
                    else
                    {
                        Thread.Sleep(500);
                    }
                }
            }
            catch (Exception ex) {
                UpdateMessages(ex.ToString());
            }
            finally {
                CloseCommunication();
                listener.Stop();
            }
        }