2015-11-12 3 views
8

का उपयोग कर 32feet.net का उपयोग कर बीटीएलई डिवाइस से कनेक्ट करें मेरे पास ब्लूटूथ कम ऊर्जा (बीटीएलई) डिवाइस है, जिसे मुझे अपने पीसी से कनेक्ट करने की आवश्यकता है। ऐसा करने के लिए, मैं डेस्कटॉप WPF ऐप में विंडोज एपीआई संदर्भ का उपयोग करता हूं।अद्वितीय सेवा प्रोटोकॉल

ब्लूटूथ डिवाइस अपेक्षाकृत सरल है: 1 सेवा, 2 विशेषताओं (एक पढ़ने/सूचित करने के लिए, एक को लिखने के लिए)।

To make below code work, add the following references to the WPF (for windows 10): 
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll 
C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Windows.winmd 

Windows API कोड के लिए सी #

public GattDeviceService BLEService; 
public GattCharacteristic BLEData_ReadNotify; 
public GattCharacteristic BLEData_Write; 
private static readonly Guid Guid_service = new Guid("25FB9E91-1616-448D-B5A3-F70A64BDA73A"); 
public static readonly Guid Characteristics_ReadNotify = new Guid("C3FBC9E2-676B-9FB5-3749-2F471DCF07B2"); 
public static readonly Guid Characteristics_Write = new Guid("D6AF9B3C-FE92-1CB2-F74B-7AFB7DE57E6D"); 


// Find all BTLE devices that have the service Guid: Guid_service 
public void findandconnect() { 
    var BTLEdeviceList = await DeviceInformation.FindAllAsync(GattDeviceService.GetDeviceSelectorFromUuid(Guid_service)); 
    // lets assume at least one device is found, store it's id. 
    id = BTLEdeviceList[0].id; 

    // Connect to the SERVICE of the device 
    BLEService = await GattDeviceService.FromIdAsync(id); 

    // Get the first "ReadNotify" characteristics of that service 
    BLEData_ReadNotify = BLEService.GetCharacteristics(Characteristics_ReadNotify).First(); 
    // If that value changes, update an event 
    BLEData_ReadNotify.ValueChanged += BLEData_ValueChanged; 

    // Also get the first "write" characteristics of that service 
    BLEData_Write = BLEService.GetCharacteristics(Characteristics_Write).First(); 
    // and tell that characteristics to NOTIFY me if the BTLE device has an update. 
    await BLEData_ReadNotify.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify); 
    // Successfully connected 

    // Send the command "RUN\r" to the write characteristics, to let it start to execute the program 
    byte[] buffer = Encoding.ASCII.GetBytes("RUN" + "\r"); 
    IBuffer ibuffer = buffer.AsBuffer(); 
    // Sending "RUN" 
    await BLEData_Write.WriteValueAsync(ibuffer); 
} 
// And here should be some event function for the ValueChanged 

खैर, यह काम करता है, थोड़े ... यह नरक के रूप में अस्थिर है, समय यह त्रुटियाँ पैदा करता है कि हल नहीं किया जा सकता है के सबसे:

रेखा: BLEData_ReadNotify.WriteClientCharacteri ... निर्दिष्ट लॉगऑन सत्र के लिए कोई उपयोगकर्ता सत्र कुंजी नहीं है। (HRESULT से अपवाद: 0x80070572)

और सेमफोर टाइमआउट अवधि समाप्त हो गई है। (HRESULT से अपवाद: 0x80070079)। यह दूसरी त्रुटि कम आम है और तब दिखाई देता है जब स्क्रिप्ट को पहले कुछ भी प्राप्त नहीं होता है, फिर टाइमर के माध्यम से यह फिर से रन कमांड भेजने की कोशिश करता है, फिर सभी क्रैश हो जाते हैं और त्रुटि एपियर होते हैं।

स्टैक ओवरफ्लो और कई साइटों पर खोज, मैंने पाया कि उपर्युक्त त्रुटियों को हल करना असंभव है। इसलिए मेरा प्रश्न:

क्या उपरोक्त कोड 32Feet.net का उपयोग करके पुनः लिखा जा सकता है?

2012 में यह संभवतः link संभवतः रक्त का उपयोग करने के लिए संभव नहीं था, लेकिन शायद यह है? इस उत्तर link में स्कैनिंग विधि का उपयोग करके, जब मैं इसे जोड़ा नहीं जाता तो मैं अपना बीएलई डिवाइस ढूंढ सकता हूं।

