Android之Bluetooth(蓝牙)编程实现

合集下载

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)

成功实现手机蓝牙控制智能小车机器人!视频+程序源代码(Android)

上次成功实现了通过笔记本电脑蓝牙来控制智能小车机器人的运动,但是通过电脑控制毕竟不方便,于是乎~本人打算将控制程序移植到手机上。

目前主流的手机操作系统有塞班、安卓(Android)、Windows Mobile,对比了一下,首先,塞班是用C++写的,这么多门语言我唯独看到C++就头大···,放弃了···,Windows Moblie 其实和之前发的电脑端程序基本是一样的,也就没什么意思了,最后决定选择目前正火的Android手机作为控制平台。

Android是个开源的应用,使用Java语言对其编程。

于是这次的开发我选用Eclipse作为开发工具,用Java语言开发手机端的控制程序,由于之前对Android的蓝牙通信这块涉及不多,一开始感觉有点小茫然,而网上也少有这方面的例程,有少数人做出了类似的东西,但是只传了个视频装X!雪特····经过几天的研究,最终确定了手机蓝牙通信其实就是Socket编程,再经过一番编写和调试,昨晚终于大功告成!这是视频:下面开始介绍Android手机端控制程序的编写:首先打开Eclipse,当然之前的Java开发环境和安卓开发工具自己得先配置好,这里就不多说了,网上教程一大摞。

然后新建一个Android项目,修改布局文件main.xml,代码如下:<?xml version="1.0" encoding="utf-8"?><AbsoluteLayoutandroid:id="@+id/widget0"android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="/apk/res/android"><Buttonandroid:id="@+id/btnF"android:layout_width="100px"android:layout_height="60px"android:text="前进"android:layout_x="130px"android:layout_y="62px"></Button><Buttonandroid:id="@+id/btnL"android:layout_width="100px"android:layout_height="60px"android:text="左转"android:layout_x="20px"android:layout_y="152px"></Button><Buttonandroid:id="@+id/btnR"android:layout_width="100px"android:layout_height="60px"android:text="右转"android:layout_x="240px"android:layout_y="152px"></Button><Buttonandroid:id="@+id/btnB"android:layout_width="100px"android:layout_height="60px"android:text="后退"android:layout_x="130px"android:layout_y="242px"></Button><Buttonandroid:id="@+id/btnS"android:layout_width="100px"android:layout_height="60px"android:text="停止"android:layout_x="130px"android:layout_y="152px"></Button></AbsoluteLayout>这个布局文件的效果就是如视频中所示的手机操作界面。

Android上成功实现了蓝牙的一些Profile

Android上成功实现了蓝牙的一些Profile

Android上成功实现了蓝牙的一些Profile前段时间做蓝牙方面的开发,Google的Android只实现了Handset/Handfree和A2DP/AVRCP等Profile,而其它常用的Profile如HID/DUN/SPP/OPP/FTP/PAN等却没有实现,并且Google方面关于何时实现也没有一个时间表。

前段时间我实现了HID/DUN/SPP三个Profile,下一步实现OPP/FTP等Profile。

具体的开发其实也简单,我是参照A2DP的代码进行的相关Profile的实现。

Android的Handset/Handfree的实现方式和A2DP/AVRCP的方式有很大的不同,Handset/Handfree是直接在bluez的RFCOMM Socket上开发的,没有利用bluez的audio plugin,而A2DP/AVRCP是在bluez的audio plugin基础上开发的,所以大大降低了实现的难度。

其实bluez的audio plugin上也有Handset/Handfree的实现,但不知道为什么Google没有用它,而要在RFCOMM Socket上自己实现一个,这使得Handset/Handfree的实现显得比较复杂。

HID要用到bluez的input plugin,Android已经把它编译进去了,在system/lib/bluez-plugin/input.so下,与input.so一起的还有audio.so库,那是供A2DP/AVRCP用的。

参照frameworks/base/core/jni /android_server_BluetoothA2dpService.cpp,自己写一个HID用的的.cpp文件,其中跟A2DP一样利用 DBUS调用input.so库的CreateDevice/Connect/Disconnect 等函数,具体源码在external/bluez /utils/input/manager.c和external/bluez/utils/input/device.c 中。

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 蓝牙设备之间自动配对

