Как?!
Все, что мне нужно, это простое последовательное соединение между моим приложением C# и чем-то еще - приложением Bluetooth-терминала на Android и, в конечном итоге, Arduino.
Однако , ничего из того, что я пробовал, не работает.
Терминальное приложение Android может подключиться к нему, и C# получает данные, но не может ничего отправить.
public partial class Bluetooth : Form
{
BluetoothListener _Listener;
public Bluetooth()
{
InitializeComponent();
_Listener = new BluetoothListener(BluetoothService.SerialPort);
_Listener.Start();
Thread t = new Thread(new ThreadStart(Listen));
t.Start();
}
private void Listen()
{
while(true)
{
if(_Listener.Pending())
{
BluetoothClient c = _Listener.AcceptBluetoothClient();
ListenProcessor p = new ListenProcessor(c);
}
}
}
class ListenProcessor
{
private BluetoothClient _Client;
public ListenProcessor(BluetoothClient c) {
_Client = c;
Thread t = new Thread(new ThreadStart(Do));
t.Start();
}
private void Do()
{
Stream s = _Client.GetStream();
while (true)
{
if (s.CanRead)
{
int a = int.Parse(s.Length.ToString());
byte[] buffer = new byte[a];
s.Read(buffer, 0, a);
string msg = System.Text.ASCIIEncoding.ASCII.GetString(buffer);
//if (InvokeRequired)
//{
// BeginInvoke((MethodInvoker)delegate { textBoxReceived.AppendText(msg); });
//}
//else
//{
// textBoxReceived.AppendText(msg);
//}
_Client.Client.Send(buffer);
}
}
}
}
private void textBoxInput_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Return)
{
string msg = textBoxInput.Text.Trim();
_Client.Client.Send(System.Text.ASCIIEncoding.ASCII.GetBytes(msg));
textBoxInput.Text = string.Empty;
textBoxReceived.AppendText("> " + msg);
_Client.Client.Send(buffer); // System.Net.Sockets.SocketException: 'A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied'
}
}
}
Итак, я попробовал наоборот, чтобы Windows подключился к Android приложению терминального сервера Bluetooth, и снова Windows не может отправлять данные.
public partial class Bluetooth : Form
{
private BluetoothClient _Client;
public Bluetooth()
{
InitializeComponent();
comboBoxDevices.Enabled = false;
buttonConnect.Enabled = false;
textBoxReceived.Enabled = false;
textBoxInput.Enabled = false;
_Client = new BluetoothClient();
BluetoothDeviceInfo di = _Client.PairedDevices.FirstOrDefault(z => z.DeviceName == "RWB");
di.SetServiceState(BluetoothService.SerialPort, true);
_Client.Connect(di.DeviceAddress, BluetoothService.SerialPort);
if (!di.Connected)
{
MessageBox.Show("Connecting failed.", "Connecting failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
Thread t = new Thread(new ThreadStart(HandleConnection));
t.Start();
}
private void textBoxInput_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Return)
{
string msg = textBoxInput.Text.Trim();
_Client.Client.Send(System.Text.ASCIIEncoding.ASCII.GetBytes(msg)); // System.Net.Sockets.SocketException: 'A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied'
textBoxInput.Text = string.Empty;
textBoxReceived.AppendText("> " + msg);
}
}
private void HandleConnection()
{
Stream s = _Client.GetStream();
while (true)
{
if (!_Client.Connected) { break; }
if (s.CanRead)
{
int a = int.Parse(s.Length.ToString());
byte[] buffer = new byte[a];
s.Read(buffer, 0, a);
string msg = System.Text.ASCIIEncoding.ASCII.GetString(buffer);
if(InvokeRequired)
{
BeginInvoke((MethodInvoker)delegate { textBoxReceived.AppendText(msg); });
}
else
{
textBoxReceived.AppendText(msg);
}
}
}
}
}
И что-то действительно странное, кажется, происходит внутри BluetoothClient.Client
. Телефонный код всегда видит Available == 0
, когда я отправляю данные из Android, а другой Доступен - >0
.
[! [Введите описание изображения здесь] [1]] [1]
[1]: https://i.stack.imgur.com/oiB5j.png
So: how to do in C# simple serial communication over Bluetooth?
Is it impossible?