这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
频率:2.4GHz
范围:10米
传输速度:100Kb+
Android 2.0(API 6)开始支持蓝牙,真机才能调试
Android蓝牙开发:
权限 android.permission.BLUETOOTH 允许程序连接到已配对的蓝牙设备
android.permission.BLUETOOTH_ADMIN 允许程序发现和配对蓝牙设备
拿到本机蓝牙设备适配器: 通过判断非null来得知当前设备是否支持蓝牙
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
查看蓝牙是否打开:
bluetoothAdapter.isEnabled()
打开蓝牙
// 1提示用户打开蓝牙,此方法会设置设备为“可发现”模式,默认120秒
startActivityForResult(new Intent(
BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE).putExtra(
bluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300),
REQUEST_OPEN_BLUETOOTH);
// 2 提示用户打开蓝牙,此方法仅打开,不会改变蓝牙设备当前的可发现状态
startActivityForResult(new Intent(
BluetoothAdapter.ACTION_REQUEST_ENABLE).putExtra(
bluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300),
REQUEST_OPEN_BLUETOOTH);
//3直接打开蓝牙
bluetoothAdapter.enable();
打开设备为发现模式:
// 1提示用户设置为可发现模式
startActivityForResult(new Intent(
BluetoothAdapter.ACTION_REQUEST_ENABLE).putExtra(
bluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300),
REQUEST_OPEN_BLUETOOTH);
//2直接打开为可发现模式
bluetoothAdapter.startDiscovery();
关闭蓝牙: bluetoothadapter是单例的
BluetoothAdapter adapter=BluetoothAdapter.getDefaultAdapter();
adapter.disable();
判断是否正在扫描
bluetoothAdapter.isDiscovering()
开始扫描蓝牙设备
bluetoothAdapter.startDiscovery();
注册扫描发现设备的监听
BluetoothAdapter.ACTION_DISCOVERY_STARTED 开始扫描
BluetoothDevice.ACTION_FOUND 发现新设备
BluetoothAdapter.ACTION_DISCOVERY_FINISHED 扫描结束
在扫描到新设备的监听中,拿到这个设备
BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);注意要判断非空,比如设备名,因为可能会先返回一些不完整的信息,之后再返回时会更新
如果当前正处在扫描状态,那么再次调用开始扫描方法,是不会重新开始扫描的。
2个设备利用蓝牙进行通讯交互,实际就是利用socket进行通讯,
大致流程:设备配对→服务端启动→客户端扫描到服务端的信息→客户端通过服务端的MAC地址以及UUID进行连接→互相通信
//服务端根据UUID创建一个ServerSocket
serverSocket = adapter.listenUsingRfcommWithServiceRecord(“server”,UUID.fromString(BlueToothActivity.SERVER_UUID));
//阻塞线程,等待客户端的连接
socket = serverSocket.accept();
//连接成功,拿到与客户端之间的通信I/O
read = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
write = new PrintStream(socket.getOutputStream());
//客户端根据服务端地址拿到服务端的设备
device = adapter.getRemoteDevice(BlueToothActivity.SERVER_ADDRESS);
//根据服务端UUID创建一个Socket
socket = device.createRfcommSocketToServiceRecord(UUID
.fromString(BlueToothActivity.SERVER_UUID));
//连接服务端成功,拿到与服务端的I/O
read = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
write = new PrintStream(socket.getOutputStream());
NFC基础
Near Field Communication (NFC) 近场通讯技术 常规功能为 读取、写入、类似蓝牙的点对点通信
NFC通讯通常分为 发起者 以及 接受者 发起者通过电磁场给接受者供电,常见的接受者比如NFC标签、NFC卡片等
同时也支持peer to peer的通讯,双方都有电源
与蓝牙相比,NFC支持的距离小很多,通常为10厘米之内,但成本低,一个NFC标签淘宝价格1,2块钱,也不需要搜寻设备、配对等流程,在双方靠近的瞬间完成交互