Member 12880421 Ответов: 2

Blutooth соединение не начнется я думаю


Я сделал учебник по youtube https://www.youtube.com/watch?v=9LG9Kfythu4[^]
но у меня не было подключения к моему устройству на другой стороне. кто-нибудь может мне помочь? что я делаю не так?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Windows;
using InTheHand;
using InTheHand.Net.Bluetooth;
using InTheHand.Net.Ports;
using InTheHand.Net.Sockets;
using System.IO;
using InTheHand.Net;

namespace HL7000_Prüf
{
    public partial class Form1 : Form
    {
        List<string> items;
        public Form1()
        {
            items = new List<string>();
            InitializeComponent();
        }

        private void bGo_Click(object sender, EventArgs e)
        {
            if (serverStarted)
            {
                updateUI("server has started");
                return;
            }
            if (rbClient.Checked)
            {
                startScan();
            }
            else
            {
                connectAsServer();
            }
        }

        private void startScan()
        {
            listBox1.DataSource = null;
            listBox1.Items.Clear();
            items.Clear();
            Thread bluetoothScanThread = new Thread(new ThreadStart(scan));
            bluetoothScanThread.Start();
        }


        BluetoothDeviceInfo[] devices;
        private void scan()
        {
           
            updateUI("Starting Scan..");
            BluetoothClient client = new BluetoothClient();
            devices = client.DiscoverDevicesInRange();
           // devices = client.DiscoverDevicesInRange();
            updateUI("Scan complete");
            updateUI(devices.Length.ToString() + " devices discovered");

            foreach (BluetoothDeviceInfo d in devices)
            {

                string desc = d.DeviceName + ": " + d.DeviceAddress;


                items.Add(desc);
            }
            updateDeviceList();
        }

        private void connectAsServer()
        {
            Thread bluetoothServerThread = new Thread(new ThreadStart(ServerConnectThread));
            bluetoothServerThread.Start();
        }

        private void connectAsClient()
        {
            throw new NotImplementedException();
        }

        
        Guid mUUID = new Guid("00011111-0000-1000-8000-00805F9B34FB");
       // Guid mUUID = new Guid("00001101-0000-1000-8000-00805f9b34fb");
       // Guid mUUID = new Guid("e0cbf06c-cd8b-4647-bb8a-263b43f0f974");
//        Guid mUUID = System.Guid.NewGuid();
        bool serverStarted = false;
        public void ServerConnectThread()
        {
            serverStarted = true;
            updateUI("Server started, waiting for clients");

            BluetoothListener blueListener = new BluetoothListener(mUUID);
            
            blueListener.Start();
       
            BluetoothClient conn = blueListener.AcceptBluetoothClient();
            MessageBox.Show(blueListener.Authenticate.ToString());
            updateUI("Client has Connected");
          
            Stream mStream = conn.GetStream();
            while (true)
            {
                try
                {
                    //handle sever connection
                    byte[] received = new byte[1024];
                    mStream.Read(received, 0, received.Length);
                    updateUI("received: " + Encoding.ASCII.GetString(received));
                    byte[] sent = Encoding.ASCII.GetBytes("hello World");
                    mStream.Write(sent, 0, sent.Length);
                }
                catch (IOException exeption)
                {
                    updateUI("Client has disconnected");
                }
            }
        }

        private void updateUI(string message)
        {
            Func<int> del = delegate()
            {
                tbOutput.AppendText(message + System.Environment.NewLine);

                return 0;
            };
            Invoke(del);
         
        }
        private void updateDeviceList()
        {
            Func<int> del = delegate()
            {
                listBox1.DataSource = items;
                return 0;
            };
           Invoke(del);
        }


        BluetoothDeviceInfo deviceInfo;
        private void listBox1_DoubleClick(object sender, EventArgs e)
        {
            deviceInfo = devices.ElementAt(listBox1.SelectedIndex);
            updateUI(deviceInfo.DeviceName + " was selected");

            if (pairDevice())
            {
                updateUI("device paired..");
                updateUI("starting connect thread");
                Thread bluetoothClientThread = new Thread(new ThreadStart(ClientConnectThread));
                bluetoothClientThread.Start();
            }
            else
            {
                updateUI("Pair failed");
            }
        }

