搜档网
当前位置:搜档网 › Android手机蓝牙通信设计 RFCOMM协议客户端+语音传送与接收

Android手机蓝牙通信设计 RFCOMM协议客户端+语音传送与接收

手机蓝牙通信设计RFCOMM协议客户端+语音传送与接收

最近作相关蓝牙RFCOMM协议的东西,下面类主要是针对蓝牙串口协议的客户端,其中包含了设备的搜索,服务的搜索,以及MMAPI函数的应用,希望通过这个类,能让初学者掌握基本的设备的搜索,服务的搜索,和蓝牙串口协议以及录音和语音发送播放等:

注意HelloMidlet midlet为一个基础设计的界面类,用来调用ClientBox 类

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.*;

import java.util.V ector;

import javax.microedition.io.Connector;

import javax.microedition.io.StreamConnection;

import https://www.sodocs.net/doc/5919241379.html,mand;

import https://www.sodocs.net/doc/5919241379.html,mandListener;

import javax.microedition.lcdui.Displayable;

import javax.microedition.lcdui.Form;

import javax.microedition.lcdui.Gauge;

import javax.microedition.lcdui.StringItem;

import javax.microedition.lcdui.TextField;

//jsr082 API

import javax.bluetooth.BluetoothStateException;

import javax.bluetooth.DeviceClass;

import javax.bluetooth.DiscoveryAgent;

import javax.bluetooth.DiscoveryListener;

import javax.bluetooth.LocalDevice;

import javax.bluetooth.RemoteDevice;

import javax.bluetooth.ServiceRecord;

import javax.bluetooth.UUID;

import hello.HelloMidlet;

import java.io.InputStream; //

import javax.microedition.media.*;

import javax.bluetooth.DataElement;

/**

* 客户端GUI

*/

public class ClientBox extends Form. implements Runnable, CommandListener, DiscoveryListener {

//字串输入框

TextField input = new TextField("开始搜索", "", 100, TextField.ANY); //编辑框

Command com_1 = new Command("开始通话", Command.SCREEN, 0);

Command com_2 = new Command("停止通话", Command.SCREEN, 0);

// StringItem result = new StringItem("", "");

private DiscoveryAgent discoveryAgent;

StreamConnection conn;

private UUID[] uuidSet;

//响应服务的UUID

//GUID

private static final UUID ECHO_SERVER_UUID = new UUID( "000050020000100080000002ee000001", false);

//private static final UUID ECHO_SERVER_UUID = new UUID( "F0E0D0C0B0A000908070605040302010", true);

private static final int[] attrSet = {0x0100};//return service name attribute

//相应通话按钮的实例

private PrimeThread mainThread;

//设备集合

V ector devices = new V ector();

//服务集合

V ector records = new V ector();

//服务搜索的事务id集合

int[] transIDs;

HelloMidlet midlet;

public ClientBox(hello.HelloMidlet midlet) {

super("");

this.midlet = midlet;

//this.append(result);

this.addCommand(new Command("取消", Command.EXIT, 1));

this.addCommand(com_1);

this.addCommand(com_2);

this.append(input);

this.setCommandListener(this);

new Thread(this).start();

}

public void commandAction(Command arg0, Displayable arg1) {

if (arg0.getCommandType() == Command.EXIT) {

if( mainThread!=null)

mainThread.distroy();

this.midlet.exitMIDlet(); //midlet.showMainMenu();

}

else if (arg0 == com_1) {

input.setString("通话开始");

Thread fetchThread = new Thread() {

public void run() {

for (int i = 0; i < records.size(); i++) {

ServiceRecord sr = (ServiceRecord) records.elementAt(i);

javax.bluetooth.DataElement de = (DataElement)sr.getAttributeV alue(0x0100);

String serverName = (String)de.getV alue();

/*

if(https://www.sodocs.net/doc/5919241379.html,pareTo("CKCService") < 0) {

continue ;

} else if (https://www.sodocs.net/doc/5919241379.html,pareTo("CKCService") > 0)

{} else {}

if( !serverName.equals("CKCService") ){

continue ;

}

*/

if (accessService(sr)) {

break;

}

}

}

};

fetchThread.start();

} else {

if(mainThread != null){

mainThread.distroy();

}

input.setString("通话结束");

}

}

private boolean accessService(ServiceRecord sr) {

boolean result = false;

try {

String url = sr.getConnectionURL(

ServiceRecord.NOAUTHENTICA TE_NOENCRYPT, false);

conn = (StreamConnection) Connector.open(url); //

mainThread = new PrimeThread(conn,this);

mainThread.start();

result = true;

}

catch (IOException e) {

}

return result;

}

public void showInfo( String s) {

this.input.setString(s);

}

public synchronized void run() {

//发现设备和服务的过程中,给用户以Gauge

Gauge g = new Gauge(null, false, Gauge.INDEFINITE, Gauge.CONTINUOUS_RUNNING);

this.append(g);

showInfo("蓝牙初始化...");

boolean isBTReady = false;

try {

LocalDevice localDevice = LocalDevice.getLocalDevice();

discoveryAgent = localDevice.getDiscoveryAgent();

isBTReady = true;

}

catch (Exception e) {

e.printStackTrace();

}

if (!isBTReady) {

showInfo("蓝牙不可用");

//删除Gauge

this.delete(1);

return;

}

uuidSet = new UUID[2];

//标志我们的响应服务的UUID集合

uuidSet[0] = new UUID(0x0100);

// uuidSet[0] =ECHO_SERVER_UUID;

uuidSet[1] = ECHO_SERVER_UUID;

try {

discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);

}

catch (BluetoothStateException e) {

}

try {

//阻塞,由inquiryCompleted()回调方法唤醒

wait();

}

catch (InterruptedException e1) {

e1.printStackTrace();

}

if (devices.size() > 0) {

RemoteDevice rd1 = (RemoteDevice) devices.elementAt(0);

String name = "";

try {

name = rd1.getFriendlyName(true);

} catch (IOException ex) {

ex.printStackTrace();

}

showInfo("设备搜索完毕,共找到" + devices.size() + "个设备,Name= " + name.toString() + " 开始搜索服务");

}

else {

showInfo("设备搜索完毕,共找到0个设备,不能提供服务。");

}

transIDs = new int[devices.size()];

for (int i = 0; i < devices.size(); i++) {

RemoteDevice rd = (RemoteDevice) devices.elementAt(i);

try {

//记录每一次服务搜索的事务id

transIDs[i] = discoveryAgent.searchServices(attrSet, uuidSet,rd, this); //搜寻一个远程设备上的所有服务返回服务搜索的事务id

}

catch (BluetoothStateException e) {

continue;

}

}

try {

//阻塞,由serviceSearchCompleted()回调方法在所有设备都搜索完的情况下唤醒

wait();

}

catch (InterruptedException e1) {

e1.printStackTrace();

}

if (records.size() > 0) {

DataElement serviceNameElement = ((ServiceRecord)records.elementAt(0)).getAttributeV alue(0x0100);//get the Service Name String serviceName = (String)serviceNameElement.getV alue();

showInfo("服务搜索完毕,共找到" + records.size() + "个服务,Name ="+serviceName.toString());

//this.addCommand(new Command("开始说话", Command.OK, 3));

}

else {

showInfo("服务搜索完毕,共找到" + records.size() + "个服务"+"\n"+"服务搜索完毕,没有找到服务。");

}

//删除Gauge

this.delete(1);

}

public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {

if (devices.indexOf(btDevice) == -1) {

devices.addElement(btDevice);

}

}

public void inquiryCompleted(int discType) {

synchronized (this) {

notify();

}

}

public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { for (int i = 0; i < servRecord.length; i++) {

records.addElement(servRecord[i]);

}

}

public void serviceSearchCompleted(int transID, int respCode) {

for (int i = 0; i < transIDs.length; i++) {

if (transIDs[i] == transID) {

transIDs[i] = -1;

break;

}

}

//如果所有的设备都已经搜索服务完毕,则唤醒初始化线程。

boolean finished = true;

for (int i = 0; i < transIDs.length; i++) {

if (transIDs[i] != -1) {

finished = false;

break;

}

}

if (finished) {

synchronized (this) {

notify();

}

}

}

}

class PrimeThread extends Thread {

private java.io.DataOutputStream dos;

private java.io.DataInputStream dis;

ClientBox cbs;

Player register;

Player play;

javax.microedition.media.control.RecordControl rc;

StreamConnection conn ;

PrimeThread(StreamConnection conn ,ClientBox c ) {

this.conn = conn;

cbs = c;

}

public void run() {

try{

register = Manager.createPlayer("capture://audio");

register.realize();

rc = (javax.microedition.media.control.RecordControl)register.getControl("RecordControl");

dos = conn.openDataOutputStream();

rc.setRecordStream(dos);

cbs.input.setString("开始录音");

rc.startRecord();

register.start();

this.currentThread().sleep(3000);

https://www.sodocs.net/doc/5919241379.html,mit();

register.close();

cbs.input.setString("录音结束");

dos.close();

this.currentThread().sleep(1000);

dis = conn.openDataInputStream();

byte [] arry = new byte[44032];

cbs.input.setString("开始接收数据");

for( int i = 0;i<43;i++) {

if(i == 43) {

dis.read(arry,i*1024,44844-(1024*i));

cbs.input.setString("开始接收数据"+i);

} else {

dis.read(arry,i*1024,1024);

cbs.input.setString("开始接收数据"+i);

}

}

dis.close();

cbs.input.setString( cbs.input.getString()+"接收数据结束");

ByteArrayInputStream baInputs = new ByteArrayInputStream(arry);

play = Manager.createPlayer(baInputs, "audio/X-wav");

cbs.input.setString( cbs.input.getString()+"播放开始");

play.start();

this.currentThread().sleep(5000);

cbs.input.setString("播放结束");

play.close();

} catch (IOException ioe) {

cbs.input.setString(ioe.toString());

System.out.println(ioe.toString());

} catch (MediaException me) {

cbs.input.setString(me.toString());

} catch (InterruptedException ex) {

cbs.input.setString(ex.toString());

}

}

public void distroy(){

try {

if(rc != null){

rc.stopRecord();

https://www.sodocs.net/doc/5919241379.html,mit();

}

if(register!=null){

register.stop();

}

if(play!=null) {

play.stop();

}

if( dos != null )

dos.close();

if( dis != null )

dis.close();

if( conn != null )

conn.close();

} catch (IOException ex) {

ex.printStackTrace();

} catch (MediaException ex) {

ex.printStackTrace();

}

}

}

Android蓝牙协议指南

Android蓝牙协议栈 Android蓝牙协议栈使用的是BlueZ,支持GAP, SDP, and RFCOMM规范,是一个SIG认证的蓝牙协议栈。 Bluez 是GPL许可的,因此Android的框架内与用户空间的bluez代码通过D-BUS进程通讯进行交互,以避免专有代码。 Headset和Handsfree(v1.5)规范就在Android框架中实现的,它是跟Phone App紧密耦合的。这些规范也是SIG认证的。 下面的图表提供了一个以库为导向的蓝牙栈视图。 实线框的是Android模块,红色虚线部分为合作伙伴指定模块(译者注:芯片商提供)。 下面的图表是以进程为导向视图:

移植 BlueZ是兼容蓝牙2.1的,可以工作在任何2.1芯片以及向后兼容的旧的蓝牙版本。有要有两个方面: ?串口驱动 UART driver ?蓝牙电源开/关 Bluetooth Power On/Off 串口驱动 BlueZ核心子系统使用hciattach守护进程添加你的指定硬件串口驱动。

例如,MSM7201A,这个文件是在drivers/serial/msm_serial.c。你还需要通过修改init.rc为hciattach来编辑命令 行选项。 蓝牙电源开/关 蓝牙芯片的电源开关方法1.0和Post 1.0是不同的,具体如下: ? 1.0:Android框架写0或1到/sys/modules/board_[PLATFORM]/parameters/bluetooth_power_on ?Post 1.0:Android框架使用linux rfkill API,参考 arch/arm/mach-msm/board-trout-rfkill.c例子。 编译 编译Android打开蓝牙支持,添加下面这行内容到BoardConfig.mk。 BOARD_HAVE_BLUETOOTH :=true 解决问题 调试 调试你的蓝牙实现,可以通过读跟蓝牙相关的logs(adb logcat)和查找ERROR和警告消息。Android使用Bluez,同时 会带来一些有用的调式工具。下面的片段为了提供一个建议的例子: hciconfig -a # print BT chipset address and features. Useful to check if you can communicate with your BT chipset. hcidump -XVt # print live HCI UART traffic. hcitool scan # scan for local devices. Useful to check if RX/TX works. l2ping ADDRESS # ping another BT device. Useful to check if RX/TX works. sdptool records ADDRESS # request the SDP records of another BT device. 守护进程日志 hcid(STDOUT)和hciattach(STDERR)的守护进程日志缺省是被写到/dev/null。编辑init.rc和init.PLATFORM.rc在logwrapper下运行这些守护进程,把它们输出到logcat。 hciconfig -a 和 hcitool

基于Android的蓝牙遥控小车设计

成绩评定表

课程设计任务书

阐述一种通过手机蓝牙遥控小车行走的软、硬件设计。手机蓝牙作为客户端,小车上的蓝牙模块HC-05作为服务端。客户端采用Eclipse 开发环境,J2ME编程,服务端采用单片机控制。双方通过串口仿真协议进行通信,单片机驱动直流电机控制小车行动。实验结果表明,小车可以接收手机遥控信号并灵活地进行前行、倒退、左转、右转和停止等功能。 关键词:89c52,hc-05,遥控小车,Andriod

目录 1引言 (1) 1.1课题设计目的及意义 (1) 1.1.1设计的目的 (1) 1.1.2设计的意义 (2) 2 方案比较与论证 (2) 2.1无线单元方案与比较 (2) 3 硬件电路设计 (4) 3.1 总体设计 (4) 3.2 单片机模块 (5) 3.2.1 STC89C52简介 (5) 3.2.2 L298N驱动模块及原理介绍 (6) 3.2.3 蓝牙模块 (7) 4 软件设计 (8) 4.1 智能车运动控制程序 (8) 4.2 Android蓝牙客户端设计与实现 (9) 4.2.1 客户端界面设计 (10)

4.2.2 BluetoothCar类设计 (10) 4.2.3 单片机C语言代码 (10) 5 实验结果及分析 (16) 6 心得体会 (17) 参考文献 (17)

1引言 1.1课题设计目的及意义 1.1.1设计的目的 遥控小车起源于美国,由于政府对无线遥控小车研发的资助以及相关资助的推动作用,日本、美国、德国等工业大国在遥控小车技术上占据着明显优势。我国的无线遥控小车研究工作始于20世纪中后期,在国家的863、973等技术发展计划的重点支持下,国内已大范围地进行无线遥控小车的研究。在研发应用方面取得了重要发展,但是与国际先进还存在一定的差距。无线遥控实现方法包括蓝牙、红外、射频几种,其中蓝牙技术具有一定优势。目前在信息家电方面应用正在铺。遥控小车起源于美国,由于政府对无线遥控小车研发的资助以及相关资助的推动作用,日本、美国、德国等工业大国在遥控小车技术上占据着明显优势。我国的无线遥控小车研究工作始于20世纪中后期,在国家的863、973等技术发展计划的重点支持下,国内已大范围地进行无线遥控小车的研究。在研发应用方面取得了重要发展,但是与国际先进还存在一定的差距。无线遥控实现方法包括蓝牙、红外、射频几种,其中蓝牙技术具有一定优势。目前在信息家电方面应用正在铺开。各种家电共用遥控,并可组网与公众互联网相接,共享有用信息。目前蓝牙技术实现无线遥控的短板在于传输距离短和芯片

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手机蓝牙通信设计 RFCOMM协议客户端+语音传送与接收

手机蓝牙通信设计RFCOMM协议客户端+语音传送与接收 最近作相关蓝牙RFCOMM协议的东西,下面类主要是针对蓝牙串口协议的客户端,其中包含了设备的搜索,服务的搜索,以及MMAPI函数的应用,希望通过这个类,能让初学者掌握基本的设备的搜索,服务的搜索,和蓝牙串口协议以及录音和语音发送播放等: 注意HelloMidlet midlet为一个基础设计的界面类,用来调用ClientBox 类 import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.*; import java.util.V ector; import javax.microedition.io.Connector; import javax.microedition.io.StreamConnection; import https://www.sodocs.net/doc/5919241379.html,mand; import https://www.sodocs.net/doc/5919241379.html,mandListener; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; import javax.microedition.lcdui.Gauge; import javax.microedition.lcdui.StringItem; import javax.microedition.lcdui.TextField; //jsr082 API import javax.bluetooth.BluetoothStateException; import javax.bluetooth.DeviceClass; import javax.bluetooth.DiscoveryAgent; import javax.bluetooth.DiscoveryListener; import javax.bluetooth.LocalDevice; import javax.bluetooth.RemoteDevice; import javax.bluetooth.ServiceRecord; import javax.bluetooth.UUID; import hello.HelloMidlet; import java.io.InputStream; // import javax.microedition.media.*; import javax.bluetooth.DataElement; /** * 客户端GUI */ public class ClientBox extends Form. implements Runnable, CommandListener, DiscoveryListener {

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平台蓝牙通信的实现

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的蓝牙In-band ring功能的实现

