2012-06-06 15 views
13

पर ब्लूटूथ कनेक्शन एंड्रॉइड (क्लाइंट) को पाइथन (सर्वर) में शुरू करना मैं अपने एंड्रॉइड फोन (सैमसंग गैलेक्सी एस 2) से एक "हैलोवर्ल्ड" (सिर्फ एक स्ट्रिंग) को अपने पीसी चलने वाले लिनक्स पर एक पायथन लिपि में भेजने की कोशिश कर रहा हूं। लेकिन मैं इसे काम करने के लिए नहीं मिल सकता है। एंड्रॉइड ऐप (क्लाइंट) और पायथन स्क्रिप्ट (सर्वर) के लिए कोड नीचे दिए गए हैं। ब्लूटूथ पीसी और फोन पर ठीक काम कर रहा है (उदाहरण के लिए मैं बीटी के माध्यम से फोन से तस्वीरें भेज सकता हूं)। जब मैं btSocket.connect() को कॉल करता हूं; इसके नीचे जावा कोड में बस कनेक्ट नहीं होगा। क्या मुझे कनेक्ट करने के लिए पोर्ट निर्दिष्ट करना है, क्योंकि मैंने सर्वर सॉकेट के लिए पोर्ट निर्दिष्ट किया है? किसी भी मदद की बहुत सराहना की जाएगी।पीसी

public class BlueTooth_testActivity extends Activity { 
    TextView header; 
    Button discoverDevicesBtn; 
    Button sendMsgBtn; 
    Button closeBtn; 
    EditText sendTxt; 
    BluetoothAdapter btAdapter; 
    BluetoothSocket btSocket; 
    private static String btAdress = "00:10:60:D1:95:CD"; 
    private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
    private OutputStream out; 
    public BluetoothDevice device; 
    private Boolean CONNECTED = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     //init layout parameters   
     header = (TextView) findViewById(R.id.text1); 
     discoverDevicesBtn = (Button) findViewById(R.id.discBtn); 
     sendMsgBtn = (Button) findViewById(R.id.sendButton); 
     closeBtn = (Button) findViewById(R.id.closeButton); 
     sendTxt = (EditText) findViewById(R.id.editText1); 
     discoverDevicesBtn.setOnClickListener(discoverDeviceListener); 
     sendMsgBtn.setOnClickListener(sendMsgListener); 
     closeBtn.setOnClickListener(closeBtnListener); 
     //init bluetooth 
     btAdapter = BluetoothAdapter.getDefaultAdapter(); 
     if (btAdapter.isEnabled()) { 
      Toast.makeText(this, "Bluetooth state:" + btAdapter.getState() + " Ok!", Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(this, "Bluetooth state:" + btAdapter.getState() + " Not ok!", Toast.LENGTH_LONG).show(); 
     } 

    } 

    private Button.OnClickListener discoverDeviceListener = new Button.OnClickListener() {@Override 
     public void onClick(View v) { 
      if (!CONNECTED) { 
       device = btAdapter.getRemoteDevice(btAdress); 
       header.append("\nRemote device: " + device.getName()); 
       try { 
        btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); 
       } catch (Exception e) { 
            } 
       header.append("\n createRfcommsockettoservice! "); 
       btAdapter.cancelDiscovery(); 
       try { 
        btSocket.connect(); 
        CONNECTED = true; 
        header.append("\n btSocket Created!"); 
       } catch (IOException e) { 
        Toast.makeText(getApplicationContext(), "Could not connect to socket", Toast.LENGTH_LONG); 
        try { 
         btSocket.close(); 
        } catch (Exception b) {} 
       } 
      } 

     } 
    }; 


    private Button.OnClickListener sendMsgListener = new Button.OnClickListener() {@Override 
     public void onClick(View v) { 
      if (CONNECTED) { 
       try { 
        out = btSocket.getOutputStream(); 
        String msg = sendTxt.getText().toString(); 
        byte[] msgBffr = msg.getBytes(); 
        out.write(msgBffr); 
        Toast.makeText(getApplicationContext(), "Message sent", Toast.LENGTH_LONG).show(); 
       } catch (Exception a) { 
        Toast.makeText(getApplicationContext(), "Could not send msg", Toast.LENGTH_LONG).show(); 
       } 
      } else { 
       Toast.makeText(getApplicationContext(), "cant send msg, not connected", Toast.LENGTH_LONG).show(); 
      } 

     } 
    }; 


} 

import bluetooth 

name="bt_server" 
target_name="siggen" 
uuid="00001101-0000-1000-8000-00805F9B34FB" 

def runServer(): 
serverSocket=bluetooth.BluetoothSocket(bluetooth.RFCOMM) 
    port=bluetooth.PORT_ANY 
    serverSocket.bind(("",port)) 
    print "Listening for connections on port: ", port 
    serverSocket.listen(1) 
    port=serverSocket.getsockname()[1] 
    inputSocket, address=serverSocket.accept() 
    print "Got connection with" , address 
    data=inputSocket.recv("1024") 
    print "received [%s] \n " % data  
    inputSocket.close() 
    serverSocket.close() 

runServer() 

(मैं इस समस्या कनेक्शन सेटअप में कहीं है के रूप में जावा कोड के बाकी शामिल करने के लिए परेशान havnt)।

+0

क्या वायरसहार्क कैप्चर यहां सहायक होगा? – James

+2

क्या आपने इसे संकुचित कर दिया है कि समस्या अजगर या जावा में है या नहीं? –

+2

आपको हमेशा अपने क्लाइंट/सर्वर का उपयोग सिद्ध सॉफ्टवेयर के एक टुकड़े के साथ संयोजन करने का प्रयास करके क्लाइंट/सर्वर कार्यान्वयन का परीक्षण करना चाहिए। देखें कि क्या आप ऐप स्टोर में उच्च रेटिंग वाले ब्लूटूथ ऐप प्राप्त कर सकते हैं और अपनी पायथन स्क्रिप्ट से कनेक्ट करने का प्रयास कर सकते हैं।फिर, देखें कि क्या आप एक गुणवत्ता पायथन सर्वर प्राप्त कर सकते हैं जो आपके एंड्रॉइड ऐप से कनेक्ट होगा। * फिर * देखें कि आपकी स्क्रिप्ट आपके एंड्रॉइड ऐप से कनेक्ट हो सकती है या नहीं। –

उत्तर

1

आपको पोर्ट निर्दिष्ट करने की आवश्यकता नहीं है, इसे आपको पहले खुले आरएफसीओएम चैनल से कनेक्ट करना चाहिए। मैंने जो ब्लूटूथ ऐप बनाया है, उसके लिए मुझे मिली एक बात यह है कि मेरे फोन पर काम करने के लिए, मुझे मैन्युअल रूप से उस कंप्यूटर से कनेक्ट करना होगा जो ऐप में कनेक्ट करने का प्रयास करने से पहले सर्वर चल रहा है। यही है, मैं Settings -> Wireless/Networks -> Bluetooth Settings -> <Find/Pair to Computer> से गुजरता हूं और तब तक यह सब करता हूं जब तक अधिसूचना मेरे सिस्टम ट्रे में पॉप अप न हो जाए। फिर, जब मैं अपने ऐप के माध्यम से सॉकेट कनेक्शन बनाने की कोशिश करता हूं तो यह काम करता है। मुझे यह अजीब लगता है क्योंकि मुझे केवल अपने फोन पर इन हुप्स से कूदना है, न कि टैबलेट पर, तो शायद यह डिवाइस पर निर्भर करता है।

इसके अलावा, आप एक अलग Thread में कनेक्शन सामग्री करना चाहते हैं।

+0

पर कब्जा करने के लिए अपना वायरशर्क सेट करने में कामयाब नहीं रहा है, ऐसा लगता है कि पाइथन स्क्रिप्ट में सर्वर सॉकेट सुन या कनेक्ट नहीं होगा अगर यह किसी विशिष्ट पोर्ट से बंधे न हो। मैंने उपकरणों को जोड़ा है और मेरी आकाशगंगा एसआईआई से फ़ाइलों को सफलतापूर्वक मेरे लिनक्स कंप्यूटर (ब्लूमेन का उपयोग करके) स्थानांतरित कर दिया है, लेकिन फिर भी ऐप्स से कनेक्ट नहीं हो सकता –

