返回列表 發帖

[Bluetooth] Bluetooth serial port 發送資料

本帖最後由 frank 於 2011-5-18 19:02 編輯

本例子作為客戶端(Client)利用主機(Server)的藍牙設備名稱作條件,發送資料到主機.

AndroidManifest.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.       package="com.openplatform.bluetooth_test"
  4.       android:versionCode="1"
  5.       android:versionName="1.0">
  6.     //新增這句令這程式有權限進行藍牙裝置的設定和搜尋裝置
  7.     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />    //新增這句令這程式有權限進行藍牙連接和通信
  8.     <uses-permission android:name="android.permission.BLUETOOTH" />

  9.     <application android:debuggable="true" android:icon="@drawable/icon" android:label="@string/app_name">
  10.         <activity android:name=".Bluetooth_Test"
  11.                   android:label="@string/app_name">
  12.             <intent-filter>
  13.                 <action android:name="android.intent.action.MAIN" />
  14.                 <category android:name="android.intent.category.LAUNCHER" />
  15.             </intent-filter>
  16.         </activity>

  17.     </application>
  18. </manifest>
複製代碼






Bluetooth_Test.java
  1. import android.app.Activity;
  2. import android.bluetooth.BluetoothAdapter;
  3. import android.bluetooth.BluetoothDevice;
  4. import android.bluetooth.BluetoothSocket;
  5. import android.widget.Toast;
  6. import android.content.*;
  7. import android.util.Log;

  8. public class Bluetooth_Test extends Activity {
  9.         
  10.     private static final String TAG = "Bluetooth_Test";
  11.     private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
  12.     private static String bt_hostname = "openplatform";
  13.         private BluetoothAdapter mBluetoothAdapter = null;
  14.         private BluetoothDevice mBluetoothDevice = null;
  15.         private final int REQUEST_ENABLE_BT = 1;
  16.         private static final boolean D = true;                                //for debug use        
  17.         private static boolean start_discovery = false;

  18.         //Bluetooth thread variable
  19.         private ConnectThread mConnectThread;
  20.         private ConnectedThread mConnectedThread;


  21.     /** Called when the activity is first created. */
  22.     @Override
  23.     public void onCreate(Bundle savedInstanceState) {
  24.         super.onCreate(savedInstanceState);
  25.         setContentView(R.layout.main);      

  26.         mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
  27.         if (mBluetoothAdapter == null) {
  28.                 // Device does not support Bluetooth
  29.                 Toast.makeText(this,
  30.                                 "此裝置沒有藍牙設備",
  31.                                 Toast.LENGTH_LONG).show();
  32.                 finish();
  33.                 return;
  34.         }     


  35.         if (!mBluetoothAdapter.isEnabled()) {
  36.                 //Enable the bluetooth if this is disabled
  37.                 Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  38.                 startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT);                                                
  39.         }  
  40.         else {
  41.                 //Bluetooth was find start search bluetooth device
  42.                 listItems.add("程式已啟動");
  43.                 connectLED();                                   
  44.         }

  45.     @Override
  46.     public void onDestroy() {
  47.             super.onDestroy();
  48.             
  49.         if (D) Log.e(TAG, "+++ ON Destory +++");
  50.         
  51.         //stop discovery bluetooth device
  52.         if(start_discovery) {               
  53.                 mBluetoothAdapter.cancelDiscovery();
  54.                 unregisterReceiver(myReceiver);               
  55.         }
  56.         
  57.         //cancel the mConnectThread        
  58.         if (mConnectThread != null)
  59.                 mConnectThread.cancel();
  60.         
  61.         //cancel the mConnectedThread
  62.         if (mConnectedThread != null)
  63.                 mConnectedThread.cancel();
  64.         
  65.     }

  66.     @Override
  67.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  68.             // TODO Auto-generated method stub   
  69.             super.onActivityResult(requestCode, resultCode, data);
  70.             
  71.             if(requestCode == REQUEST_ENABLE_BT){                     
  72.                     if(resultCode==RESULT_OK){
  73.                             //user enable the bluetooth, start search device
  74.                             listItems.add("程式已啟動");               
  75.                                connectDevice();
  76.                     }
  77.              }
  78.     }   

  79.     private void connectDevice() {
  80.             if(D) Log.e(TAG, "+++ connectDevice() +++");
  81.             

  82.                 //Query paired devices
  83.                 Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
  84.                 // If there are paired devices
  85.                 if (pairedDevices.size() > 0) {
  86.                         
  87.                     // Loop through paired devices
  88.                     for (BluetoothDevice device : pairedDevices) {
  89.                            
  90.                             //connect the device if the device match the bt_hostname
  91.                             if(device.getName().equals(bt_hostname)) {                           

  92.                                     mBluetoothDevice = device;

  93.                                     if (D) Log.e(TAG, "+++ connectDevice() - found pairedDevices("+ device.getName() +") +++");
  94.                                     
  95.                             }
  96.                                 
  97.                     }                                         
  98.                     
  99.                 }               
  100.                 else {
  101.                                                         
  102.                         //Register the BroadcastReceiver         
  103.                         IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
  104.                         registerReceiver(myReceiver,filter);                                

  105.                 //set the flag to unregister the myReceiver when on destroy
  106.                 start_discovery = true;
  107.                         
  108.                         //start to discovery led device                        
  109.                         doDiscovery();        
  110.                 }
  111.                
  112.                 //Create the connection thread               
  113.                 if (D) Log.e(TAG, "+++ connectDevice() - mBluetoothDevice("+ mBluetoothDevice.getName() +") +++");
  114.                 mConnectThread = new ConnectThread(mBluetoothDevice);
  115.                 mConnectThread.start();
  116.                
  117.                
  118.     }
  119.        /** Will cancel an in-progress connection, and close the socket */
  120.         public void cancel() {
  121.                
  122.                 if (D) Log.e(TAG, "+++ ConnectThread - cancel() ("+ mmDevice.getName() +") +++");
  123.                
  124.             try {
  125.                 mmSocket.close();
  126.             } catch (IOException e) { }
  127.         }
  128.         
  129.     }
  130.    
  131.     private class ConnectedThread extends Thread {
  132.         private final BluetoothSocket mmSocket;
  133.         private final InputStream mmInStream;
  134.         private final OutputStream mmOutStream;

  135.         public ConnectedThread(BluetoothSocket socket) {
  136.                
  137.                 if (D) Log.e(TAG, "+++ ConnectedThread() +++");
  138.                
  139.             mmSocket = socket;
  140.             InputStream tmpIn = null;
  141.             OutputStream tmpOut = null;

  142.             // Get the input and output streams, using temp objects because
  143.             // member streams are final
  144.             try {
  145.                 tmpIn = socket.getInputStream();
  146.                 tmpOut = socket.getOutputStream();
  147.             } catch (IOException e) { }

  148.             mmInStream = tmpIn;
  149.             mmOutStream = tmpOut;
  150.         }

  151.         public void run() {//如果需要接收資料的話,把下面的comment 轉為 statement
  152.                 /*
  153.             byte[] buffer = new byte[1024];  // buffer store for the stream
  154.             int bytes; // bytes returned from read()

  155.             // Keep listening to the InputStream until an exception occurs
  156.             while (true) {
  157.                 try {
  158.                     // Read from the InputStream
  159.                     bytes = mmInStream.read(buffer);
  160.                     // Send the obtained bytes to the UI Activity
  161.                     mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
  162.                             .sendToTarget();
  163.                 } catch (IOException e) {
  164.                     break;
  165.                 }
  166.             }
  167.             */
  168.                 write();
  169.         }

  170.         /* Call this from the main Activity to send data to the remote device */
  171.         //public void write(byte[] bytes) {
  172.         public void write() {
  173.                 String str = "1234\r\n";
  174.                 byte[] bytes = str.getBytes();
  175.                
  176.                 if (D) Log.e(TAG, "+++ ConnectedThread - Write() +++");
  177.                
  178.             try {
  179.                 mmOutStream.write(bytes);
  180.                
  181.             } catch (IOException e) { }
  182.         }

  183.         /* Call this from the main Activity to shutdown the connection */
  184.         public void cancel() {
  185.             try {
  186.                 mmSocket.close();
  187.             } catch (IOException e) { }
  188.         }
  189.     }   
  190.    
  191.    
  192. }
複製代碼

以後可以用 Android 藍牙做很多Input /Output 的控制了,太好
Bill Tang     MSN:billtang@openplatform.com.hk
Openplatform Technology Co.,Ltd. 資訊坊科技有限公司  
無線工程施工、方案設計、無線產品、天饋材料、終端設備綜合供應商
Tel: 852-27491011  Fax: 852-81483532

TOP

Good!
不管高低價筒,可靠的就是好筒

TOP

返回列表