文档库 最新最全的文档下载
当前位置:文档库 › Android 蓝牙AVRCP功能的实现

Android 蓝牙AVRCP功能的实现

Android 蓝牙AVRCP功能的实现
Android 蓝牙AVRCP功能的实现

Android 蓝牙AVRCP功能的实现

作者:Macro Liu AVRCP的按键定义:

\sdk\emulator\keymaps\AVRCP.kl

key 200 MEDIA_PLAY_PAUSE WAKE

key 201 MEDIA_PLAY_PAUSE WAKE

key 166 MEDIA_STOP WAKE

key 163 MEDIA_NEXT WAKE

key 165 MEDIA_PREVIOUS WAKE

key 168 MEDIA_REWIND WAKE

key 208 MEDIA_FAST_FORWARD WAKE

BCM(broadcom)宏定义需要打开:

BOARD_HAVE_BLUETOOTH_BCM := true

BT音频控制的代码

external\bluetooth\bluez\audio\control.c

(1) 按键的MAP

static struct {

const char *name;

uint8_t avrcp;

uint16_t uinput;

} key_map[] = {

{ "PLAY", PLAY_OP, KEY_PLAYCD },

{ "STOP", STOP_OP, KEY_STOPCD },

{ "PAUSE", PAUSE_OP, KEY_PAUSECD },

{ "FORWARD", FORWARD_OP, KEY_NEXTSONG },

{ "BACKWARD", BACKWARD_OP, KEY_PREVIOUSSONG },

{ "REWIND", REWIND_OP, KEY_REWIND },

{ "FAST FORWARD", FAST_FORWARD_OP, KEY_FASTFORWARD },

{ NULL }

};

(2) 按键处理

static void handle_panel_passthrough(struct control *control,

{

for (i = 0; key_map[i].name != NULL; i++) {

uint8_t key_quirks;

if ((operands[0] & 0x7F) != key_map[i].avrcp)

continue;

DBG("AVRCP: %s %s", key_map[i].name, status);

key_quirks = control->key_quirks[key_map[i].avrcp];

if (key_quirks & QUIRK_NO_RELEASE) {

if (!pressed) {

DBG("AVRCP: Ignoring release");

break;

}

DBG("AVRCP: treating key press as press + release");

send_key(control->uinput, key_map[i].uinput, 1);

send_key(control->uinput, key_map[i].uinput, 0);

break;

}

send_key(control->uinput, key_map[i].uinput, pressed);

break;

}

}

HCIDUMP数据分析

以Sony耳机DRC-BT15为例

#adb shell

#hcidump –X

左键:

> ACL data: handle 12 flags 0x02 dlen 12

L2CAP(d): cid 0x0042 len 8 [psm 0]

0000: 30 11 0e 00 48 7c 4c 00 0...H|L. < HCI Command: Exit Sniff Mode (0x02|0x0004) plen 2

0000: 0c 00 ..

< ACL data: handle 12 flags 0x00 dlen 12

0000: 08 00 4b 00 32 11 0e 09 48 7c 4c 00 ..K.2...H|L. > HCI Event: Max Slots Change (0x1b) plen 3

0000: 0c 00 05 ...

> HCI Event: Mode Change (0x14) plen 6

0000: 00 0c 00 00 00 00 ......

> HCI Event: Command Status (0x0f) plen 4

0000: 0c 01 04 08 ....

> ACL data: handle 12 flags 0x02 dlen 12

L2CAP(d): cid 0x0042 len 8 [psm 0]

0000: 40 11 0e 00 48 7c cc 00 @...H|? < ACL data: handle 12 flags 0x00 dlen 12

0000: 08 00 4b 00 42 11 0e 09 48 7c cc 00 ..K.B...H|? > HCI Event: Number of Completed Packets (0x13) plen 5

0000: 01 0c 00 02 00 .....

播放/暂停:

> ACL data: handle 12 flags 0x02 dlen 12

L2CAP(d): cid 0x0042 len 8 [psm 0]

0000: 50 11 0e 00 48 7c 4b 00 P...H|K. < ACL data: handle 12 flags 0x00 dlen 12

0000: 08 00 4b 00 52 11 0e 09 48 7c 4b 00 ..K.R...H|K. > ACL data: handle 12 flags 0x02 dlen 12

L2CAP(d): cid 0x0042 len 8 [psm 0]

0000: 60 11 0e 00 48 7c cb 00 `...H|? < ACL data: handle 12 flags 0x00 dlen 12

0000: 08 00 4b 00 62 11 0e 09 48 7c cb 00 ..K.b...H|? > HCI Event: Number of Completed Packets (0x13) plen 5

0000: 01 0c 00 02 00 .....

右键:

> ACL data: handle 12 flags 0x02 dlen 12

L2CAP(d): cid 0x0042 len 8 [psm 0]

0000: 70 11 0e 00 48 7c 46 00 p...H|F. < ACL data: handle 12 flags 0x00 dlen 12

0000: 08 00 4b 00 72 11 0e 09 48 7c 46 00 ..K.r...H|F. > ACL data: handle 12 flags 0x02 dlen 12

L2CAP(d): cid 0x0042 len 8 [psm 0]

0000: 80 11 0e 00 48 7c c6 00 ....H|? < ACL data: handle 12 flags 0x00 dlen 12

0000: 08 00 4b 00 82 11 0e 09 48 7c c6 00 ..K.....H|? > HCI Event: Number of Completed Packets (0x13) plen 5

0000: 01 0c 00 02 00 .....

> HCI Event: Max Slots Change (0x1b) plen 3

0000: 0c 00 01 ...

> HCI Event: Mode Change (0x14) plen 6

0000: 00 0c 00 02 c8 00 ....?

然后将control.c的日志打印出来:

按一次”“播放/暂停键”:

D/ACRVP ( 237): --- handle_panel_passthrough ----

D/ACRVP ( 237): operands[0] = 46 对应PAUSE_OP

D/ACRVP ( 237): key_quirks = 0, pressed = 1按键按下

D/ACRVP ( 237): control->uinput = fffffffe,send_key = 201对应MEDIA_PLAY_PAUSE

D/ACRVP ( 237): --- handle_panel_passthrough ----

D/ACRVP ( 237): operands[0] = c6 (= 0x46 | 0x80 表示按键释放了) D/ACRVP ( 237): key_quirks = 0, pressed = 0按键释放

D/ACRVP ( 237): control->uinput = fffffffe,send_key = 201 对应MEDIA_PLAY_PAUSE

再按一次”“播放/暂停键”:

D/ACRVP ( 237): --- handle_panel_passthrough ----

D/ACRVP ( 237): operands[0] = 44 对应PLAY_OP

D/ACRVP ( 237): key_quirks = 0, pressed = 1 按键按下

D/ACRVP ( 237): control->uinput = fffffffe,send_key = 200 对应MEDIA_PLAY_PAUSE

D/ACRVP ( 237): --- handle_panel_passthrough ----

D/ACRVP ( 237): operands[0] = c4

D/ACRVP ( 237): key_quirks = 0, pressed = 0 按键释放

D/ACRVP ( 237): control->uinput = fffffffe,send_key = 200 对应MEDIA_PLAY_PAUSE

next key:

D/ACRVP ( 237): --- handle_panel_passthrough ----

D/ACRVP ( 237): operands[0] = 4b对应FORWARD_OP

D/ACRVP ( 237): key_quirks = 0, pressed = 1

D/ACRVP ( 237): control->uinput = fffffffe,send_key = 163 对应MEDIA_NEXT

D/ACRVP ( 237): --- handle_panel_passthrough ----

D/ACRVP ( 237): operands[0] = cb

D/ACRVP ( 237): key_quirks = 0, pressed = 0

D/ACRVP ( 237): control->uinput = fffffffe,send_key = 163

prev key:

D/ACRVP ( 237): --- handle_panel_passthrough ----

D/ACRVP ( 237): operands[0] = 4c 对应BACKWARD_OP

D/ACRVP ( 237): key_quirks = 0, pressed = 1

D/ACRVP ( 237): control->uinput = fffffffe,send_key = 165 对应

D/ACRVP ( 237): --- handle_panel_passthrough ----

D/ACRVP ( 237): operands[0] = cc

D/ACRVP ( 237): key_quirks = 0, pressed = 0

D/ACRVP ( 237): control->uinput = fffffffe,send_key = 165 MEDIA_PREVIOUS

从上面可以看到bluetooth的协议栈blueZ是没有问题的

将frameworks\base\libs\ui\EventHub.cpp的LOG打开,只能看到了control.c的日志,EventHub的getEvent完全不响应

观察所有log日志发现,openDevice里也没有装载AVRCP.kl

初步判断event有问题

event分析:

$ adb shell

# cd /proc/bus/input

# cat devices

cat devices

# cat devices

cat devices

I: Bus=0019 Vendor=0001 Product=0001 Version=0001 参考s3c-keypad.c N: Name="s3c-keypad" input_dev->name = DEVICE_NAME;

P: Phys=s3c-keypad/input0 input_dev->phys = "s3c-keypad/input0"; S: Sysfs=/devices/virtual/input/input0 virtual的?

U: Uniq=

H: Handlers=event0

B: EV=3

B: KEY=4000400 0

I: Bus=0019 Vendor=0001 Product=0001 Version=0100参考vpad_buttons.c

N: Name="s3c-eintkey" input->name = pdev->name, gpio_keys_device_https://www.wendangku.net/doc/b813749878.html, = "s3c-eintkey",

P: Phys=gpio-keys/input0 input->phys = "gpio-keys/input0"

S: Sysfs=/devices/platform/s3c-eintkey/input/input1 为什么这里是platform目录?

U: Uniq=

H: Handlers=event1

B: EV=3

B: KEY=100000 0 0 0

I: Bus=0018 Vendor=0000 Product=0000 Version=0000 参考amri_ts.c

N: Name="amri_ts" amri_ts_https://www.wendangku.net/doc/b813749878.html, = "amri_ts"

P: Phys= 没有定义

S: Sysfs=/devices/platform/s3c2440-i2c.0/i2c-0/0-0033/input/input2 为什么这里是platform目录?

U: Uniq=

H: Handlers=event2

B: EV=b

B: KEY=400 0 0 0 0 0 40000800 40 0 0 10000

B: ABS=2650000 0

I: Bus=0000 Vendor=0000 Product=0000 Version=0000

N: Name="ecompass_data"

P: Phys=

S: Sysfs=/devices/virtual/input/input3

U: Uniq=

H: Handlers=event3

B: EV=9

B: ABS=307bf

从上面可以看到,完全没有AVRCP的event。

解决办法:

Kernel

$ make menuconfig

CONFIG_INPUT_UINPUT

解决后的状况:

$ adb shell

# cd /proc/bus/input

# cat devices

显示增加了一个event

I: Bus=0005 Vendor=0000 Product=0000 Version=0000

N: Name="AVRCP"

P: Phys=

S: Sysfs=/devices/virtual/input/input4

U: Uniq=

H: Handlers=event4

B: EV=100007

B: KEY=10300 168 0 0 0 0 0

B: REL=0

看openDevice的信息:

D/EventHub( 84): EventHub::readNotify nfd: 87

D/EventHub( 84): Opening device: /dev/input/event4

D/EventHub( 84): Getting keys...

D/EventHub( 84): Getting absolute controllers...

D/EventHub( 84): keylayoutFilename = /system/usr/keylayout/AVRCP.kl

I/EventHub( 84): New keyboard: device->id=0x10003 devname='AVRCP' propName='hw.keyboards.65539.devname'

keylayout='/system/usr/keylayout/AVRCP.kl'

I/EventHub( 84): New device: path=/dev/input/event4 name=AVRCP id=0x10003 (of 0x4) index=4 fd=196 classes=0x1

D/EventHub( 84): Adding device /dev/input/event4 0x361800 at 4, id = 3, classes = 0x1

D/EventHub( 84): Reporting device opened: id=0x10003, name=/dev/input/event4

按键时也可以看到EventHub的信息了:

Log如下:

D/ACRVP ( 236): --- handle_panel_passthrough ----

D/ACRVP ( 236): operands[0] = 46

D/ACRVP ( 236): key_quirks = 0, pressed = 1

D/ACRVP ( 236): control->uinput = 14,send_key = 201 control.c 发出201号键,按键按下了

D/EventHub( 84): /dev/input/event4 got: t0=937, t1=582930, type=1, code=201, v=1 表示从event4得到201号键 MEDIA_PLAY_PAUSE

D/EventHub( 84): iev.code=201 keyCode=85 flags=0x00000001 err=0

D/EventHub( 84): /dev/input/event4 got: t0=937, t1=600241, type=0, code=0, v=0

D/AudioHardware( 61): AudioStreamOutALSA::setParameters() routing=0 D/ACRVP ( 236): --- handle_panel_passthrough ----

D/ACRVP ( 236): operands[0] = c6

D/ACRVP ( 236): key_quirks = 0, pressed = 0

D/ACRVP ( 236): control->uinput = 14,send_key = c9

D/EventHub( 84): /dev/input/event4 got: t0=937, t1=664391, type=1, code=201, v=0 control.c发出201号键,按键释放了

D/EventHub( 84): iev.code=201 keyCode=85 flags=0x00000001 err=0

D/EventHub( 84): /dev/input/event4 got: t0=937, t1=664406, type=0, code=0, v=0

D/A2DP ( 61): a2dp_stop

D/A2DP ( 61): bluetooth_stop

E/BluetoothEventLoop.cpp( 84): event_filter: Received signal org.bluez.AudioSink:Stopped from /org/bluez/236/hci0/dev_00_1D_BA_A5_D8_1C

E/BluetoothEventLoop.cpp( 84): event_filter: Received signal org.bluez.AudioSink:PropertyChanged from /org/bluez/236/hci0/dev_00_1D_BA_A5_D8_1C

E/BluetoothEventLoop.cpp( 84): event_filter: Received signal org.bluez.AudioSink:PropertyChanged from /org/bluez/236/hci0/dev_00_1D_BA_A5_D8_1C

V/BluetoothEventRedirector( 244): Received android.bluetooth.a2dp.action.SINK_STATE_CHANGED

D/CachedBluetoothDevice( 244): onProfileStateChanged: profile A2DP newProfileState 2

D/BluetoothA2dpService( 84): A2DP state : device: 00:1D:BA:A5:D8:1C State:4->2

D/A2DP ( 61): Received BT_RESPONSE - BT_STOP_STREAM

D/dalvikvm( 285): GC_EXPLICIT freed 87K, 56% free 2640K/5895K, external 1625K/2137K, paused 75ms

Macro Liu

2011-08-01

android蓝牙介绍二蓝牙代码架构及其uart 到rfcomm流程

Android bluetooth介绍(二) android 蓝牙代码架构及其uart 到rfcomm 流程 一、Android Bluetooth Architecture蓝牙代码架构部分(google 官方蓝牙框架) Android的蓝牙系统,自下而上包括以下一些内容如上图所示: 1、串口驱动 Linux的内核的蓝牙驱动程、Linux的内核的蓝牙协议的层 2、BlueZ的适配器

BlueZ的(蓝牙在用户空间的函式库) bluez代码结构 Bluetooth协议栈BlueZ分为两部分:内核代码和用户态程序及工具集。(1)、内核代码:由BlueZ核心协议和驱动程序组成 Bluetooth协议实现在内核源代码 kernel/net/bluetooth中。包括 hci,l2cap,hid,rfcomm,sco,SDP,BNEP等协议的实现。 (2)、驱动程序:kernel/driver/bluetooth中,包含Linuxkernel对各种接口的 Bluetooth device的驱动,如:USB接口,串口等。 (3)、用户态程序及工具集: 包括应用程序接口和BlueZ工具集。BlueZ提供函数库以及应用程序接口,便于程序员开发bluetooth应用程序。BlueZ utils是主要工具集,实现对bluetooth设备的初始化和控制。 3、蓝牙相关的应用程序接口 Android.buletooth包中的各个Class(蓝牙在框架层的内容-----java)

同样下图也是一张比较经典的蓝牙代码架构图(google官方提供) 二、蓝牙通过Hciattach启动串口流程: 1、hciattach总体流程

Android蓝牙编程

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 pairedDevices = cwjBluetoothAdapter.getBondedDevices();

Android蓝牙功能及RFCOMMSDP简介

A n d r o i d蓝牙功能及R F C O M M S D P简介文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]

A n d r o i d2.0蓝牙功能及R F C O M M、S D P简介一.Android2.0蓝牙功能简介 Google于2009年10月28日发布了AndroidSDK2.0版本。对于开发人员来说,最关心的莫过于新版本添加了哪些新特性,API有哪些改动。2.0版本发布前,最受关注的就是能否在新版本中添加蓝牙功能。Google果然不负众望,在2.0版本中加入了蓝牙功能,使Android平台功能更加强大。蓝牙模块实现了以下功能: 蓝牙的打开/关闭。 设备和服务的探索。 使用RFCOMM连接远程设备发送/接收数据。 公布RFCOMM服务和监听接入的RFCOMM连接。 新版本添加了android.bluetooth包。该包提供了一些用于管理蓝牙设备的功能类。蓝牙的APIs允许应用程序连接或断开headset(头戴式耳机),扫描其他蓝牙设备并与之配对。增强了写和修改本地服务发现协议(ServiceDiscoveryProtocol,SDP)数据库,查询其他蓝牙设备SDP数据库,在Android上建立RFCOMM通道/Socket,连接到其他设备指定Socket的控制。 注意:不是所有的Android设备都能保证有蓝牙功能。 下面是android.bluetooth包中类的简述: BluetoothAdapter代表本地蓝牙适配器。 可以使用getDefaultAdapter()方法获得默认的本地蓝牙适配 器。

Android蓝牙开发经典笔记,程序和说明

Bluetooth Low Energy——蓝牙低功耗 Android4.3(API级别18)引入内置平台支持BLE的central角色,同时提供API和app应用程序用来发现设备,查询服务,和读/写characteristics。与传统蓝牙(ClassicBluetooth)不同,蓝牙低功耗(BLE)的目的是提供更显著的低功耗。这使得Android 应用程序可以和具有低功耗的要求BLE设备,如接近传感器,心脏速率监视器,健身设备等进行通信。 关键术语和概念 下面是关键BLE术语和概念的总结: 通用属性规范(GATT)—GATTprofile是一个通用规范用于在BLE链路发送和接收被称为―属性(attributes)‖的数据片。目前所有的低功耗应用profile都是基于GATT。 蓝牙SIG定义了许多profile用于低功耗设备。Profile(配置文件)是一个规范,规范了设备如何工作在一个特定的应用场景。注意:一个设备可以实现多个profile。例如,一个设备可以包含一个心脏监测仪和电池电平检测器。 属性协议(ATT )—GATT是建立在属性协议(ATT )的顶层,通常也被称为GATT/ ATT 。ATT进行了优化用于在BLE设备上运行。为此,它采用尽可能少的字节越好。每个attribute 属性被UUID(通用唯一标识符)唯一标识,UUID是标准128-bit格式的ID用来唯一标识信息。attributes 被ATT 格式化characteristics和services形式进行传送。 特征(Characteristics)—一个characteristics包含一个单独的value值和0 –n个用来描述characteristic 值(value)的descriptors。一个characteristics可以被认为是一种类型的,类似于一个类。 描述符(descriptor)—descriptor是被定义的attributes,用来描述一个characteristic的值。例如,一个descriptor可以指定一个人类可读的描述中,在可接受的范围里characteristic值,或者是测量单位,用来明确characteristic的值。 服务(service)—service是characteristic的集合。例如,你可以有一个所谓的―Heart RateMonitor‖service,其中包括characteristic,如―heart rate measurement ‖。你可以在https://www.wendangku.net/doc/b813749878.html,找到关于一系列基于GATT的profile和service。 角色和职责 以下是适用于当一个Android设备与BLE设备交互的角色和责任: 中心设备(central)与外围设备(peripheral)。这也适用于BLE连接本身。Central设备进行扫描,寻找advertisenment,peripheral设备发出advertisement。 GATT server(服务器)与GATTclient(客户端)。这决定了两个设备建立连接后如何互相交互。 要了解它们的区别,假设你有一个Android手机和活动跟踪器,活动跟踪器是一个BLE装置。这款手机扮演central角色;活动跟踪器扮演peripheral角色(建立一个BLE连接,必须具备两者。如果两个设备只支持central角色或peripheral角色,不能跟对方建立一个BLE连接)。

Android平台蓝牙通信的实现

Android平台蓝牙通信的实现 一、Android蓝牙概况 1.蓝牙的来历 蓝牙这个名称来自于第十世纪的一位丹麦国王哈拉尔蓝牙王,Blatand 在英文里的意思可以被解释为Bluetooth( 蓝牙)因为国王喜欢吃蓝莓,牙龈每天都是蓝色的所以叫蓝牙。在行业协会筹备阶段,需要一个极具有表现力的名字来命名这项高新技术。行业组织人员,在经过一夜关于欧洲历史和未来无线技术发展的讨论后,有些人认为用Blatand 国王的名字命名再合适不过了。Blatand 国王将挪威,瑞典和丹麦统一起来;他的口齿伶俐,善于交际,就如同这项即将面世的技术,技术将被定义为允许不同工业领域之间的协调工作,保持着各个系统领域之间的良好交流,例如计算机,手机和汽车行业之间的工作。名字于是就这么定下来了。 Blatand 国王 蓝牙的创始人是爱立信公司,爱立信早在1994 年就已进行研发。1997 年,爱立信与其他设备生产商联系,并激发了他们对该项技术的浓厚兴趣。1998 年2 月,跨国大公司包括诺基亚、苹果、三星组成的一个特殊兴趣小组(SIG),他们共同的目标是建立一个全球性的小范围无线通信技术,即蓝牙。而蓝牙这个标志的设计:它取自Harald Bluetooth 名字中的「H」和「B」两个字母,用古北欧字母来表示,将这两者结合起来,就成为了蓝牙的logo (见图)。

蓝牙logo 2.蓝牙开发概况 对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少 Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发 现如今,蓝牙已是每部安卓手机标配的功能,多用于蓝牙耳机和传输文件,还可以多部手机之间建立蓝牙通信,本文就通过参考SDK自带的一个BluetoothChat的例程,开发一个新的蓝牙聊天室。 在Android1 的时候,相关API 非常不完善,还不能简单的使用Bluetooth 开发,有一个开源项目可以帮助程序员使用、开发蓝牙,支持直接方法bluetooth 协议栈。在Android2 以后,框架提供了一些官方API 来进行蓝牙的通信,但目前的程序也比较不完善。本文主要讨论Android2 蓝牙通信的API 使用方法。 首先看聊天效果图: 二、Android编程介绍 (一)编程环境 Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Android蓝牙功能及RFCOSDP简介

A n d r o i d蓝牙功能及R F C O S D P简介 集团标准化小组:[VVOPPT-JOPP28-JPPTL98-LOPPNN]

A n d r o i d2.0蓝牙功能及R F C O M M、S D P简介 一.Android2.0蓝牙功能简介 Google于2009年10月28日发布了AndroidSDK2.0版本。对于开发人员来说,最关心的莫过于新版本添加了哪些新特性,API有哪些改动。2.0版本发布前,最受关注的就是能否在新版本中添加蓝牙功能。Google果然不负众望,在2.0版本中加入了蓝牙功能,使Android平台功能更加强大。蓝牙模块实现了以下功能: 蓝牙的打开/关闭。 设备和服务的探索。 使用RFCOMM连接远程设备发送/接收数据。 公布RFCOMM服务和监听接入的RFCOMM连接。 新版本添加了android.bluetooth包。该包提供了一些用于管理蓝牙设备的功能类。蓝牙的APIs允许应用程序连接或断开headset(头戴式耳机),扫描其他蓝牙设备并与之配对。增强了写和修改本地服务发现协议(ServiceDiscoveryProtocol,SDP)数据库,查询其他蓝牙设备SDP数据库,在Android上建立RFCOMM通道/Socket,连接到其他设备指定Socket的控制。 注意:不是所有的Android设备都能保证有蓝牙功能。 下面是android.bluetooth包中类的简述: BluetoothAdapter代表本地蓝牙适配器。 可以使用getDefaultAdapter()方法获得默认的本地蓝牙适配器。 使用BluetoothDevice类在远程蓝牙设备上进行操作。 BluetoothClass表示一个蓝牙类?。 蓝牙类是一个32位字段,这些位的格式定义在。这个类包含32位字段,提供常数和方 法去确定在这个字段中编码的服务类和设备类(服务类可以有多个)。 每个蓝牙类可组成零至多个服务类,确切的说是一个设备类。这个设备类进一步分解为 主要和次要设备类组件。 这个类通常用于表示一个设备(如在用户界面显示一个图标),但不能可靠的描述哪个 蓝牙配置或服务被设备支持。精确的服务搜索是通过SDP请求得到的。 .远程设备可以通过getBluetoothClass()方法检索这个类。 BluetoothClass.Device蓝牙设备类。确切的说,每个BluetoothClass编码一个设备类,分为主要和次要组 件。 BluetoothClass.Device里的常量表示一个主设备和从设备的组合(即完整的设备类)

蓝牙模块介绍

Android 手机蓝牙模块介绍: 主机模块实物与从机一样,模块上有白点,主机模块会自动和从机模块配对,省却配对的麻烦,适合在需要两个设备间通过蓝牙串口无线通信的应用,无需电脑. 蓝牙透传模块可以让你原来使用串口的设备摆脱线缆的束缚在10米范围内实现无线串口通信。使用该模块无需了解复杂的蓝牙底层协议,只要简单的几个步骤即可享受到无线通信的便捷。蓝牙透传模块只有4个AT指令,分别是测试通讯,改名称,改波特率,改配对密码,AT指令必须从TXD,RXD信号脚设置,不能通过蓝牙信道设置。发送AT指令的设备可以是各种类型的MCU(比如51,avr,pic,msp430,arm等),也可以是电脑通过串口(PC串口接MAX232以后或者USB转串口)发送。 特别注意: 1、主机模块和从机模块均不能切换工作模式,只能是单一的工作模式(主或从) 2、主机模块只能配对HC06的从机模块,主机模块之间不能配对连接,主机模块也不能跟带蓝牙的电脑或者手机等其他蓝牙设备配对 3、从机模块可以跟带蓝牙的电脑或者部分带蓝牙的手机配对使用,从机模块之间不能连接,如果电脑没有 4、主机模块的AT指令比从机模块少了AT+NAME指令,其他指令相同 5、主机模块和从机模块的接口均为3.3V电平,可以直接连接各种TTL电平带串口MCU(5V的MCU请串联1K电阻)直接连接,设置参数可以用MCU或者本店的USB转串口,或者增加MAX232转换电路后的电脑串口 小常识: TXD:发送端,一般表示为自己的发送端,正常通信的时候接另一个设备的RXD。 RXD:接收端,一般表示为自己的接收端,正常通信的时候接另一个设备的TXD。 正常通信时候本身的TXD永远接设备的RXD! 自收自发:顾名思义,也就是自己接收自己发送的数据,也就是自身的TXD接到自身的RXD,用来测试本身的发送和接收是否正常。也称回环测试。 由于蓝牙核心板不方便接线,因此我们把它焊接到底板上,底板上含3.3V LDO,为了方便再拆卸,仅焊接有用的引脚,引出VCC、GND、TXD、RXD(TXD、RXD均为3.3V电平)四根线方便接线,STATE为LED 状态输出脚,未连接时输出脉冲,连接后输出高电平,可由MCU判断状态,需自行焊接插针,KEY接口对从机无效。该蓝牙模块可以接各种单片机,USB转串口等串口设备,输入电压3.6~6V(推荐5V,不得超过7V), 模块尺寸:3.57cm*1.52cm(cm) 注意:所标价格为单个模块的价格,并非一对模块的价格!!! 模块与单片机请遵循以下连接:

ble简介和androidble编程

ble简介和androidble编程 一.BLE和BT区别其实我知道许多程序员不太喜欢阅读除了代码以外的文档,因为有时这些过于冗长的文档对编程并没有更多的好处,有了协议,接口,demo差不多很多人就能写出很好质量的代码了。但其实更深入的编程是少了阅读的,阅读文档可以解决很多编程中遇到的困难,比如在大数据大流量情况下,很多正常的程序会表现出不可靠的一面,这已经不是够编程能解决的了,硬件的配置,服务器带宽,使用的数据库,调用的接口都有可能是瓶颈。比如BLE,同样的蓝牙,但却有着本质区别,一个表现就是不是所有蓝牙设备都支持BLE,编程如果不考虑这个问题,程序出错就会迷茫。再比如连接到BLE或者蓝牙上的设备是有数量限制的,如果不知道这个限制,在连接不上时,也会六神无主。BLE在智家居中和移动设备中的应用方兴未艾,做深入的研究推广到更多的应用上,还是有意义的。 1蓝牙的历史:蓝牙的创始公司是爱立信。1994年爱立信开始对小范围无线通信技术进行研发,在1997年,爱立信的研究激发了其他公司的浓厚兴趣,于是1998年2月,一些跨国大公司包括诺基亚、苹果、三星组成的一个特殊兴趣小组(SIG),他们共同的目标是建立一个全球性的小范围无线通信技术,该项技术就是蓝牙。2.BLE 是Bluetooth Low

Energy的缩写,又叫蓝牙4.0,区别于蓝牙3.0和之前的技术。BLE前身是NOKIA开发的Wibree技术,主要用于实现移动智能终端与周边配件之间的持续连接,是功耗极低的短距离无线通信技术,并且有效传输距离被提升到了100米以上,同时只需要一颗纽扣电池就可以工作数年之久。 3. BLE是在蓝牙技术的基础上发展起来的,既同于蓝牙,又区别于传统蓝牙。BLE设备分单模和双模两种,双模简称BR,商标为Bluetooth Smart Ready,单模简称BLE或者LE,商标为Bluetooth Smart。Android是在4.3后才支持BLE,这可以解释不是所有蓝牙手机都支持BLE,而且支持BLE的蓝牙手机一般是双模的。4.双模兼容传统蓝牙,可以和传统蓝牙通信,也可以和BLE通信,常用在手机上,android4.3和IOS4.0之后版本都支持BR,也就是双模设备。单模只能和BR和单模的设备通信,不能和传统蓝牙通信,由于功耗低,待机长,所以常用在手环的智能设备上。这可以解释手机上的BLE 与手环等设备上的BLE的区别。5不是所有手机都支持BLE,因为BLE不仅仅依靠软件实现,同时需要硬件支持,于是有很多手机不能联接智能手环等设备。Android4.3手机上安装的是双模BR,因此兼容蓝牙3.0之前的技术,既能与BLE设备通信,也能与传统蓝牙通信,比较耗电,能够像传统设备一样高速传输。大部分智能手环使用的单工BLE,不支持传统蓝牙,不能与之联结和通信,低功耗低速率设备。

Android+2.0+蓝牙功能及RFCOMM、SDP简介

Android 2.0 蓝牙功能及RFCOMM、SDP简介 一.Android 2.0蓝牙功能简介 Google 于2009年10月28日发布了Android SDK 2.0版本。对于开发人员来说,最关心的莫过于新版本添加了哪些新特性,API有哪些改动。2.0版本发布前,最受关注的就是能否在新版本中添加蓝牙功能。Google果然不负众望,在2.0版本中加入了蓝牙功能,使Android平台功能更加强大。蓝牙模块实现了以下功能: ?蓝牙的打开/关闭。 ?设备和服务的探索。 ?使用RFCOMM连接远程设备发送/接收数据。 ?公布RFCOMM服务和监听接入的RFCOMM连接。 新版本添加了android.bluetooth包。该包提供了一些用于管理蓝牙设备的功能类。蓝牙的APIs允许应用程序连接或断开headset(头戴式耳机),扫描其他蓝牙设备并与之配对。增强了写和修改本地服务发现协议(Service Discovery Protocol ,SDP)数据库,查询其他蓝牙设备SDP数据库,在Android上建立RFCOMM通道/Socket,连接到其他设备指定Socket 的控制。 注意:不是所有的Android设备都能保证有蓝牙功能。 下面是android.bluetooth包中类的简述:

Android蓝牙模型原理及设备之间的连接已再【eoeAndroid特刊】第六期中有所说明,在此不做赘述。详情请参见【eoeAndroid特刊】第六期4-6节。 二.协议简述 蓝牙规范(Specification of the Bluetooth System)就是蓝牙无线通信协议标准,它规定了蓝牙应用产品应遵循的标准和需要达到的要求。蓝牙协议规范遵循开放系统互连参考模型(Open System Interconnetion/Referenced Model, OSI/RM),从低到高地定义了蓝牙协议堆栈的各个层次。 在蓝牙规范中,中介协议是为高层应用协议或程序在蓝牙逻辑链路上工作提供了必要的支持,为应用曾提供了各种不同的标准接口。这部分协议包括RFCOMM、SDP、IrDA、(PPP/IP/TCP/UDP)、(TCS/AT)等。 2.1 串口仿真协议(RFCOMM) 基于欧洲电信标准化协会(European Telecommunication Standardization Institute, ETSI)的TS07.10标准制定。该协议用于模拟串行接口环境,使得基于串口的传统应用仅作少量的修改或者不做任何修改可以直接在该层上运行。 通过提供串行端口仿真,RFCOMM 可以同时支持遗留串行端口应用程序以及其它应用程序中的OBEX 协议。RFCOMM 是ETSI TS 07.10 标准的一个子集,也具有一些蓝牙特定的适配性。 RFCOMM 协议能在两台蓝牙设备之间同时维持多达60 个连接。蓝牙设备中同时使用的连接数目取决于特定实施。 由于有了RFCOMM,完整的通信路径包括两个运行在不同设备(通信端点)上的应用程序及它们之间的通信段。上图显示了完整的通信路径 RFCOMM 旨在覆盖利用串行端口设备的应用程序。在简单的配置中,通信段是一个设

ANDROID蓝牙编程

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, 蓝牙模块

Android之蓝牙驱动开发总结

Android之蓝牙驱动开 发总结

二Android Bluetooth架构 (1) 2.1 Bluetooth架构图 (1) 2.2 Bluetooth代码层次结构 (3) 三Bluetooth协议栈分析 (4) 3.1 蓝牙协议栈 (4) 3.2 Android与蓝牙协议栈的关系 (5) 四Bluetooth之HCI层分析 (5) 4.1 HCI层与基带的通信方式 (6) 4.2 包的分析及研究 (7) 4.3 通信过程的研究与分析 (8) 五Bluetooth之编程实现 (8) 5.1 HCI层编程 (8) 5.2 L2CAP层编程 (10) 5.3 SDP层编程 (12) 六Bluetooth之启动过程实现 (13) 6.1 Bluetooth启动步骤 (14) 6.2 Bluetooth启动流程 (14) 6.3 Bluetooth数据流向 (14) 6.4 Bluez控制流程 (14) 6.5 Bluetooth启动过程分析 (15) 七Bluetooth之驱动移植 (15) 7.1 android系统配置 (15) 7.2 启动项修改 (16) 7.3 电源管理rfkill驱动 (16) 7.4 Rebuild Android image and reboot (16) 7.5 实现BT睡眠唤醒机制 (16) 7.6 系统集成 (17) 八Bluetooth之调试与编译 (17) 8.1 Bluetooth驱动调试 (17)

九Bluetooth之应用程序开发 (18) 9.1 Bluetooth的API开发 (18) 9.2 The Basics开发 (18) 9.3 Bluetooth Permissions开发 (19) 9.4 Setting Up Bluetooth服务 (19) 9.5 Finding Devices服务 (20) 9.6 Connecting Devices服务 (22) 9.7 Managing a Connection服务 (26) 9.8 Working with Profiles服务 (28) 十总结与疑问 (29)

Android蓝牙功能及RFCOSDP简介

A n d r o i d2.0蓝牙功能及R F C O M M、S D P简介 一.Android2.0蓝牙功能简介 Google于2009年10月28日发布了AndroidSDK2.0版本。对于开发人员来说, 最关心的莫过于新版本添加了哪些新特性,API有哪些改动。2.0版本发布前,最受 关注的就是能否在新版本中添加蓝牙功能。Google果然不负众望,在2.0版本中加 入了蓝牙功能,使Android平台功能更加强大。蓝牙模块实现了以下功能: ?蓝牙的打开/关闭。 ?设备和服务的探索。 ?使用RFCOMM连接远程设备发送/接收数据。 ?公布RFCOMM服务和监听接入的RFCOMM连接。 新版本添加了android.bluetooth包。该包提供了一些用于管理蓝牙设备的功能类。蓝牙的APIs允许应用程序连接或断开headset(头戴式耳机),扫描其他蓝牙设备并与之配对。增强了写和修改本地服务发现协议(ServiceDiscoveryProtocol,SDP)数据库,查询其他蓝牙设备SDP数据库,在Android上建立RFCOMM通道/Socket,连接到其他设备指定Socket的控制。 注意:不是所有的Android设备都能保证有蓝牙功能。 下面是android.bluetooth包中类的简述:

Android蓝牙模型原理及设备之间的连接已再【eoeAndroid特刊】第六期中有所说明,在此不做赘述。详情请参见【eoeAndroid特刊】第六期4-6节。 二.协议简述 蓝牙规范(SpecificationoftheBluetoothSystem)就是蓝牙无线通信协议标准,它规定了蓝牙应用产品应遵循的标准和需要达到的要求。蓝牙协议规范遵循开放系

蓝牙app开发-Android开发解析

蓝牙app开发-Android开发解析 深圳蓝牙app软件开发公司《酷点网络》由于近期正在开发一个通过蓝牙进行数据传递的模块,在参考了有关资料,并详细阅读了Android的官方文档后,总结了Android中蓝牙模块的使用 1. 使用蓝牙的响应权限 复制代码代码如下: 2. 配置本机蓝牙模块 在这里首先要了解对蓝牙操作一个核心类BluetoothAdapter 复制代码代码如下: BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); //直接打开系统的蓝牙设置面板 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, 0x1); //直接打开蓝牙 adapter.enable(); //关闭蓝牙 adapter.disable(); //打开本机的蓝牙发现功能(默认打开120秒,可以将时间最多延长至300秒) Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERA BLE);

discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); //设置持续时间(最多300秒) 3.搜索蓝牙设备 使用BluetoothAdapter的startDiscovery()方法来搜索蓝牙设备 startDiscovery()方法是一个异步方法,调用后会立即返回。该方法会进行对其他蓝牙设备的搜索,该过程会持续12秒。该方法调用后,搜索过程实际上是在一个System Service中进行的,所以可以调用cancelDiscovery()方法来停止搜索(该方法可以在未执行discovery请求时调用)。 请求Discovery后,系统开始搜索蓝牙设备,在这个过程中,系统会发送以下三个广播:ACTION_DISCOVERY_START:开始搜索 ACTION_DISCOVERY_FINISHED:搜索结束 ACTION_FOUND:找到设备,这个Intent中包含两个extra fields:EXTRA_DEVICE和EXT RA_CLASS,分别包含BluetooDevice和BluetoothClass。 我们可以自己注册相应的BroadcastReceiver来接收响应的广播,以便实现某些功能 复制代码代码如下: // 创建一个接收ACTION_FOUND广播的BroadcastReceiver private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // 发现设备 if (BluetoothDevice.ACTION_FOUND.equals(action)) { // 从Intent中获取设备对象 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

android蓝牙开发简介

对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少 Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发,刚巧这段时间公司有蓝牙开发的需求,我看了很多国内、国外的资料,又研究了一下J2ME的蓝牙开发(为了找找思路),虽然我想要的功能还没实现(我曾经在很多论坛里问了很多遍,苦于没有高人解答..),我要实现的功能是连接一个硬件设备,凡是跟硬件沾上边的,都让软件人员开发头疼.. 好了,废话不说了,鉴于很多开发人员现在也有蓝牙开发的需求,也为了大家少走些弯路,先将我积攒的一点点在Android蓝牙开发经验与大家分享一下! 首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限 然后,看下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()获取本地蓝牙地址

Android蓝牙开发(整理)

Android蓝牙开发 学习之前先了解两个基本概念: 1.RFCOMM协议: 一个基于欧洲电信标准协会ETSI07.10规程的串行线性仿真协议。此协议提供RS232控制和状态信号,如基带上的损坏,CTS以及数据信号等,为上层业务(如传统的串行线缆应用)提供了传送能力。 RFCOMM是一个简单传输协议,其目的是针对如何在两个不同设备上的应用之间保证一条完整的通信路径,并在它们之间保持一通信段。 RFCOMM是为了兼容传统的串口应用,同时取代有线的通信方式,蓝牙协议栈需要提供与有线串口一致的通信接口而开发出的协议。RFCOMM协议提供对基于L2CAP协议的串口仿真,基于ETSI07.10。可支持在两个BT设备之间同时保持高达60路的通信连接。 RFCOMM只针对直接互连设备之间的连接,或者是设备与网络接入设备之间的互连。通信两端设备必须兼容于RFCOMM协议,有两类设备:DTE (Data Terminal Endpoint,通信终端,如PC,PRINTER)和DCE (Data Circuit Endpoint,通信段的一部分,如Modem)。此两类设备不作区分。 2.MAC硬件地址 MAC(Medium/MediaAccess Control, 介质访问控制)MAC地址是烧录在NetworkInterfaceCard(网卡,NIC)里的.MAC地址,也叫硬件地址,是由48比特长(6字节),16进制的数字组成.0-23位叫做组织唯一标志符(organizationally unique,是识别LAN(局域网)节点的标识.24-47位是由厂家自己分配。其中第40位是组播地址标志位。网卡的物理地址通常是由网卡生产厂家烧入网卡的EPROM(一种闪存芯片,通常可以通过程序擦写),它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。 Android平台提供的蓝牙API去实现蓝牙设备之间的通信,蓝牙设备之间的通信主要包括了四个步骤:设置蓝牙设备、寻找局域网内可能或者匹配的设备、连接设备和设备之间的数据传输。以下是建立蓝牙连接的所需要的一些基本类: BluetoothAdapter类:代表了一个本地的蓝牙适配器。它是所有蓝牙交互的的入口点。利用它你可以发现其他蓝牙设备,查询绑定了的设备,使用已知的MAC地址实例化一个蓝牙设备和建立一个BluetoothServerSocket(作为服务器端)来监听来自其他设备的连接。 BluetoothDevice类:代表了一个远端的蓝牙设备,使用它请求远端蓝牙设备连接或者获取远端蓝牙设备的名称、地址、种类和绑定状态(其信息是封装在BluetoothSocket中)。 BluetoothSocket类:代表了一个蓝牙套接字的接口(类似于TCP中的套接字),它是应用程序通过输入、输出流与其他蓝牙设备通信的连接点。 BlueboothServerSocket类:代表打开服务连接来监听可能到来的连接请求(属于server 端),为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。当远端设备发起连接连接请求的时候,并且已经连接到了的时候,BlueboothServerSocket类将会返回一个BluetoothSocket。 BluetoothClass类:描述了一个蓝牙设备的一般特点和能力。它的只读属性集定义了设备的主、次设备类和一些相关服务。然而,它并没有准确地描述所有该设备所支持的蓝牙文件和服务,而是作为对设备种类来说的一个小小暗示。

基于安卓的蓝牙通信系统开发

目录 一、系统背景 (2) 1.1 Android系统概述 (2) 1.2 蓝牙概述 (3) 二、系统分析 (5) 2.1 需求分析 (5) 2.2 技术基础 (5) 2.3 平台搭建 (8) 2.4 运行环境 (11) 三、系统总体设计 (12) 3.1 设计思想 (12) 3.2 设计框架 (13) 四、程序设计 (16) 4.1 设置蓝牙权限 (16) 4.3 设置蓝牙可见 (16) 4.4 查询已配对蓝牙设备 (17) 4.5 扫描周围蓝牙设备 (17) 4.6 服务器端的连接 (18) 4.7 客户端的连接 (19) 4.8 数据通信线程 (20) 五、系统测试 (22) 六、设计体会 (26)

一、系统背景 1.1 Android系统概述 自从2008年9月22日,美国运营商T-Mobile USA在纽约正式发布了第一款基于android安卓的手机后,更多的移动设备厂商看到了安卓android的光明前景,并纷纷加入其中,android甚至已经涉足上网本市场了其发展前景广阔涉及领域越来越大。随着android手机的普及,android应用的需求势越来越大,这个潜力巨大的市场,已经吸引无数软件开发厂商和开发者投身其中。android 的开放性使其比苹果和黑莓对年轻人更具吸引力,更能吸引年轻人群的关注和喜爱。在18岁至24岁族群中,Android是最多人选用的操作系统。同时因为Android 系统的开放性为Android平板电脑的快速发展奠定了基础,也才能促使其吸引着越来越多的用户接受和使用。同时Android还具有应用程序无界限、应用程序是在平的的条件下创建的、应用程序可以轻松的嵌入网络、应用程序可以并行运行等众多出色的品质。具有其他操作系统无法比拟的优势和发展空间。 安卓系统在不断升级完善,如今,平板电脑市场已成为Android与苹果IOS 除了智能手机领域之外争夺的第二个焦点。一直以来,多数新闻仍然显示iPad 在平板市场的霸主地位难撼。但是,以Android领头的平板电脑正以高速的增长对苹果iPad造成冲击。放眼整个平板市场,生产Android平板电脑的确是大势所趋。世界上所有的顶级设备制造商,三星、索尼、摩托罗拉、联想、LG、宏碁、HTC、华硕,几乎每一家都在卖Android平板电脑。 安卓给用户的触屏体验非常好,安卓手机在高端机领域泛滥的同时也在中低端机领域涉足,这将给安卓系统手机带来非常好的前景,从目前的市场上来看,安卓系统能够在短短的时间里面,占据着超大的市场份额,而且还有非常好的信誉口碑,绝对不是一两个人吹捧出来的,那是因为安卓手机真的能够让人体验到好,才能够有如此高的评价。所以说,虽然目前安卓手机还是存在一定问题上的不足,很多问题都有待需要改善,这就说明安卓系统处于一种发展状态,那么它的生命力就会很强,前景很广阔。 Android是一套真正意义的开放性移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。Android的Java程序运行环境包含一组Java核心函数库及Dalvik虚拟机,他们有效地优化了Java程序的运行过程。Android系

相关文档
相关文档 最新文档