Android蓝牙编程

合集下载

AndroidStudio蓝牙开发实例——基于Android6.0

AndroidStudio蓝牙开发实例——基于Android6.0

AndroidStudio蓝⽛开发实例——基于Android6.0因项⽬需要做⼀个Android 的蓝⽛app来通过⼿机蓝⽛传输数据以及控制飞⾏器,在此,我对这段时间⾥写的蓝⽛app的代码进⾏知识梳理和出现错误的总结。

该应⽤的Compile Sdk Version 和targetSdkVersion均为26,Min Sdk Version为22,基于Android studio平台开发。

⼀、声明蓝⽛权限⾸先,要在新建项⽬中的AndroidManifest.xml中声明两个权限:BLUETOOTH权限和BLUETOOTH_ADMIN权限。

其中,BLUETOOTH权限⽤于请求连接和传送数据;BLUETOOTH_ADMIN权限⽤于启动设备、发现或进⾏蓝⽛设置,如果要拥有该权限,必须现拥有BLUETOOTH权限。

其次,因为android 6.0之后采⽤新的权限机制来保护⽤户的隐私,如果我们设置的targetSdkVersion⼤于或等于23,则需要另外添加ACCESS_COARSE_LOCATION和ACCESS_FINE_LOCATION权限,否则,可能会出现搜索不到蓝⽛设备的问题。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>⼆、启动和关闭蓝⽛1.⾸先,要获取BluetoothAdapter蓝⽛适配器的对象,然后检测设备是否⽀持蓝⽛。

Android 手机应用开发-Android蓝牙通信

Android  手机应用开发-Android蓝牙通信

发现,握手,验证,连接
基本环境准备
表现层
业务层
Android 平台
表现层UI设计
基本环境准备
表现层
业务层
Android 平台
业务层-扫描已配对的蓝牙设备
业务层编码主要是调用平台的API。
① 获得BluetoothAdapter对象。 ② 判断当前设备中是否拥有蓝牙设备。 ③ 判断当前设备中蓝牙是否打开。 ④ 得到已经配对的蓝牙设备对象。
Android 手机应用开发 第九章 Android蓝牙操作(一)
3G软件学院
讲师: 刘彬 讲师:
复习上节课内容
① 如何实现Android 应用程序的国际化。
② 建立常驻程序的完成步骤。
第九章:
学习目标:
Android 蓝牙通信(一)
什么是蓝牙。 了解 Android 蓝牙通讯的基本结构。 掌握 Android 蓝牙通信的权限。 建立 蓝牙通讯协议配置步骤。 实例 Android扫描周围已配对的蓝牙 设备。
第四步: Android Framework 管理蓝牙连接
基本环境准备
表现层
业务层
Android 平台
第一步:设置蓝牙通信
使用 BluetoothAdapter 类,获得 BluetoothAdapter 对象与启动蓝牙通信。 1)取得 BluetoothAdapter 类
2) 启动蓝牙通信
基本环境准备
1 . 服务端连接 2. 客户端连接
基本环境准备
表现层
业务层
Android 平台
第四步:管理蓝牙连接
当成功连接一个或多个蓝牙设备时,每一个蓝牙设备都 有一条连接BluetoothSocket, 此时蓝牙设备彼此间可以传递数据。

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

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总体流程2、展讯hciattach代码实现流程:三、具体代码分析1、initrc中定义idh.code\device\sprd\sp8830ec_nwcn\init.sc8830.rc1.service hciattach /system/bin/hciattach -n /dev/sttybt0 sprd_shark2.socket bluetooth stream 660 bluetooth bluetoother bluetooth4.group wifi bluetooth net_bt_admin net_bt inet net_raw net_admin system5.disabled6.oneshotadb 下/dev/ttybt0(不同平台有所不同)PS 进程中:hicattch2、/system/bin/hciattach 执行的Main函数idh.code\external\bluetooth\bluez\tools\hciattach.cservice hciattach /system/bin/hciattach -n /dev/sttybt0sprd_shark 传进两个参数,/dev/sttybt0 和 sprd_shark1.i nt main(int argc, char *argv[])2.{3.………………4.for (n = 0; optind < argc; n++, optind++) {5.char *opt;6.7.opt = argv[optind];8.9.switch(n) {10. case 0://(1)、解析驱动的位置;11. dev[0] = 0;12. if (!strchr(opt, '/'))13. strcpy(dev, "/dev/");14. strcat(dev, opt);15. break;16.17. case 1://(2)、解析串口的配置相关参数;18. if (strchr(argv[optind], ',')) {19. int m_id, p_id;20. sscanf(argv[optind], "%x,%x",&m_id, &p_id);21. u = get_by_id(m_id, p_id);22. } else {23. u = get_by_type(opt);24. }25.26. if (!u) {27. fprintf(stderr, "Unknown device type or id\n");28. exit(1);29. }30.31. break;32.33. case 2://(3)、通过对前面参数的解析,把uart[i]中的数值初始化;34. u->speed = atoi(argv[optind]);35. break;36.37. case 3:38. if (!strcmp("flow", argv[optind]))39. u->flags |= FLOW_CTL;40. else41. u->flags &= ~FLOW_CTL;42. break;43.44. case 4:45. if (!strcmp("sleep", argv[optind]))46. u->pm = ENABLE_PM;47. else48. u->pm = DISABLE_PM;49. break;50.51. case 5:52. u->bdaddr = argv[optind];53. break;54. }55. }56.57.………………58. if (init_speed)//初始化串口速率;59. u->init_speed = init_speed;60.………………61. n = init_uart(dev, u, send_break, raw);//(4)、初始化串口;62.………………63.64. return 0;65.}(1)、解析驱动的位置;1.if (!strchr(opt, '/'))2.strcpy(dev, "/dev/");3.service hciattach /system/bin/hciattach -n /dev/sttybt0 sprd_shark4.dev = /dev/ttyb0(2)、解析串口的配置相关参数;获取参数对应的结构体;1.u = get_by_id(m_id, p_id);2.static struct uart_t * get_by_id(int m_id, int p_id)3.{4.int i;5.for (i = 0; uart[i].type; i++) {6.if (uart[i].m_id == m_id && uart[i].p_id== p_id)7.return &uart[i];8.}9.return NULL;10.}这个函数比较简单,通过循环对比,如传进了的参数sprd_shark和uart结构体中的对比,找到对应的数组。

Android中文API(70)——BluetoothDevice[蓝牙]

Android中文API(70)——BluetoothDevice[蓝牙]

Android中⽂API(70)——BluetoothDevice[蓝⽛]前⾔声明 欢迎转载,但请保留⽂章原始出处:)正⽂ ⼀、结构public static class BluetoothDevice extends Object implements Parcelableng.Objectandroid.bluetooth.BluetoothDevice ⼆、概述 代表⼀个远程蓝⽛设备。

让你创建⼀个带有各⾃设备的BluetoothDevice或者查询其皆如名称、地址、类和连接状态等信息。

对于蓝⽛硬件地址⽽⾔,这个类仅仅是⼀个瘦包装器。

这个类的对象是不可改变的。

这个类上的操作会使⽤这个⽤来创建BluetoothDevice类的BluetoothAdapter类执⾏在远程蓝⽛硬件上。

为了获得BluetoothDevice,类,使⽤BluetoothAdapter.getRemoteDevice(String)⽅法去创建⼀个表⽰已知MAC地址的设备(⽤户可以通过带有BluetoothAdapter类来完成对设备的查找)或者从⼀个通过 BluetoothAdapter.getBondedDevices()得到返回值的有联系的设备集合来得到该设备。

注意:需要权限 参见 三、常量String ACTION_ACL_CONNECTED⼴播活动:指明⼀个与远程设备建⽴的低级别(ACL)连接。

总是包含附加域ACL连接通过Android蓝⽛栈⾃动进⾏管理需要权限接收常量值: "android.bluetooth.device.action.ACL_CONNECTED"String ACTION_ACL_DISCONNECTED⼴播活动:指明⼀个来⾃于远程设备的低级别(ACL)连接的断开总是包含附加域ACL连接通过Android蓝⽛栈⾃动进⾏管理需要权限接收常量值: "android.bluetooth.device.action.ACL_DISCONNECTED"String ACTION_ACL_DISCONNECT_REQUESTED⼴播活动:指明⼀个为远程设备提出的低级别(ACL)的断开连接请求,并即将断开连接。

Android之Bluetooth(蓝牙)编程实现

Android之Bluetooth(蓝牙)编程实现
// 布局控件 private TextView mTitle; private EditText mInputEditText; private EditText mOutEditText; private EditText mOutEditText2; private Button mSendButton; private CheckBox HEXCheckBox; private Button breakButton; private CheckBox checkBox_sixteen; /*private ImageView ImageLogoView;*/
//HEXCheckBox = (CheckBox) findViewById(R.id.radioMale); /*****************************************************************/ /*****************************************************************/ /*****************************************************************/ breakButton = (Button) findViewById(R.id.button_break); // 得到当地的蓝牙适配器 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); /*****************************************************************/ /*****************************************************************/ /*****************************************************************/ // 初始化 CheckBox //checkBox_sixteen = (CheckBox) findViewById(R.id.checkBox_sixteen); /*****************************************************************/ /*****************************************************************/ /*****************************************************************/

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

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的值。

Android 蓝牙AVRCP功能的实现

Android 蓝牙AVRCP功能的实现

Android蓝牙AVRCP功能的实现作者:MacroLiu AVRCP的按键定义:\sdk\emulator\keymaps\AVRCP.klkey200MEDIA_PLAY_PAUSEWAKEkey201MEDIA_PLAY_PAUSEWAKEkey166MEDIA_STOPWAKEkey163MEDIA_NEXTWAKEkey165MEDIA_PREVIOUSWAKEkey168MEDIA_REWINDWAKEkey208MEDIA_FAST_FORWARDWAKEBCM(broadcom)宏定义需要打开:BOARD_HAVE_BLUETOOTH_BCM:=trueBT音频控制的代码external\bluetooth\bluez\audio\control.c(1)按键的MAPstaticstruct{constchar*name;uint8_tavrcp;uint16_tuinput;}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},{"FASTFORWARD", FAST_FORWARD_OP, KEY_FASTFORWARD}, {NULL}};(2)按键处理staticvoidhandle_panel_passthrough(structcontrol*control,{…for(i=0;key_map[i].name!=NULL;i++){uint8_tkey_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:Ignoringrelease");break;}DBG("AVRCP:treatingkeypressaspress+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为例#adbshell#hcidump–X左键:>ACLdata:handle12flags0x02dlen12L2CAP(d):cid0x0042len8[psm0]0000:30110e00487c4c000...H|L.<HCICommand:ExitSniffMode(0x02|0x0004)plen20000:0c00..<ACLdata:handle12flags0x00dlen120000:08004b0032110e09487c4c00..K.2...H|L.>HCIEvent:MaxSlotsChange(0x1b)plen30000:0c0005...>HCIEvent:ModeChange(0x14)plen60000:000c00000000......>HCIEvent:CommandStatus(0x0f)plen40000:0c010408....>ACLdata:handle12flags0x02dlen12L2CAP(d):cid0x0042len8[psm0]0000:40110e00487ccc00@...H|?<ACLdata:handle12flags0x00dlen120000:08004b0042110e09487ccc00..K.B...H|?>HCIEvent:NumberofCompletedPackets(0x13)plen5 0000:010c000200.....播放/暂停:>ACLdata:handle12flags0x02dlen12L2CAP(d):cid0x0042len8[psm0]0000:50110e00487c4b00P...H|K.<ACLdata:handle12flags0x00dlen120000:08004b0052110e09487c4b00..K.R...H|K.>ACLdata:handle12flags0x02dlen12L2CAP(d):cid0x0042len8[psm0]0000:60110e00487ccb00`...H|?<ACLdata:handle12flags0x00dlen120000:08004b0062110e09487ccb00..K.b...H|?>HCIEvent:NumberofCompletedPackets(0x13)plen5 0000:010c000200.....右键:>ACLdata:handle12flags0x02dlen12L2CAP(d):cid0x0042len8[psm0]0000:70110e00487c4600p...H|F.<ACLdata:handle12flags0x00dlen120000:08004b0072110e09487c4600..K.r...H|F.>ACLdata:handle12flags0x02dlen12L2CAP(d):cid0x0042len8[psm0]0000:80110e00487cc600....H|?<ACLdata:handle12flags0x00dlen120000:08004b0082110e09487cc600..K.....H|?>HCIEvent:NumberofCompletedPackets(0x13)plen5 0000:010c000200.....>HCIEvent:MaxSlotsChange(0x1b)plen30000:0c0001...>HCIEvent:ModeChange(0x14)plen60000:000c0002c800....?然后将control.c的日志打印出来:按一次”“播放/暂停键”:D/ACRVP(237):---handle_panel_passthrough----D/ACRVP(237):operands[0]=46对应PAUSE_OPD/ACRVP(237):key_quirks=0,pressed=1按键按下D/ACRVP(237):control->uinput=fffffffe,send_key=201对应MEDIA_PLAY_PAUSED/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_OPD/ACRVP(237):key_quirks=0,pressed=1按键按下D/ACRVP(237):control->uinput=fffffffe,send_key=200对应MEDIA_PLAY_PAUSED/ACRVP(237):---handle_panel_passthrough----D/ACRVP(237):operands[0]=c4D/ACRVP(237):key_quirks=0,pressed=0按键释放D/ACRVP(237):control->uinput=fffffffe,send_key=200对应MEDIA_PLAY_PAUSEnextkey:D/ACRVP(237):---handle_panel_passthrough----D/ACRVP(237):operands[0]=4b对应FORWARD_OPD/ACRVP(237):key_quirks=0,pressed=1D/ACRVP(237):control->uinput=fffffffe,send_key=163对应MEDIA_NEXT D/ACRVP(237):---handle_panel_passthrough----D/ACRVP(237):operands[0]=cbD/ACRVP(237):key_quirks=0,pressed=0D/ACRVP(237):control->uinput=fffffffe,send_key=163prevkey:D/ACRVP(237):---handle_panel_passthrough----D/ACRVP(237):operands[0]=4c对应BACKWARD_OPD/ACRVP(237):key_quirks=0,pressed=1D/ACRVP(237):control->uinput=fffffffe,send_key=165对应D/ACRVP(237):---handle_panel_passthrough----D/ACRVP(237):operands[0]=ccD/ACRVP(237):key_quirks=0,pressed=0D/ACRVP(237):control->uinput=fffffffe,send_key=165MEDIA_PREVIOUS 从上面可以看到bluetooth的协议栈blueZ是没有问题的将frameworks\base\libs\ui\EventHub.cpp的LOG打开,只能看到了control.c的日志,EventHub的getEvent完全不响应观察所有log日志发现,openDevice里也没有装载AVRCP.kl初步判断event有问题event分析:$adbshell#cd/proc/bus/input#catdevicescatdevices#catdevicescatdevicesI:Bus=0019Vendor=0001Product=0001Version=0001参考s3c-keypad.c N:Name="s3c-keypad" input_dev->name=DEVICE_NAME;P:Phys=s3c-keypad/input0input_dev->phys="s3c-keypad/input0";S:Sysfs=/devices/virtual/input/input0virtual的?U:Uniq=H:Handlers=event0B:EV=3B:KEY=40004000I:Bus=0019Vendor=0001Product=0001Version=0100参考vpad_buttons.cN:Name="s3c-eintkey"input->name=pdev->name,gpio_keys_device_dri ="s3c-eintkey",P:Phys=gpio-keys/input0input->phys="gpio-keys/input0"S:Sysfs=/devices/platform/s3c-eintkey/input/input1为什么这里是platform目录?U:Uniq=H:Handlers=event1B:EV=3B:KEY=100000000I:Bus=0018Vendor=0000Product=0000Version=0000参考amri_ts.cN:Name="amri_ts"amri_ts_="amri_ts"P:Phys=没有定义S:Sysfs=/devices/platform/s3c2440-i2c.0/i2c-0/0-0033/input/input2为什么这里是platform目录?U:Uniq=H:Handlers=event2B:EV=bB:KEY=4000000040000800400010000B:ABS=26500000I:Bus=0000Vendor=0000Product=0000Version=0000N:Name="ecompass_data"P:Phys=S:Sysfs=/devices/virtual/input/input3U:Uniq=H:Handlers=event3B:EV=9B:ABS=307bf从上面可以看到,完全没有AVRCP的event。

ble简介和androidble编程

ble简介和androidble编程

ble简介和androidble编程一.BLE和BT区别其实我知道许多程序员不太喜欢阅读除了代码以外的文档,因为有时这些过于冗长的文档对编程并没有更多的好处,有了协议,接口,demo差不多很多人就能写出很好质量的代码了。

但其实更深入的编程是少了阅读的,阅读文档可以解决很多编程中遇到的困难,比如在大数据大流量情况下,很多正常的程序会表现出不可靠的一面,这已经不是够编程能解决的了,硬件的配置,服务器带宽,使用的数据库,调用的接口都有可能是瓶颈。

比如BLE,同样的蓝牙,但却有着本质区别,一个表现就是不是所有蓝牙设备都支持BLE,编程如果不考虑这个问题,程序出错就会迷茫。

再比如连接到BLE或者蓝牙上的设备是有数量限制的,如果不知道这个限制,在连接不上时,也会六神无主。

BLE在智家居中和移动设备中的应用方兴未艾,做深入的研究推广到更多的应用上,还是有意义的。

1蓝牙的历史:蓝牙的创始公司是爱立信。

1994年爱立信开始对小范围无线通信技术进行研发,在1997年,爱立信的研究激发了其他公司的浓厚兴趣,于是1998年2月,一些跨国大公司包括诺基亚、苹果、三星组成的一个特殊兴趣小组(SIG),他们共同的目标是建立一个全球性的小范围无线通信技术,该项技术就是蓝牙。

2.BLE 是Bluetooth LowEnergy的缩写,又叫蓝牙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的蓝牙手机一般是双模的。

Android之蓝牙驱动开发总结

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)一Bluetooth基本概念蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备、计算机及其终端设备、各种数字数据系统、甚至家用电器采用无线方式联接起来。

android蓝牙简单开发示例教程

android蓝牙简单开发示例教程

android蓝⽛简单开发⽰例教程⽬录概述1、权限申请2、打开蓝⽛3、接收蓝⽛状态的改变4、扫描其他的设备5、蓝⽛配对6、获取已经配对的设备7、连接设备概述前段时间学习了⼀些蓝⽛开发的知识,记录⼀下Android中蓝⽛的简单开发。

下⾯是最重要的两个类。

BluetoothAdapter : 蓝⽛适配器,通过getDefaultAdapter ()去获取⼀个实例,如果设备不⽀持蓝⽛的话,返回的是⼀个null对象,通过它,可以打开、关闭蓝⽛,扫描设备、向指定设备创建socket通道…BluetoothDevice : 代表⼀个设备对象,可以通过它获取设备的名字、地址、类型等,也可以创建匹配,建⽴socket通道等等。

1、权限申请<uses-permission android:name="android.permission.BLUETOOTH"/> 使⽤蓝⽛所需要的权限<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 使⽤扫描和设置蓝⽛的权限(申明这⼀个权限必须申明上⾯⼀个权限)Android6以上版本,扫描其他蓝⽛还需要位置权限// Android 9 以下版本<user-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>// Android 9 以上<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>2、打开蓝⽛mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();// 如果设备不⽀持蓝⽛if (mBluetoothAdapter == null){return;}// 设备⽀持蓝⽛功能,调⽤startActivityForResult去启动蓝⽛if (!mBluetoothAdapter.isEnabled()){unch(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE));}打开蓝⽛功能是通过startActivity去启动的,但是startActivity这个函数已经过期了,所以我使⽤官⽅推荐的Activity Result替代它ActivityResultLauncher<Intent> startBlueTooth = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),new ActivityResultCallback<ActivityResult>() {@Overridepublic void onActivityResult(ActivityResult result) {if (result==null){Toast.makeText(BlueToothActivity.this, "open failed", Toast.LENGTH_SHORT).show();}else {if (result.getResultCode() == RESULT_CANCELED){Toast.makeText(BlueToothActivity.this,"⽤户取消",Toast.LENGTH_SHORT);}}}});3、接收蓝⽛状态的改变通过⼴播去接收蓝⽛状态的改变class BluetoothStateChangeReceiver extends BroadcastReceiver{public int DEFAULT_VALUE_BLUETOOTH = 1000;@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)){int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,DEFAULT_VALUE_BLUETOOTH); switch(state){case BluetoothAdapter.STATE_ON:Log.d(TAG, "onReceive: open");break;case BluetoothAdapter.STATE_OFF:Log.d(TAG, "onReceive: off");break;case BluetoothAdapter.STATE_TURNING_ON :Log.d(TAG, "onReceive: 正在打开");break;case BluetoothAdapter.STATE_TURNING_OFF:Log.d(TAG, "onReceive: 正在关闭");break;}}}}别忘了⼴播的注册和解注册IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);stateReceiver = new BluetoothStateChangeReceiver() ;registerReceiver(stateReceiver,filter);4、扫描其他的设备同样通过⼴播接收,action是BluetoothDevice.ACTION_FOUNDclass MyReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (BluetoothDevice.ACTION_FOUND.equals(action)) {// 从intent对象中获取蓝⽛设备的信息BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);// 当发现新设备不存在于配对列表中时添加if (device.getBondState() != BluetoothDevice.BOND_BONDED) {blueNames.add(device.getName()+"\t"+device.getAddress());}blueAdpater.notifyDataSetChanged();Log.d(TAG, "onReceive: " + device.getName());}}}动态注册⼴播IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(mReceiver,filter);开启扫描mBluetoothAdapter.startDiscovery();5、蓝⽛配对public class BondReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())){BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);switch(device.getBondState()){case BluetoothDevice.BOND_BONDED:Log.d(TAG, "onReceive: 配对完成");break;case BluetoothDevice.BOND_BONDING:Log.d(TAG, "onReceive: 正在配对");break;case BluetoothDevice.BOND_NONE:Log.d(TAG, "onReceive: 取消配对");break;}}}}6、获取已经配对的设备已经配对的设备会被存储起来,通过BluetoothAdpater直接获取即可Set<BluetoothDevice> paireDevices = mBluetoothAdapter.getBondedDevices();if (paireDevices.size()>0){for (BluetoothDevice pairedDevice : pairedDevices) {blueNames.add(pairedDevice.getName()+" "+pairedDevice.getAddress());Log.d(TAG, "onClick: "+pairedDevice.getName());}}7、连接设备想要在两台设备之间创建连接,必须实现客户端和服务端机制,他们之间使⽤套接字机制进⾏连接,服务端开放服务器套接字,客户端通过MAC地址向服务端发起连接。

基于Android Studio的蓝牙通信开发与设计

基于Android Studio的蓝牙通信开发与设计

基于Android Studio的蓝牙通信开发与设计在開放技术支持下,蓝牙技术已经成为无线局域网和便携设备网络的延伸,尤其是在智能手机上的应用,通过蓝牙技术手机可以与周边事物进行无线连接,实现信息交互。

文章基于Android Studio开发工具,进行蓝牙界面设计和蓝牙通信功能调用,实现了安卓手机与蓝牙设备之间的无线连接。

标签:Android Studio;蓝牙通信;客户端引言目前蓝牙4.0技术已经相对完善,而且具有功耗低,稳定性高,传输距离较远,数度较快等特点。

一大批无线设备开始使用蓝牙来进行通信,各种蓝牙设备应用而生。

市场上各种可穿戴设备如智能跑鞋、智能手表、智能眼镜等基本都使用蓝牙与手机进行通信。

这些蓝牙设备在市场售卖后,获得了极大认可,蓝牙通信技术功不可没。

近几年由于Android开发应用非常火,谷歌开发了一套属于自己的开发程序Android Studio。

Android Studio具有许多非常高效的特性:集成Gradle的打包工具;随时可见的效果;可以拖拽UI操作;代码可自动补全;更丰富的操作接口;Google Cloud的高度集成以及全新的特性JUnit和Maven仓库的集成。

因此本文采用最新版的Android Studio进行蓝牙通信客户端的开发。

1 Android Studio客户端设计流程图1是客户端从开发到测试的整个设计流程,使用Android Studio平台进行设界面语言和程序内部功能算法语言的设计,使用基于安卓6.0的内置虚拟机进行软件界面显示及页面跳转的测试,最后使用Android Studio对软件进行打包,把打包好的软件安装在测试手机上,进行蓝牙通信功能测试。

2 藍牙通信界面设计如图2所示的界面,布局文件放在主目录下,res文件夹下的layout文件下的activity_main.xml文件。

下面对布局代码进行详细的说明:首先,打开activity_mian.xml文件进行界面设计,针对布局代码及按钮代码进行编写,采用线性布局(LinearLayout);然后通过以下语句进行显示内容设置:android:layout_width=“fill_parent”选择界面;android:layout_height=“0dp”设置高度;android:layout_weight=“1”设置宽度;android:gravity=“top”设置样式等等。

Android蓝牙4.0 ble代码 直接从Eclipse粘贴的代码

Android蓝牙4.0 ble代码 直接从Eclipse粘贴的代码

程序结合了网上的开源程序。

com.example.android.bluetoothlegatt包中的代码有修改,res文件夹和AndroidManifest.xml中的代码没有修改.下面直接上代码,并把修改的地方用红色指出来。

/** Copyright (C) 2013 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** /licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.example.android.bluetoothlegatt;import android.app.Activity;import android.app.ListActivity;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.bluetooth.BluetoothManager;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.os.Bundle;import android.os.Handler;import youtInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import java.util.ArrayList;/*** Activity for scanning and displaying available Bluetooth LE devices.*/public class DeviceScanActivity extends ListActivity {private LeDeviceListAdapter mLeDeviceListAdapter;//适配器adapter,存放搜寻到的设备信息private BluetoothAdapter mBluetoothAdapter;private boolean mScanning;private Handler mHandler;private static final int REQUEST_ENABLE_BT = 1;// 10秒后停止查找搜索.private static final long SCAN_PERIOD = 10000;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getActionBar().setTitle(R.string.title_devices);//BLE Device ScanmHandler = new Handler();// 检查当前手机是否支持ble 蓝牙,如果不支持退出程序if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();finish();}// 初始化Bluetooth adapter, 通过蓝牙管理器得到一个参考蓝牙适配器//(API必须在以上android4.3或以上和版本)final BluetoothManager bluetoothManager =(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);mBluetoothAdapter = bluetoothManager.getAdapter();// 检查设备上是否支持蓝牙if (mBluetoothAdapter == null) {Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();finish();return;}}//选项菜单(optionsMenu)。

Android蓝牙实例(和单片机蓝牙模块通信)

Android蓝牙实例(和单片机蓝牙模块通信)

Android蓝⽛实例(和单⽚机蓝⽛模块通信)1、Android蓝⽛编程 蓝⽛3.0及以下版本编程需要使⽤UUID,UUID是通⽤唯⼀识别码(Universally Unique Identifier),这是⼀个软件构建的标准,也是被开源基⾦会组织应⽤在分布式计算环境领域的⼀部分。

在蓝⽛3.0及下⼀版本中,UUID被⽤于唯⼀标识⼀个服务,⽐如⽂件传输服务,串⼝服务、打印机服务等,如下:#蓝⽛串⼝服务SerialPortServiceClass_UUID = '{00001101-0000-1000-8000-00805F9B34FB}'LANAccessUsingPPPServiceClass_UUID = '{00001102-0000-1000-8000-00805F9B34FB}'#拨号⽹络服务DialupNetworkingServiceClass_UUID = '{00001103-0000-1000-8000-00805F9B34FB}'#信息同步服务IrMCSyncServiceClass_UUID = '{00001104-0000-1000-8000-00805F9B34FB}'SDP_OBEXObjectPushServiceClass_UUID = '{00001105-0000-1000-8000-00805F9B34FB}'#⽂件传输服务OBEXFileTransferServiceClass_UUID = '{00001106-0000-1000-8000-00805F9B34FB}'IrMCSyncCommandServiceClass_UUID = '{00001107-0000-1000-8000-00805F9B34FB}' 蓝⽛的连接有主从设备,提供服务的可以认为是从设备。

Android蓝牙开发(整理)

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去实现蓝牙设备之间的通信,蓝牙设备之间的通信主要包括了四个步骤:设置蓝牙设备、寻找局域网内可能或者匹配的设备、连接设备和设备之间的数据传输。

Android开发-蓝牙、NFC、网络和Wi-Fi

Android开发-蓝牙、NFC、网络和Wi-Fi

Android开发-蓝⽛、NFC、⽹络和Wi-Fi关键词:BluetoothAdapter、ConnectivityManager、WifiManager、NfcMessage、NfcAdapter、NdefMessage、NdefRecord管理蓝⽛设备和发现模式发现远程蓝⽛设备通过蓝⽛通信监视Internet连接监视Wi-Fi和⽹路详细信息配置Wi-Fi和扫描接⼊点使⽤Wi-Fi Direct传输数据扫描NFC标签使⽤Android Bean传输数据管理本地蓝⽛设备适配器通过类来控制本地蓝⽛设备,该类代表运⾏应⽤程序的Android设备。

BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();为了读取任何⼀种本地BluetoothAdapter属性、启动发现过程或者找到绑定的设备,需要在应⽤程序的manifest⽂件中包含BLUETOOTH权限。

为了修改任何⼀种本地设备属性,还需要BLUETOOTH_ADMIN使⽤权限。

BluetoothAdapter bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();//使⽤isEnable⽅法确认设备已经启⽤if(bluetoothAdapter.enable()){//访问BluetoothAdapter的"友好的"(⽤户设置的,⽤于标识特定设备的任意字符串)名称bluetoothAdapter.getName();//获取硬件地址bluetoothAdapter.getAddress();}如果拥有BLUETOOTH_ADMIN权限,那么就能够使⽤setName⽅法更改BluetoothAdapter的"友好的"名称。

使⽤⽅法,获取当前BluetoothAdapter的状态。

Indicates the local Bluetooth adapter is off.Indicates the local Bluetooth adapter is on, and ready for use.Indicates the local Bluetooth adapter is turning off.Indicates the local Bluetooth adapter is turning on.为了启⽤BluetoothAdapter,可以使⽤启动⼀个系统Referrence Activity并将静态常量作为其动作字符串。

android蓝牙开发的基本流程

android蓝牙开发的基本流程

android蓝牙开发的基本流程
1. 检查当前设备是否支持蓝牙功能:首先,要确认当前设备是否支持蓝牙,可以通
过BluetoothAdapter对象来检查。

2. 启用蓝牙功能:如果发现设备不支持蓝牙功能,则可以调用BluetoothAdapter方
法enable()来启用蓝牙。

3. 当不能直接启用蓝牙功能时,需要请求额外的权限:如果不能直接启用蓝牙功能,则可以使用Intent的ACTION_REQUEST_ENABLE来请求额外的权限。

调用startActivityForResult方法后App会显示来自系统的提示框,用户可以在其中输入额外的权限信息。

4. 实例化BluetoothDevice对象:为了发现服务和特性,需要建立BluetoothDevice 对象的实例。

通常可以使用getRemoteDevice方法,该方法可以接收一个MAC地址参数。

5. 建立连接:下一步要建立连接。

调用BluetoothDevice实例的connectGatt()方法来建立连接。

6. 搜索服务:当连接建立成功,就可以使用BluetoothGatt对象来发现服务。

8. 使用特性:最后,可以使用找到的特性进行通信,从而实现蓝牙功能。

以上就是Android蓝牙开发的基本流程。

除了上面提到的步骤之外,还可以添加其他
一些额外的功能,以实现更加灵活和完善的蓝牙功能。

Android蓝牙开发实例解析

Android蓝牙开发实例解析

Android蓝⽛开发实例解析在使⽤⼿机时,蓝⽛通信给我们带来很多⽅便。

那么在Android⼿机中怎样进⾏蓝⽛开发呢?本⽂以实例的⽅式讲解Android蓝⽛开发的知识。

1、使⽤蓝⽛的响应权限XML/HTML代码<uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>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_DISCOVERABLE);discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);//设置持续时间(最多300秒)3、搜索蓝⽛设备使⽤BluetoothAdapter的startDiscovery()⽅法来搜索蓝⽛设备。

Android如何实现蓝牙配对连接功能

Android如何实现蓝牙配对连接功能

Android如何实现蓝⽛配对连接功能⽬录本⽂适⽤的范围准备搜索配对连接坑坑坑本⽂适⽤的范围Android蓝⽛部分是很复杂的,也涉及很多名词和功能。

本⽂介绍的配对连接⽅法适⽤于⼀般的蓝⽛⽿机、⾳响等,并不是连接蓝⽛ BLE 或者想⽤蓝⽛来进⾏ Socket 通信的。

先来介绍⼏种名称:Profile:Bluetooth 的⼀个很重要特性,就是所有的 Bluetooth 产品都⽆须实现全部的 Bluetooth 规范。

为了更容易的保持Bluetooth 设备之间的兼容,Bluetooth 规范中定义了 Profile。

Profile 定义了设备如何实现⼀种连接或者应⽤,你可以把Profile 理解为连接层或者应⽤层协。

我们标题中的说的连接其实就是去连接各种 Profile。

下⾯介绍的⼏种都是Android 实现了的 Profile。

A2dp:表⽰蓝⽛⽴体声,和蓝⽛⽿机听歌有关那些,另还有个Avrcp⾳频/视频远程控制配置⽂件,是⽤来听歌时暂停,上下歌曲选择的。

Handset、Handfree:和电话相关,蓝⽛接听、挂断电话。

其他:btservice关于蓝⽛基本操作的⽬录,⼀切由此开始; hdp蓝⽛关于医疗⽅⾯的应⽤;hid:⼈机交互接⼝,蓝⽛⿏标键盘什么的就是这个了;pbap:电话号码簿访问协议(Phonebook Access Profile) ...准备在 AndroidManifest.xml 添加所需的权限<uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />打开蓝⽛mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if (!mBluetoothAdapter.isEnabled()) {Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enableIntent, REQUEST_ENABLE_BT);}注册⼴播由于蓝⽛的搜索、配对和连接状态的改变都是系统通过⼴播的⽅式发出来的,所以需要注册这些⼴播来获取状态的改变。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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地址}}};// 注册这个 BroadcastReceiverIntentFilter 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包含了主要以下几类:BluetoothAdapterBluetoothDevice、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个端口。

相关文档
最新文档