Android Bluetooth 学习(3)蓝牙设备之间自动配对0人收藏此文章, 我要收藏发表于6个月前(2013-03-21 12:01) , 已有654次阅读,共0个评论前言(android2.3版本,4.0版本由于是随机获取pin值,没有研究过):1、蓝牙设备之间自动配对,需要两个设备都安装进行配对的apk(网上好多自动配对的帖子都没有说明情况)2、在自动匹配的时候想通过反射调用BluetoothDevice的setPin、createBond、cancelPairingUserInput实现设置密钥、配对请求创建、取消密钥信息输入等。

1)createBond()创建,最终会调到源码的BluetoothService的createBond(String address)方法,通过对源码浅显的了解,createBond主要是写入匹配密钥(BluetoothService的writeDockPin ())以及进入jni注册回调函数onCreatePairedDeviceResult观察匹配结果比如:// Pins did not match, or remote device did not respond to pin// request in time// We rejected pairing, or the remote side rejected pairing. This// happens if either side presses 'cancel' at the pairing dialog.// Not sure if this happens// Other device is not responding at all// already bonded等,在jni中创建了进行匹配的device("CreatePairedDevice"),这时bluetooth会发送一个ACTION_PAIRING_REQUEST的广播,只有当前会出现密钥框的蓝牙设备收到。

Android跟蓝牙耳机建立连接有两种方式

Android跟蓝牙耳机建立连接有两种方式

Android跟蓝牙耳机建立连接有两种方式Android 跟蓝牙耳机建立连接有两种方式。

1. Android 主动跟蓝牙耳机连BluetoothSettings 中和蓝牙耳机配对上之后,BluetoothHeadsetService 会收到BONDING_CREATED_ACTION,这个时候BluetoothHeadsetService 会主动去和蓝牙耳机建立RFCOMM 连接。

if(action.equals(BluetoothIntent.BONDING_CREATED_AC TION)) {if (mState ==BluetoothHeadset.STATE_DISCONNECTED) {// Lets try and initiate an RFCOMM connectiontry {mBinder.connectHeadset(address, null);} catch (RemoteException e) {}}} RFCOMM 连接的真正实现是在ConnectionThread 中,它分两步,第一步先通过SDPClient 查询蓝牙设备时候支持Headset 和Handsfree profile。

// 1) SDP querySDPClient client = SDPClient.getSDPClient(address);if (DBG) log("Connecting to SDP server (" + address + ")...");if (!client.connectSDPAsync()) {Log.e(TAG, "Failed to start SDP connection to " + address);mConnectingStatusHandler.obtainMessage(SDP_ERROR ).sendToTarget();client.disconnectSDP();return;}if (isInterrupted()) {client.disconnectSDP();return;}if (!client.waitForSDPAsyncConnect(20000)) { // 20 secs if (DBG) log("Failed to make SDP connection to " + address);mConnectingStatusHandler.obtainMessage(SDP_ERROR ).sendToTarget();client.disconnectSDP();return;}if (DBG) log("SDP server connected (" + address + ")");int headsetChannel = client.isHeadset();if (DBG) log("headset channel = " + headsetChannel);int handsfreeChannel = client.isHandsfree();if (DBG) log("handsfree channel = " + handsfreeChannel); client.disconnectSDP();第2步才是去真正建立RFCOMM 连接。

Android蓝牙Ble开发之获取心率

Android蓝牙Ble开发之获取心率

Android蓝牙Ble开发之获取心率•最近在研究Android的蓝牙Ble的开发,由于是低功耗蓝牙,以前没有接触过,看过好多博客,大多数都差不多,不过个人有一点心得关于蓝牙获取心率的。

首先就是权限问题了,在AndroidMainfest清单文件中添加一下权限:<uses-permissionandroid:name="android.permission.BLUETOOTH"/><uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/> 这次研究开发的是mio的心率手表所以如果没有设备的大家仅供参考:1、首先判断当前设备是否支持ble:/*** 判断当前设备是否支持ble*/if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {System.out.println("不支持BLE设备");}2、获取蓝牙适配器:mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();3、搜索蓝牙设备:/*** 搜索蓝牙设备** @param enable*/private void scanLeDevice(boolean enable) {// TODO Auto-generated method stubif (enable) {mHandler.postDelayed(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubmScanning = false;mBluetoothAdapter.stopLeScan(callback);}}, 10000);mScanning = true;mBluetoothAdapter.startLeScan(callback);} else {mScanning = false;mBluetoothAdapter.stopLeScan(callback);}}4、搜索蓝牙设备的回调接口:/*** 蓝牙搜索的回调方法*/private BluetoothAdapter.LeScanCallback callback = new LeScanCallback() {public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {System.out.println(device + "****" + device.getName() + "***"+ device.getAddress());runOnUiThread(new Runnable() {public void run() {adapter.addDevice(device);adapter.notifyDataSetChanged();}});}};5、然后搜索到设备之后就是连接蓝牙设备了:lv.setOnItemClickListener(new OnItemClickListener() {private BluetoothGatt gatt;@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//把搜索到的设备信息放到listview中,然后连接设备BluetoothDevice device = adapter.getDevice(position);//连接设备的方法gatt = device.connectGatt(getApplicationContext(), false,mGattCallback);}});6、获取设备中的各种信息的方法这里主要是获取心率的:private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {private BluetoothGattCharacteristic mCharacteristic;/*** 当连接状态发生改变的时候回调的方法*/@Overridepublic void onConnectionStateChange(BluetoothGatt gatt, int status,int newState) {//判断蓝牙连接状态if (newState == BluetoothProfile.STATE_CONNECTED) {System.out.println("设备已连接");//寻找设备中的服务gatt.discoverServices();} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {System.out.println("设备已断开连接");}}/*** 当服务发现后所调用的方法*/@Overridepublic void onServicesDiscovered(BluetoothGatt gatt, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {System.out.println("Services discovered");//得到心率信息的serviceBluetoothGattService service = gatt.getService(mHeartRateServiceUuid);if (service == null) {System.out.println("没有得到心率服务");} else {System.out.println("得到心率服务");mCharacteristic = service.getCharacteristic(mHeartRateCharacteristicUuid);if (mCharacteristic == null) {System.out.println("不能找到心率");} else {boolean success = gatt.setCharacteristicNotification(mCharacteristic, true);if (!success) {System.out.println("Enabling notification failed!");return;}BluetoothGattDescriptor descriptor = mCharacteristic.getDescriptor(BleDefinedUUIDs.Descriptor.CHAR_CLIENT_C ONFIG);if (descriptor != null) {descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_ VALUE);gatt.writeDescriptor(descriptor);System.out.println("Notification enabled");} else {System.out.println("Could not get descriptor for characteristic! Notification are not enabled.");}}} else {System.out.println("Unable to discover services");}}/*** 当service里边的characteristic发生改变调用*/@Overridepublic void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic) {//得到心率数据if(characteristic.equals(mCharacteristic)){byte[] raw = mCharacteristic.getValue();System.out.println("心率****="+raw);int index = ((raw[0] & 0x01) == 1) ? 2 : 1;int format = (index == 1) ? BluetoothGattCharacteristic.FORMAT_UINT8 : BluetoothGattCharacteristic.FORMAT_UINT16;int value = mCharacteristic.getIntValue(format, index);final String description = value + " bpm";runOnUiThread(new Runnable() {@Overridepublic void run() {System.out.println("心率:"+description);}});}/* the rest of callbacks are not interested for us */@Overridepublic void onCharacteristicRead(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, int status) {}@Overridepublic void onCharacteristicWrite(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, int status) {};@Overridepublic void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {};};就这样简单的就能吧蓝牙中的心率得到了;下面看看源码吧:先看一下布局文件:<LinearLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingT op="@dimen/activity_vertical_margin"android:orientation="vertical"tools:context=".MainActivity" ><Buttonandroid:id="@+id/start"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="18dp"android:text="搜索蓝牙设备" /><ListViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/lv"></ListView></LinearLayout>listview的item:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"><TextView android:id="@+id/device_name"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="24dp"/><TextView android:id="@+id/device_address"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="12dp"/></LinearLayout>BleDefinedUUIDs.java:package com.example.watch;import java.util.UUID;public class BleDefinedUUIDs {public static class Service {final static public UUID HEART_RATE = UUID.fromString("0000180d-0000-1000-8000-00805f9b34fb");};public static class Characteristic {final static public UUID HEART_RATE_MEASUREMENT = UUID.fromString("00002a37-0000-1000-8000-00805f9b34fb");final static public UUID MANUFACTURER_STRING = UUID.fromString("00002a29-0000-1000-8000-00805f9b34fb");final static public UUID MODEL_NUMBER_STRING = UUID.fromString("00002a24-0000-1000-8000-00805f9b34fb");final static public UUID FIRMWARE_REVISION_STRING = UUID.fromString("00002a26-0000-1000-8000-00805f9b34fb");final static public UUID APPEARANCE = UUID.fromString("00002a01-0000-1000-8000-00805f9b34fb");final static public UUID BODY_SENSOR_LOCATION = UUID.fromString("00002a38-0000-1000-8000-00805f9b34fb");final static public UUID BATTERY_LEVEL = UUID.fromString("00002a19-0000-1000-8000-00805f9b34fb");}public static class Descriptor {final static public UUID CHAR_CLIENT_CONFIG = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");}}MianActivity.javapackage com.example.watch;import java.util.ArrayList;import java.util.UUID;import android.os.Bundle;import android.os.Handler;import android.app.Activity;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothGatt;import android.bluetooth.BluetoothGattCallback;import android.bluetooth.BluetoothGattCharacteristic;import android.bluetooth.BluetoothGattDescriptor;import android.bluetooth.BluetoothGattService;import android.bluetooth.BluetoothProfile;import android.bluetooth.BluetoothAdapter.LeScanCallback;import android.bluetooth.BluetoothDevice;import android.content.Intent;import android.content.pm.PackageManager;import android.text.style.BulletSpan;import youtInflater;import android.view.Menu;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity {private BluetoothAdapter mBluetoothAdapter;private static final int REQUEST_ENABLE_BT = 1;private Handler mHandler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.activity_main);/*** 判断当前设备是否支持ble*/if (!getPackageManager().hasSystemFeature( PackageManager.FEATURE_BLUETOOTH_LE)) { System.out.println("不支持BLE设备");}//得到蓝牙适配器mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(intent, REQUEST_ENABLE_BT);}Button start = (Button) findViewById(R.id.start);lv = (ListView) findViewById(R.id.lv);adapter = new LeDeviceListAdapter();start.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {scanLeDevice(true);lv.setAdapter(adapter);adapter.clear();}});lv.setOnItemClickListener(new OnItemClickListener() {private BluetoothGatt gatt;@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//把搜索到的设备信息放到listview中,然后连接设备BluetoothDevice device = adapter.getDevice(position);gatt = device.connectGatt(getApplicationContext(), false,mGattCallback);}});}final static private UUID mHeartRateServiceUuid = BleDefinedUUIDs.Service.HEART_RATE;final static private UUID mHeartRateCharacteristicUuid = BleDefinedUUIDs.Characteristic.HEART_RATE_MEASUREMENT;/*** 寻找服务*/private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {private BluetoothGattCharacteristic mCharacteristic;/*** 当连接状态发生改变的时候回调的方法*/@Overridepublic void onConnectionStateChange(BluetoothGatt gatt, int status,int newState) {//判断蓝牙连接状态if (newState == BluetoothProfile.STATE_CONNECTED) {System.out.println("设备已连接");//寻找设备中的服务gatt.discoverServices();} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {System.out.println("设备已断开连接");}}/*** 当服务发现后所调用的方法*/@Overridepublic void onServicesDiscovered(BluetoothGatt gatt, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {System.out.println("Services discovered");//得到心率信息的serviceBluetoothGattService service = gatt.getService(mHeartRateServiceUuid);if (service == null) {System.out.println("没有得到心率服务");} else {System.out.println("得到心率服务");mCharacteristic = service.getCharacteristic(mHeartRateCharacteristicUuid);if (mCharacteristic == null) {System.out.println("不能找到心率");} else {boolean success = gatt.setCharacteristicNotification(mCharacteristic, true);if (!success) {System.out.println("Enabling notification failed!");return;}BluetoothGattDescriptor descriptor = mCharacteristic.getDescriptor(BleDefinedUUIDs.Descriptor.CHAR_CLIENT_C ONFIG);if (descriptor != null) {descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_ VALUE);gatt.writeDescriptor(descriptor);System.out.println("Notification enabled");} else {System.out.println("Could not get descriptor for characteristic! Notification are not enabled.");}}}} else {System.out.println("Unable to discover services");}}/*** 当service里边的characteristic发生改变调用*/@Overridepublic void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic) {//得到心率数据if(characteristic.equals(mCharacteristic)){byte[] raw = mCharacteristic.getValue();System.out.println("心率****="+raw);int index = ((raw[0] & 0x01) == 1) ? 2 : 1;int format = (index == 1) ? BluetoothGattCharacteristic.FORMAT_UINT8 : BluetoothGattCharacteristic.FORMAT_UINT16;int value = mCharacteristic.getIntValue(format, index);final String description = value + " bpm";runOnUiThread(new Runnable() {@Overridepublic void run() {System.out.println("心率:"+description);}});}}/* the rest of callbacks are not interested for us */@Overridepublic void onCharacteristicRead(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, int status) {}@Overridepublic void onCharacteristicWrite(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, int status) {};@Overridepublic void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {};};private boolean mScanning;/*** 搜索蓝牙设备** @param enable*/private void scanLeDevice(boolean enable) {// TODO Auto-generated method stubif (enable) {mHandler.postDelayed(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubmScanning = false;mBluetoothAdapter.stopLeScan(callback);}}, 10000);mScanning = true;mBluetoothAdapter.startLeScan(callback);} else {mScanning = false;mBluetoothAdapter.stopLeScan(callback);}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == REQUEST_ENABLE_BT&& resultCode == Activity.RESULT_CANCELED) {finish();return;}super.onActivityResult(requestCode, resultCode, data);}/*** 蓝牙搜索的回调方法*/private BluetoothAdapter.LeScanCallback callback = new LeScanCallback() {public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {System.out.println(device + "****" + device.getName() + "***"+ device.getAddress());runOnUiThread(new Runnable() {adapter.addDevice(device);adapter.notifyDataSetChanged();}});}};private ListView lv;private LeDeviceListAdapter adapter;private class LeDeviceListAdapter extends BaseAdapter { private ArrayList<BluetoothDevice> mLeDevices; private LayoutInflater mInflator;public LeDeviceListAdapter() {super();mLeDevices = new ArrayList<BluetoothDevice>(); mInflator = MainActivity.this.getLayoutInflater();}public void addDevice(BluetoothDevice device) {if (!mLeDevices.contains(device)) {mLeDevices.add(device);}}public BluetoothDevice getDevice(int position) { return mLeDevices.get(position);}mLeDevices.clear();}@Overridepublic int getCount() {return mLeDevices.size();}@Overridepublic Object getItem(int i) {return mLeDevices.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder viewHolder;// General ListView optimization code.if (view == null) {view = mInflator.inflate(yout.listitem_device, null);viewHolder = new ViewHolder();viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address);viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name);view.setTag(viewHolder);} else {viewHolder = (ViewHolder) view.getT ag();}BluetoothDevice device = mLeDevices.get(i);final String deviceName = device.getName();if (deviceName != null && deviceName.length() > 0) viewHolder.deviceName.setText(deviceName);elseviewHolder.deviceName.setText("未知设备"); viewHolder.deviceAddress.setText(device.getAddress());return view;}}static class ViewHolder {TextView deviceName;TextView deviceAddress;}。

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 蓝牙AVRCP功能的实现

Android 蓝牙AVRCP功能的实现

Android 蓝牙AVRCP功能的实现作者:Macro Liu AVRCP的按键定义:\sdk\emulator\keymaps\AVRCP.klkey 200 MEDIA_PLAY_PAUSE WAKEkey 201 MEDIA_PLAY_PAUSE WAKEkey 166 MEDIA_STOP WAKEkey 163 MEDIA_NEXT WAKEkey 165 MEDIA_PREVIOUS WAKEkey 168 MEDIA_REWIND WAKEkey 208 MEDIA_FAST_FORWARD WAKEBCM(broadcom)宏定义需要打开:BOARD_HAVE_BLUETOOTH_BCM := trueBT音频控制的代码external\bluetooth\bluez\audio\control.c(1) 按键的MAPstatic 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 12L2CAP(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 20000: 0c 00 ..< ACL data: handle 12 flags 0x00 dlen 120000: 08 00 4b 00 32 11 0e 09 48 7c 4c 00 ..K.2...H|L. > HCI Event: Max Slots Change (0x1b) plen 30000: 0c 00 05 ...> HCI Event: Mode Change (0x14) plen 60000: 00 0c 00 00 00 00 ......> HCI Event: Command Status (0x0f) plen 40000: 0c 01 04 08 ....> ACL data: handle 12 flags 0x02 dlen 12L2CAP(d): cid 0x0042 len 8 [psm 0]0000: 40 11 0e 00 48 7c cc 00 @...H|? < ACL data: handle 12 flags 0x00 dlen 120000: 08 00 4b 00 42 11 0e 09 48 7c cc 00 ..K.B...H|? > HCI Event: Number of Completed Packets (0x13) plen 50000: 01 0c 00 02 00 .....播放/暂停:> ACL data: handle 12 flags 0x02 dlen 12L2CAP(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 120000: 08 00 4b 00 52 11 0e 09 48 7c 4b 00 ..K.R...H|K. > ACL data: handle 12 flags 0x02 dlen 12L2CAP(d): cid 0x0042 len 8 [psm 0]0000: 60 11 0e 00 48 7c cb 00 `...H|? < ACL data: handle 12 flags 0x00 dlen 120000: 08 00 4b 00 62 11 0e 09 48 7c cb 00 ..K.b...H|? > HCI Event: Number of Completed Packets (0x13) plen 50000: 01 0c 00 02 00 .....右键:> ACL data: handle 12 flags 0x02 dlen 12L2CAP(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 120000: 08 00 4b 00 72 11 0e 09 48 7c 46 00 ..K.r...H|F. > ACL data: handle 12 flags 0x02 dlen 12L2CAP(d): cid 0x0042 len 8 [psm 0]0000: 80 11 0e 00 48 7c c6 00 ....H|? < ACL data: handle 12 flags 0x00 dlen 120000: 08 00 4b 00 82 11 0e 09 48 7c c6 00 ..K.....H|? > HCI Event: Number of Completed Packets (0x13) plen 50000: 01 0c 00 02 00 .....> HCI Event: Max Slots Change (0x1b) plen 30000: 0c 00 01 ...> HCI Event: Mode Change (0x14) plen 60000: 00 0c 00 02 c8 00 ....?然后将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_PAUSEnext key: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_NEXTD/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 = 163prev key: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 = 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 devicescat devices# cat devicescat devicesI: 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=event0B: EV=3B: KEY=4000400 0I: Bus=0019 Vendor=0001 Product=0001 Version=0100参考vpad_buttons.cN: Name="s3c-eintkey" input->name = pdev->name, gpio_keys_device_ = "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=event1B: EV=3B: KEY=100000 0 0 0I: Bus=0018 Vendor=0000 Product=0000 Version=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=400 0 0 0 0 0 40000800 40 0 0 10000B: ABS=2650000 0I: Bus=0000 Vendor=0000 Product=0000 Version=0000N: Name="ecompass_data"P: Phys=S: Sysfs=/devices/virtual/input/input3U: Uniq=H: Handlers=event3B: EV=9B: ABS=307bf从上面可以看到,完全没有AVRCP的event。

android ble createbond用法 概述及解释说明

android ble createbond用法 概述及解释说明

android ble createbond用法概述及解释说明1. 引言1.1 概述本文将详细介绍Android BLE(蓝牙低功耗)中的createBond用法,并对其进行解释和说明。

蓝牙低功耗技术已经广泛应用于智能设备、无线音频设备以及其他物联网场景。

而createBond方法则是在Android平台上建立蓝牙设备绑定的一种关键方法。

1.2 文章结构文章主要分为四个部分:引言、Android BLE createBond用法、解释说明和结论。

首先,引言部分将对文章的背景和重点进行概述,并简要介绍文章结构。

然后,在Android BLE createBond用法部分,我们将详细讨论createBond方法的定义、作用以及使用步骤。

接下来,在解释说明部分,我们将探讨createBond 方法的参数和返回值,同时介绍与蓝牙配对相关的流程,并提供可能遇到的问题及相应的解决方案。

最后,在结论部分,我们会总结createBond方法的使用场景和优劣势,并展望其在未来发展中可能扮演的角色。

1.3 目的本文旨在帮助读者深入了解并掌握Android BLE中createBond方法的使用方式。

通过全面解析该方法,读者可以更好地理解其在蓝牙设备绑定过程中的作用和意义,并在实际开发中更加灵活地应用它。

同时,通过对createBond方法涉及的技术和流程进行解释和说明,读者还可以对蓝牙低功耗技术有更深入的理解,并为未来相关项目的设计和开发提供指导和参考。

总之,本文旨在为Android BLE开发者和研究人员提供一个全面而清晰的createBond用法指南。

2. Android BLE createBond用法2.1 什么是createBond方法createBond方法是Android BLE中的一个函数,用于建立与蓝牙设备的配对关系。

在Android开发中,BLE(Bluetooth Low Energy)是一种低功耗蓝牙技术,用于在设备之间进行短距离通信。

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蓝牙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 Bluetooth详解

Android Bluetooth详解

对于Android的英文帮助文档,总是看了记不住,远不如对中文资料那么印象深,所以下面的叙述都是对Android帮助文档Bluetooth的翻译。

一、BluetoothAndroid平台包含了对Bluetooth协议栈的支持,允许机器通过Bluetooth设备进行无线数据交换。

应用框架通过Android Bluetooth API访问Bluetooth功能模块。

这些API能让应用无线连接其他Bluetooth设备,实现点对点和多点之间的通信。

运用蓝牙API,Android应用程序可以完成如下操作:1、扫描其他Bluetooth设备。

2、查询配对Bluetooth设备的本地Bluetooth适配器。

3、建立RFCOMM通道。

4、通过服务探索连接到其他设备。

5、与其他设备进行数据传输。

6、管理多个连接二、The Basics本文描述如何使用Android Bluetooth APIs完成Bluetooth通讯的4个必要任务:设置Bluetooth,搜寻本地配对或者可用的Bluetooth设备,连接Bluetooth设备,与Bluetooth 设备进行数据传输。

所有可用的Bluetooth APIs都包含在android.bluetooth包中。

下面是建立Bluetooth连接需要用到的类和接口的总结:1、BluetoothAdapter描述本地Bluetooth适配器(Bluetooth接收器)。

BluetoothAdapter是所有Bluetooth相关活动的入口。

运用BluetoothAdapter可以发现其他Bluetooth设备,查询连接(或配对)的设备列表,用已知MAC地址实例化一个BluetoothDevice对象,创建一个BluetoothServerSocket对象侦听其他设备的通信。

2、BluetoothDevice描述一个远程Bluetooth设备。

可以用它通过一个BluetoothSocket请求一个远程设备的连接,或者查询远程设备的名称、地址、类、连接状态等信息。

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手机通过蓝牙连接佳博打印机的实例代码

Android手机通过蓝牙连接佳博打印机的实例代码

Android⼿机通过蓝⽛连接佳博打印机的实例代码所使⽤的打印机为佳博打印机,⽀持蓝⽛、wifi、usb我所使⽤的是通过蓝⽛来连接。

在⽹上找到⼀个佳博官⽅针对安卓开发的App源码,但是各种的跳转,没有看太懂,所以⼜去问度娘,找到了⼀个不错的⽂章Android对于蓝⽛开发从2.0版本的sdk才开始⽀持,⽽且模拟器不⽀持,测试⾄少需要两部⼿机,所以制约了很多技术⼈员的开发。

1. ⾸先,要操作蓝⽛,先要在AndroidManifest.xml⾥加⼊权限// 管理蓝⽛设备的权限<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />// 使⽤蓝⽛设备的权限<uses-permissionandroid:name="android.permission.BLUETOOTH" />2.打开蓝⽛获得蓝⽛适配器(android.bluetooth.BluetoothAdapter),检查该设备是否⽀持蓝⽛,如果⽀持,就打开蓝⽛。

// 检查设备是否⽀持蓝⽛adapter = BluetoothAdapter.getDefaultAdapter();if (adapter == null){// 设备不⽀持蓝⽛}// 打开蓝⽛if (!adapter.isEnabled()){Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);// 设置蓝⽛可见性,最多300秒intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);context.startActivity(intent);}3.获取已配对的蓝⽛设备(android.bluetooth.BluetoothDevice)⾸次连接某蓝⽛设备需要先配对,⼀旦配对成功,该设备的信息会被保存,以后连接时⽆需再配对,所以已配对的设备不⼀定是能连接的。

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蓝牙开发的基本流程。

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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 布局控件 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); /*****************************************************************/ /*****************************************************************/ /*****************************************************************/
public class BluetoothChat extends Activity { // 调试 private static final String TAG = "BluetoothChat"; private static boolean D = true; private static final String info = "junge"; // 类型的消息发送从 bluetoothchatservice 处理程序 public static final int MESSAGE_STATE_CHANGE = 1; public static final int MESSAGE_READ = 2; public static final int MESSAGE_WRITE = 3; public static final int MESSAGE_DEVICE_NAME = 4; public static final int MESSAGE_TOAST = 5; public static final String BluetoothData = "fullscreen"; public String filename = ""; // 用来保存存储的文件名 private String newCode = ""; private String newCode2 = ""; // 键名字从收到的 bluetoothchatservice 处理程序 public static final String DEVICE_NAME = "device_name"; public static final String TOAST = "toast"; // 独特的是这个应用程序
以发现其他的蓝牙设备,查找一些匹配的设备,用 MAC 地址来实例化一个 BluetoothDevice。 创建一个 BluetoothServerSocket 来监听其他设备,进而和它们进行通信。
BluetoothDevice: 表示远程的蓝牙设备。用它通过 BluetoothSocket 来请求与远程的设备进行连接。后者 查询设备的基本信息,例如名称,地址,类或者结合的状态。 BluetoothSocket:
//第一次输入加入-->变量 private int sum =1;
// 名社民党记录当创建服务器套接字 String mmsg = ""; String mmsg2 = "";
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
实现效果图如下:(1)启动时请求打开蓝牙
(2)搜索设备 (3)链接一个设备
(4)下面即可进行数据传输 具体实现代码如下: (1)BluetoothChat.class package com.example.BluetoothChat;
import java.io.UnsupportedEncodingException;
//getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,yout.custom_title); mInputEditText = (EditText) findViewById(R.id.editText1); mInputEditText.setGravity(Gravity.TOP); mInputEditText.setSelection(mInputEditText.getText().length(), mInputEditText.getText().length()); mInputEditText.clearFocus(); mInputEditText.setFocusable(false); // 设置文本的标题 mTitle = (TextView) findViewById(R.id.title_left_text); //mTitle.setText(R.string.app_name); mTitle = (TextView) findViewById(R.id.title_right_text); // 初始化 Radiobutton]
为了使用蓝牙,你必须在你的应用程序中声明权限。 <manifest ... >
<uses-permission android:name="android.permission.BLUETOOTH" /> ... </manifest> 两种权限:BLUETOOTH 和 BLUETOOTH ADMIN. 当使用 BLUETOOTH ADMIN 时,一定要声明 BLUETOOTH。 工程目录如下:
import java.util.UUID;
import comroid.app.Activity; import android.app.AlertDialog; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.Html; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.widget.Button; import android.widget.CheckBox;
/*****************************************************************/ /*****************************************************************/
/*****************************************************************/
表示一个 Bluetooth socket 接口(与 TCP socket 相似)。它是一个连接点,运行设备 通过 InputStream 和 OutputStream 的形式来交换数据。
相关文档
最新文档