0

我是Android新手,我试图了解蓝牙连接的工作原理。为此,我使用了wiced的应用程序来了解工作。使用存储的MAC地址通过服务连接到蓝牙设备

在这里我想连接到一个特定的设备关于他们的MAC地址。我设法通过共享首选项来存储和检索MAC地址。现在我想连接到与MAC地址匹配的设备,无需用户交互。

要存储的MAC地址我做到以下几点:

private void initDevicePicker() {   
     final SharedPreferences mSharedPreference= PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
     if(mSharedPreference.contains("MAC_ID")){ 
     String value=(mSharedPreference.getString("MAC_ID", "")); 
     } 
     else 
      // search for devices 
} 

我想获取MAC地址和我后启动服务:

public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

     if (convertView == null || convertView.findViewById(R.id.device_name) == null) { 
      convertView = mInflater.inflate(R.layout.devicepicker_listitem, null); 
      holder = new ViewHolder(); 
      String DeviceName; 

      holder.device_name = (TextView) convertView.findViewById(R.id.device_name); 
      // DeviceName= String.valueOf((TextView) convertView.findViewById(R.id.device_name)); 
      holder.device_addr = (TextView) convertView.findViewById(R.id.device_addr); 
      holder.device_rssi = (ProgressBar) convertView.findViewById(R.id.device_rssi); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     DeviceRecord rec = mDevices.get(position); 
     holder.device_rssi.setProgress(normaliseRssi(rec.rssi)); 
     editor = PreferenceManager.getDefaultSharedPreferences(mContext); 
     String deviceName = rec.device.getName(); 
     if (deviceName != null && deviceName.length() > 0) { 
      holder.device_name.setText(rec.device.getName()); 
      holder.device_addr.setText(rec.device.getAddress()); 
      //Log.i(TAG, "Service onStartCommand"); 
      if(deviceName.equals("eVulate")&& !editor.contains("MAC_ID")) { 
       storeMacAddr(String.valueOf(rec.device.getAddress())); 
       } 
     } else { 
      holder.device_name.setText(rec.device.getAddress()); 
      holder.device_addr.setText(mContext.getResources().getString(R.string.unknown_device)); 
     } 

     return convertView; 

public void storeMacAddr(String MacAddr) { 

     editor.edit().putString("MAC_ID", MacAddr).commit(); 
    } 
     } 

我retrive通过下面的代码相同不知道究竟该在哪里做。 任何形式的帮助表示赞赏。

+0

我看到了适合我的情况[这里]的答案之一(http://stackoverflow.com/questions/15025852/how-to-move-bluetooth-activity-into-a-service)。如果任何人都可以提供给我更多的细节,特别是MyApplication和Abstract类,那将会非常有用。 – ADI

回答

-1

经过String value=(mSharedPreference.getString("MAC_ID", ""));您可以开始服务。 Here获取数据并将数据发送到蓝牙设备所需的一切。

+0

此问题不受BLE约束。所以请更新您的答案或删除它 –

+0

@ReazMurshed阅读问题它受到蓝牙连接。 –

+0

为什么downvote ...? –

1

所有你有一些蓝牙设备的MAC地址,你想用他们的MAC地址连接到他们。我认为你需要阅读更多关于蓝牙发现和连接的信息,不过无论如何,我会在阅读完有关Android蓝牙之后再添加一些代码,以帮助你。

从您的Activity您需要注册BroadcastReceiver,以便识别蓝牙连接更改并开始发现附近的蓝牙设备。该BroadcastReceiver看起来像这样

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { 

     } else if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
      BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 

      if (device.getAddress().equals(Constants.DEVICE_MAC_ADDRESS)) { 
       startCommunication(device); 
      } 

     } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 


     } else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { 
      // Your bluetooth device is connected to the Android bluetooth 

     } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { 
      // Your device is disconnected. Try connecting again via startDiscovery 
      mBluetoothAdapter.startDiscovery(); 
     } 
    } 
}; 

有一个startCommunication函数内,我会在这个答案后再发布。现在您需要在您的活动中注册BroadcastReceiver

里面你onCreate注册接收这样

// Register bluetooth receiver 
IntentFilter filter = new IntentFilter(); 
filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); 
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); 
filter.addAction(BluetoothDevice.ACTION_FOUND); 
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
registerReceiver(mReceiver, filter); 

不要忘了unregister容纳器内部的你Activity

unregisterReceiver(mReceiver); 

onDestroy功能,现在您的Activity需要声明一个BluetoothAdapter开始蓝牙发现和BluetoothSocket与蓝牙连接。所以你需要在Activity中添加这两个变量并相应地进行初始化。

// Declaration 
public static BluetoothSocket mmSocket; 
public static BluetoothAdapter mBluetoothAdapter; 

...

// Inside `onCreate` initialize the bluetooth adapter and start discovering nearby BT devices 
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
mBluetoothAdapter.enable(); 
mBluetoothAdapter.startDiscovery(); 

现在,在这里你去的startCommunication功能

void startCommunication(BluetoothDevice device) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     ConnectThread mConnectThread = new ConnectThread(device); 
     mConnectThread.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    } else { 
     ConnectThread mConnectThread = new ConnectThread(device); 
     mConnectThread.execute((Void) null); 
    } 
} 

ConnectThreadAsyncTask它连接到所需的设备在不同的线程,并打开BluetoothSocket进行沟通。

public class ConnectThread extends AsyncTask<Void, Void, String> { 

    private BluetoothDevice btDevice; 

    public ConnectThread(BluetoothDevice device) { 
     this.btDevice = device; 
    } 

    @Override 
    protected String doInBackground(Void... params) { 

     try { 
      YourActivity.mmSocket = btDevice.createRfcommSocketToServiceRecord(Constants.MY_UUID); 
      YourActivity.mBluetoothAdapter.cancelDiscovery(); 
      YourActivity.mmSocket.connect(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 

     return ""; 
    } 

    @Override 
    protected void onPostExecute(final String result) { 

     if (result != null){/* Success */} 
     else {/* Connection Failed */} 

    } 

    @Override 
    protected void onCancelled() {} 

} 

这是如何找到附近的蓝牙设备,并使用之前存储的MAC地址连接到它们。

+0

谢谢你的信息。但是,我想在服务中包含蓝牙连接。我这样做是因为一旦应用程序断开连接,服务应该开始运行并搜索具有MAC地址的设备,然后连接到它(如果可用)。如何在服务中实现上述代码? – ADI