您的位置:首页 > 移动开发 > Android开发

Android 蓝牙编程

2015-07-14 17:16 489 查看


对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是
Android的蓝牙开发,国内的例子很少
Android
对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发,刚巧这段时间公司有蓝牙开发的需求,我看了很多国内、国外的资料,又研究了一下J2ME的蓝牙开发(为了找找思路),虽然我想要的功能还没实现(我曾经在很多论坛里问了很多遍,苦于没有高人解答..),我要实现的功能是连接一个硬件设备,凡是跟硬件沾上边的,都让软件人员开发头疼..

好了,废话不说了,鉴于很多开发人员现在也有蓝牙开发的需求,也为了大家少走些弯路,先将我积攒的一点点在Android蓝牙开发经验与大家分享一下!

首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限



<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"
/>




<uses-permissionandroid:name="android.permission.BLUETOOTH"
/>


然后,看下api,Android所有关于蓝牙开发的类都在android.bluetooth包下,如下图,只有8个类













而我们需要用到了就只有几个而已:




1.BluetoothAdapter
顾名思义,蓝牙适配器,直到我们建立bluetoothSocket连接之前,都要不断操作它




BluetoothAdapter
里的方法很多,常用的有以下几个:




cancelDiscovery()
根据字面意思,是取消发现,也就是说当我们正在搜索设备的时候调用这个方法将不再继续搜索




disable()
关闭蓝牙




enable()
打开蓝牙,这个方法打开蓝牙不会弹出提示,更多的时候我们需要问下用户是否打开,一下这两行代码同样是打开蓝牙,不过会提示用户:



Intemtenabler=new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);




startActivityForResult(enabler,reCode);//
同startActivity(enabler);




getAddress()
获取本地蓝牙地址




getDefaultAdapter()
获取默认BluetoothAdapter,实际上,也只有这一种方法获取BluetoothAdapter




getName()
获取本地蓝牙名称




getRemoteDevice(String
address)
根据蓝牙地址获取远程蓝牙设备




getState()
获取本地蓝牙适配器当前状态(感觉可能调试的时候更需要)




isDiscovering()
判断当前是否正在查找设备,是返回true




isEnabled()
判断蓝牙是否打开,已打开返回true,否则,返回false




listenUsingRfcommWithServiceRecord(String
name,UUID uuid)
根据名称,UUID创建并返回BluetoothServerSocket,这是创建BluetoothSocket服务器端的第一步




startDiscovery()
开始搜索,这是搜索的第一步




2.BluetoothDevice
看名字就知道,这个类描述了一个蓝牙设备




createRfcommSocketToServiceRecord(UUIDuuid)
根据UUID创建并返回一个BluetoothSocket

这个方法也是我们获取BluetoothDevice的目的——创建BluetoothSocket

这个类其他的方法,如getAddress(),getName(),同BluetoothAdapter




3.BluetoothServerSocket
如果去除了Bluetooth相信大家一定再熟悉不过了,既然是Socket,方法就应该都差不多,

这个类一种只有三个方法

两个重载的accept(),accept(inttimeout)两者的区别在于后面的方法指定了过时时间,需要注意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过期之后),都会阻塞线程,应该放在新线程里运行!

还有一点需要注意的是,这两个方法都返回一个BluetoothSocket,最后的连接也是服务器端与客户端的两个BluetoothSocket的连接




close()
这个就不用说了吧,翻译一下——关闭!




4.BluetoothSocket,
跟BluetoothServerSocket相对,是客户端

一共5个方法,不出意外,都会用到




close(),
关闭




connect()
连接




getInptuStream()
获取输入流




getOutputStream()
获取输出流




getRemoteDevice()
获取远程设备,这里指的是获取bluetoothSocket指定连接的那个远程蓝牙设备




[b]

1
、获取本地蓝牙适配器[/b]




BluetoothAdapter

mAdapter= BluetoothAdapter.getDefaultAdapter();





2
、打开蓝牙




if(!mAdapter.isEnabled()){




//
弹出对话框提示用户是后打开



Intent enabler = new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);




startActivityForResult(enabler,
REQUEST_ENABLE);





//
不做提示,强行打开




// mAdapter.enable();




}





3
、搜索设备



1)
刚才说过了mAdapter.startDiscovery()



是第一步,可以你会发现没有返回的蓝牙设备,怎么知道查找到了呢?向下看,不要急





2)
定义BroadcastReceiver,关于BroadcastReceiver不多讲了,不是今天的讨论内容,代码如下

BroadcastReceiver
mReceiver = new BroadcastReceiver() {




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)
{




Log.v(TAG, "find device:" + device.getName()




+ device.getAddress());




}




}






//
搜索完成




else if
(BluetoothAdapter.ACTION_DISCOVERY_FINISHED




.equals(action)) {




setTitle("
搜索完成");



if (mNewDevicesAdapter.getCount() == 0) {




Log.v(TAG,"find over");




}




}




//
执行更新列表的代码



}




};


这样,没当查找到新设备或是搜索完成,相应的操作都在上段代码的两个if里执行了,不过前提是你要先注册



BroadcastReceiver
,具体代码如下



IntentFilter filter = new
IntentFilter(BluetoothDevice.ACTION_FOUND);




registerReceiver(mReceiver, filter);




filter = new
IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);




registerReceiver(mReceiver, filter);


(这段代码,一般写在onCreate()里..)



3
建立连接,首先Android
sdk(2.0以上版本)支持的蓝牙连接是通过BluetoothSocket建立连接(说的不对请高人指正),服务器端(BluetoothServerSocket)和客户端(BluetoothSocket)需指定同样的UUID,才能建立连接,因为建立连接的方法会阻塞线程,所以服务器端和客户端都应启动新线程连接






1
)服务器端:



//UUID
格式一般是"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"可到




//http://www.uuidgenerator.com
申请



BluetoothServerSocket serverSocket = mAdapter.
listenUsingRfcommWithServiceRecord(serverSocketName,UUID);




serverSocket.accept();




2)
客户端:



//
还记得我们刚才在BroadcastReceiver获取了BLuetoothDevice么?



BluetoothSocket clienSocket=dcvice.
createRfcommSocketToServiceRecord(UUID);




clienSocket.connect();




4
、数据传递,通过以上操作,就已经建立的BluetoothSocket连接了,数据传递无非是通过流的形式



1
)获取流



inputStream = socket.getInputStream();




outputStream = socket.getOutputStream();




2
)写出、读入

这是基础的东西,在这就不多赘述了

终于写完了,这是我这两天的学习经验,希望对有蓝牙需求的朋友有所帮助!另外,之前我们提过



android.bluetooth
下有8个类,还有4个类没有用到,那4个类里定义的都是常量,我也没用到它们..


补充一下,使设备能够被搜索

Intent enabler = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

startActivityForResult(enabler,REQUEST_DISCOVERABLE);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: