2009-10-06 10 views
5

Ich versuche, Symbol.WPAN.Bluetooth zu verwenden, das mit dem EMDK für Symbol-Geräte geliefert wird.Symbol.WPAN.Bluetooth Beispiel, das Daten überträgt

Hat jemand zufällig ein funktionierendes Beispiel, das Daten überträgt?

Das Beispiel des Symbols verbindet nur die Geräte. (Sie denken anscheinend, dass die Übertragung von Daten in einem Personal Area Network-Beispiel nicht wirklich benötigt wird.)

Wie auch immer, ich weiß, dass dies eine Totale ist, aber wenn jemand dies zur Arbeit gebracht hat, würde ich gerne Code sehen.

Das habe ich ausprobiert. Ich habe ein Gerät drücken Sie Taste1 und ein anderes Gerät drücken Sie Taste2. Der gelesene Wert ist immer ein Byte-Array mit einer Länge von Null.

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

Hallo Vaccano. Hast du es tatsächlich versucht? Hat es funktioniert? Ich habe es mit Erfolg versucht. –

+0

Ich konnte es nie zum Laufen bringen. Da es sich um einen proprietären Bluetooth-Stack (StoneStreet) handelt, sind Sie auf sich gestellt. StoneStreet wird nicht mit Ihnen sprechen, wenn Sie sie nicht einstellen, und die Bibliotheken von Symbol scheinen nur für Drucker und Headsets (usw.) gedacht zu sein. Wir mussten unsere Daten an einen zentralen Server senden und dann erneut auf das Zielgerät herunterladen. Sehr frustrierend, aber Symbol/Motorola ist mit StoneStreet ins Bett gegangen und es gibt nichts, was Sie tun könnten, wenn Ihr Gerät diesen Stack hat. (Wenn Sie das Glück haben, den Microsoft-Stack zu haben, gibt es viele Frameworks, die das einfach machen. – Vaccano

Antwort

3

Ich gab die Verwendung der integrierten COM-Port-Verbindung auf und öffnete ein SerialPort-Objekt auf der Verbindung.

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); 

Ich fand auch, dass, obwohl ihre docs sagte, dass LocalComPort wurde automatisch zugewiesen, das ist die Wahrheit nicht immer war. Es war am besten, ihren BTExplorer zu verwenden, um es zuerst zu setzen.

Auch dort würde OpenComPort in Situationen funktionieren, in denen das nicht sein sollte - mit Reflector ist es offensichtlich falsch. Es gibt die Überprüfung von ::CreateFile("COM" + port...) gegen 0 statt -1 (INVALID_HANDLE_VALUE)

+0

Ich segne Sie für das Posten. Ich hatte aufgegeben. Ich werde diesen Code ausprobieren und hoffentlich kann ich eine Art von Kommunikation bekommen passieren ... – Vaccano

+0

Ich sah nur, dass dies immer noch rumhing. Ich werde versuchen, es bald zu überprüfen und sehen, ob es funktioniert. – Vaccano

+1

Ich benutze ein MC75 und führen Sie den Beispiel-Code von Motorola die gleiche wie du. Für mich Fehler in der ersten Zeile von PairRemoteDevice(), m_Bluetooth.RemoteDevices [selectedDeviceIndex] .LocalComPort = m_Bluetooth.LocalComPorts [0], das Array "localcomports" ist leer. Dies wird bald aufgegeben. – JPM

0

Ich weiß nicht, ob das jemals jemandem helfen kann, aber hier ist ein altes Stück Code, den ich vor ein paar Jahren schrieb.

Sie müssen es aufräumen, damit es für Ihre Anwendung funktioniert. Meine App hatte ein TextBox-Steuerelement, von dem sie gelesen und Fehler in einer globalen Klasse protokolliert hat. Ändern Sie das, um mit dem zu arbeiten, was Sie haben, und es sollte grundsätzlich gut sein.

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); 
    } 
    } 

}