第八章 Android 网络通信

Preview:

DESCRIPTION

第八章 Android 网络通信. 本章主要内容. 网络的重要性. 网络化信息化的世界 短信、电话 无线上网 移动 , 自由 ,随时随地. Android 支持的通信模式. GSM EDGE 3G ……. WIFI BLUETOOTH NFC. Android 网络通信基础. GSM. 全球移动通信系统 ( Global System for Mobile Communications ). 当前应用最为广泛的移动电话标准。全球超过 200 个国家和地区超过 10 亿人正在使用 GSM 电话。. Android 网络通信基础. GSM. - PowerPoint PPT Presentation

Citation preview

第八章 Android 网络通信

本章主要内容

Android 网络通信基础

Android Http 通信

WIFI

蓝牙

网络化信息化的世界短信、电话无线上网移动,自由,随时随地

网络的重要性

Android 支持的通信模式

GSM

EDGE

3G

……

WIFI

BLUETOOTH

NFC

Android 网络通信基础

GSM

全球移动通信系统( Global System for Mobile Communications )

当前应用最为广泛的移动电话标准。全球超过200 个国家和地区超过 10 亿人正在使用 GSM 电话。

Android 网络通信基础

GSM

GSM 标准的广泛使用使得在移动电话运营商之间签署“漫游协定”后用户的国际漫游变得很平常。

GSM 较之它以前的标准最大的不同是他的信令和语音信道都是数字的,因此 GSM 被看作是第二代( 2G )移动电话系统。 GSM 标准当前由 3GPP 组织负责制定和维护。

Android 网络通信基础

EDGE

增强型数据速率 GSM 演进技术Enhanced Data Rate for GSM Evolution

从 GSM 到 3G 的过渡技术能够充分利用现有的 GSM 资源弹性优势工作在 TDMA 和 GSM 网络提高了 GPRS 信道编码效率及其高速移动数据标准

Android 网络通信基础

3G

第三代移动通信技术( 3rd-generation , 3G ) 3G 就是指 IMT-2000 ( International Mobile Telecommunications-

2000 ),是国际电信联盟( ITU )定义的第三代无线通信的全球标准。

IMT-2000 规定移动终端的连接速度:

以车速移动时 —— 144Kbps

室外静止或步行时—— 384Kbps

室内 —— 2Mbps

Android 网络通信基础

3G

目前存在的几种标准: WCDMA ( Wideband CDMA )——欧洲 CDMA2000 —— 美国高通北美公司 TD-SCDMA (时分同步 CDMA ) —— 中国大陆 WiMAX —— 微波存取全球互通( 07 年提出) (Worldwide Interoperability for Microwave Access)

Android 网络通信基础

3G—— 应用

宽带上网 视频通话 手机电视 无线搜索

3G 目前广泛地运用在:

手机音乐 手机购物 手机网游

Android 网络通信基础

WiFi

Wireless Fidelity ,中文译为“无线兼容认证”

实质——一种商业认证 技术——短程无线传输 现状——带 WiFi 的便携式设备是潮流

Android 网络通信基础

WiFi

常见的 WiFi 使用形式——无线路由器

覆盖范围—— 70 至 120 米 使用场合——公司、家庭、公共场所 优点——方便的建立局域网、低成本、使用简单

Android 网络通信基础

WiFi—— 应用

无线电波的覆盖范围广 传输速度高 使用门槛比较低 消除布线的麻烦 发射功率低,健康安全

WiFi 相比其他技术有如下一些特点:

Android 网络通信基础

Bluetooth

蓝牙的标志 开放式无线通讯标准 设备短距离互联解决方案

定义:

优势: 无需驱动程序——独特的配置文件 小型化无线电 低功率、低成本、安全性、稳固 易于使用、即时连接

Android 网络通信基础

Bluetooth

蓝牙协议栈:

核心协议层( HCI 、 LMP 、 L2CAP 、 SDP ) 线缆替换协议层( RFCOMM ) 电话控制协议层( TCS-BIN ) 选用协议层

( PPP 、 TCP 、 IP 、 UDP 、 OBEX 、 IrMC 、 WAP

、 WAE )

Android 网络通信基础

Bluetooth

蓝牙规范( profile )——为了保证蓝牙设备的互通性而制定的一系列规范:

蓝牙立体声音频传输规范( A2DP ) 基本图像规范( BIP ) 基本打印规范( BPP ) 无线电话规范( CTP ) 蓝牙耳机规范( HP ) 文件传输规范( FTP ) ……

Android 网络通信基础

NFC

Near Field Communication (近场通讯)技术起源:

NFC 由非接触式射频识别 (RFID)及互联互通技术整合演变而来 , 在单一芯片上结合感应式读卡器、感应式卡片和点对点的功能,能在短距离内与兼容设备进行识别和数据交换。

Android 网络通信基础

NFC

轻松、安全、迅速的通信 传输范围小——独特的信号衰减技术 带宽高、能耗低

技术优势:

应用场合:

门禁、公交 手机支付

Android 网络通信基础

Andrion 提供的网络接口

Android 平台提供了三种网络接口,它们分别是:

java.net.*

org.apache.*

android.net.*

开发人员可以使用这些接口方便的进行 Android 网络编程。

Android Http 通信

Http 简介

Http ( Hypertext Transfer Protocol )即超文本传输协议,它是Web 的基础协议,是建立在 TCP 上的一种应用。

Http 连接特点: 客户端发送的每次请求都需要服务器返回响应,并在请求结束后释放连接,这个建立连接到关闭连接的过程称为“一次连接”。由于 HTTP 在每次请求结束后都会主动释放连接,因此 HTTP 连接是一种“短连接”、“无状态”的连接。

Android Http 通信

Http 的特点

1. 支持客户 /服务器模式;2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常

用的有 GET 、 POST 。3. 灵活: HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-

Type 加以标记;4. 无状态: HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。

Android Http 通信

使用 HttpClient 接口通信示例

Http请求数据通常使用 GET 和 POST向服务器提交表单而获取响应的方式获得数据。主要有以下几种区别:

1. GET 方法是将参数数据队列附加到 URL 的 ACTION属性中,值和表单内各个字段一一对应,以明文的方式存在于 URL 中。而 POST 方法则是将数值内容放置在 HTML HEADER 内一起传送至 ACTION属性所指的 URL 地址;

2. 对于 GET 方法,服务端采用 Request.QueryString获取变量的值,而对于 POST 方法,服务端采用 Request.Form获取提交的数据。

3. 一般来说 GET 方法项服务器传送的数据量较小。而 POST 方法传送的数据量较大。

Android Http 通信

使用 HttpClient 接口通信示例

2 使用 GET 方法1 初始状态 3 使用 POST 方法

Android Http 通信

使用 HttpClient 接口通信示例

使用 GET 方法请求数据的代码段如下:protected void httpClientGet() { //GET 请求的 url ,可以看到 url 中 weather 的值为 chengdu String googleWeatherUrl = "http://www.google.com/ig/api?hl=zh-

cn&weather=chengdu";//DefaultHttpClient ,默认的 HttpClient 类DefaultHttpClient httpclient = new DefaultHttpClient();//HttpGetHttpGet httpget = new HttpGet(googleWeatherUrl);//ResponseHandler ,用于处理服务端返回的响应ResponseHandler<String> responseHandler = new BasicResponseHandler();try {

String content = httpclient.execute(httpget, responseHandler);Toast.makeText(getApplicationContext(), " 连接成功 !",

Toast.LENGTH_SHORT).show();// 设置 TextView ,显示获取的网页内容tv.setText(content);

} catch (Exception e) {Toast.makeText(getApplicationContext(), " 连接失败 ",

Toast.LENGTH_SHORT).show();e.printStackTrace();

}httpclient.getConnectionManager().shutdown();// 关闭连接

}

Android Http 通信

使用 HttpClient 接口通信示例

使用 POST 方法请求数据的代码如下:protected void httpClientPost() {

try{ // 定义需要获取的内容来源地址

final String SERVER_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getWeather";

// 根据内容来源地址创建一个 Http 请求HttpPost request = new HttpPost(SERVER_URL); // 添加参数List params = new ArrayList();params.add(new BasicNameValuePair("theCityCode", " 成都 "));params.add(new BasicNameValuePair("theUserID", "")); // 设置参数的编码request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));// 发送请求并获取反馈, 解析返回的内容HttpResponse httpResponse = new

DefaultHttpClient().execute(request);// 如果返回状态码不为 404 ,即 URL 无误则显示获取的内容if (httpResponse.getStatusLine().getStatusCode() != 404){

String result = EntityUtils.toString(httpResponse.getEntity());

tv.setText(result.toString());}

}catch (Exception e) {}

}

String Url = "http://www.google.com/ig/api?weather=chengdu";URL url = new URL(googleWeatherUrl);HttpURLConnection httpconn = (HttpURLConnection)

url.openConnection();

Android Http 通信

使用 HttpUrlConnection 接口通信示例

HttpURLConnection继承自 URLConnection 。要获取HttpURLConnection类的实例,需要使用 openConnection() 方法来获取,代码如下:

Android Http 通信

使用 HttpUrlConnection 接口通信示例

5 使用 GET 方法4 初始状态 6 使用 POST 方法

HttpURLConnection 使用 GET 方法获取数据的关键代码如下:

Android Http 通信

使用 HttpUrlConnection 接口通信示例

// 获取 HttpURLConnection 实例HttpURLConnection httpconn = (HttpURLConnection)

url.openConnection();if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) {

Toast.makeText(getApplicationContext(), " 连接 Google Weather API 成功 !", Toast.LENGTH_SHORT).show();

// InputStreamReader ,用于读取网页内容InputStreamReader isr = new

InputStreamReader(httpconn.getInputStream(), "utf-8");int i;String content = "";// 从流中读取数据while ((i = isr.read()) != -1) {

content = content + (char) i;}isr.close();// 设置 TextViewtv.setText(content);

}//disconnecthttpconn.disconnect();

Android Http 通信

使用 HttpUrlConnection 接口通信示例

HttpURLConnection 使用 POST 方法请求数据需要改变的主要有两处,一是需要使用 setRequestMethod() 方法,二是使用 DataOutputStream向服务器写入参数值。代码如下:

// 使用 HttpURLConnection 打开连接HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();// 因为要求使用 Post 方式提交数据,需要设置为 trueurlConn.setDoOutput(true);urlConn.setDoInput(true);// 设置以 Post 方式,注意此处的“ POST” 必须大写urlConn.setRequestMethod("POST");//Post 请求不能使用缓存urlConn.setUseCaches(false);urlConn.setInstanceFollowRedirects(true);// 配置本次连接的 Content-Type ,配置为 application/x-www-form-urlencodedurlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 连接,从 postUrl.openConnection() 至此的配置必须在 connect 之前完成// 要注意的事 connection.getOutputStream 会隐含地进行 connect 。urlConn.connect();//DataOutputStream 流上传数据DataOutputStream out=new DataOutputStream(urlConn.getOutputStream());// 要上传的参数String content="par="+ URLEncoder.encode("POSTTransferData", "gb2312");// 将要上传的内容写入流中out.writeBytes(content);// 刷新,关闭out.flush();out.close();

Android WiFi

开发

Android SDK 提供的相关包: android.net.wifi

ScanResult 用于描述一个已经被检测到的 wifi 接入点。

WifiConfiguration 该类代表了一个已经配置好的 wifi 网络,包括了该网络的一些安全设置。例如接入点密码,接入点通讯所采用的安全标准。

WifiConfiguration.AuthAlgorithm 公认的 IEEE 802.11 标准认证算法。

Android WiFi

相关类介绍

WifiConfiguration.GroupCipher 公认的组密码。 WifiConfiguration.KeyMgmt 公认的密钥管理方案。 WifiConfiguration.PairwiseCipher 公认的用于 WPA 的成对

密码标准。 WifiConfiguration.Protocol 公认的安全协议WifiConfiguration.Status 网络所可能存在的状态。

Android WiFi

相关类介绍

WifiInfo 描述了各个 wifi 连接的状态,该连接是否处于活动状态或者是否处于识别过程中。

WifiManager 这个类比较重要。它提供了用于管理 wifi连接的各种主要 API 。详见表后说明。

WifiManager.MulticastLock 允许应用程序接收 wifi 的多播数据包。

WifiManager.WifiLock 允许应用程序永久地保持 wifi 连接(防止系统自动回收)。

Android WiFi

重要类

Android 操作 WiFi 的重要类—— WifiManager

这个类提供了最主要的用于管理 wifi 连接的 API 。

通过调用 Context.getSystemService(Context.WIFI_SERVICE)

方法来得到系统提供的 WifiManager ,代码如下:

WifiManager mWifiManager = (WifiManager)

context.getSystemService(Context.WIFI_SERVICE);

Android WiFi

WifiManager主要用于处理的事务

已经配置好的网络连接列表。 如果当前有连接存在的话,可以得到当前正处于活动状态的 wifi 连接的控制权,可以通过它建立或者断开连接,并且可以查询该网络连接的动态信息;

通过对已经扫描到的接入点的足够信息来进行判断,得出一个最好的接入点进行连接。

定义了很多用于系统广播通知的常量,它们分别代表了WiFi 状态的改变。

Android WiFi

WiFi 的开发补充

Android 网络连接管理类—— ConnectivityManager

该类用于管理抽象意义上的“网络连接”

监控网络连接(包括WiFi , GPRS , UMTS等等); 当网络连接发生改变时,向系统广播这一改变; 当失去了当前的网络连接时,尝试切换到另外一个连接; 提供了允许其他应用程序调用的 API让应用程序可以方便地查询当前的网络状态。

它完成的主要任务是:

Android WiFi

WiFi 的权限获取

要在应用程序中对 Android 系统的 WiFi 设备进行相关操作,需要在项目中的 AndroidManifest.xml 中选择性地添加如下几句用于声明权限的语句:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"></uses-permission> <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

Android WiFi

WiFi 开发——代码示例

// 取得 WifiManager 对象mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);// 取得 WifiInfo 对象mWifiInfo = mWifiManager.getConnectionInfo();// 打开 WIFIpublic void openWifi(){

if (!mWifiManager.isWifiEnabled()){

mWifiManager.setWifiEnabled(true);}

}

Android WiFi

WiFi 开发——代码示例

// 关闭 WIFIpublic void closeWifi(){

if (!mWifiManager.isWifiEnabled()){

mWifiManager.setWifiEnabled(false);}

}// 得到 WifiLock ,以便应用程序保持 wifi 连接public void acquireWifiLock(){

mWifiLock.acquire();}

// 解锁 WifiLockpublic void releaseWifiLock(){

if (mWifiLock.isHeld()) // 判断是否被锁定{

mWifiLock.acquire();}

}// 创建 WifiLockpublic void creatWifiLock(){

mWifiLock = WifiManager.createWifiLock("Lock");}

Android WiFi

WiFi 开发——代码示例

// 得到已经配置好的网络列表public List<WifiConfiguration> getConfiguration(){

return mWifiConfiguration;}//选择一个已配置好的网络进行连接public void connectConfiguration(int index){

//索引大于配置好的网络索引返回if(index > mWifiConfiguration.size()){

return;}// 连接配置好的指定 ID 的网络

mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, true);

}

Android WiFi

WiFi 开发——代码示例

Android 蓝牙

Android 蓝牙开发

Android SDK 提供的相关包: android.bluetooth

API主要为应用程序提供如下几个功能: 1. 搜寻有效范围内的蓝牙设备; 2. 通过本地的蓝牙适配器来查询到与之配对的蓝牙设备; 3. 在配对的蓝牙设备之间建立 RFCOMM 信道; 4. 连接到其他设备的指定端口; 5. 在设备之间传输数据。

Android 蓝牙

Android 蓝牙 API

接口名 描述

BluetoothProfile 蓝牙规范的公用 API 接口,所有的蓝牙规范都必 须 实 现 这 个 接口。 Profile 目的 是 要确保Bluetooth 设备间的互通性。

BluetoothProfile.ServiceListener 用于在蓝牙客户设备连接或者断开连接时给它们发出通知的接口。

android.bluetooth包括了以下两个接口:

Android 蓝牙

Android 蓝牙 API

android.bluetooth包括了以下一些类:

类名 描述BluetoothA2dp 这个类作为对 BluetoothProfile 接口实现的实例,

这是对蓝牙的 A2DP规范的 API 实现类。

BluetoothAdapter 代表了本地的蓝牙适配器。BluetoothAssignedNumbers 蓝牙的指令编号。

BluetoothClass 代表蓝牙的类,这个类描述了蓝牙设备的特征和性能参数。

Android 蓝牙

Android 蓝牙 API

类名 描述BluetoothClass.Device 定义了所有的 device 类所用的常量。

BluetoothClass.Device.Major 定义了所有主要的 device 类所用的常量。

BluetoothClass.Service 定义了所有的 service 类所用的常量。

BluetoothHeadset 实现蓝牙耳机服务的公共 API 。

Android 蓝牙

Android 蓝牙 API

类名 描述BluetoothServerSocket 用于监听 socket 连接请求的类。

BluetoothSocket 一个已连接的或正在连接的 socket 类。

android.bluetooth 中用于建立连接的类:

类似于 Java API 中的 ServerSocket 和 Socket 类

Android 蓝牙

Android 蓝牙权限获取

要在应用程序中对 Android 系统的蓝牙设备进行相关操作,需要在项目中的 AndroidManifest.xml 中添加:<uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

Android 蓝牙

Android 蓝牙示例——TestBluetooth

运行截图:

①程序初始化

②打开蓝牙

③允许搜索

④正在搜索

(项目文件保存在 /workspace目录,项目名称 TestBluetooth )

Android 蓝牙

Android 蓝牙示例——TestBluetooth

TestBluetooth项目文件结构:

源码包名: com.bluetooth

主 Activity : BluetoothActivity

查找蓝牙 Activity : DiscoveryActivity

工具类(对话框功能): SamplesUtils

执行查找界面的布局: discovery.xml

主界面布局: main.xml

Android 蓝牙

Android 蓝牙示例——TestBluetooth

AndroidManifest.xml:<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.bluetooth"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name="BluetoothActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>接下页

Android 蓝牙

Android 蓝牙示例——TestBluetooth

AndroidManifest.xml (续):<activity android:name="DiscoveryActivity"

android:theme="@style/Theme.Transparent"><intent-filter>

<action android:name="android.intent.action.MAIN" />

<category

android:name="android.intent.category.DEFAULT" /></intent-filter>

</activity> </application> <!-- SDK 的版本至少要高于 5 --> <uses-sdk android:minSdkVersion="5" /> <!-- 声明需要使用蓝牙的权限 -->

<uses-permission android:name="android.permission.BLUETOOTH" />

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /></manifest>

Android 蓝牙

Android 蓝牙示例——TestBluetooth

BluetoothActivity.java:== 代码较多,见书本

DiscoveryActivity.java:== 代码较多,见书本

Android 蓝牙

Android 蓝牙——建立连接

1. 本机作为服务端参与连接的建立 通过 listenUsingRfcommWithServiceRecord(String, UUID) 方法来得到一个BluetoothServerSocket对象,方法中的 String参数代表了本机的名称, UUID是用于蓝牙设备之间相互识别的唯一识别码。

mServerSocket=mAdapter.listenUsingRfcommWithServiceRecord(NAME, UUID);然后通过mServerSocket 的 accept() 方法开始监听连接到这个端口的请求。mServerSocket.accept();

该监听线程会一直阻塞直到有新的请求到来,除非在程序中人为的调用mServerSocket 的 close() 方法。完整代码见书本。

Android 蓝牙

Android 蓝牙——建立连接

2. 本机作为客户端参与连接的建立

通过使用 BluetoothDevice 类来得到 BluetoothSocket ,这样将会得到一个用于连接到远程蓝牙设备的 BlueSocket 对象。

mSocket= device.createRfcommSocketToServiceRecord(MY_UUID);

得到了 BluetoothSocket对象后,通过调用它的 connect() 方法,建立起到服务器的一条专用的蓝牙连接。完整代码见书本。

Android 蓝牙

Android 蓝牙——实例:手机联系人( contacts )交换的实现

这个程序实现的功能主要是:

1. 将手机内的名片信息(包括姓名,电话,邮箱,备注以及联系人头像等等)备份到手机的 SD卡中;

2. 可以解析由步骤 1 备份生成的备份文件并且导入到手机中;3. 实现不同的手机用户之间相互发送名片信息的功能,支持 wifi 和

蓝牙。

Android 蓝牙

Android 蓝牙——实例:手机联系人( contacts )交换的实现

2 发送界面1 启动界面 3 正在连接

实例截图 ( 通过WiFi 发送手机联系人 )

Android 蓝牙

Android 蓝牙——实例:手机联系人( contacts )交换的实现

发送文件的业务流程如图:

Androi d设备A Androi d设备B

控制端口A

数据端口B数据端口A

控制端口B①

②发送命令“ SEND+端口号”

③利用接收到的数据端口号建立连接,发送准备好消息

等待准备好②

④发送文件

Android 蓝牙

Android 蓝牙——实例:手机联系人( contacts )交换的实现

发送文件步骤:

① 在 A 设备即发送方的客户端上输入设备 B即接收方的 IP 地址和控制端口B ,建立起到设备 B 的控制连接;

② 通过由第①步所建立的连接发送一条表示“请求发送文件”的命令,其中携带了设备 A 的数据端口 A 的值,同时设备 A 开始监听是否有请求连接到数据端口 A;

③ 设备 B 在接收到设备 A 所发出的消息后,解析该命令的作用,发现是以SEND 开头的“请求发送”命令,获取设备 A 的数据端口,尝试进行连接,若连接成功则发送一条“准备好”的消息;

④ 设备 A 接收到设备 B 所发出的准备好消息,开始通过数据端口连接发送文件,知道发送完成,释放端口。

Android 蓝牙

通过蓝牙发送和接收名片文件

BluetoothServerSocket bss = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);

蓝牙是通过以下的代码得到 BluetoothServerSocket 实例的:

BluetoothSocket bs = device.createRfcommSocketToServiceRecord(MY_UUID);

蓝牙通过如下方式得到 BluetoothSocket 实例:

本章小结

本章主要学习了 Android 平台下的网络通信基础知识,并且通过一组示例说明了如何在实际开发中来使用 Android 网络相关的 API ,着重介绍了WIFI 和蓝牙开发的典型方法。

THE END