        private void ClientConnectThread()
        {
            BluetoothClient client = new BluetoothClient();
            updateUI("attempting connect");
            client.BeginConnect(deviceInfo.DeviceAddress, mUUID, this.BluetoothClientConnectCallback, client);
            if (client.Connected)
            {
                updateUI("Verbindung geht");
            }
            else
            {
                updateUI("nicht");
            }
        }

        void BluetoothClientConnectCallback(IAsyncResult result)
        {

            BluetoothClient client = (BluetoothClient)result.AsyncState;
            client.EndConnect(result);

            Stream stream = client.GetStream();
            stream.ReadTimeout = 1000;

            while (true)
            {
                while (!ready) ;

                stream.Write(message, 0, message.Length);
            }
        }

        string myPin = "1234";
        private bool pairDevice()
        {
            if (!deviceInfo.Authenticated)
            {
                if (!BluetoothSecurity.PairRequest(deviceInfo.DeviceAddress, myPin))
                {
                    return false;
                }
            }
            return true;
        }
        bool ready = false;
        byte[] message;
        private void tbText_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                message = Encoding.ASCII.GetBytes(tbText.Text);
                ready = true;
                tbText.Clear();
            }
        }

    }
}


Я писал на C#. Guid, который я установил в комментарии, я пробовал, но я думаю, что что-то не так, потому что messagebox после
BluetoothClient conn = blueListener.AcceptBluetoothClient();
не будет показано.

спасибо за вашу помощь

Что я уже пробовал:

другой Guid, соединение с сервером будет неудачным.

2 Ответов

Рейтинг:
2

Member 12880421

это все мой код. как мне получить uuid? и как мне запустить экземпляр клиента, когда сервер еще не готов?


Рейтинг:
1

Jochen Arndt

С 32-футового.Объем документации:

Цитата:
Приложения/службы Bluetooth идентифицируются и регистрируются с помощью UUID (Universally Unique Id)-128-битного значения, представленного системой.Класс Guid в .NET. Если вы создаете новую службу, то новый UUID должен быть создан во время разработки и введен в исходный код двух приложений, новое значение может быть создано либо вызовом Guid.NewValue, либо с помощью guidgen.exe программа Windows SDK - в Visual Studio доступ к ней осуществляется с помощью пункта меню Tools, “Create GUID".


Наконец может быть глупый вопрос:
Вы также запустили экземпляр клиента на другом устройстве, используя тот же UUID?
Если нет, то сервер, конечно, будет неопределенно ждать соединения.

[Правка ответа на вопрос, опубликованный в качестве решения]
Цитата:
это все мой код. как мне получить uuid? и как мне запустить экземпляр клиента, когда сервер еще не готов?

Чтобы сгенерировать UUID, следуйте советам из цитаты (выполните guidgen.exe инструмент и скопируйте и вставьте UUID или используйте идентификатор GUID.Метод NewGuid (Система)[^])

Сервер готов при запуске приложения в качестве сервера. Он просто ждет соединения. AcceptBluetoothClient это блокирующий вызов. Это означает, что вызов не будет возвращен до тех пор, пока не будет установлено соединение или не произойдет ошибка. Поэтому он вызывается изнутри своего собственного потока.

Затем запустите программное обеспечение как клиент в другой системе (rbClient.Checked должен быть trueЗатем он должен подключиться (или, по крайней мере, попытаться) подключиться к серверу. Я не пытался понять, что делает весь этот код. А у тебя, похоже, нет ни того, ни другого.

Bluetooth-это последовательный радиопротокол. Насколько я знаю, он не поддерживает работу клиента и сервера в одной системе (как и большинство последовательных протоколов / интерфейсов, таких как IrDA, USB, RS-232, без использования какого-либо оборудования обратной связи). Таким образом, вы должны запустить два (или более) экземпляра вашего приложения на двух разных системах (или с помощью двух устройств Bluetooth, подключенных к одной системе): один сервер и один или несколько клиентов.
[/РЕДАКТИРОВАТЬ]