DIY智能插座(五) -- Android客户端

本文详细介绍了Android平台上的蓝牙编程,包括蓝牙服务的UUID配置、主从模式的理解,以及使用BluetoothAdapter、BluetoothDevice等核心类实现蓝牙连接、监听及数据收发的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手机客户端主要涉及蓝牙编程,涉及到几个概念:

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值