没有合适的资源?快使用搜索试试~ 我知道了~
ANDROID蓝牙编程.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 184 浏览量
2023-11-15
16:16:25
上传
评论
收藏 275KB DOC 举报
温馨提示
试读
29页
ANDROID蓝牙编程.doc 用BluetoothAdapter类,你能够在Android设备上查找周边的蓝牙设备然后配对(绑定),蓝牙通讯是基于唯一地址MAC来相互 传输的,考虑到安全问题Bluetooth通讯时需要先配对。然后开始相互连接,连接后设备将会共享同一个RFCOMM通道以便相互传输数据,目前这些实 现在Android 2.0或更高版本SDK上实现。
资源推荐
资源详情
资源评论
ANDROID 蓝牙编程
用 BluetoothAdapter 类,你能够在 Android 设备上查找周边的蓝牙设备然
后配对(绑定),蓝牙通讯是基于唯一地址 MAC 来相互 传输的,考虑到安全问题
Bluetooth 通讯时需要先配对。然后开始相互连接,连接后设备将会共享同一个
RFCOMM 通道以便相互传输数据,目前这些实 现在 Android 2.0 或更高版本 SDK
上实现。
一、查找发现 findding/discovering devices
对于 Android 查找发现蓝牙设备使用 BluetoothAdapter 类的
startDiscovery()方法就可以执行一个异步方式获取周边的蓝 牙设备,因为是
一个异步的方法所以我们不需要考虑线程被阻塞问题,整个过程大约需要 12 秒
时间,这时我们紧接着注册一个 BroadcastReceiver 对象来接收查找到的蓝牙
设备信息,我们过滤 ACTION_FOUND 这个 Intent 动作来获取每个远程设备的详
细信息,通过附加参数在 Intent 字段 EXTRA_DEVICE 和 EXTRA_CLASS, 中包含了
每个 BluetoothDevice 对象和对象的该设备类型 BluetoothClass ,示例代码
private final BroadcastReceiver cwjReceiver = 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);
myArrayAdapter.add(device.getName() + "
android123 " + device.getAddress()); //获取设备名称和 mac 地址
}
}
};
// 注册这个 BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(cwjReceiver, filter);
最后 android123 提醒大家需要注意的是,记住在 Service 或 Activity 中重
写 onDestory()方法,使用 unregisterReceiver 方法反注册这个
BroadcastReceiver 对象保证资源被正确回收。
一些其他的状态变化有 ACTION_SCAN_MODE_CHANGED 额外参数
EXTRA_SCAN_MODE 和 EXTRA_PREVIOUS_SCAN_MODE 以及
SCAN_MODE_CONNECTABLE_DISCOVERABLE、 SCAN_MODE_CONNECTABLE 和
SCAN_MODE_NONE, 蓝牙模块
二、配对绑定 bnded/paired device
在 Android 中配对一个蓝牙设备可以调用 BluetoothAdapter 类的
getBondedDevices()方法可以获取已经配对的设备,该方法将会返回一个
BluetoothDevice 数组来区分每个已经配对的设备,示例代码如下:
Set<BluetoothDevice> pairedDevices =
cwjBluetoothAdapter.getBondedDevices();
if (pairedDevices.size() > 0) //如果获取的结果大于 0,则开始逐个解析
{
for (BluetoothDevice device : pairedDevices) {
myArrayAdapter.add(device.getName() + " android123 " +
device.getAddress()); //获取每个设备的名称和 MAC 地址添加到数组适配
器 myArrayAdapter 中。
}
}
蓝牙模块
很多网友不明白如何让自己的手机被其他蓝牙设备发现如何设置,下面我们就
一起来说说
三、允许发现 enabling discoverability
如果需要用户确认操作,不需要获取底层蓝牙服务实例,可以通过一个
Intent 来传递 ACTION_REQUEST_DISCOVERABLE 参数, 这里通过
startActivityForResult 来强制获取一个结果,重写
startActivityForResult()方法获取执行结果,返 回结果有 RESULT_OK 和
RESULT_CANCELLED 分别代表开启和取消(失败),当然最简单的方法是直接执行,
示例代码如下
Intent cwjIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
cwjIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(cwjIntent);
接下来系统会提示用户是否允许,对话框如下
从 Android 2.0 开始提供最全面的蓝牙开发接口,API Level 为 5 的系统才能调
用,目前 Android Bluetooth API 包含了主要以下几类:BluetoothAdapter
BluetoothDevice、BluetoothSocket 、BluetoothServerSocket 和
BluetoothClass 它们均在 android.bluetooth 这个包中出现。
我们调用时除了需要考虑 API Level 至少为 5 外,还需注意添加相应的权限,
比如使用通讯需要在 androidmanifest.xml 加入<uses-permission
android:name="android.permission.BLUETOOTH" />,而开关蓝牙需要
android.permission.BLUETOOTH_ADMIN 权限。
三、建立通讯 establishing
对于建立一个蓝牙通讯,必须经过以下四个步骤:获取本地蓝牙设备、查
找远程设备、配对(已配对设备将会忽略这步的细节)、连接设备和传输数据.
在 Android 平台中首先我们需要查找本地活动的蓝牙适配器,通过
BluetoothAdapter 类的 getDefaultAdapter() 方法获得一个系统默认可用的蓝
牙设备,示例代码如下
BluetoothAdapter cwjBluetoothAdapter =
BluetoothAdapter.getDefaultAdapter();
if (cwjBluetoothAdapter == null) {
// Android 开发网提示大家本机没有找到蓝牙硬件或驱动存在问题
}
当然有了这步仍然不能建立连接,因为我们还不知道手机中的蓝牙功能是否
被开启,可以通过 cwjBluetoothAdapter 的.isEnabled 方法来判断,如果没有
开启,我们可以通过下面的代码提醒用户启用:
if (!cwjBluetoothAdapter.isEnabled()) {
Intent TurnOnBtIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(TurnOnBtIntent, REQUEST_ENABLE_BT);
}
这时用户会收到类似下面的窗口:
我们通过 startActivityForResult()方法发起的 Intent 将会在
onActivityResult()回调方法中获取用户的选 择,比如用户单击了 Yes 开启,
那么将会收到 RESULT_OK 的结果,如果 RESULT_CANCELED 则代表用户不愿意开
启蓝牙,当然 android123 提醒大家还可以通过其他方式来开启,比如说用
BluetoothDevice 获取蓝牙服务接口对象,是用 enable()方法来开启,无需询
问用户,这时就需要用到 android.permission.BLUETOOTH_ADMIN 权限。
如何判断系统蓝牙的状态呢? 建立 BroadcastReceiver 对象,接收
ACTION_STATE_CHANGED 动作,在 EXTRA_STATE 和 EXTRA_PREVIOUS_STATE 包含了
现在状态和过去的状态,最终的结果定义是 STATE_TURNING_ON 正在开启,
STATE_ON 已经开启, STATE_TURNING_OFF 正在关闭和 STATE_OFF 已经关闭,如
果有什么不明白的可以在我们的论坛中交流。
Android 蓝牙中的 RFCOMM
一 RFCOMM 通道:
RFCOMM 协议
一个基于欧洲电信标准协会 ETSI07.10 规程的串行线性仿真协议。此协议
提供 RS232 控制和状态信号,如基带上的损坏,CTS 以及数据信号等,为上层业
务(如传统的串行线缆应用)提供了传送能力。
RFCOMM 是一个简单传输协议,其目的是针对如何在两个不同设备上的应用
之间保证一条完整的通信路径,并在它们之间保持一通信段。
RFCOMM 协议概述
RFCOMM 通信段
RFCOMM 是为了兼容传统的串口应用,同时取代有线的通信方式,蓝牙协议
栈需要提供与有线串口一致的通信接口而开发出的协议。RFCOMM 协议提供对基
于 L2CAP 协议的串口仿真,基于 ETSI07.10。可支持在两个 BT 设备之间同时保
持高达 60 路的通信连接。
目的:
在两个不同设备(通信设备的两端)上的应用之间保证一条完整的通信路径,
并在他们之间保持一通信段。下图是一条完整的通信路径。
RFCOMM 只针对直接互连设备之间的连接,或者是设备与网络接入设备之间
的互连。通信两端设备必须兼容于 RFCOMM 协议,有两类设备:DTE (Data
Terminal Endpoint,通信终端,如 PC,PRINTER)和 DCE (Data Circuit
Endpoint,通信段的一部分,如 Modem)。此两类设备不作区分。
RFCOMM 服务
RFCOMM 仿真 RS232 串口,仿真过程包括非数据通路状态的传输,RFCOMM 内
置空 Modem 仿真标准框架。
RFCOMM 中的仿真 RS-232 通路
多串口仿真
两个采用 RFCOMM 通信的 BT 设备有可能同时打开多个串口,RFCOMM 支持同
时打开 60 个端口。
认识二:MAC 硬件地址
MAC(Medium/MediaAccess Control, 介质访问控制)MAC 地址是烧录在
NetworkInterfaceCard(网卡,NIC)里的.MAC 地址,也叫硬件地址,是由 48 比特
长(6 字节),16 进制的数字组成.0-23 位叫做组织唯一标志符
(organizationally unique,是识别 LAN(局域网)节点的标识.24-47 位是由厂家
自己分配。其中第 40 位是组播地址标志位。网卡的物理地址通常是由网卡生产
厂家烧入网卡的 EPROM(一种闪存芯片,通常可以通过程序擦写),它存储的是传
输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。
也就是说,在网络底层的物理传输过程中,是通过物理地址来识别主机的,
它一般也是全球唯一的。比如,著名的以太网卡,其物理地址是 48bit(比特位)
的整数,如:44-45-53-54-00-00,以机器可读的方式存入主机接口中。以太网
地址管理机构(除了管这个外还管别的)
(IEEE)(IEEE:电气和电子工程师协会)将以太网地址,也就是 48 比特的不同组
合,分为若干独立的连续地址组,生产以太网网卡的厂家就购买其中一组,具
体生产时,逐个将唯一地址赋予以太网卡。
剩余28页未读,继续阅读
资源评论
悠闲饭团
- 粉丝: 151
- 资源: 3303
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功