当前位置:文档之家› Android蓝牙系统分析与开发

Android蓝牙系统分析与开发

Android蓝牙系统分析与开发
Android蓝牙系统分析与开发

Android蓝牙系统分析与开发

安卓蓝牙使用的是Bluez协议栈,整个android蓝牙系统包括三大部分:

1.驱动部分:在kernel/driver/bluetooth目录,主要包括电源管理和蓝牙休眠部分

在kernel/driver/tty目录还有蓝牙的uart或usb驱动

2.Bluez协议栈部分:包含的内容很复杂,有基本协议栈,如hci/l2cap/rfcomm/

等,还有a2dp/obex等profile,代码分布在许多位置;

3.蓝牙应用部分,主要是蓝牙设置界面等等。

以下是我从网上转过来的一些内容:

实战Linux Bluetooth编程(一)协议栈概述

Sam一年前在Linux下写了一个类似Windows下BTW的库--BTX。现在需要添加新功能时发现很多知识点都忘记

了。所以决定在这次学习中,把一些bluez API记录下来。这几天又想,这样还不够,不如把Linux下的

Bluetooth编程基础给记录下来吧。

前言:随着嵌入式系统的飞速发展,很多嵌入式平台上需要Bluetooth设备和应用。但在Linux下如何对

Bluetooth编程,一直没有一份很好的中文文档。Sam结合自己的工作,一步一步将一些有用的东西记录下来

,希望对其它Linux下Bluetooth编程的朋友有点帮助。

一:Bluetooth基本概念:

Bluetooth是爱立信、诺基亚、东芝、IBM和Intel 5家公司在1998年联合推出的一项无线网络技术。其宗旨

是提供一种短距离、低成本的无线传输应用技术。在行业协会筹备阶段,需要一个极具有表现力的名字来命

名这项高新技术。行业组织人员,在经过一夜关于欧洲历史和未来无限技术发展的讨论后,有些人认为用

Blatand国王的名字命名再合适不过了。Blatand国王将现在的挪威,瑞典和丹麦统一起来;就如同这项即将

面世的技术,将标准不一的短距离无线传输技术统一起来。

Intel负责半导体芯片和传输软件的开发,爱立信负责无线射频和移动电话软件的开发,IBM和东芝负责笔记

本电脑接口规格的开发。

蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备、计算机及其终端设备、各种数字数据系统、

甚至家用电器采用无线方式联接起来。它的传输距离为10cm~10m,如果增加功率或是加上某些外设便可达

到100m的传输距离。它采用2.4GHz ISM频段和调频、跳频技术,使用权向纠错编码、ARQ、TDD和基带协议。

TDMA每时隙为0.625μs,基带符合速率为1Mb/s。蓝牙支持64kb/s实时语音传输和数据传输,语音编码为

CVSD,发射功率分别为1mW、2.5mW和100mW,并使用全球统一的48比特的设备识别码。由于蓝牙采用无线接

口来代替有线电缆连接,具有很强的移植性,并且适用于多种场合,加上该技术功耗低、对人体危害小,而

且应用简单、容易实现,所以易于推广。

蓝牙技术的系统结构分为三大部分:底层硬件模块、中间协议层和高层应用。底层硬件部分包括无线跳频(

RF)、基带(BB)和链路管理(LM)。无线跳频层通过2.4GHz无需授权的ISM 频段的微波,实现数据位流的

过滤和传输,本层协议主要定义了蓝牙收发器在此频带正常工作所需要满足的条件。基带负责跳频以及蓝牙

数据和信息帧的传输。链路管理负责连接、建立和拆除链路并进行安全控制。

关于bluetooth协议栈,接下来再谈。

当前已经实现的Bluetooth栈有以下各种:

1. Widcomm: 第一个windows上的协议栈,由Widcomm公司开发,也就是现在的Broadcom.

2. Microsoft Windows stack: Windows XP SP2中包括了这个内建的协议栈,开发者也可以调用其API开发

第三方软件。

3. Toshiba stack: 它也是基于Windows的,不支持第三方开发,但它把协议栈授权给一些laptop商(sony,

asus等,我的本本上就是Toshiba的)。它支持的Profile有: SPP, DUN, FAX, LAP, OPP, FTP, HID,

HCRP, PAN, BIP, HSP, HFP , A2DP, AVRCP, GAVDP)

4. BlueSoleil: 著名的IVT公司的产品.该产品可以用于桌面和嵌入式,他也支持第三方开发,DUN, FAX,

HFP, HSP, LAP, OBEX, OPP, PAN SPP, AV, BIP, FTP, GAP, HID, SDAP, and SYNC。

5. Bluez: Linux官方协议栈,该协议栈的上层用Socket封装,便于开发者使用,通过DBUS与其它应用程序

通信。

6. Affix: NOKIA公司的协议栈,在Symbian系统上运行.

7. BlueDragon:东软公司产品,好像2002年6月就通过了蓝牙的认证,支持的Profile:SDP、Serial-DevB

、AVCTP、AVRCP-Controller、AVRCP-Target、Headset-AG、Headset-HS、OPP-Client、OPP-Server、CT-GW

、CT-Term、Intercom、FT-Server、FT-Client、GAP、SDAP、Serial-DevA、AVDTP、GAVDP、A2DP-Source、

A2DP-Sink.

8. BlueMagic:美国Open Interface 公司for portable embedded divce的协议栈,iphone(apple),nav-

u(sony)等很多电子产品都用该商业的协议栈,BlueMagic 3.0是第一个通过bluetooth 协议栈1.1认证的协

议栈,那么我现在就在用它,那么该栈用起来简单,API清晰明了。实现了的profile

有:HCI,L2CAP,RFCOMM,A/V,Remote,Control,A/V,Streaming,BIP,BPP,DUN,FAX, FTP,GAP,Hands-

Free,and,Headset,HCRP,HID,OBEX,OPP,PAN,BNEP,PBAP,SAP,SPP,Synchronizat ion,SyncML,Telephony,XML.

9. BCHS-Bluecore Host Software: 蓝牙芯片CSR的协议栈,同时他也提供了一些上层应用的Profile的库,

当然了它也是为嵌入式产品了,支持的Profile有:

A2DP,AVRCP,PBAP,BIP,BPP,CTP,DUN,FAX,FM API,FTP

GAP,GAVDP,GOEP,HCRP,Headset,HF1.5,HID,ICP,JSR82,LAP Message Access

Profile,OPP,PAN,SAP,SDAP,SPP,SYNC,SYNC ML。

10. Windows CE:微软给Windows CE开发的协议栈,但是windows ce本身也支持其它的协议栈

11. BlueLet:IVT公司for embedded product的清量级协议栈。

实战Linux Bluetooth编程(二) BlueZ简介

Linux下Bluetooth协议栈的实现. Linux下开放的蓝牙协议栈主要包括IBM公司的BlueDrekar,Nokia公司的

Affix, Axis公司的OpenBT和官方协议栈BlueZ。我们主要面对Bluez来探讨。

BlueZ基础代码均是由Maxim Krasnyansky完成的。包括:HCI,L2CAP,RFCOMM 和基本socket的实现。他就职

于Qualcomm(高通)。Marcel Holtmann开发层的协议和应用,包括:BNEP, CMTP 等。当然,这些中也有Maxim

Krasnyansky的参预。有部分代码由Nokia提供的。

Bluez是如何实现Bluetooth协议栈的呢?它分2部分实现:

1.Kernel层实现:

正如上一篇所谈到的,bluetooth协议栈有多层结构,最底层的硬件协议在硬件中就已经实现了。(例如

broadcom的芯片中,底层硬件协议已经包含于芯片之中了)。软件级别的协议实现,从HCI这一层起就可以

了。 BlueZ对各层协议的实现是依托于Socket的。BlueZ首先创建了一个新的Socket中的协议--

PF_BLUETOOTH (AF_BLUETOOTH=31). (也就是说,Socket()的第一个参数:domain必须是:

PF_BLUETOOTH )。这也意味着,地址类型需要使用Bluetooth所定义的。

其实很简单,就是在net_families(网络协议列表)中添加了PF_BLUETOOTH这一项。如果对Linux Kernel有了

解的话,就知道这个注册动作一定在Bluetooth init部分作的。

同样,各个协议层(如:HCI,L2CAP,HID等)都将自己的行为规范添加到

PF_BLUETOOTH协议中。

2.应用程序层实现:

虽然Kernel层已经将Bluetooth协议栈完全实现了,但如果要使用起来,还是非常不方便的。毕竟应用程序

与kernel最方便的交流通道就是ioctl().这非常不直观。于是,BlueZ又提供了一套API,这个API帮助开发者

方便的与Kernel层协议打交道。当然,这些API底层的实现其就是是ioctl.

BlueZ的时间,基本就是这样了。下面咱们具体研究如何使用BlueZ所提供的这套API。

实战Linux Bluetooth编程(三) HCI层编程

1. HCI层协议概述:

HCI提供一套统一的方法来访问Bluetooth底层。如图所示:

从图上可以看出,Host Controller Interface(HCI) 就是用来沟通Host和Module。Host通常就是PC,

Module则是以各种物理连接形式(USB,serial,pc-card等)连接到PC上的bluetooth Dongle。

在Host这一端:application,SDP,L2cap等协议都是软件形式提出的(Bluez 中是以kernel层程序)。在

Module这一端:Link Manager, BB, 等协议都是硬件中firmware提供的。

而HCI则比较特殊,它一部分在软件中实现,用来给上层协议和程序提供访问接口(Bluez中,hci.c

hci_usb.c,hci_sock.c等).另一部分也是在Firmware中实现,用来将软件部分的指令等用底层协议明白的

方式传递给底层。

居于PC的上层程序与协议和居于Modules的下层协议之间通过HCI沟通,有4种不同形式的传输:Commands,

Event, ACL Data, SCO/eSCO Data。

1.1. HCI Command:

HCI Command是Host向Modules发送命令的一种方式。HCI Command Packet结构如下:

OpCode用来唯一标识HCI Command.它由2部分组成,10bit的Opcode Command. 6bit的Opcode Group。

1.1.1: OpCode Group:

Linux Kernel(BlueZ)中,~/include/net/bluetooth/hci.h中定义了OpCode Group。

#define OGF_LINK_CTL 0x01

#define OGF_LINK_POLICY 0x02

#define OGF_HOST_CTL 0x03

#define OGF_INFO_PARAM 0x04

#define OGF_STATUS_PARAM 0x05

它们代表了不同的Command Group:

OGF_LINK_CTL: Link control,这个Command Group中的Command允许Host控制与其它bluetooth device 的连

接。

OGF_LINK_POLICY :Link Policy。这个Command Group中的Command允许调整Link Manager control.

OGF_HOST_CTL: Control and Baseband.

1.1.2: Opcode Command:

用来在同一个Group内唯一识别Command。~/include/net/bluetooth/hci.h中定义。

1.2: HCI Event:

Modules向Host发送一些信息,使用HCI Event。Event Packet结构如下:

HCI Event分3种:Command complete Event, Command States Event,Command Subsequently Completend.

Command complete Event: 如果Host发送的Command可以立刻有结果,则会发送此类Event。也就是说,如果

发送的Command只与本地Modules有关,不与remote设备打交道,则使用Command complete Event。例如:

HCI_Read_Buffer_Size.

Command States Event:如果Host发送的Command不能立刻得知结果,则发送此类Event。Host发送的

Command执行要与Remote设备打交道,则必然无法立刻得知结果,所以会发送Command States Event.例如:

HCI Connect。

Command Subsequently Completend:Command延后完成Event。例如:连接已建立。

下图是一个Command-Event例子:

从这里可以看出,如果Host发送的Command是与Remote device有关的,则会先发送Command States Event

。等动作真正完成了,再发送 Command Subsequently Completend。

HCI ACL与SCO数据,这里就不多讲了。只需要明白,l2cap数据是通过ACL数据传输给remote device的。

下图很明白的展示了l2cap数据如何一步一步转化为USB数据并传递给底层协议的。

很明显,一个l2cap包会按照规则先切割为多个HCI数据包。HCI数据包再通过HCI-usb这一层传递给USB设备

。每个包又通过USB driver发送到底层。

2. HCI protocol的实现:

(稍后添加)

3. HCI 层的编程:

正如上一节所说,HCI是沟通上层协议以及程序与底层硬件协议的通道。所以,通过HCI发送的Command都是

上层协议或者应用程序发送给Bluetooth Dongle的。它命令Bluetooth Dongle (或其中的硬件协议)去做什

么何种动作。

3.0:得到Host上插入Dongle数目以及Dongle信息:

我们先复习一下socket的概念:

使用函数socket()建立一个Socket,就如同你有一部电话.bind()则是把这个电话和某个电话号码(网络地

址)对应起来。

类似的,我们可以把Host理解为一个房间,这个房间有多部电话(Dongle)。

当使用socket() 打开一个HCI protocol的socket,表明得到这个房间的句柄。HOST可能会有多个Dongle。

换句话说,这个房间可以有多个电话号码。所以HCI会提供一套指令去得到这些Dongle。

// 0. 分配一个空间给 hci_dev_list_req。这里面将放所有Dongle信息。

struct hci_dev_list_req *dl;

struct hci_dev_req *dr;

struct hci_dev_info di;

int i;

if (!(dl = malloc(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t)))) {

perror("Can't allocate memory");

exit(1);

}

dl->dev_num = HCI_MAX_DEV;

dr = dl->dev_req;

//1. 打开一个HCI socket.此socket相当于一个房间。

