您的位置:首页 > 其它

用NFC简化蓝牙配对并互相发送对方的蓝牙的MAC地址

2016-03-01 22:40 423 查看
本文的实现过程如下

Touch DeviceA发送DeviceA的MAC地址给DeviceB,DeviceB接收到DeviceA的MAC地址后,请求与之配对,配对成功后将DeviceB的MAC地址通过蓝牙发送给DeviceA

DevicA 发送本机地址

@Override
public NdefMessage createNdefMessage(NfcEvent event) {

String text = ("Beam me up, Android!\n\n" +
"Beam Time: " + System.currentTimeMillis());
NdefMessage msg = new NdefMessage(
new NdefRecord[]{createMime(//the other device recognise this APP and filter a activity by "application/vnd.com.example.huanghanqing.testnfc"
"application/vnd.com.example.huanghanqing.testnfc", getLocalBtAddr().getBytes())
//,NdefRecord.createApplicationRecord("com.example.android.beam")
});
return msg;
}

mNfcAdapter.setNdefPushMessageCallback(this, this);

DeviceB接收到对方地址并与之创建连接,返回数据

void processIntent(Intent intent) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
// only one message sent during the beam
NdefMessage msg = (NdefMessage) rawMsgs[0];
// record 0 contains the MIME type, record 1 is the AAR, if present
String bluetoothAddr = new String(msg.getRecords()[0].getPayload());
textView.setText(bluetoothAddr);
connectAndReturnBtaddr(bluetoothAddr);
}

private void connectAndReturnBtaddr(String bluetoothAddr) {

try {
try {
if (bluetoothDevice == null) {
bluetoothDevice = bluetoothAdapter.getRemoteDevice(bluetoothAddr);
}
if (bluetoothSocket == null) {
bluetoothSocket = bluetoothDevice.createRfcommSocketToServiceRecord(MY_UUID);
bluetoothSocket.connect();
os = bluetoothSocket.getOutputStream();
}
} catch (Exception e) {
e.printStackTrace();
}
if (os != null) {
os.write(bluetoothAdapter.getAddress().getBytes("utf-8"));
}
} catch (Exception e) {
e.printStackTrace();
}
}

DeviceA接受数据

public class AcceptThread extends Thread{
BluetoothServerSocket serverSocket;
private BluetoothSocket socket;
private OutputStream os;
private  InputStream is;
public AcceptThread() {
try{
serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME,MY_UUID);
}catch (Exception e){

}
}

public void run(){
try {
socket = serverSocket.accept();
is = socket.getInputStream();
os = socket.getOutputStream();
while (true){
byte[] buffer = new byte[1024];
int n = is.read(buffer);
Message msg = new Message();
msg.obj = new String(buffer,0,n,"utf-8");
handler.sendMessage(msg);
}
}catch (Exception e){

}
}
}

总的代码如下

package
4000
com.example.huanghanqing.testnfc;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.os.Parcelable;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.UUID;
import java.util.logging.LogRecord;

import javax.net.ssl.HandshakeCompletedListener;

import static android.nfc.NdefRecord.createMime;

public class MainActivity extends Activity implements CreateNdefMessageCallback {
NfcAdapter mNfcAdapter;
TextView textView;
BluetoothDevice bluetoothDevice;
BluetoothSocket bluetoothSocket;
private final String targetFilename = Environment.getExternalStorageDirectory().getPath() + "/temp_ic_launcher.png";
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
private final UUID MY_UUID = UUID.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");
private OutputStream os;
private final String NAME = "Bluetooth_Socket";

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

textView = (TextView) findViewById(R.id.textView1);
// Check for available NFC Adapter
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
System.out.println(bluetoothAdapter.getAddress());
if (mNfcAdapter == null) {
Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show();
finish();
return;
}
mNfcAdapter.setNdefPushMessageCallback(this, this);

new AcceptThread().start();
}

@Override public NdefMessage createNdefMessage(NfcEvent event) { String text = ("Beam me up, Android!\n\n" + "Beam Time: " + System.currentTimeMillis()); NdefMessage msg = new NdefMessage( new NdefRecord[]{createMime(//the other device recognise this APP and filter a activity by "application/vnd.com.example.huanghanqing.testnfc" "application/vnd.com.example.huanghanqing.testnfc", getLocalBtAddr().getBytes()) //,NdefRecord.createApplicationRecord("com.example.android.beam") }); return msg; }

@Override
public void onResume() {
super.onResume();
// Check to see that the Activity started due to an Android Beam
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
processIntent(getIntent());
} else {
// mNfcAdapter.invokeBeam(this);
}
}

@Override
public void onNewIntent(Intent intent) {
// onResume gets called after this to handle the intent
setIntent(intent);
}

/**
* Parses the NDEF Message from the intent and prints to the TextView
*/
void processIntent(Intent intent) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); // only one message sent during the beam NdefMessage msg = (NdefMessage) rawMsgs[0]; // record 0 contains the MIME type, record 1 is the AAR, if present String bluetoothAddr = new String(msg.getRecords()[0].getPayload()); textView.setText(bluetoothAddr); connectAndReturnBtaddr(bluetoothAddr); }

private String getLocalBtAddr() {
return bluetoothAdapter.getAddress();
}

private void connectAndReturnBtaddr(String bluetoothAddr) { try { try { if (bluetoothDevice == null) { bluetoothDevice = bluetoothAdapter.getRemoteDevice(bluetoothAddr); } if (bluetoothSocket == null) { bluetoothSocket = bluetoothDevice.createRfcommSocketToServiceRecord(MY_UUID); bluetoothSocket.connect(); os = bluetoothSocket.getOutputStream(); } } catch (Exception e) { e.printStackTrace(); } if (os != null) { os.write(bluetoothAdapter.getAddress().getBytes("utf-8")); } } catch (Exception e) { e.printStackTrace(); } }
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Toast.makeText(MainActivity.this,String.valueOf(msg.obj),Toast.LENGTH_LONG).show();
}
};

public class AcceptThread extends Thread{
BluetoothServerSocket serverSocket;
private BluetoothSocket socket;
private OutputStream os;
private InputStream is;
public AcceptThread() {
try{
serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME,MY_UUID);
}catch (Exception e){

}
}

public void run(){
try {
socket = serverSocket.accept();
is = socket.getInputStream();
os = socket.getOutputStream();
while (true){
byte[] buffer = new byte[1024];
int n = is.read(buffer);
Message msg = ne
abc8
w Message();
msg.obj = new String(buffer,0,n,"utf-8");
handler.sendMessage(msg);
}
}catch (Exception e){

}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: