最近项目需要做蓝牙连接蓝牙秤设备,获取称重数据,然后就去研究了下蓝牙相关知识,看过一堆一堆的博客文章,然后开始写,依然踏了很多的坑,自己各种办法试了又试,终于完善得差不多了,然后现在项目做完了有空就写下博客记录下。
对于蓝牙通信方面,比如蓝牙聊天,其实跟蓝牙连接蓝牙秤差不多。如果是app连接蓝牙秤,比手机连接手机聊天少了那么一两个步骤。其实可以这么理解,手机蓝牙连接蓝牙外设备(非手机),那么就是将外设备作为服务器,手机作为客户端来进行连接。如果是手机和手机蓝牙聊天,那么双方都是作为服务器和客户端,手机A和B,A作为服务器给B发送消息,B作为客户端进行接收;同理A接收B的消息的时候,B是服务器给A发送消息,A作为客户端来接受。一个发送一个接收,蓝牙通信就是这样的,那么主要的两个操作就是刚刚说的,如果需要发送功能,那么就需要自己作为服务器,主要方法就是执行socket.accept()来连接客户端,给客户端发送消息;如果需要接受数据的功能,那么需要自己作为客户端,主要方法就是执行socket.connect()来连接服务器,接收服务器的消息。
所以其实蓝牙通信主要就是上面说的两个方面,一个是接收消息,一个是发送消息;主要进行的两个操作就是accept()和connect(),其他的什么开启蓝牙,检测蓝牙是否开启,扫描附近蓝牙等都是次要的,也比较简单。
对于简单的蓝牙检测,开启,扫描等我就贴核心代码简略说下了。
正常的操作应该是:
1.检测手机是否支持蓝牙,支持的话,如果蓝牙没开启就开启蓝牙,如果不支持弹出提示
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); //获取蓝牙适配器
if (bluetoothAdapter != null) { //有蓝牙功能
if (!bluetoothAdapter.isEnabled()) { //蓝牙未开启
new Thread(new Runnable() {
@Override
public void run() {
bluetoothAdapter.enable(); //开启蓝牙(还有一种方法开启,我就不说了,自己查去)
}
}).start();
} else {
if (!bluetoothAdapter.isDiscovering()) { //如果没有在扫描设备
bluetoothAdapter.startDiscovery();//扫描附近蓝牙设备,然后做接下来的操作,比如扫描附近蓝牙等
} else {
IApplication.showToast("正在扫描"); //弹出Toast提示
}
}
} else { //无蓝牙功能
IApplication.showToast("当前设备未找到蓝牙功能"); //弹出Toast提示
}
2.获取扫描结果(注册蓝牙扫描结果的广播,然后接收)
if (action.equals(BluetoothDevice.ACTION_FOUND)) { //搜索到蓝牙设备
BluetoothDevice btd = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (btd.getBondState() != BluetoothDevice.BOND_BONDED) { //如果没有配对过
callback.found(btd); //使用接口回调给需要的activity
}
} else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) { //搜索结束
callback.finished(); //使用接口回调给需要的activity
}
3.在activity中获取传过来的扫描结果
@Override
public void found(BluetoothDevice btd) { //搜索到蓝牙设备
deviceList.add("未配对设备:" + btd.getName() + "\n" + "设备地址:" + btd.getAddress());
adapter.notifyDataSetChanged(); //用来显示扫描到的蓝牙列表
}
@Override
public void finished() {
if (deviceList == null || deviceList.size() == 0) {//未扫描到蓝牙设备
deviceList.add("未扫描到可用蓝牙设备");
adapter.notifyDataSetChanged(); //更新蓝牙列表
progressDialog.dismiss(); //隐藏正在扫描的dialog
}
}
另外,已经匹配过的蓝牙是需要单独获取的
/**
* 获取已配对的蓝牙设备
*/
private void findAvalibleDevice() {
Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();
if (bluetoothAdapter != null && bluetoothAdapter.isDiscovering()) {
deviceList.clear();
adapter.notifyDataSetChanged();
}
if (devices.size() > 0) { //存在已经配对过的蓝牙设备
for (BluetoothDevice item : devices) {
deviceList.add("已配对设备:" + item.getName() + "\n" + "设备地址:" + item.getAddress());
}
adapter.notifyDataSetChanged();
} else {
deviceList.add("不存在配对的蓝牙设备");
adapter.notifyDataSetChanged();
}
}
额,先写到这了,有点事。。。等有空补上,在下篇会重点说明蓝牙进行连接、获取数据等。