if ((ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0) { perror("Can't open HCI socket.");

exit(1);

}

// 2. 使用HCIGETDEVLIST,得到所有dongle的Device ID。存放在dl中。

if (ioctl(ctl, HCIGETDEVLIST, (void *) dl) < 0) {

perror("Can't get device list");

exit(1);

}

// 3 使用HCIGETDEVINFO,得到对应Device ID的Dongle信息。

di.dev_id = (dr+i)->dev_id;

ioctl(ctl, HCIGETDEVINFO, (void *) &di);

这样就能得到所有Dongle信息。

struct hci_dev_info {

uint16_t dev_id; //dongle Device ID

char name[8]; //Dongle name

bdaddr_t bdaddr; //Dongle bdaddr

uint32_t flags; //Dongle Flags:如:UP,RUNING,Down等。

uint8_t type; //Dongle连接方式:如USB,PC Card,UART,RS232等。uint8_t features[8];

uint32_t pkt_type;

uint32_t link_policy;

uint32_t link_mode;

uint16_t acl_mtu;

uint16_t acl_pkts;

uint16_t sco_mtu;

uint16_t sco_pkts;

struct hci_dev_stats stat; //此Dongle的数据信息,如发送多少个ACL Packet,正确多少,错误多

少,等等。

};

3.0.1: UP和Down Bluetooth Dongle:

ioctl(ctl, HCIDEVUP, hdev)

ioctl(ctl, HCIDEVDOWN, hdev)

ctl:为使用socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)打开的Socket.

hdev: Dongle Device ID.(所以上面的Socket不需要bind,因为这边指定了)

3.1 BlueZ提供的HCI编程接口一(针对本地Dongle的API系列):

3.1。1 打开一个HCI Socket---int hci_open_dev(int dev_id):

这个function用来打开一个HCI Socket。它首先打开一个HCI protocol的Socket(房间),并将此Socket与

device ID=参数dev_id的Dongle绑定起来。只有bind后,它才将Socket句柄与Dongle对应起来。

注意,所有的HCI Command发送之前,都需要使用 hci_open_dev打开并绑定。

3.1.2: 关闭一个HCI Socket:

int hci_close_dev(int dd) //简单的关闭使用hci_open_dev打开的Socket。

3.1.3: 向HCI Socket(对应一个Dongle)发送 request:

int hci_send_req(int dd, struct hci_request *r, int to)

BlueZ提供这个function非常有用,它可以实现一切Host向Modules发送Command的功能。

参数1:HCI Socket。

参数2:Command内容。

参数3:以milliseconds为单位的timeout.

下面详细解释此function和用法:

当应用程序需要向Dongle(对应为一个bind后的Socket)发送Command时,调用此function.

其中,参数一dd对应一个使用hci_open_dev()打开的Socket(Dongle)。

参数三to则为等待Dongle执行并回复命令结果的timeout.以毫秒为单位。

参数二hci_request * r 最为重要,首先看它的结构:

struct hci_request {

uint16_t ogf; //Opcode Group

uint16_t ocf; //Opcode Command

int event; //此Command产生的Event类型。

void *cparam; //Command 参数

int clen; //Command参数长度

void *rparam; //Response 参数

int rlen; //Response 参数长度

};

ogf,ocf不用多说,对应前面的图就明白这是Group Code和Command Code。这两项先确定下来,然后可以查

HCI Spec。察看输入参数(cparam)以及输出参数(rparam)含义。至于他们的结构以及参数长度,则在

~/include/net/bluetooth/hci.h中有定义。

至于event.如果设置,它会被setsockopt设置于Socket。

例1:得到某个连接的Policy Setting.

HCI Spec以及~/include/net/bluetooth/hci.h中均可看到,

OGF=OGF_LINK_POLICY(0x02).

OCF=OCF_READ_LINK_POLICY(0x0C).

因为这个Command用来读取某个ACL连接的Policy Setting。所以输入参数即为此连接Handle.

返回参数则包含3部分,status(Command是否顺利执行), handle(连接Handle)。policy(得到的policy

值)

这就又引入了一个新问题,如何得到某个ACL连接的Handle。

可以使用ioctl HCIGETCONNINFO得到ACL 连接Handle。

ioctl(dd, HCIGETCONNINFO, (unsigned long) cr);

Connect_handle = htobs(cr->conn_info->handle);

所以完整的过程如下:

struct hci_request HCI_Request;

read_link_policy_cp Command_Param;

read_link_policy_rp Response_Param;

// 1.得到ACL Connect Handle

if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) {

return -1;

}

Connect_handle = htobs(cr->conn_info->handle);

memset(&HCI_Request, 0, sizeof(HCI_Request));

memset(&Command_Param, 0 , sizeof(Command_Param)); memset(&Response_Param, 0 , sizeof(Response_Param));

// 2.填写Command输入参数

Command_Param.handle = Connect_handle;

HCI_Request.ogf = OGF_LINK_POLICY; //Command组ID

HCI_Request.ocf = OCF_READ_LINK_POLICY; //Command ID HCI_Request.cparam = &Command_Param;

HCI_Request.clen = READ_LINK_POLICY_CP_SIZE;

HCI_Request.rparam = &Response_Param;

HCI_Request.rlen = READ_LINK_POLICY_RP_SIZE;

if (hci_send_req(dd, &HCI_Request, to) < 0)

{

perror("\nhci_send_req()");

return -1;

}

//如果返回值状态不对

if (Response_Param.status) {

return -1;

}

//得到当前policy

*policy = Response_Param.policy;

3.1.4:几个更基础的function:

static inline void bacpy(bdaddr_t *dst, const bdaddr_t *src) //bdaddr copy

static inline int bacmp(const bdaddr_t *ba1, const bdaddr_t *ba2)//bdaddr 比较

3.1.5: 得到指定Dongle BDAddr:

int hci_read_bd_addr(int dd, bdaddr_t *bdaddr, int to);

参数1:HCI Socket,使用hci_open_dev()打开的Socket(Dongle)。

参数2:输出参数,其中会放置bdaddr.

参数3:以milliseconds为单位的timeout.

3.1.6: 读写Dongle Name:

int hci_read_local_name(int dd, int len, char *name, int to)

int hci_write_local_name(int dd, const char *name, int to)

参数1:HCI Socket,使用hci_open_dev()打开的Socket(Dongle)。

参数2:读取或设置Name。

参数3:以milliseconds为单位的timeout.

注意:这里的Name与IOCTL HCIGETDEVINFO 得到hci_dev_info中的name不同。

3.1.7:得到HCI Version:

int hci_read_local_version(int dd, struct hci_version *ver, int to)

3.1.8:得到已经UP的Dongle BDaddr:

int hci_devba(int dev_id, bdaddr_t *bdaddr);

dev_id: Dongle Device ID.

bdaddr:输出参数,指定Dongle如果UP,则放置其BDAddr。

3.1.9: 得到Dongle Info:

int hci_devinfo(int dev_id, struct hci_dev_info *di)

dev_id: Dongle Device ID.

di: 此Dongle信息。

出错返回 -1。

注意,这个Function的做法与3.0的方法完全一致。

3.1.10:从hciX中得到X:

int hci_devid(const char *str)

str: 类似 hci0这样的字串。

如果hciX对应的Device ID(X)是现实存在且UP。则返回此设备Device ID。

3.1.11:得到BDADDR不等于参数bdaddr的Dongle Device ID:

int hci_get_route(bdaddr_t *bdaddr)

查找Dongle,发现Dongle Bdaddr不等于参数bdaddr的第一个Dongle,则返回此Dongle Device ID。

所以,如果: int hci_get_route(NULL),则得到第一个可用的Dongle Device ID。

3.1.12: 将BDADDR转换为字符串:

int ba2str(const bdaddr_t *ba, char *str)

3.1.13: 将自串转换为BDADDR:

int str2ba(const char *str, bdaddr_t *ba)

3.2 BlueZ提供的HCI编程接口二(针对Remote Device的API系列):

3.2.1 inquiry 远程Bluetooth Device:

int hci_inquiry(int dev_id, int len, int nrsp, const uint8_t *lap, inquiry_info **ii, long

flags)

hci_inquiry()用来命令指定的Dongle去搜索周围所有bluetooth device.并将搜索到的Bluetooth Device

bdaddr 传递回来。

参数1:dev_id:指定Dongle Device ID。如果此值小于0,则会使用第一个可用的Dongle。

参数2:len: 此次inquiry的时间长度(每增加1,则增加1.25秒时间)

参数3:nrsp:此次搜索最大搜索数量,如果给0。则此值会取255。

参数4:lap:BDADDR中LAP部分,Inquiry时这块值缺省为0X9E8B33.通常使用NULL。则自动设置。

参数5:ii:存放搜索到Bluetooth Device的地方。给一个存放inquiry_info 指针的地址,它会自动分配空间

。并把那个空间头地址放到其中。

参数6:flags:搜索flags.使用IREQ_CACHE_FLUSH,则会真正重新inquiry。否则可能会传回上次的结果。

返回值是这次Inquiry到的Bluetooth Device 数目。

注意:如果*ii不是自己分配的,而是让hci_inquiry()自己分配的,则需要调用bt_free()来帮它释放空

间。

3.2.2:得到指定BDAddr的reomte device Name:

int hci_read_remote_name(int dd, const bdaddr_t *bdaddr, int len, char *name, int to)

参数1:使用hci_open_dev()打开的Socket。

参数2:对方BDAddr.

参数3:name 长度。

参数4:(out)放置name的位置。

参数5:等待时间。

3.2.3: 读取连接的信号强度:

int hci_read_rssi(int dd, uint16_t handle, int8_t *rssi, int to)

注意,所有对连接的操作,都会有一个参数,handle.这个参数是连接的Handle。前面讲过如何得到连接

Handle的。

实战Linux Bluetooth编程(四) L2CAP层编程

(L2CAP协议简介,L2CAP在BlueZ中的实现以及L2CAP编程接口)

一:L2CAP协议简介:

Logical Link Control and Adaptation Protocol(L2CAP)

逻辑连接控制和适配协议 (L2CAP) 为上层协议提供面向连接和无连接的数据服务,并提供多协议功能和分

割重组操作。L2CAP 充许上层协议和应用软件传输和接收最大长度为 64K 的

L2CAP 数据包。

L2CAP 基于通道(channel) 的概念。通道 (Channel) 是位于基带(baseband) 连接之上的逻辑连接

。每个通道以多对一的方式绑定一个单一协议 (single protocol)。多个通道可以绑定同一个协议,但一个

通道不可以绑定多个协议。每个在通道里接收到的 L2CAP 数据包被传到相应的上层协议。多个通道可共

享同一个基带连接。

L2CAP处于Bluetooth协议栈的位置如下:

也就是说,所有L2CAP数据均通过HCI传输到Remote Device。且上层协议的数据,大都也通过L2CAP来传送。

L2CAP可以发送Command。例如连接,断连等等。

下面看Command例子:Connection Request:

其中PSM比较需要注意,L2CAP 使用L2CAP连接请求(Connection Request )命令中的PSM字段实现协议复用

。L2CAP可以复用发给上层协议的连接请求,这些上层协议包括服务发现协议SDP (PSM = 0x0001)、RFCOMM

(PSM = 0x0003)和电话控制(PSM = 0x0005)等。

Protocol PSM Reference

SDP 0x0001 See Bluetooth Service Discovery Protocol (SDP), Bluetooth SIG. RFCOMM 0x0003 See RFCOMM with TS 07.10, Bluetooth SIG.

TCS-BIN 0x0005 See Bluetooth Telephony Control Specification / TCS Binary, Bluetooth SIG.

TCS-BIN-CORDLESS 0x0007 See Bluetooth Telephony Control Specification / TCS Binary, Bluetooth

SIG.

BNEP 0x000F See Bluetooth Network Encapsulation Protocal, Bluetooth SIG. HID_Control 0x0011 See Human Interface Device , Bluetooth SIG.

HID_Interrupt 0x0013 See Human Interface Device, Bluetooth SIG.

UPnP 0x0015 See [ESDP] , Bluetooth SIG.

AVCTP 0x0017 See Audio/Video Control Transport Protocol , Bluetooth SIG. AVDTP 0x0019 See Audio/Video Distribution Transport Protocol , Bluetooth SIG.

AVCTP_Browsing 0x001B See Audio/Video Remote Control Profile, Bluetooth SIG

UDI_C-Plane 0x001D See the Unrestricted Digital Information Profile [UDI], Bluetooth SIG

二:L2CAP编程方法:

L2CAP编程非常重要,它和HCI基本就是Linux Bluetooth编程的基础了。几乎所有协议的连接,断连,读写

都是用L2CAP连接来做的。

1.创建L2CAP Socket:

socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP);

domain=PF_BLUETOOTH, type可以是多种类型。protocol=BTPROTO_L2CAP.

2.绑定:

// Bind to local address

memset(&addr, 0, sizeof(addr));

addr.l2_family = AF_BLUETOOTH;

bacpy(&addr.l2_bdaddr, &bdaddr); //bdaddr为本地Dongle BDAddr

if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {

perror("Can't bind socket");

goto error;

}

3.连接

memset(&addr, 0, sizeof(addr));

addr.l2_family = AF_BLUETOOTH;

bacpy(addr.l2_bdaddr, src);

addr.l2_psm = xxx;

if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("Can't connect");

goto error;

}

注意:

struct sockaddr_l2 {

sa_family_t l2_family; //必须为 AF_BLUETOOTH

unsigned short l2_psm; //与前面PSM对应,这一项很重要

bdaddr_t l2_bdaddr; //Remote Device BDADDR

unsigned short l2_cid;

};

4. 发送数据到Remote Device:

send()或write()都可以。

5. 接收数据:

revc() 或read()

以下为实例:

注:在Bluetooth下,主动去连接的一端作为主机端。被动等别人连接的作为Client端。

背景知识1:Bluetooth设备的状态

之前HCI编程时,是用 ioctl(HCIGETDEVINFO)得到某个Device Info

(hci_dev_info).其中flags当时解释的

很简单。其实它存放着Bluetooth Device(例如:USB Bluetooth Dongle)的当前状态:

其中,UP,Down状态表示此Device是否启动起来。可以使用ioctl(HCIDEVUP)等修改这些状态。

另外:就是Inquiry Scan, PAGE Scan这些状态:

Sam在刚开始自己做L2CAP层连接时,使用另一台Linux机器插USB Bluetooth Dongle作Remote Device。怎么

也没法使用inquiry扫描到remote设备,也没法连接remote设备,甚至无法使用l2ping ping到remote设备。

觉得非常奇怪,后来才发现Remote Device状态设置有问题。没有设置PSCAN

和ISCAN。

Inquiry Scan状态表示设备可被inquiry. Page Scan状态表示设备可被连接。

#hciconfig hci0 iscan

#hciconfig hci0 pscan

或者:#hciconfig hci0 piscan

就可以设置为PSCAN或者iSCAN状态了。

编程则可以使用ioctl(HCISETSCAN) . dev_opt = SCAN_INQUIRY;dr.dev_opt = SCAN_PAGE;dr.dev_opt =

SCAN_PAGE | SCAN_INQUIRY;

则可以inquiry或者connect了。

实战Linux Bluetooth编程(五) Socket与Bluetooth

Linux下Bluetooth编程,借用了Socket体制。也就是说,BlueZ Kernel部分将Bluetooth协议栈以网络协议

的形式添加进网络协议栈,这样极大的方便了用户编程。下面Sam就结合Socket 概念将Linux Bluetooth做个

研究。

1957年10月4日,星期五,苏联发射了人类历史上第一颗人造地球卫星

--Sputnik.这标志着人类外太空时代

的开始。这颗卫星篮球大小,在发射98分钟后到达运转轨道,可以通过短波40.002MHz收听到它的声音。这

也标志着苏联在航天科技领域超过美国。但当时谁能想到,Sputnik的升空竟然促进了TCP/IP和Internel的

出现。(Sam:不知道朝鲜那个轨道高度几百米的卫星会促成什么出现,嘿嘿)。被Sputnik所刺激的美国总统

艾森豪威尔五星上将积极推动ARPA。又因为美国政府为了公平起见,每次采购计算机时都从不同设备制造商

处购买。大家很快发现,各个计算机无法兼容。1962年,Licklider提出:各个计算机高度自治,但他们也

应该能够相互通讯。这就是ARPA网,它成为Internel的前身。

一:理解Socket:

在使用手机与女朋友联系时,必须用手机拨她的号码,然后心情坎坷的等待她的应答。当双方通话时,就建

立了一个具有两个端点的通信线路。

Linux中的Socket与电话非常相似。具体问题,稍后再分析。

二:Socket域(domain),类型(type),协议(protoclo)以及Bluetooth 中的具体使用:

Berkeley小组在构思BSD Socket时,TCP/IP协议也还处在发展之中,其他一些很有竞争力的协议如X.25等也

在发展,其它很多协议还在构思与研究阶段(Bluetooth还没出生)。为了使Socket可以应用于各种不同协

议,domain的作用就在于此。

domain指出想要使用的协议族。

不得不佩服Berkeley小组的前瞻力。他们考虑在指定Socket时,可能还需要进一步的细分类目:

Android应用开发基本知识点汇总

Android应用开发基本知识点汇总 Activity 一生命周期 4种状态 running / paused / stopped / killed 生命周期 Activity启动 onCreate -> onStart -> onResume 点Home返回主界面 onPause -> onStop 再次回到原Activity onRestart -> onStart -> onResume 退出Activity onPause -> onStop -> onDestroy 进程优先级前台/可见/服务/后台/空 二任务栈 三启动模式 standard singleTop 栈顶复用 singleTask 栈内复用 singeInstance 四scheme跳转协议 服务器可以定制化告诉App跳转哪个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面 Fragment 一第五大组件 为什么是第五大组件 Fragment相对Activity更节省内存,切换更舒适Fragment加载到Activity的两种方式 静态加载xml 动态加载fragmentTransaction.add(id, fragment, “name”); .commit; FragmentPagerAdapter与FragmentStatePagerAdapter

FragmentStatePagerAdapter在切换时回收内存,适合页面较多的情况FragmentPagerAdapter并没有回收内存,只是detach了Activity 二生命周期 onAttach -> onCreate -> onCreateView -> onViewCreated -> onActivityCreated -> onStart -> onResume -> onPause -> onStop -> onDestroyView -> onDestroy -> onDetach 先创建Activity后创建Fragment,先销毁Fragment后销毁Activity 三Fragment之间的通信 Fragment调用Activity getActivity Activity调用Fragment 接口回调 Fragment调用Fragment方法findFragmentById 四FragmentManager replace add remove Service 一应用场景,与Thread区别 Service是什么后台长时间运行,没有用户界面,运行在主线程,不能有耗时操作 Service与Thread区别 Activity难以与Thread交互,尤其当Activity销毁以后 二开启Service的两种方式 StartService onCreate -> onStartCommand -> onBind -> onDestroy onStartCommand return START_STICKY;

(完整版)Android应用开发期末考试题

试题 一、选择题 1 android虚拟设备的缩写是(AVD) 2 Android SDK目前支持的操作系统(DOS) 3 Android开发工具插件(ADT)没有提供的开发功能(自动更新) 4Android SDK提供一些开发工具可以把应用软件打包成Android格式文件(APK) 5 Android当中基本的所有的UI都是由(view)或者其子类实现的 6以下不是Android中调试项目的正确步骤(测试用例) 7下列不是Activity的生命周期方法之一的是(OnResume) 8以下可以做EditText编辑框的提示信息是(adroid:hint) 9以下不是Activity启动的方法是(gotoActivity) 10以下不是手机操作系统的是(windows vista) 二、填空题 1 Android平台由操作系统,中间件,用户界面和应用软件组成的。 2 Android平台提供了2D,3D的图形支持,数据库支持SQLite,并且集成了浏览器 3目前已知的可以用来搭建Android开发环境的系统有windows,Linux,Mac 等4开发中推荐使用的IDE开发组合为IDE,eclipse,ADI来开发 5 Android SDK主要以java语言为基础 6创建工程时需要填写的信息名称有工程名,包的名字,Activity的名字还有应用的名字

7 Android.jar是一个标准的压缩包,其内容包含的是编译后的class,包含了全部的API 三、简答题 1 Android SDK中API的包结构的划分?至少五个 android.util,android.os,android.content,android.view,android.graphics,android.text 2 Android软件框架结构自上而下可分为哪些层? 应用程序(Application)、应用程序框架(Application Framework)、各种库(Libraries)和Android运行环境(RunTime)、操作系统层(OS) 3 Android应用程序的4大组件是什么? Activity、Broadcast Intent Receiver、Service、Content Provider 4 Android应用工程文件结构有哪些? 源文件(包含Activity),R.java文件,Android Library,assets目录res目录,drawble目录,layout目录,values目录,AndroidManifest.xml 5 Android开发应用程序最有可能使用到的应用框架部分是哪些? 一组View(UI)组件,Content Providers,Resource Manger,Notification Manger,Activiy Manger 6 Android底层库包含哪些? 系统C库,媒体库,Surface Manager,LibWebCore,SGL 四、编程 1实现点击一个按钮,结束当前Activity并将需要返回的数据放置并关闭当前窗体请编写核心代码 Bundle bundle = new Bundle ( ); Bundle.putString(“store”,”数据来自Activity1”) ;

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

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

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

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

《Android应用开发》课程标准

《Android应用开发》 课程标准 内蒙古电子信息职业技术学院计算机科学系

一.课程设置概述 1.1课程在相关专业中的性质与定位 Android应用开发是物联网应用技术专业(应用开发方向)的核心课程之一,是Android应用程序开发方法的主要课程,是Android应用的主要领域。为了适应高职学生的学习情况,该课程以Android应用技术为重点,逐步阐述Android应用体系结构,介绍Android应用常见的几个功能。采用项目+案例教学法,既让学生掌握Android的基本知识,同时,也让学生在潜移默化中了解一些Android 的高级开发技术,从而为今后实现Android应用开发打下基础。 本课程的任务是使学生通过学习和操作实践,了解和掌握Android的主流应用技术及其开发方法,掌握Android的sdk、Activity、高级UI、网络、多媒体体方面的编程技术。为进一步学习移动互联工程师后续课程打下良好的理论和实践基础。 1.2 本课程的基本教学理念 (一)突出学生主体,注重技能培养,回归能力本位 Android应用开发是移动互联工程师的专业核心课程,注重软件开发基本理论、基本方法和基本技能的学习及素质教育,激发学生的学习兴趣,在启发、提示下使其自主地、全面地理解软件的基本理论和基本方法,提高学生的思维能力和实际操作技能,增强他们理论联系实际的能力,培养学生的创新精神,使学生养成观察、独立分析和解决问题的习惯;以提高技能、磨砺意识、活跃思维、展现个性和拓宽视野。 (二)尊重个体差异,注重过程评价,促进学生发展 本课程在教学过程中,倡导自主学习,启发学生对设定问题积极思考、分析,鼓励多种思维方式并将其表达出来,尊重个体差异。采用项目教学法进行教学,每个项目的成绩采取自评、互评、教师综合评价相结合的方式能激励学生的学习兴趣和自主学习能力的发展。教师在给学生评价成绩时应尽量以学习过程中的评价为主,注重培养和激发学生的学习积极性和自信心。最后期末的成绩评价应注重检测学生的知识应用能力。学生的最终课程成绩应由平时的各次项目成绩和期末的评定成绩按一定比例构成,在把握比例构成时要有利于促进学生的知识应用能力。建立以过程培养促进个体发展,以学生可持续发展能力评价教学过程的双向促进机制,以激发兴趣、展现个性、发展心智和提高素质为基本理念。 (三)整合课程资源,开放创新教学,拓展学习渠道 本课程在教学过程中,提醒学生留意观察并思考生活中接触的Android系统应用,鼓励其结合生活中熟悉的操作方法提出问题或假设,在教师引导下,通过分析、推理,使学生自主学习、总结,以便增强学生对Android开发方法基本理论的理解;通过课堂讲解与讨论、案例分析等促进学生对所学理论的理解和运用,以培 养其实际操作技能。充分利用现代教学手段,不断改进教学方式,突出典型案例

Android应用开发基础习题

-- 任务一Android 开发环境的搭建 第一部分知识回顾与思考 1.Android 的四层架构分别包括哪几层?分别起到什么作用? 答:Linux 内核层(Linux Kernel ):基于Linux 内核,内核为上层系统提供了系统服务。 系统库层(Libraries ):系统库基于C/C++ 语言实现,通过接口向应用程序框架层提供编程接口。 应用框架层(Application Framework ):为开发者提供了一系列的Java API,包括图形用户界面组件

View 、SQLite 数据库相关的API 、Service 组件等。 应用程序层(Applications ):包含了Android 平台中各式各样的应用程序。 第二部分职业能力训练 一、单项选择题(下列答案中有一项是正确的,将正确答案填入括号内) 1.Android 四层架构中,应用框架层使用的是什么语法?(C)A .CB .C++C.Java D.Android 2.Android 四层架构中,系统库层使用的是什么语法?(B)A .VBB.C /C++C.Java D .Android 3.应用程序员编写的Android 应用程序,主要是调用(B)提供的接口进行实现。 A .应用程序层DCB.应用框架层.应用视图层.系统库层

二、填空题(请在括号内填空) 1.在Android 智能终端中,有很多应用如拍照软件、联系人管理软件,它们都属于Android 的(应用程 序)层。 2.为了让程序员更加方便的运行调试程序,Android 提供了(模拟器),可以方便的将程序运行其上, 而不要实际的移动终端。 程序运行,我们需要安装(Java 3.为了支持)。JDK 三、简答题 1.简述Android 开发环境安装的步骤。 答:下载并安装JDK ,配置JDK 的环境变量; 从Anroid 官网上下载Android 开发组件(包含Eclipse 和

Android应用开发试题

Android应用开发试题 一、选择题(每题2分,共30分) 1. 下列不是手机操作系统的是?(D) A.Android B. Window Mobile C. Apple IPhone IOS D.windows vista 2.Android的VM虚拟机是哪个?A A.Dalvik B.JVM C.KVM D.framework 3. AndroidVM虚拟机中运行的文件的后缀名为(B) A.class B.apk C.dex D.xml 4. 下面关于Android DVM的进程和Liunx的进程,应用程序的进程说法正确的是 A.DVM指dalivk的虚拟机.每一个Android应用程序都在自己的进程中运行,不一定拥有一个独立的Dalvik虚拟机实例,而每一个DVM都是在Liunx中的一个进程,所以说可以认为是同一个概念。B B.DVM指dalivk的虚拟机.每一个Android应用程序都在自己的进程中运行,不一定拥有一个独立的Dalvik虚拟机实例,而每一个DVM不一定都是在Liunx 中的一个进程,所以说可以认为不是一个概念。 C.DVM指dalivk的虚拟机.每一个Android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,而每一个DVM不一定都是在Liunx中的一个进程,所以说可以认为不是同一个概念。 D.DVM指dalivk的虚拟机.每一个Android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,而每一个DVM都是在Liunx中的一个进程,所以说可以认为是同一个概念。 5. 下列哪个可做EditText编辑框的提示信息?(D) A. android:inputType B. android:text C. android:digits D. android:hint 6. 在AndroidManifes.xml中描述一个Activity时,该Activity的label属性是指定什么( B) A.指定Activity的图标 B.指定Activity的显示图标 C.指定Activity和类相关联的类名 D.指定该Activity的唯一标识 7. 关于ContentValues类说法正确的是( A ) A.它和Hashtable比较类似,也是负责存储一些名值对,但是它存储的名值对当中的名是String类型,而值都是基本类型。 B.它和Hashtable比较类似,也是负责存储一些名值对,但是它存储的名值对当中的名是任意类型,而值都是基本类型。 C.它和Hashtable比较类似,也是负责存储一些名值对,但是它存储的名值对当中的名可以使空,而值都是String类型。 D.它和Hashtable比较类似,也是负责存储一些名值对,但是它存储的名值对当中的名是String类型,而值也是String类型。 8. Activity对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行( A) A.onPause() B.onCreate() C.onResume() D.onStart 9. 下列哪个不是Activity的生命周期方法之一?(B) A. onCreate B. startActivity C. onStart D. onResume 10.如果在android应用程序中需要发送短信,那么需要在AndroidManifest.xml文件中增加什么样的权限( D). A.发送短信,无需配置权限

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应用技术简介

Android技术应用简介 摘要:近几年来,Android逐渐成为便携设备上的主要操作系统。2011年Android 在全球的市场份额首次超过塞班系统,跃居全球第一。本文主要通过阐述Android的主要思想、发展状况以及核心技术来使读者对Android有一个初步的认识。 关键词:Android、linux、NDK、google 这学期我们开设了《Android应用程序开发》这门课程。这么课程开始的时候同学们都很兴奋。因为Android在现在是最为流行的操作系统。同学们大部分用的手机都是Android操作系统。所以对它的名字非常熟悉,但是对它的真正意义和具体是如何实现Android应用程序却十分陌生。同学们都希望了解到自己的手机上的应用程序到底是如何实现其功能的。所以对这门课程产生了极大的兴趣。 这门课程主要给我们介绍了Android开发环境、应用程序、生命周期、用户界面、组件通信与广播信息、后台服务、数据存储与访问、位置服务与地图应用、Android NDK开发这9个方面的内容。让我们对Android有一个初步的认知。这本书上的内容仅仅是Android程序开发的一小部分,是引导我们正确看待Android。在今后的学习中还需要我们多看关于Android的书籍,关注Android 各方面的消息,多做关于Android的实验和课题。这样才能进一步了解这个当今全球最为流行的操作系统。 1、Android简介 Android是一种以linux为基础的开放源代码操作系统,主要使用于便携设备。目前尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由google 收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。Android的主要竞争对手是苹果公司的iOS以及RIM的Blackberry OS。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年2月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为68.4%。 Android的系统架构和其它操作系统一样,采用了分层的架构。android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。 Android是以Linux为核心的手机操作平台,作为一款开放式的操作系统,随着Android的快速发展,如今已允许开发者使用多种编程语言来开发Android 应用程序,而不再是以前只能使用Java开发Android应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统。 在Android中,开发者可以使用Java作为编程语言来开发应用程序,也可以通过NDK使用C/C++作为编程语言来开发应用程序,也可使用SL4A来使用其他各种脚本语言进行编程(如:python、lua、tcl、php等等),还有其他诸如:QT(qt for android)、Mono(mono for android)等一些著名编程框架也开始

Android开发技术文档

Android 开发最佳实践 从Futurice公司Android开发者中学到的经验。遵循以下准则,避免重复发明轮子。若您对开发iOS或Windows Phone 有兴趣,请看iOS Good Practices和Windows client Good Practices这两篇文章。 摘要 ?使用 Gradle 和它推荐的工程结构 ?把密码和敏感数据放在gradle.properties ?不要自己写 HTTP 客户端,使用Volley或OkHttp库 ?使用Jackson库解析JSON数据 ?避免使用Guava同时使用一些类库来避免65k method limit(一个Android程序中最多能执行65536个方法) ?使用 Fragments来呈现UI视图 ?使用 Activities 只是为了管理 Fragments ?Layout 布局是 XMLs代码,组织好它们 ?在layoutout XMLs布局时,使用styles文件来避免使用重复的属性 ?使用多个style文件来避免单一的一个大style文件 ?保持你的colors.xml 简短DRY(不要重复自己),只是定义调色板 ?总是使用dimens.xml DRY(不要重复自己),定义通用常数 ?不要做一个深层次的ViewGroup ?在使用WebViews时避免在客户端做处理,当心内存泄露 ?使用Robolectric单元测试,Robotium 做UI测试 ?使用Genymotion 作为你的模拟器 ?总是使用ProGuard 和 DexGuard混淆来项目 Android SDK 将你的Android SDK放在你的home目录或其他应用程序无关的位置。当安装有些包含SDK的IDE的时候,可能会将SDK放在IDE同一目录下,当你需要升级(或重新安装)IDE或更换的IDE时,会非常麻烦。此外,若果你的IDE 是在普通用户,不是在root下运行,还要避免吧SDK放到一下需要sudo权限的系统级别目录下。 构建系统

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应用开发技术 一、判断题 1、在同一个资源目录中,可以存在两个文件名相同、扩展名不同的资源文件。(×) 2、Android系统下的文件,可以被本系统里的所有应用程序访问。(×) 3、无论Service是以启动方式还是绑定方式运行,该Service类都要重写onBind方法。(√) 4、一个Intent可以包含多个action。(×) 5、对于有序广播消息,是按照各个BroadcastReceiver注册的顺序先后接收并处理。(×) 6、Android是J2ME的一个实现。(×) 7、Android既是操作系统也是开发平台。(√) 8、Android是通过栈的形式来管理多个Activity的。(√) 9、View是ViewGroup的子类。(×) 10、一个Intent可以包含多个category。(√) 二、单项选择题 1、下面哪个不是Android的界面布局方式?( A ) A、FlowLayout B、LinearLayout C、TableLayout D、RelativeLayout 2、浏览网页使用的Intent的Action是什么?( D ) A、ACTION_CALL B、ACTION_EDIT C、ACTION_SEND D、ACTION_VIEW 3、Android 关于启动方式的service生命周期的onCreate()和onStartCommand()方法,说法正确的是( D ) A、当第一次启动的时候只会调用onCreate()方法 B、当第一次启动的时候只会调用onStartCommand ()方法 C、如果service已经启动,将先后调用onCreate()和onStartCommand ()方法 D、如果service已经启动,只会执行onStartCommand ()方法,不再执行onCreate()方法 4、下列关于ContentProvider的说法错误的是:( B ) A、ContentProvider的作用是实现数据共享和交换 B、要访问ContentProvider,只需调用ContentProvider的增删改查相关方法 C、ContentProvider提供的URI必须以“content://”开头 D、Android对于系统里的音视频、图像、通讯录提供了内置的ContentProvider 5、下列关于继承的哪项叙述是正确的?( D ) A、在Java中类允许多重继承 B、在Java中一个类只能实现一个接口 C、在Java中一个类不能同时继承一个类和实现一个接口 D、在Java中接口允许继承自另一个接口 6、以下哪种方式不能退出当前活动状态的Activity?( C ) A、调用finish()方法 B、单击(返回)按钮 C、单击(回到桌面)按钮 D、Activity运行时出现异常 7、对于TextView,使用哪个属性来设置显示的文本?( B ) A、android:textSize B、android:text C、android:textColor D、android:string 8、要处理Button的点击事件,需要注册哪个监听器?( A ) A、OnClickListener() B、OnButtonClickListener() C、OnButtonListener() D、OnItemClickListener() 9、在下述Java语言语句中,错误 ..的创建数组的方法是( D ) A、int intArray [ ]; intArray=new int[5]; B、int intArray [ ]=new int[5]; C、int [ ] intArray ={1,2,3,4,5}; D、int intArray [5]={1,2,3,4, 5}; 10、以下哪种方式不能退出当前活动状态的Activity?( C ) A、调用finish()方法 B、单击(返回)按钮 C、单击(回到桌面)按钮 D、Activity运行时出现异常 11、对于音乐播放器程序中的播放进度控制,使用哪个控件适合?( C ) A、ProgressBar B、RatingBar

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

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

开发实践—浅析安卓应用程序开发技术

中南财经政法大学 程序开发实践 课程报告 浅析安卓应用程序开发技术 组长*** (*********) 组员** (********) ** (********) ** (********) 专业信息管理与信息系统(2010级) 指导教师*** 完成日期2012年6月

目录 前言 (3) 1 简介 (3) 1.1 技术原理 (4) 1.2 开发平台简介 (4) 2 开发流程 (5) 2.1 技术准备 (5) 2.2 开发步骤 (5) 2.3 部分代码分析 (9) 3 问题及分析 (14) 3.1 技术优势 (14) 3.2 系统漏洞 (15) 3.3 优化发展 (15) 4 项目组成员分工情况 (1)

前言 Android是以Linux为核心的手机操作平台,作为一款开放式的操作系统,随着Android的快速发展,如今已允许开发者使用多种编程语言来开发Android应用程序,而不再是以前只能使用Java开发Android应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统。Android作为目前最流行的手机操作系统,关于其应用开发技术已经成了人们主要感兴趣的技术之一,此次我们浅析一下其开发的主要流程技术,便于参考学习,同时加强人们对于Android系统的理解。 本篇论文主要介绍一下该开发技术的工作步骤,以及部分参考代码的分析,目的在于更好地理解其技术实现。简要说明其在不同平台上的实现,并分析在目前的Android市场中出现的系统和技术方面的不足,以及优化设想。 1、简介 1.1 技术原理 Android系统架构由5部分组成,分别是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applications。 Linux Kernel Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。如果你学过计算机网络知道 OSI/RM,就会知道分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响到上层。 也就是说各层各尽其职,各层提供固定的SAP(Service Access Point),专业点可以说是高内聚、低耦合。如果你只是做应用开发,就不需要深入了解Linux Kernel层。 Android Runtime Android包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。 Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大。dx 是一套工具,可以将Java .class 转换成.dex 格式。一个dex文件通常会有多个.class。由于dex 有时必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。Dalvik虚拟机依赖于Linux 内核提供基本功能,如线程和底层内存管理。 Libraries

Android应用开发入门教程(经典版)

Android应用开发入门教程(经典版) Linux公社(https://www.doczj.com/doc/ea6718009.html,)于2006年9月25日注册并开通网站,Linux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC 就是关于Linux的数据中心。 https://www.doczj.com/doc/ea6718009.html,提供包括Ubuntu,Fedora,SUSE技术,以及最新IT资讯等Linux专业类网站。

目录 第一篇Android系统结构和SDK使用 (5) 第1章 Android的系统介绍 (5) 1.1 系统介绍 (5) 1.2 软件结构和使用的工具 (7) 第2章 Android SDK的开发环境 (10) 2.1 Android SDK的结构 (10) 2.2 Android SDK环境安装 (11) 2.2.1. 安装JDK基本Java环境。 (11) 2.2.2. 安装Eclipse (12) 2.2.3. 获得Android SDK (12) 2.2.4(1). 在Eclipse 3.4(Ganymede)中安装ADT (14) 2.2.4(2). 在Eclipse 3.5(Galileo)中安装ADT (17) 2.2.5. 在Eclipse中配置Android SDK (20) 2.3 Android中运行仿真器环境 (21) 2.3.1. 建立Android虚拟设备 (21) 2.3.2. 运行虚拟设备 (22) 2.3.3. 使用Android中的工具 (23) 2.3.4. 使用logcat (24) 2.3.5. 使用仿真器控制 (25) 2.3.6. 命令行工具adb、mksdcard等 (26) 2.3.7. 使用设备控制 (28) 2.4 Android中建立工程 (29) 2.4.1. 建立工程 (29) 2.4.2. 查看和编辑各个文件 (31) 2.4.3. 运行工程 (33) 第二篇 Android应用程序的概述和框架 (36) 第3章 Android应用层程序的开发方式 (36) 3.1 应用程序开发的结构 (36) 3.2 API参考文档的使用 (36) 第4章Android应用程序示例 (40) 4.1 HelloActivity程序的运行 (40) 4.2 HelloActivity的源文件结构 (41) 4.2.1.Android.mk文件 (41) 4.2.2.AndroidManifest.xml文件 (42) 4.2.3.源代码文件 (42) 4.2.4.布局文件 (43) 4.2.5.其他资源文件 (43) 4.3 HelloActivity的编译结构 (43) 4.4 SkeletonApp的程序的运行 (44) 4.5 SkeletonApp的源文件结构 (44) 4.6 SkeletonApp的编译结构 (46) 第5章 Android应用程序的内容 (47) 5.1 Android应用程序的概念性描述 (47) 5.1.1.应用程序的组成部分 (47) 5.1.2.应用程序的生命周期 (48) 5.2 应用程序包含的各个文件 (50) 5.3 使用am工具启动Android应用程序 (51) 2

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)。

相关主题
文本预览
相关文档 最新文档