用NFC简化蓝牙配对并互相发送对方的蓝牙的MAC地址
2016-03-01 22:40
423 查看
本文的实现过程如下
Touch DeviceA发送DeviceA的MAC地址给DeviceB,DeviceB接收到DeviceA的MAC地址后,请求与之配对,配对成功后将DeviceB的MAC地址通过蓝牙发送给DeviceA
DevicA 发送本机地址
DeviceB接收到对方地址并与之创建连接,返回数据
DeviceA接受数据
总的代码如下
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){
}
}
}
}
相关文章推荐
- android自定义电池View
- 关于主配置和虚拟主机配置
- 截图软件
- 算法_9:随机算法
- 10+ 最流行的 jQuery Tree 菜单插件
- 开源一个完整的iOSApp《丁丁美图》供初学者学习
- javascript闭包
- 接口和抽象类有什么区别
- 关于方法区内存溢出!
- 无线智能小车(一)
- 【02】SimpleAdapter和OnScrollListener
- Collocations
- struts(tags)
- 搜索(DLX):HOJ 1017 - Exact cover
- 单例模式
- bzoj 1059: [ZJOI2007]矩阵游戏
- 【计算机视觉】粒子滤波跟踪
- AngularJS 使用 UI Router 实现表单向导
- Eclipse 使用 maven 构建demo
- 我的决心书Linux