您的位置:首页 > 其它

关于安卓蓝牙开发总结

2015-10-04 09:52 225 查看
这几个星期提出了一个小项目,于是和团队日夜加工,大概就是传感器连接51单片机,51再通过蓝牙发送信息到手机端。前几天一直在研究单片机里面的程序,这几天是负责写安卓客户端接收的界面,涉及到有关安卓蓝牙的开发,仔细学习了下,略有心得,做个总结,新手感悟,望大神指点。注意,这个主要是和单片机蓝牙相连,与手机互连略有不同的,主要体现在UUID那块,也是需要获取,因为单片机的串口蓝牙UUID是固定的。整体思路可以参考。

首先得介绍关于蓝牙的几个重要的类,BluetoothAdapter,BluetoothSocket,BluetoothDevice,大概用这几个类就能做出蓝牙的基本功能,当然蓝牙类不多,还有其他的,详细的大家去看看API吧。

首先来讲BluetoothAdapter,这个类是用来获取本地的蓝牙,以便后续对本地蓝牙进行操作。

BluetoothAdapter adapter = BluetoothAdapter. getDefaultAdapter () ————本地蓝牙对象的获得

再来是BluetoothDevice,这个类是用来获取搜索到附近的蓝牙设备的对象,也就是说搜到对方了,用BluetoothDevice去获取一个对象,然后对象里装有名称,地址之类可用的

BluetoothDevice device = intents.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) ————附近蓝牙对象的获得,这个intent我们稍后再说。

最后是BluetoothSocket,顾名思义,就是蓝牙通信的类了,可以获得流对象。

BluetoothSocket clienSocket=device.createRfcommSocketToServiceRecord(uuid); ——————定义与XX蓝牙连接的socket

clienSocket.connect(); ——————开始连接

重要的类就是这三个,至于类中的方法不详细说明,用提示快捷键去查看下,各种方法也是见名知意,接下来我们详细讲下思路。

一、我首先是初始化了一个本地蓝牙的对象,用来对我手机上的蓝牙进行操作嘛,再次之前,我先用代码打开了蓝牙的开关。

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

Toast.makeText(MainActivity.this, "打开蓝牙", Toast.LENGTH_SHORT).show();

startActivityForResult(intent, 1);

BluetoothAdapter adapter = BluetoothAdapter. getDefaultAdapter ();

adapter.startDiscovery();

二、我注册了一个广播接收,为什么要注册广播接收呢,原来仔细了解蓝牙机制,大概意思是打开搜索附近蓝牙设备时,如果搜索到了,会返还相应的信号,那我们如何接收这些 信号呢?自然是注册一个广播接受者啦,来看看它到底返回的信息。

class myBroadcastReceiver extends BroadcastReceiver

{

public void onReceive(Context arg0, Intent intents)

{

String action = intents.getAction();

if (BluetoothDevice.ACTION_FOUND.equals(action))

{

device = intents.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

listData.add(device.getName() + "\n" + device.getAddress());

Toast.makeText(MainActivity.this, "搜索中", Toast.LENGTH_SHORT).show();

}

if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action))

{

Toast.makeText(MainActivity.this, "搜索完毕", Toast.LENGTH_SHORT).show();

}

listview.setAdapter(mArrayAdapter);

}

}

解释:这段代码还是挺简单的吧~就是写个类继承BroadcastReceiver,然后重新里面的onReceive方法,这个方法里呢,它会获取一个intent,不要小瞧这个intent哦 ,里面可是包含着很多拥有信息的,首先你这个intent是干嘛的干嘛的想干嘛,好,我获取你的action信息来看看你的举动目的,这个举动目的也就是我们刚才说的 返回的信息,一般来说有BluetoothDevice.ACTION_FOUND(就是找到设备啦)、BluetoothAdapter.ACTION_DISCOVERY_FINISHED(找累了,找完了
)、诸如此类的常量信息。然后我们做个判断,再用刚才讲的获取到找到的device设备,这样就OK了.

三、找到了设备,那就连接咯,还等什么。这时就用到BluetoothSocket这个类了。恩,没什么好说的,这步比较简单。不过注意捕捉异常。

BluetoothSocket clienSocket=device.createRfcommSocketToServiceRecord(uuid); ——————定义与XX蓝牙连接的socket

clienSocket.connect();

四、连接了干嘛,自然是通信啦,到这步其实就不太算蓝牙的知识范围啦,就是我们以前学的输入输出流,获取信息啦,这里我尝试了一个比较新潮的用法(对我而言= = ), 以前用的是thread+handle,现在用下传说的AsyncTask。这里写下简单代码步骤。

一个类继承了AsyncTask类,重写protected Boolean doInBackground(Void... params)方法,在这里加入我们想要处理的耗时的事情,自然是数据的获取了。

InputStream is=MainActivity.clienSocket.getInputStream();

i = is.read(arrayOfByte);

str_receiver = new String(arrayOfByte, 0, i);

chs=str_receiver.toCharArray();

length =chs.length;

publishProgress();

然后在protected void onProgressUpdate(Integer... values)方法里更新UI,这样就完成啦~~~~~~~

PS:整体理解了还是比较简单的,第一次写总结,也不知道格式或者思路条理这些好不好,大家见谅,其实在开发过程中,还有关于listview,UUID之类的小内容,就没有扩展 开来总结了,今天主题是蓝牙嘛,以后有机会也写写,包括异步处理的两种方法。那蓝牙总结就写到这里,最后附录那里还有关于单片机串口的UUID,省的要做同样项目的 小伙伴们就不用到处找了。

附录:单片机串口UUID "00001101-0000-1000-8000-00805F9B34FB"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: