android蓝牙
Posted z_fishLong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android蓝牙相关的知识,希望对你有一定的参考价值。
1 蓝牙协议分为4层,即核心协议层、电缆替代协议层、电话控制协议层和采纳的其它协议层。这4种协议中最重要的是核心协议。蓝牙的核心协议包括基带、链路管理、逻辑链路控制和适应协议四部分。其中链路管理(LMP)负责蓝牙组件间连接的建立。逻辑链路控制与适应协议(L2CAP)位于基带协议层上,属于数据链路层,是一个为高层传输和应用层协议屏蔽基带协议的适配协议。
2 打开蓝牙的两种方式
a)方式一:
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, 1);
b)方式二:
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter()
adapter.enable();
adapter.disable();
必须有权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
3 蓝牙操作
a)获取已经配对的设备
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
//获取已经配对过的蓝牙设备
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
if (pairedDevices.size() > 0)
for (BluetoothDevice device : pairedDevices)
bluetoothDevices.add(device.getName() + ":" + device.getAddress());
b)搜索周围设备
创建BroadcastReceiver
private final BroadcastReceiver receiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action))
BluetoothDevice device = intent
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getBondState() != BluetoothDevice.BOND_BONDED)
bluetoothDevices.add(device.getName() + ":" + device.getAddress());
arrayAdapter.notifyDataSetChanged();
else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED
.equals(action))
setProgressBarVisibility(false);
setTitle("连接蓝牙设备");
;
注册BroadcastReceiver
//注册广播接收器
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(receiver, filter);
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
this.registerReceiver(receiver, filter);
开始查找设备
if (mBluetoothAdapter.isDiscovering())
mBluetoothAdapter.cancelDiscovery();
mBluetoothAdapter.startDiscovery();
发现蓝牙设备后系统会发广播,接收到广播后在receiver 处理
(二)两个蓝牙之间传送数据
原理:通过蓝牙传输数据与Socket类似。在网络中使用Socket和ServerSocket控制客户端和服务端的数据读写。而蓝牙通讯也由客户端和服务端Socket来完成。蓝牙客户端Socket是BluetoothSocket,蓝牙服务端Socket是BluetoothServerSocket。这两个类都在android.bluetooth包中。
无论是BluetoothSocket,还是BluetoothServerSocket,都需要一个UUID(全局唯一标识符,Universally Unique Identifier).格式如下:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
UUID的格式被分成5段,其中中间3段的字符数相同,都是4,第1段是8个字符,最后一段是12个字符。所以UUID实际上是一个8-4-4-4-12的字符串。
UUID相当于Socket的端口,而蓝牙地址相当于Socket的IP。
两个蓝牙设备进行连接时需要使用同一个UUID。但很多读者可能发现,有很多型号的手机(可能是非Android系统的手机)之间使用了不同的程序也可以使用蓝牙进行通讯。从表面上看,它们之间几乎不可能使用同一个UUID。
实际上,UUID和TCP的端口一样,也有一些默认的值。例如,将蓝牙模拟成串口的服务就使用了一个标准的UUID:
00001101-0000-1000-8000-00805F9B34FB。除此之外,还有很多标准的UUID,如下面就是两个标准的UUID。
信息同步服务:00001104-0000-1000-8000-00805F9B34FB
文件传输服务:00001106-0000-1000-8000-00805F9B34FB
客户端代码(发送端):
private final UUID MY_UUID = UUID //uuid为端口号
.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
BluetoothSocket clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
clientSocket.connect();
OutputStream os = clientSocket.getOutputStream();
os.write("发送信息到其他蓝牙设备".getBytes("utf-8"));
服务端(接收端):
private Handler handler = new Handler()
@Override
public void handleMessage(Message msg)
Toast.makeText(MainActivity.this, String.valueOf(msg.obj),
Toast.LENGTH_LONG).show();
super.handleMessage(msg);
;
private class AcceptThread extends Thread
private BluetoothServerSocket serverSocket;
private BluetoothSocket socket;
private InputStream is;
private OutputStream os;
public AcceptThread()
try
serverSocket = mBluetoothAdapter
.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
catch (Exception e)
// TODO: handle exception
public void run()
try
socket = serverSocket.accept();
is = socket.getInputStream();
os = socket.getOutputStream();
while (true)
byte[] buffer = new byte[128];
int count = is.read(buffer);
Message msg = new Message();
msg.obj = new String(buffer, 0, count, "utf-8");
handler.sendMessage(msg);
catch (Exception e)
// TODO: handle exception
开启线程
AcceptThread acceptThread = new AcceptThread();
acceptThread.start();
以上是关于android蓝牙的主要内容,如果未能解决你的问题,请参考以下文章
求鉴定 手机型号是Android,2.3.4的系统,基带版本MAUI.11AMD.W11.19.SP.V1,2011/06/23