android通过 蓝牙obd接口数据,Android bluetooth connection with an obd2

Till now my app can discover make discoverable and all these.When i press the device's name for example of my near cellphone(which i have opened the bluetooth) it appears in my listview fact that i want.After when i press it ,i have the classic error << "W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback

W/System.err: java.io.IOException: read failed, socket might closed or timeout, read ret: -1 ">>.It doesnt work the bluetoothSocket.connect in my code.

In other case when i go into my car with my tablet(which includes my app from android studio) i can search the obd2 and when i press it ,it makes the bond requirement.I am keying in the 1234 password and make the bond in tablets bluetooth features where i can see it.I need someone who have did something like this to help me to the next steps.for example how to send a command for rpm or speed and take response.Please help me!

Here is my code:

public class BluetoothActivity extends AppCompatActivity {

private static final String TAG ="msg" ;

private BluetoothAdapter bluetoothAdapter;

private ToggleButton toggleButton;

private ListView listview;

private ArrayAdapter adapter;

private static final int MESSAGE_READ =1;

private static final int ENABLE_BT_REQUEST_CODE = 1;

private static final int DISCOVERABLE_BT_REQUEST_CODE = 2;

private static final int DISCOVERABLE_DURATION = 300;

private final static UUID uuid = UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66");

// Create a BroadcastReceiver for ACTION_FOUND

private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

// Whenever a remote Bluetooth device is found

if (BluetoothDevice.ACTION_FOUND.equals(action)) {

// Get the BluetoothDevice object from the Intent

BluetoothDevice bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

// Add the name and address to an array adapter to show in a ListView

adapter.add(bluetoothDevice.getName() + "\n"

+ bluetoothDevice.getAddress());

adapter.notifyDataSetChanged();

}

//uuid=BluetoothDevice.getUuids()[0].getUuid();

}

};

// IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

// registerReceiver(broadcastReceiver, filter) // Don't forget to unregister during onDestroy

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_bluetooth);

toggleButton = (ToggleButton) findViewById(R.id.toggleButton);

listview = (ListView) findViewById(R.id.listView);

//Listview Item Click Listener

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position, long id) {

String itemValue = (String) listview.getItemAtPosition(position);

String MAC = itemValue.substring(itemValue.length() - 17);

BluetoothDevice bluetoothDevice = bluetoothAdapter.getRemoteDevice(MAC);

// Initiate a connection request in a separate thread

ConnectingThread t = new ConnectingThread(bluetoothDevice);

t.start();

}

});

adapter = new ArrayAdapter

(this, android.R.layout.simple_list_item_1);

listview.setAdapter(adapter);

bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

}

//Οταν πατάμε το button για να ανοίξει το bluetooth!

public void onToggleClicked(View view) {

adapter.clear();

ToggleButton toggleButton = (ToggleButton) view;

if (bluetoothAdapter == null) {

// Device does not support Bluetooth

Toast.makeText(getApplicationContext(), "Η συσκευή δεν υποστηρίζει bluetooth.",

Toast.LENGTH_SHORT).show();

toggleButton.setChecked(false);

} else {

if (toggleButton.isChecked()){ // to turn on bluetooth

if (!bluetoothAdapter.isEnabled()) {

// A dialog will appear requesting user permission to enable Bluetooth

Intent enableBluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(enableBluetoothIntent, ENABLE_BT_REQUEST_CODE);

} else {

Toast.makeText(getApplicationContext(), "Η Συσκευή είναι έτοιμη για χρήση." +

"\n" + "Ανίχνευση για Απομακρυσμένες Συσκευές...",

Toast.LENGTH_SHORT).show();

// To discover remote Bluetooth devices

discoverDevices();

// Make local device discoverable by other devices

makeDiscoverable();

}

} else { // Turn off bluetooth

bluetoothAdapter.disable();

adapter.clear();

Toast.makeText(getApplicationContext(), "Η συσκευή έχει Απενεργοποιηθεί.",

Toast.LENGTH_SHORT).show();

}

}

}

public void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == ENABLE_BT_REQUEST_CODE) {

// Bluetooth successfully enabled!

if (resultCode == Activity.RESULT_OK) {

Toast.makeText(getApplicationContext(), "Το Bluetooth έχει Ενεργοποιηθεί." +

"\n" + "Ανίχνευση για Απομακρυσμένες Συσκευές...",

Toast.LENGTH_SHORT).show();

// To discover remote Bluetooth devices

discoverDevices();

// Make local device discoverable by other devices

makeDiscoverable();

// Start a thread to create a server socket to listen

// for connection request

ListeningThread t = new ListeningThread();

t.start();

} else { // RESULT_CANCELED as user refused or failed to enable Bluetooth

Toast.makeText(getApplicationContext(), "Το Bluetooth δεν έχει Ενεργοποιηθεί.",

Toast.LENGTH_SHORT).show();

// Turn off togglebutton

toggleButton.setChecked(false);

}

} else if (requestCode == DISCOVERABLE_BT_REQUEST_CODE){

if (resultCode == DISCOVERABLE_DURATION){

Toast.makeText(getApplicationContext(), "Η συσκευή είναι τώρα Ανιχνεύσιμη απο άλλες συσκευές.. " +

DISCOVERABLE_DURATION + " Δευτερόλεπτα",

Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(getApplicationContext(), "Αποτυχία να Ενεργοποιηθεί η Ανιχνευσημότητα της Συσκευής.",

Toast.LENGTH_SHORT).show();

}

}

}

