2009-10-06 6 views
5

Estoy tratando de usar Symbol.WPAN.Bluetooth que viene con el EMDK para dispositivos Symbol.Symbol.WPAN.Bluetooth ejemplo que transfiere datos

¿Alguien tiene un ejemplo de trabajo que transfiere datos?

El ejemplo de símbolo simplemente empareja los dispositivos. (Aparentemente piensan que transferir datos no es realmente necesario en un ejemplo de red de área personal.)

De todos modos, sé que esto es una posibilidad remota, pero si alguien ha conseguido esto, me gustaría ver algún código.

Esto es lo que he intentado. Tengo un dispositivo presione el botón 1 y otro dispositivo presione el botón2. El valor de lectura es siempre una matriz de bytes de longitud cero.

using System.Text; 
using System.Windows.Forms; 
using Symbol.WPAN; 
using Symbol.WPAN.Bluetooth; 

namespace SmartDeviceProject1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Bluetooth bluetooth = new Bluetooth(); 
      if (bluetooth.IsEnabled != true) 
      { 
       bluetooth.Enable(); 
       bluetooth.RadioMode = BTH_RADIO_MODE.BTH_DISCOVERABLE_AND_CONNECTABLE; 
      } 

      RemoteDevice connectedDevice = null; 
      foreach (RemoteDevice remoteDevice in MakeEnumerable(bluetooth.RemoteDevices)) 
      { 
       if ((remoteDevice.Name == "WM_Dan") && (remoteDevice.IsPaired == false)) 
       { 
        remoteDevice.Pair(); 
        connectedDevice = remoteDevice; 
       } 
      } 

      string test; 
      test = "Testing this out"; 
      ASCIIEncoding encoding = new ASCIIEncoding(); 
      byte[] encTest = encoding.GetBytes(test); 


      if (connectedDevice != null) 
      { 
       connectedDevice.WriteTimeout = 20000; 
       connectedDevice.Write(encTest); 
      } 


     } 

     public static IEnumerable<RemoteDevice> MakeEnumerable(RemoteDevices devices) 
     { 
      for (var i = 0; i < devices.Length; i++) 
      { 
       yield return devices[i]; 
      } 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      Bluetooth bluetooth = new Bluetooth(); 

      if (bluetooth.IsEnabled != true) 
      { 
       bluetooth.Enable(); 
       bluetooth.RadioMode = BTH_RADIO_MODE.BTH_DISCOVERABLE_AND_CONNECTABLE; 
      } 

      RemoteDevice connectedDevice = null; 
      foreach (RemoteDevice remoteDevice in MakeEnumerable(bluetooth.RemoteDevices)) 
      { 
       if ((remoteDevice.Name == "WM_Dan2") && (remoteDevice.IsPaired == false)) 
       { 
        remoteDevice.Pair(); 
        connectedDevice = remoteDevice; 
       } 
      } 

      string test; 
      test = "Testing this out"; 
      ASCIIEncoding encoding = new ASCIIEncoding(); 
      byte[] encTest = encoding.GetBytes(test); 
      byte[] encTest2; 
      string test2; 

      if (connectedDevice != null) 
      { 
       connectedDevice.ReadTimeout = 20000; 
       encTest2 = connectedDevice.Read(encTest.Length); 
       test2 = encoding.GetString(encTest2, 0, encTest2.Length); 
       MessageBox.Show(test2); 
      } 

     } 

    } 
} 
+0

Hi Vaccano. ¿Lo probaste realmente? Ha funcionado? Lo intenté sin éxito. –

+0

Nunca pude hacerlo funcionar. Debido a que es una pila patentada de bluetooth (StoneStreet), usted está solo. StoneStreet no le hablará a menos que los contrate, y las bibliotecas de Symbol solo parecen funcionar con impresoras y auriculares (etc.). Tuvimos que enviar nuestros datos a un servidor central y luego volver a descargarlos en el dispositivo de destino. Muy frustrante, pero Symbol/Motorola se metió en la cama con StoneStreet y no hay nada que puedas hacer si tu dispositivo tiene esa pila. (Si tienes la suerte de tener la pila de Microsoft, hay muchos frameworks que hacen que esto sea fácil. – Vaccano

Respuesta

3

Dejé de usar la conexión incorporada del puerto com y abrí un objeto SerialPort en la conexión.

SerialPort sp = new SerialPort(); 
sp.PortName = "COM" + connectedDevice.LocalComPort.ToString(); 
sp.BaudRate = 9600; 
sp.DataBits = 8; 
sp.Parity = Parity.None; 
sp.StopBits = StopBits.One; 

sp.Open(); 
sp.Open(); 
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); 
sp.ErrorReceived += new SerialErrorReceivedEventHandler(sp_ErrorReceived); 
sp.WriteLine(textBoxSend.Text); 

También encontré que a pesar de que sus documentos se dice que LocalComPort auto asignado, esto no fue siempre la verdad. Lo mejor era usar su BTExplorer para establecerlo primero.

Además, OpenComPort funcionaría en situaciones en las que no debería funcionar, usar Reflector es obviamente obvio. Está comprobando la devolución de ::CreateFile("COM" + port...) contra 0 en lugar de -1 (INVALID_HANDLE_VALUE)

+0

Te bendigo por publicar esto. Me había rendido. Voy a probar este código y espero poder obtener algún tipo de comunicación pasar ... – Vaccano

+0

Acabo de ver esto todavía estaba dando vueltas. Trataré de verificarlo pronto y veré si funciona. – Vaccano

+1

Estoy usando un MC75 y ejecuto el código de ejemplo de Motorola de la misma manera que tú. errores en la primera línea de PairRemoteDevice(), m_Bluetooth.RemoteDevices [selectedDeviceIndex] .LocalComPort = m_Bluetooth.LocalComPorts [0]; el conjunto de localcomports termina vacío. Voy a renunciar a esto pronto. – JPM

0

No sé si esto alguna vez puede ayudar a alguien, pero aquí hay un viejo código que escribí hace unos años.

Tendrá que limpiarlo para que funcione para su aplicación. Mi aplicación tenía un control TextBox que leía y registraba errores en una clase Global. Cambia eso para que funcione con lo que tienes, y básicamente debería ser bueno.

static class Scanner { 

    const string _CODEFILE = "Scanner.cs - Scanner::"; 
    static int _baud = 9600; 
    static int _bits = 8; 
    static string _dataIn = null; 
    static string _port = "COM1"; 
    static Parity _parity = Parity.None; 
    static StopBits _stop = StopBits.One; 
    static SerialPort _com1 = null; 
    static TextBox _textbox = null; 
    public enum ControlType { None, BadgeID, PartNumber, SerialNumber, WorkOrder }; 
    static ControlType _control; 

    public static bool Available { get { return ((_com1 != null) && (_com1.IsOpen)); } } 

    public static bool Close { 
    get { 
     if (_com1 == null) return true; 
     try { 
     if (_com1.IsOpen) { 
      _com1.Close(); 
     } 
     return (!_com1.IsOpen); 
     } catch { } 
     return false; 
    } 
    } 

    public static string Open() { 
    const string na = "Not Available"; 
    if (_com1 == null) { 
     string reset = Reset(); 
     if (!String.IsNullOrEmpty(reset)) return reset; 
    } 
    try { 
     _com1.Open(); 
     return (_com1.IsOpen) ? null : na; 
    } catch (Exception err) { 
     return err.Message; 
    } 
    } 

    static void ProcessData(string incoming) { 
    _dataIn += incoming; 
    if ((_control != ControlType.None) && (_textbox != null)) { 
     bool ok = false; 
     string testData = _dataIn.Trim(); 
     switch (_control) { 
     case ControlType.BadgeID: 
      if (testData.Length == 6) { 
      if (testData != BarCode.LOGOFF) { 
       Regex pattern = new Regex(@"[0-9]{6}"); 
       ok = (pattern.Matches(testData).Count == 1); 
      } else { 
       ok = true; 
      } 
      } 
      break; 
     case ControlType.PartNumber: 
      if (testData.Length == 7) { 
      Regex pattern = new Regex(@"[BCX][P057][0-9]{5}"); 
      ok = (pattern.Matches(testData).Count == 1); 
      } 
      break; 
     case ControlType.SerialNumber: 
      if (testData.Length == 15) { 
      Regex pattern = new Regex(@"[BCX][P057][0-9]{5} [0-9]{4} [0-9]{2}"); 
      ok = (pattern.Matches(testData).Count == 1); 
      } 
      break; 
     case ControlType.WorkOrder: 
      if (testData.Length == 6) { 
      Regex pattern = new Regex(@"[0-9]{6}"); 
      ok = (pattern.Matches(testData).Count == 1); 
      } 
      break; 
     } 
     if (ok) { 
     _textbox.Text = testData; 
     _textbox.ScrollToCaret(); 
     _dataIn = null; 
     } 
    } 
    } 

    static string Reset() { 
    if (_com1 != null) { 
     try { 
     if (_com1.IsOpen) { 
      _com1.DiscardInBuffer(); 
      _com1.Close(); 
     } 
     } catch (Exception err) { 
     return err.Message; 
     } 
     Global.Dispose(_com1); 
     _com1 = null; 
    } 
    try { 
     _com1 = new SerialPort(_port, _baud, _parity, _bits, _stop); 
     _com1.DataReceived += new SerialDataReceivedEventHandler(Serial_DataReceived); 
     _com1.Open(); 
    } catch (Exception err) { 
     return err.Message; 
    } 
    return null; 
    } 

    public static void ScanSource(ref TextBox objTextBox, ControlType objType) { 
    _textbox = objTextBox; 
    _control = objType; 
    _dataIn = null; 
    } 

    static void Serial_DataReceived(object sender, SerialDataReceivedEventArgs e) { 
    ProcessData(_com1.ReadExisting()); 
    } 

    public static void Settings(string ComPort, int BaudRate, Parity ParityValue, int Bits, StopBits StopBit) { 
    _port = ComPort; 
    _baud = BaudRate; 
    _parity = ParityValue; 
    _bits = Bits; 
    _stop = StopBit; 
    } 

    /// <summary> 
    /// Closes the COM Port 
    /// COM Port routines are ready to add as soon as I am 
    /// </summary> 
    static bool ComPortClose { 
    get { 
     if (_com1 == null) ComPortReset(); 
     return ((_com1 == null) ? true : _com1.IsOpen ? false : true); 
    } 
    set { 
     if (_com1 == null) ComPortReset(); 
     else if (_com1.IsOpen) { 
     _com1.DiscardInBuffer(); 
     _com1.Close(); 
     } 
    } 
    } 
    /// <summary> 
    /// Opens the COM Port 
    /// </summary> 
    static bool ComPortOpen { 
    get { 
     if (_com1 == null) ComPortReset(); 
     return (_com1 == null) ? false : _com1.IsOpen; 
    } 
    set { 
     if (_com1 == null) ComPortReset(); 
     if ((_com1 != null) && (!_com1.IsOpen)) _com1.Open(); 
    } 
    } 
    /// <summary> 
    /// Initialized the Serial Port on COM1 
    /// </summary> 
    static void ComPortReset() { 
    if ((_com1 != null) && (_com1.IsOpen)) { 
     _com1.Close(); 
     _com1 = null; 
    } 
    try { 
     _com1 = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); 
    } catch (IOException err) { 
     Global.LogError(_CODEFILE + "ComPortReset", err); 
    } 
    } 

} 
Cuestiones relacionadas