Android Studio开发(六)短距离无线通信——蓝牙通信
Android Studio开发(六)蓝牙通信
一、任务需求
- 依据第一次的微信界面模拟,实现安卓的蓝牙通信。
二、短距离无线通信技术(Short-Distance Wirleless Communication)
1. 简介
顾名思义,短距离无线通信技术泛指通信距离短的一类无线通信。近年来,由于数据通信需求的推动,加上半导体、计算机等相关电子技术领域的快速发展,短距离无线与移动通信技术也经历了一个快速发展的阶段,WLAN技术、蓝牙技术、UWB 技术,以及紫蜂( ZigBee)技术、射频识别(RFID)技术等取得了令人瞩目的成就。
短距离无线通信通常指的是 100m 以内的通信,分为高速短距离无线通信和低速短距离无线通信两类。
- 高速短距离无线通信最高数据速率>100Mbit/s,通信距离<10m,典型技术有高速 UWB、WirelessUSB;
- 低速短距离无线通信的最低数据速率<1Mbit/s,通信距离<100m,典型技术有蓝牙、紫蜂和低速 UWB。
2. 几种常用的短距离无线通信技术
手机上常用的三种短距离无线通信为:
- 蓝牙
- Wi-Fi
- NFC近场通信技术
接下来,对这三种技术分别加以简单介绍。
2.1 蓝牙(Bluetooth)
“蓝牙(Bluetooth)”是一个开放性的、短距离无线通信技术标准,也是目前国际上最新的一种公开的无线通信技术规范。它可以在较小的范围内,通过无线连接的方式安全、低成本、低功耗的网络互联,使得近距离内各种通信设备能够实现无缝资源共享,也可以实现在各种数字设备之间的语音和数据通信。由于蓝牙技术可以方便地嵌入到单一的 CMOS 芯片中,因此,特别适用于小型的移动通信设备,
使设备去掉了连接电缆的不便,,通过无线建立通信。
蓝牙技术以低成本的近距离无线连接为基础,采用**高速跳频(Frequency Hopping)和时分多址(Time Division Multi- access—TDMA)**等先进技术,为固定与移动设备通信环境建立一个特别连接。蓝牙技术使得一些便于携带的移动通信设备和计算机设备不必借助电缆就能联网,并且能够实现无线连接因特网,其实际应用范围还可以拓展到各种家电产品、消费电子产品和汽车等信息家电,组成一个巨大的无线通信网络。打印机、PDA、桌上型计算机、传真机、键盘、游戏操纵杆以及所有其它的数字设备都可以成为蓝牙系统的一部分。
2.2 Wi-Fi
是以太网的一种无线扩展,理论上只要用户位于一个接入点四周的一定区域内,但受墙壁阻隔,在建筑物内的有效传输距离小于户外。主要应用在SOHO、家庭无线网络以及不便安装电缆的建筑物或场所,例如机场、酒店、商场等公共热点场所,可以节省大量铺设电缆所需花费的资金。
2.3 近场通信(Near Field Communication,NFC)
是由Philips、NOKIA和Sony主推的一种类似于RFID(非接触式射频识别)的短距离无线通信技术标准。和RFID不同,NFC采用了双向的识别和连接。在20cm距离内工作于13.56MHz频率范围。NFC最初仅仅是遥控识别和网络技术的合并,但现在已发展成无线连接技术。它能快速自动地建立无线网络,为蜂窝设备、蓝牙设备、Wi-Fi设备提供一个“虚拟连接”,使电子设备可以在短距离范围进行通讯。NFC的短距离交互大大简化了整个认证识别过程,使电子设备间互相访问更直接、更安全和更清楚,不用再听到各种电子杂音。NFC通过在单一设备上组合所有的身份识别应用和服务,帮助解决记忆多个密码的麻烦,同时也保证了数据的安全保护。有了NFC,多个设备如数码相机、PDA、机顶盒、电脑、手机等之间的无线互连,彼此交换数据或服务都将有可能实现。同样,构建Wi-Fi家族无线网络需要多台具有无线网卡的电脑、打印机和其它设备。除此之外,还得有一定技术的专业人员才能胜任这一工作。而NFC被置入接入点之后,只要将其中两个靠近就可以实现交流,比配置Wi-Fi连结容易得多。
值得注意的是,NFC的有效距离一般不能超过4cm。
三、使用蓝牙在安卓中进行简单通信
1. socket套接字
既然要通信,那么就一定会涉及到消息的接受和发送,在开发过程中一定会涉及到网络层的socket套接字。这里使用BluetoothServerSocket
和BluetoothSocket
实现。
如果对于套接字不太理解的话,可以再看看计网中对于套接字的描述和基本网络编程,对于理解很有帮助(哈工大的慕课这一部分讲得很好,值得一看)。
由于在实际过程中,发现使用socket会导致线程阻塞,从而影响后续执行,因此本次实验采用多线程进行开发,
2. 在AS中声明权限使用蓝牙
在安卓4.X
版本过后,若要搜索到附近的蓝牙设备需开启定位权限,和前一节使用百度地图API实现实时定位的操作类似,我们需要添加如下代码对权限加以声明:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
3. 编码阶段
最核心的也就是信息的接受以及发送了,代码如下:
public void acceptMessage() throws IOException {
BluetoothServerSocket serverSocket =
bluetoothAdapter.listenUsingRfcommWithServiceRecord(bluetoothAdapter.getName(),
UUIDSTR);
BluetoothSocket socket = serverSocket.accept(60);
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
byte[] bytes = new byte[1024];
int read = 0;
while ((read = in.read(bytes)) != -1) {
String s = new String(bytes, 0, read);
System.out.println(s);
}
in.close();
socket.close();
}
public void sendMessage(BluetoothDevice device, String msg) throws IOException {
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUIDSTR);
socket.connect();
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
out.write(msg.getBytes());
out.flush();
out.close();
socket.close();
}
四、实现效果
由于没有安卓设备,而且这一部分还需要两部,真机测试无法进行,不过应该没什么太大问题XD
附源代码如下: