一般的Android手机都带有蓝牙,虽说BT这东西放到现在看速度是奇慢,但还是有很多的手持设备等,提供了蓝牙的支持,那么用我们的手机,就可以连接到这些设备,然后进行一些操作。
比如楼主这次要实现的是用手机连接到蓝牙设备,扫描RFID码。
先大体说下步骤吧:
1.打开手机和设备的BT。
2.手机和设备进行配对,扫描,输入密码进行配对。
3.手机和设备之间建立起Socket通信。
4.发/收消息,进行通信。
5.关掉Socket,GG。
步骤1~2,我是直接在设置里进行操作的,自己再写一套太麻烦了。这里我们主要来看3~5步:
首先,要从已配对的设备列表中,找到我们要连接的目标设备。
BluetoothAdapter是这样获取的:
mBTAdapter = BluetoothAdapter.getDefaultAdapter();
/**
* 找到目录设备(已配对)
*/
private void connectToDevice() {
mTargetDevice = null;
Set devices = mBTAdapter.getBondedDevices();
if (devices != null && devices.size() > 0) {
Iterator iterator = devices.iterator();
while (iterator.hasNext()) {
// 有带关键字"6301"的,则取之
BluetoothDevice dev = iterator.next();
if (dev.getName().contains("6301")) {
mTargetDevice = dev;
break;
}
}
if (mTargetDevice == null) {
// 无则取第一个
mTargetDevice = devices.iterator().next();
}
mConnectedDev.setText(String.format(getString(R.string.connected_device),
mTargetDevice.getName()));
// 开始扫描
mScanThread = new ST(mTargetDevice);
mScanThread.start();
} else {
mConnectedDev.setText(R.string.no_bond_device);
}
}
private class ST extends Thread {
private ST(BluetoothDevice d) {
mDevice = d;
// 正在连接至设备
mHandler.sendMessage(mHandler.obtainMessage(0, 0, 0,
getString(R.string.connecting_to_device)));
}
private BluetoothDevice mDevice;
private BluetoothSocket mBTSocket;
@Override
public void run() {
try {
Method m = mDevice.getClass().getMethod("createRfcommSocket", new Class[] {
int.class
});
mBTSocket = (BluetoothSocket) m.invoke(mDevice, 1);
mBTSocket.connect();
// 可以开如扫描
mHandler.sendMessage(mHandler
.obtainMessage(0, 0, 0, getString(R.string.ok_to_scan)));
// 连接ok
BufferedInputStream in = new BufferedInputStream(mBTSocket.getInputStream());
int b1 = in.read();
int b2 = in.read();
if (b1 == 0xaa && b2 == 0x53) {
// 帧头找到
in.skip(2);// 跳过设备ID
in.skip(2);// 跳过指令长度
in.skip(1);// 跳过指令码
int lenEPC = in.read(); // EPC长度
System.out.println("EPC lenth: " + lenEPC);
StringBuilder builderEPC = new StringBuilder();
// 读取EPC
System.out.println("read EPC E");
for (int i = 0; i < lenEPC; i++) {
builderEPC.append(Integer.toHexString(in.read()));
}
System.out.println("read EPC X");
mRFIDString = builderEPC.toString().trim().toUpperCase();
mHandler.sendMessage(mHandler.obtainMessage(0, 0, 0, mRFIDString));
} else {
readFailed();
}
} catch (Exception e) {
e.printStackTrace();
readFailed();
} finally {
if (mBTSocket != null) {
try {
mBTSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void readFailed() {
mHandler.sendMessage(mHandler.obtainMessage(0, 0, 0,
getString(R.string.scan_failed_plz_retry)));
}
public void closeSocket() {
if (mBTSocket != null) {
try {
mBTSocket.close();
mBTSocket = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
说明:
1. run()方法开头用反射调用"createRfcommSocket"方法的一段代码,是为了解决连接时频繁报出connection reset等问题的,引起这些问题的主要原因,还是由于传入的UUID不对。
2. BluetoothSocket和普通的Socket基本是一样的,用起来无门槛。
这个例子,是手机连接蓝牙设备使用到的一个通用例子,run()里的操作,是根据蓝牙设备的不同而不同的。
楼主现在在琢磨Android手机连接蓝牙打印机进行打印,有相关经验的朋友,望不吝赐教,解答以下问题:
1. 有没有一个“大一统”的蓝牙打印机API包?
2. 没有的话,是不是每针对一款打印机,就要写一套通代码?
3.有木有相关实例代码,求发给楼主一份,楼主也想站在巨巨们的肩膀上,求成全~。~
(求代码不能忘记留邮箱:[email protected],谢谢)