protected void discoverDevices(){

// To scan for remote Bluetooth devices

if (bluetoothAdapter.startDiscovery()) {

Toast.makeText(getApplicationContext(), "Ανίχνευση για άλλες Συσκευές Bluetooth...",

Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(getApplicationContext(), "Η Ανίχνευση Απέτυχε να αρχίσει.",

Toast.LENGTH_SHORT).show();

}

}

//Συνάρτηση για makeDiscoverable

protected void makeDiscoverable(){

// Make local device discoverable

Intent discoverableIntent = new

Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DISCOVERABLE_DURATION);

startActivityForResult(discoverableIntent, DISCOVERABLE_BT_REQUEST_CODE);

}

@Override

protected void onResume() {

super.onResume();

// Register the BroadcastReceiver for ACTION_FOUND

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

this.registerReceiver(broadcastReceiver, filter);

}

//on pause an xreiastei na bei kwdikas{}

@Override

protected void onPause() {

super.onPause();

this.unregisterReceiver(broadcastReceiver);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.bluetooth, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will

// automatically handle clicks on the Home/Up button, so long

int id = item.getItemId();

if (id == R.id.action_settings) {

return true;

}

return super.onOptionsItemSelected(item);

}

//Thread gia ton server..

private class ListeningThread extends Thread {

private final BluetoothServerSocket bluetoothServerSocket;

//Constructor

public ListeningThread() {

BluetoothServerSocket temp = null;

try {

temp = bluetoothAdapter.listenUsingRfcommWithServiceRecord(getString(R.string.app_name), uuid);

} catch (IOException e) {

e.printStackTrace();

}

bluetoothServerSocket = temp;

}

public void run() {

BluetoothSocket bluetoothSocket = null;

// This will block while listening until a BluetoothSocket is returned

// or an exception occurs

Log.d(TAG, "O kwdikas edw trexei");

while (true) {

try {

bluetoothSocket = bluetoothServerSocket.accept();

} catch (IOException e) {

break;

}

// If a connection is accepted

if (bluetoothSocket != null) {

//!!!!!!!!!!!!!!!!

runOnUiThread(new Runnable() {

public void run() {

Toast.makeText(getApplicationContext(), "Επιτυχής Σύνδεση με την συσκευή.",

Toast.LENGTH_SHORT).show();

}

});

ConnectedThread a = new ConnectedThread(bluetoothSocket);

a.start();

try {

bluetoothServerSocket.close();

} catch (IOException e) {

e.printStackTrace();

}

break;

}

}

}

public void cancel() {

try {

bluetoothServerSocket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

private class ConnectingThread extends Thread{

private final BluetoothSocket bluetoothSocket;

private final BluetoothDevice bluetoothDevice ;

public ConnectingThread(BluetoothDevice device){

BluetoothSocket temp = null;

bluetoothDevice = device;

//Get a BluetoothSocket to connect with the given BluetoothDevice

try{

temp=bluetoothDevice.createInsecureRfcommSocketToServiceRecord(uuid);

}catch (IOException e){

e.printStackTrace();

}

bluetoothSocket = temp;

}

public void run() {

// Cancel discovery as it will slow down the connection

bluetoothAdapter.cancelDiscovery();

try {

bluetoothSocket.connect();

Log.d(TAG, "the code is running");

// This will block until it succeeds in connecting to the device

// through the bluetoothSocket or throws an exception

// bluetoothSocket.connect();

//isConnected = true;

} catch (IOException connectException) {

connectException.printStackTrace();

try {

//unable to connect

bluetoothSocket.close();

} catch (IOException closeException) {

closeException.printStackTrace();

}

}

// Do work to manage the connection (in a separate thread)

//manageConnectedSocket(bluetoothSocket);

ConnectedThread t= new ConnectedThread(bluetoothSocket);

t.start();

}

// Cancel an open connection and terminate the thread

public void cancel() {

try {

bluetoothSocket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

private class ConnectedThread extends Thread {

private final BluetoothSocket bluetoothSocket;

private final InputStream mmInStream;

private final OutputStream mmOutStream;

private android.os.Handler mHandler;

public ConnectedThread(BluetoothSocket socket) {

bluetoothSocket = socket;

InputStream tmpIn = null;

OutputStream tmpOut = null;

// Get the input and output streams, using temp objects because

// member streams are final

try {

tmpIn = socket.getInputStream();

tmpOut = socket.getOutputStream();

} catch (IOException e) { }

mmInStream = tmpIn;

mmOutStream = tmpOut;

}

public void run() {

byte[] buffer = new byte[1024]; // buffer store for the stream

int bytes; // bytes returned from read()

// Keep listening to the InputStream until an exception occurs

while (true) {

try {

// Read from the InputStream

bytes = mmInStream.read(buffer);

// Send the obtained bytes to the UI activity

mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)

.sendToTarget();

} catch (IOException e) {

break;

}

}

// Call this from the main activity to send data to the remote device

public void write(byte[] bytes) {

try {

mmOutStream.write(bytes);

} catch (IOException e) { }

}

// Call this from the main activity to shutdown the connection

public void cancel() {

try {

bluetoothSocket.close();

mmInStream.close();

mmOutStream.close();

} catch (IOException e) { }

}

public void setmHandler(Handler mHandler) {

this.mHandler = mHandler;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值