हां, तो मैं कुछ कोड

// mac is mac address of local bluetooth device 
Guid Guid_service = new Guid("25FB9E91-1616-448D-B5A3-F70A64BDA73A"); 
localEndpoint = new BluetoothEndPoint(myRadio.LocalAddress, Guid_service); 
// client is used to manage connections 
localClient = new BluetoothClient(localEndpoint); 

BluetoothAddress a = new BluetoothAddress(new byte[] { 180, 99, 76, 86, 31, 21 }); 
Guid Guid_service = new Guid("25FB9E91-1616-448D-B5A3-F70A64BDA73A"); 
localClient.Connect(a, Guid_service); 

NetworkStream stream = localClient.GetStream(); 

कोशिश की, लेकिन मैं त्रुटि के साथ लाइन localClient.Connect में फंसे हूँ: प्रकार 'System.Net.Sockets.SocketException' की एक अपवाद हो गई। अतिरिक्त जानकारी: एक कनेक्शन का प्रयास विफल हो गया क्योंकि जुड़े पार्टी ठीक से समय की अवधि के बाद कोई जवाब नहीं दिया, या स्थापित कनेक्शन विफल रहा क्योंकि कनेक्ट किए गए मेजबान

जवाब में नाकाम रही है खिड़कियों एपीआई कोड 32feet.net में फिर से लिखा जा सकता है , ifso, कैसे आगे बढ़ना है?

नोट: मैंने विंडोज मूल नेट कोड का उपयोग कर बीटी 2.1 डिवाइस से कनेक्ट करने का प्रयास किया, लेकिन धारावाहिक बंदरगाह अस्थिर और सिर में दर्द है। 32feet.net के साथ यह अब सीरियलपोर्ट पर शानदार काम करता है, बहुत स्थिर है और यह हर बार कनेक्ट होता है!

+0

इसके लिए आपको कोई समाधान मिला है? मैं भी वही ढूंढ रहा हूं। –

+0

समाधान विंडोज 8+ का उपयोग करना है, और WinRT API का उपयोग करना है। "डेस्कटॉप सी # एप्लिकेशन में winRT को शामिल करने के तरीके" जैसे कुछ खोजें। एक बार जब आप WinRT API को शामिल कर लेते हैं, तो आप इसकी ब्लूटूथ कॉल का उपयोग कर सकते हैं, जो आपको बीटी 2.1 के साथ-साथ बीटी 4 डिवाइस से कनेक्ट करने की अनुमति देता है। मेरे पास कहीं भी कोड बिछा रहा है, लेकिन अभी कोई समय नहीं है। अगर आपको कोड की आवश्यकता है तो टिप्पणी करें और मैं इसे एप पोस्ट करूंगा। – Jeffrey

+0

हाँ आदमी कृपया कोड या लिंक पोस्ट करें जो आपके लिए संभव है। धन्यवाद। –

उत्तर

0

मैं इस

सेमाफोर समय समाप्ति की अवधि से संबंधित समाप्त हो गया है के साथ simular समस्या हुई। (HRESULT से अपवाद: 0x80070079)।

मेरी समस्या को .NET 4.7.1 के साथ हल किया गया था।इसके अलावा मुझे यह सुनिश्चित करने की ज़रूरत थी कि ब्लूटूथ डिवाइस के लिए मेरा नवीनतम माइक्रोसॉफ्ट ब्लूटूथ ड्राइवर था, मैं

सीरियलपोर्ट धाराएं पृष्ठभूमि थ्रेड पर अपवाद होने पर प्रक्रिया को समाप्त नहीं कर पाएंगे। उपयोग में होने पर यूएसबी सीरियल पोर्ट को हटाते समय ऐसा हो सकता है। यह नया व्यवहार Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions AppContext स्विच द्वारा नियंत्रित किया जाता है। .NET 4.7 या उससे नीचे लक्षित करते समय यह स्विच डिफ़ॉल्ट रूप से truetf पर सेट होता है। [428,461, System.dll, बग]

https://github.com/Microsoft/dotnet/blob/0745983093568027ff931672d9db021e3e120b5b/releases/net471/dotnet471-changes.md

अद्यतन: वास्तव में यह एक में 2 मुद्दों प्रतीत होता है। .net बग और फर्मवेयर समस्या जहां डिवाइस ब्लूटूथ मॉड्यूल पर कभी वापस नहीं आ रहा था।

संबंधित मुद्दे