手机客户端主要涉及蓝牙编程,涉及到几个概念:
Service’s UUID : 标示服务类型,例如蓝牙打印服务、蓝牙音频传输服务、蓝牙串口服务,只有正确配置这个UUID,才能正常连接,对于蓝牙串口(SPP)服务,对应的UUID为:00001101-0000-1000-8000-00805F9B34FB
蓝牙主/从模式:蓝牙主设备一般可以连接多个设备,例如你的电脑、手机都是这样,而一般的设备,例如蓝牙耳机、蓝牙鼠标、蓝牙POS机等,都是作为从设备。主设备会主动发配对、连接请求,从设备响应这些请求。当然许多设备既可以做主,也可以做从,手机、电脑就是主从可以切换的。
知道这些概念就可以进行Android编程了,当然前提是你得会android编码 ~~
对于android蓝牙编程,只要搞熟悉了套路,还是so easy的,主要涉及几个类:
BluetoothAdapter:主要用于描述本机蓝牙适配器,封装了许多蓝牙状态信息、蓝牙操作(开、关、扫描等)
BluetoothDevice:对远端蓝牙设备的描述,例如MAC地址、设备名称、是否绑定等,都可以通过这个类获取
BluetoothServerSocket:作为服务端套接字,用来监听是否有数据接收
BluetoothSocket:蓝牙套接字,数据发送接收都是通过这个对象来实现,其实和网络编程都是比较类似的,很好理解。
由于蓝牙编程和网络编程类似,涉及到堵塞,所以需要和UI线程分离,用单独的线程实现蓝牙的数据收发。简要的编程步骤如下:
1)蓝牙适配器的获取:
BluetoothAdapter mBluetoothAdapter = null;
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
2)连接到远端设备
//Name for the SDP record when creating server socket
private static final String NAME_SECURE = "BluetoothSecure";
private static final String NAME_INSECURE = "BluetoothInsecure";
//Service's UUID
private static final UUID MY_UUID =
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
String address = "A1:A2:A3:A4:A5:A6"; //对应远端MAC地址
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);//创建蓝牙设备
BluetoothSocket mmSocket;
mmSocket = device.createRfcommSocketToServiceRecord(MY_UUID); //安全方式连接
//mmSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);//非安全方式连接
mmSocket.connect(); //开始连接
3)蓝牙监听(接受连接)
BluetoothServerSocket mmServerSocket;
InputStream mmInStream;
OutputStream mmOutStream;
mmServerSocket =mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, MY_UUID);//安全方式
//mmServerSocket = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, MY_UUID); //非安全方式
BluetoothSocket mmSocket = mmServerSocket.accept(); //开始监听
4)蓝牙读写
InputStream mmInStream = mmSocket.getInputStream(); //输入流
OutputStream mmOutStream = mmSocket.getOutputStream(); //输出流
byte[] buffer = new byte[4096];
int bytes = 0;
Read from the InputStream
bytes = mmInStream.read(buffer); //将输入流读入buffer数组
mmOutStream.write(buffer); //将buffer写到数据流
基本上蓝牙编程就按照这几步数来就行了,当然,由于蓝牙编程和Socket网络编程十分类似,会出现阻塞现象,所以不要放在UI线程,应该另起单独的线程完成上述操作。后面会放上完整的代码,里面有具体实现步骤。一般将这些后台数据操作的部分另起一个文件,作为一个Service也是挺好的。说完了蓝牙编程部分,简要看一下UI部分吧:
四个开关用ListView实现,点击菜单栏的“Connect a device”会弹出扫描界面,点击item,会获取MAC地址,然后会连接到该设备。程序在刚启动时,会发送状态请求码,即0x60(参看第一节),查询退出前的开关状态。为了避免每次开启程序时还要手动连接一次,可以将mac地址通过SharedPreferences的方式进行保存,开启程序后读取保存的mac字段,然后自动连接即可。
最后欣赏一下完成后的图片和视频演示吧~~~~
视频演示:
height="480" width="800" src="http://player.youku.com/embed/XMTY4MjIwNjYyOA==" allowfullscreen="">
附上Android Apk源代码地址:
https://github.com/lonely-geek/bluetooth-switch