龙源期刊网 https://www.sodocs.net/doc/5919241379.html, 基于Android的蓝牙In-band ring功能的实现 作者:陈媛媛 来源:《中国新通信》2016年第08期 【摘要】蓝牙作为一种短距无线数据与语音传输的开放性全球规范,目前在整个世界范 围内都得到了很广泛的应用。它可以支持便携式计算机、移动终端以及其他电子设备之间通过建立无线电空中接口相互通信,可以方便地进行数据和语音传输。Android是基于Linux的移动操作系统,目前在终端市场占据了70%的市场份额,应用相当广泛。本文通过研究Android 系统以及蓝牙协议栈,在现有架构基础上平台实现了in-band ring功能。 【关键字】蓝牙 Android in-band ring 一、引言 蓝牙(Bluetooth)技术规范由蓝牙特别兴趣小组(SIG)制订,在使用通用无线传输模块和数据通信协议的基础上,开发交互式服务和应用,多用于便携式通信设备。 整个蓝牙协议体系结构自上而下分为高端应用层、中间协议层和底层硬件模块,结构如图1所示。 蓝牙协议栈最上层为应用层,它对应于各种应用模型的剖面(Profile)。 中间协议层由逻辑链路控制与适配协议、服务发现协议、串口仿真协议和电话控制协议等规范组成。它是蓝牙协议栈的核心部分,主要实现了逻辑链路控制与适配协议实现数据的拆装、服务质量的控制和协议复用等功能,为上层协议的实现提供相应的基础。服务发现协议主要为上层应用程序提供一种发现网络中可用的服务及其特性的特殊机制;串口仿真协议是为运行在不同设备上的两个应用程序建立一条完整的通信路径,并保持两个设备之间有一个通信段;电话控制协议则提供蓝牙设备间话音和数据的呼叫控制指令[1]。 蓝牙射频、基带层和链路管理层构成蓝牙的底层模块。蓝牙射频用于实现数据位流的过滤和无线传输;基带层主要控制跳频和蓝牙数据信息帧的传输;链路管理层则用于建立和拆除链路,以及链接的安全和控制。它们共同为上层软件模块提供相应的访问接口。两个模块之间的数据的传输必须通过蓝牙主机控制器接口(HCI)的解释才能进行[2]。

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与BLE的蓝牙通信系统的实现

基于Android与BLE的蓝牙通信系统的实现 高科技电子行业的发展,引领了可穿戴设备的风潮,人们越发追求于其低功耗和稳定性。文章實现了一个基于Android和BLE的蓝牙通信系统,除了能通过蓝牙连接Android手机进行通信以及强大的低耗能优势以外,还对BLE连接流程进行了优化,提高了硬件和软件之间的蓝牙通信性能。 标签:BLE;Android;蓝牙通信 Abstract:The development of high-tech electronic industry leads the trend of wearable devices,and people increasingly pursue its low power consumption and stability. In this paper,a Bluetooth communication system based on Android and BLE is implemented. In addition to being able to communicate with Android mobile phone through Bluetooth and powerful low energy consumption advantage,the flow of BLE connection is optimized,improving Bluetooth communication performance between hardware and software. Keywords:BLE;Android;Bluetooth communication 引言 自从“可穿戴设备”这个名词进入人们的视线,越来越多的消费者愿意去尝试这项新技术,在巨大利益的推动下,对可穿戴设备的研究也如火如荼地展开。目前可穿戴设备的技术还不够成熟,功能强大的设备无法独立使用,很多功能需要配合手机软件才能够完成,因此设备与App之间的通信成为人们重点关注的对象。目前,大多数的可穿戴设备和App的通信都是使用蓝牙作为数据传输方式,而Android系统亦是目前手机最流行的操作系统,故本文开发了一个基于Android 的蓝牙通信系统。 蓝牙分为低功耗蓝牙和经典蓝牙,低功耗蓝牙,即BLE,对应的是蓝牙4.0及以上版本。经典蓝牙又分为传统蓝牙和高速蓝牙,高速蓝牙指的是3.0版本,蓝牙3.0以下版本属于传统蓝牙[1]。低功耗蓝牙与经典蓝牙相比,它的通信距离从10米扩展到100米,发送数据所需的时间也从100ms降至3ms,相应延时也从100ms降至6ms。虽然数据传输速率还无法与高速蓝牙相比,但在耗能方面,极大体现了低功耗蓝牙的价值,能够以极低的运行和待机功耗使一粒纽扣电池连续工作数年之久,此外,它还有低成本和跨厂商的互操作性[2],所以低功耗蓝牙将是可穿戴设备更好的选择。数据同步成功率是设备与App之间蓝牙通信性能的一大体现,很多网络上的Android App与各种设备的数据同步成功率不到80%,如何提高设备和App之间的蓝牙通信性能,也是BLE应用开发者关注的重点。 BLE在待机功耗和运行功耗上的特点符合当今可穿戴设备的发展需求,在未来一段时间,它将占据可穿戴设备通信的主流市场。本系统基于Android 4.3

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)就是蓝牙无线通信协议标准,它规定了蓝牙应用产品应遵循的标准和需要达到的要求。蓝牙协议规范遵循开放系

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系

相关主题