1

सर्वर टुकड़ा

मैं अपने गहराई से बाहर कर रहा हूँ जब यह अजगर की बात आती है, लेकिन की तरह अपने अजगर टुकड़ा कहीं भी UUID का उपयोग नहीं करता यह लग रहा है। उदाहरण के लिए, pybluez repo में example server है जहां वे advertise_service पर कॉल करते समय यूयूआईडी का उपयोग करते हैं, जो आपके स्निपेट में दिखाई नहीं दे रहा है। आप इसी तरह कुछ करने के लिए थे, तो आपका SNIPPIT लग सकता है जैसे:

import bluetooth 

name="bt_server" 
target_name="siggen" 
uuid="00001101-0000-1000-8000-00805F9B34FB" 

def runServer(): 
serverSocket=bluetooth.BluetoothSocket(bluetooth.RFCOMM) 
    port=bluetooth.PORT_ANY 
    serverSocket.bind(("",port)) 
    print "Listening for connections on port: ", port 
    serverSocket.listen(1) 
    port=serverSocket.getsockname()[1] 

    #the missing piece 
    advertise_service(server_sock, "SampleServer", 
         service_id = uuid, 
         service_classes = [ uuid, bluetooth.SERIAL_PORT_CLASS ], 
         profiles = [ bluetooth.SERIAL_PORT_PROFILE ] 
         ) 

    inputSocket, address=serverSocket.accept() 
    print "Got connection with" , address 
    data=inputSocket.recv("1024") 
    print "received [%s] \n " % data  
    inputSocket.close() 
    serverSocket.close() 

runServer() 

ग्राहक

BluetoothDevice.createRfcommSocketToServiceRecord() "सुरक्षित संचार सॉकेट" बनाने के लिए है। क्या यह आपका सर्वर कर रहा है? यदि नहीं, तो शायद BluetoothDevice.createInsecureRfcommSocketToServiceRecord() उपयुक्त कॉल है?

1
सिफारिशें पहले से ही तैनात बाद

है, तो यहां मैं के रूप में मैं आप इसे करना चाहते थे उम्मीद आपका कोड प्राप्त करने में सक्षम था:

import bluetooth 
    
    name="bt_server" 
    target_name="test" 
    # some random uuid, generated by https://www.famkruithof.net/uuid/uuidgen 
    uuid="0fee0450-e95f-11e5-a837-0800200c9a66" 
    
    def runServer(): 
        # you had indentation problems on this line: 
        serverSocket=bluetooth.BluetoothSocket(bluetooth.RFCOMM) 
        port=bluetooth.PORT_ANY 
        serverSocket.bind(("",port)) 
        print "Listening for connections on port: ", port    

        # wait for a message to be sent to this socket only once 
        serverSocket.listen(1) 
        port=serverSocket.getsockname()[1] 
    
        # you were 90% there, just needed to use the pyBluez command: 
        bluetooth.advertise_service(serverSocket, "SampleServer", 
                           service_id = uuid, 
                           service_classes = [ uuid, bluetooth.SERIAL_PORT_CLASS ], 
                           profiles = [ bluetooth.SERIAL_PORT_PROFILE ] 
                           ) 
    
        inputSocket, address=serverSocket.accept() 
        print "Got connection with" , address 
        data=inputSocket.recv(1024) 
        print "received [%s] \n " % data    
        inputSocket.close() 
        serverSocket.close()  
    
    runServer()  

कमांड लाइन से चलाने, कि कोड इंतजार करेंगे ब्लूटूथ के माध्यम से एक संदेश भेजा जाता है जब तक हमेशा के लिए। तो, उस कोड के साथ, आपको बस इतना करना है कि ब्लूटूथ के माध्यम से अपने एंड्रॉइड डिवाइस को कनेक्ट करें, और उसके बाद डिवाइस आपके द्वारा विकसित किए जा रहे एंड्रॉइड ऐप विधि या इस तरह से कुछ के माध्यम से डेटा (उपरोक्त के समान यूयूआईडी के संदर्भ में) भेजता है गिस्ट (जो मैंने उपयोग किया): https://gist.github.com/tito/7432757

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