第八章 网络与数据通信技术_第1页
第八章 网络与数据通信技术_第2页
第八章 网络与数据通信技术_第3页
第八章 网络与数据通信技术_第4页
第八章 网络与数据通信技术_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第八章 网络与数据通信技术 俞成海俞成海 教 学 任 教学任务 USB 编程 Wi-Fi 编程 蓝牙编程 Socket实现技术 HTTP 协议通信实现技术 教学重点 蓝牙编程 Socket实现技术 U S 两种模式来支持Android USB外设 :USB 外设模式和USB主 机模式 在 USB 外设模式下,外部 USB 硬件(装有Android的设备要 连接的外部设备)充当 USB 主机。外设的例子包括机器人、 扩展插座、诊断和音乐设备、电子报亭、读卡器等其他设备, 这种模式给予不具备主机功能的 Android 设备以与USB硬件 交互的能 力。 在USB主机模式下,装有 Android 的

2、设备扮演着主机的角色。 这种设备的例子包括数码像机,键盘,鼠标和游戏手柄。那 些适应面很广的USB设备仍可以与Android应用交互,前提是 这些Android应用可以正确的与这些设备通讯。 h t t p: / / d e v e l o p e r. a n d r o i d. c o m / s / u s b / i n d e x. h t m l U S B 常用的类: UsbManager:允许您枚举已连接的USB设备并且与其进行“交流”。 UsbDevice:代表了一个已连接的USB的设备并且包含具有该设备验 证信息,接口和接口点的方法。 UsbInterface:代表了一个

3、USB设备的一个接口,该接口定义了一系 列关于设备的函数。一个设备在进行“交流”的时候可以有一个或 者多个接口 UsbEndpoint:代表一个接口的接口点,该接口点就是这个接口的通 信信道。一个接口可以有一个或者多个这样的接口点,而且一般都 是有输入和输出双向通信的接口点。 UsbDeviceConnection:代表该设备的一个连接,用来在接点上传 输数据。这个类允许您能用同步或者异步的方式发送和返回数据。 UsbRequest:在通过UsbDeviceConnection和设备进行“交流”的一个 异步请求。 UsbConstants:关于在linux内核中linux/usb/ch9.h的

4、相关定义的USB常 量 使 用 步 骤 为了让应用可以发现一个USB设备,需要 android.hardware.usb.action.USB_DEVICE_ATTACHED这个意图指定一个 意图来进行过滤 获取USB信息 UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap deviceList = manager.getDeviceList(); UsbDevice device =deviceList.get(deviceName); 和设备通信和设备通信 UsbInterface

5、 intf= device.getInterface(0); UsbEndpoint endpoint= intf.getEndpoint(0); UsbDeviceConnection connection= manager.openDevice(device); connection.claimInterface(intf, true); connection.bulkTransfer(endpoint, bytes, bytes.length, 0); 终止通信终止通信 当你完成数据的传输或者你的设备已拔出时,通过调用releaseInterface()和 close()来关闭接口和连接

6、。 W i - F i 编 程 C o n n e c e r NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI) 所需要用到的wifi相关Android包:.wifi 常见操作主要包括以下及各类和接口: 1、WifiManager 提供了管理WiFi连接的大部分API,主要包括如下内容: 查看已经配置好的网络清单,而且可以修改个别记录的属性。 可以建立或是关闭WiFi网络连接,并且可以查询有关网络状态的动态信息。 对接入点的扫描结果包含足够的信息来决

7、定需要与什么接入点建立连接。 同时还定义了许多常量来表示WiFi状态的改变。 常用的方法:getWiFiState , isWifiEnabled,setWifiEnabled,startScan, getScanResults等等 W i F i 所需要用到的所需要用到的wifi相关相关Android包:包:.wifi 常见操作主要包括以下及各类和接口:常见操作主要包括以下及各类和接口: 2、WifiConfiguration WiFi网络的配置,包括安全配置等。网络的配置,包括安全配置等。 3.WifiInfo WiFi无线连接的描述,包括接入点、网络连接状态、隐藏的接无线连接的描述,包括

8、接入点、网络连接状态、隐藏的接 入点,入点,ip地址、连接速度、地址、连接速度、mac地址、网络地址、网络id,信号强度等信信号强度等信 息。息。 4.ScanResult 主要用来描述已经检测出的接入点,包括接入点的地址、接入主要用来描述已经检测出的接入点,包括接入点的地址、接入 点的名称、身份认证、频率、信号强度等信息。点的名称、身份认证、频率、信号强度等信息。 找 到 周 围 A 检测网卡状态,修改网卡状态检测网卡状态,修改网卡状态开启,进行扫描周围开启,进行扫描周围ap,打印结果打印结果 class ListWifiListerner implements OnClickListene

9、r Override public void onClick(View v) wifiManager = (WifiManager)WifiActivity.this.getSystemService(Context.WIFI_SERVICE); wifiManager.startScan(); mWifiList = wifiManager.getScanResults(); for(int i=0;imWifiList.size();i+) sb.append(new Integer(i).toString()+.); sb.append(mWifiList.get(i).toString

10、(); sb.append(n); mainText.setText(sb); sb.delete(0, sb.capacity(); 蓝 牙 ,使用蓝牙进行设备通信,主要包含四个部分:蓝牙设置、搜索设备、连接、传 输数据 BluetoothAdapter 代表本地蓝牙适配器(蓝牙发射器),是所有蓝牙交互的入。 通过它可以搜索其它蓝牙设备,查询已经配对的设备列表,通过已知的MAC地 址创建BluetoothDevice,创建BluetoothServerSocket监听来自其它设备的通信。 BluetoothDevice 代表了一个远端的蓝牙设备, 使用它请求远端蓝牙设备连接或 者获取 远端蓝

11、牙设备的名称、地址、种类和绑定状态。 BluetoothSocket 代表了一个蓝牙套接字的接,是应用程 序通过输、输出流 与其他蓝牙设备通信的连接点。 BluetoothServerSocket 代表打开服务连接来监听可能到来的连接请求 (属于 server 端) , 为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务 套接字。 BluetoothClass 描述了一个设备的特性(profile)或该设备上的蓝牙一致可以提供 哪些服务(service),但不可信。比如,设备是一个电话、计算机或手持设备;设 备可以提供audio/telephony服务等。可以用它来进行一些UI上的提示。

12、 BluetoothHeadset 提供手机使用蓝牙耳机的支持。这既包括 蓝牙耳机和免提(V1.5)模式。 BluetoothA2dp 定义高品质的音频,可以从一个设备传输到 另一个蓝牙连接。 “A2DP的”代表高级音频分配模式。 BluetoothHealth 代表了医疗设备配置代理控制的蓝牙服务 BluetoothHealthCallback一个抽象类,使用实现 BluetoothHealth回调。你必须扩展这个类并实现回调方法接 收更新应用程序的注册状态和蓝牙通道状态的变化。 BluetoothHealthAppConfiguration 代表一个应用程序的配置, 蓝牙医疗第三方应用注册

13、与远程蓝牙医疗设备交流。 BluetoothProfile.ServiceListener 当他们已经连接到或从服务 断开时通知BluetoothProfile IPX的客户时一个接(即运行 一个特定的配置文件,内部服务)。 B l u e T 至少要在AndroidManifest.xml中声明两个权限: BLUETOOTH和 BLUETOOTH_ADMIN 获取BluetoothAdapter 打开蓝牙:通过isEnabled()来检查蓝牙当前是否可用。如果 这个方法返回false,则蓝牙不能够使用。为了请求蓝牙使用, 呼叫startActivityForResult()与的 ACTION

14、_REQUEST_ENABLE动作意图获取 BluetoothAdapter 查找匹配设备 扫描设备 开始搜索设备,调用开始搜索设备,调用startDiscovery() 。该函数是异步的,调用后立即返回,。该函数是异步的,调用后立即返回, 返回值表示搜索是否成功开始。返回值表示搜索是否成功开始。 应用中可以注册一个带应用中可以注册一个带ACTION_FOUND Intent的的BroadcastReceiver,搜,搜 索到每一个设备时都接收到消息。索到每一个设备时都接收到消息。Intent携带着而外的字段信息携带着而外的字段信息 EXTRA_DEVICE和和EXTRA_CLASS,分别包含

15、一个,分别包含一个BluetoothDevice和一和一 个个BluetoothClass。 使用使用cancelDiscovery()来停止搜索来停止搜索 使能被发现 如果想让本地设备被其他设备发现,可以带 ACTION_REQUEST_DISCOVERABLE action Intent调用startActivityForResult(Intent, int) 方法 作为服务器连接 通过持有通过持有个打开的个打开的BluetoothServerSocket对对 象。服务器象。服务器socket的作用是侦听进来的连接,如的作用是侦听进来的连接,如 果一个连接被接受,提供一个连接好的果一个连接

16、被接受,提供一个连接好的 BluetoothSocket对象。对象。 建 立 服 务 器 s o c k e t 1.通过调用listenUsingRfcommWithServiceRecord(String, UUID) 得到一个BluetoothServerSocket对象,当客户端试图连接本设 备,它将携带一个UUID用来唯一标识它要连接的服务, UUID必须匹配,连接才会被接受。 2.通过调用accept()来侦听连接请求。这是一个阻塞的调用,直 到有连接进来或者产生异常才会返回。只有远程设备发送一 个连接请求,并且携带的UUID与侦听它socket注册的UUID 匹配,连接请求才会被

17、接受。如果成功,accept()将返回一个 连接好的BluetoothSocket对象。 3.除非需要再接收另外的连接,否则的话调用close() 。close() 释放server socket和它的资源,但不会关闭连接accept()返回 的连接好的BluetoothSocket对象。 作 为 客 1.用BluetoothDevice调用 createRfcommSocketToServiceRecord(UUID)获取一 个BluetoothSocket对象。 这个初始化的 BluetoothSocket会连接到BluetoothDevice。 2.调用connect()完成连接 当调用

18、这个方法的时候, 系统会在远程设备上完成一个SDP查找来匹配UUID。 如果查找成功并且远程设备接受连接,就共享 RFCOMM信道,connect()会返回。这也是一个阻塞 的调用,不管连接失败还是超时(12秒)都会抛出 异常。 管理连接 如果已经连接了两个设备,他们都已经拥有 各自的连接好的BluetoothSocket对象。可以在 设备间共享数据了。使用BluetoothSocket,传 输任何数据通常来说都很容易了: 1.通过socket获取输入输出流来处理传输(分 别使用getInputStream()和getOutputStream() )。 2.用read(byte)和write(

19、byte)来实现读写。 基 于 S o c k Socket网络通信的组成元素 服务器,主要功能:侦听连接、接收连接、接收 数据和向客户端发送数据。 客户端,主要功能:发起连接、接收数据和向服 务器发送数据 Socket网络通信的基本原理 IP地址 : 主机标识 端 口 : 服务类型 Socket = IP(address) + Port(server) Java-Internet语言语言 具备强大网络通信功能具备强大网络通信功能 基于套接字(Socket)通信方式 流套接字 TCP协议协议 (Transmission Control Protocol) UDP协议协议 (User Datag

20、ram Protocol) 数据报套接字 主 要 Java的的Socket属于流式套接字通信,采用属于流式套接字通信,采用TCP协议,提协议,提 供面向连接的服务,实现可靠的通信。供面向连接的服务,实现可靠的通信。 J提供两个类,实现Socke通信: ServerSocket - 服务器端 Socket - 客户端通 操作TCP 套接字的发送和接收需要借助java.io包的 InputStream / OutputStream 完成,分别通过方法实现: Socket.getInputStream() / Socket.getOutputStream() S o c k e t / S e r

21、v Socket() 通过系统默认类型的通过系统默认类型的 SocketImpl 创建未连接套接字创建未连接套接字 Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定创建一个流套接字并将其连接到指定 IP 地址的指定端口号地址的指定端口号 Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程端口上的指定远程地址创建一个套接字并将其连接到指定远程端口上的指定远程地址 Socket(String host,

22、int port) 创建一个流套接字并将其连接到指定主机上的指定端口号创建一个流套接字并将其连接到指定主机上的指定端口号 Socket(String host, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程主机上的指定远程端口创建一个套接字并将其连接到指定远程主机上的指定远程端口 ServerSocket() 创建非绑定服务器套接字 ServerSocket(int port) 创建绑定到特定端口的服务器套接字 ServerSocket(int port, int backlog) 利用指定的 backlog

23、 创建服务器套接字并将其绑定到指定的本地端口号 ServerSocket(int port, int backlog, InetAddress bindAddr) 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器 S o c k e t / S e r v S o c k OutputStream 获得获得Socket对象输出流对象输出流 建立Socket 连接 通过流传输数据 服务端 联结成功联结成功 获得已连接的获得已连接的Socket对象对象 Socket (host,port)Socket (host,port) 创建创建Socket对象对象 向指定主机端口

24、发出连接请求向指定主机端口发出连接请求 客户端 Socket对象 ServerSocket 对象 InputStream 获得获得Socket对象输入流对象输入流 申请连接 ServiceSocket.close() 停止提供停止提供TCP连接服务连接服务 一个一个ServerSocket对象和一个对象和一个Socket对象对象 一个一个Socket对象对象 Socket.close() 关闭关闭TCP连接连接 ServerSocket (port) 创建创建ServiceSocke对象对象,提供提供TCP连接服务连接服务 accept () 在指定的端口监听客户端请求联结创建在指定的端口监听

25、客户端请求联结创建 InputStream 获得获得Socket对象输入流对象输入流 Socket.close() 关闭关闭TCP连接连接 OutputStream 获得获得Socket对象输出流对象输出流 ServerSocket 对象 访问监听 S o c k Server端Client端 service = ServerSocket (port_number) 创建service对象,以TCP服务实现端口监听 socket = ServerSocket.accept() 创建socke对象, 接收用户访问请求 Socket = Socket (port_number) 创建socke对象

26、,建立连接,发送访 问请求 InputStream Socket对象输入流 OutputStream Socket对象输出流 通过socke对象实现与Client端数据传输 OutputStream Socket对象输出流 InputStream Socket对象输入流 通过socke对象,实现与Servert端 数据传输 socket.close() 关闭Socke关闭结束与Client端的连接 service. close() 关闭监听程序 socket.close() 关闭Socke 结束与Server端的连接 (1) 建立连接 (2) 数据通讯 (3) 拆除连接 客 开启INTERNE

27、T 布局界面(Main.xml) 获取资源(EditText,Button,TextView) Socket通信 数据读写(DataInputStream/DataOutputStream) 客户端主要代码: public void onClick(View v) Socket s = null; DataOutputStream dout = null; DataInputStream din = null; if(v = button1)/点击的是按钮 try s = new Socket(02, 8888);/连接服务器 dout = new DataOutputS

28、tream(s.getOutputStream();/得到输出流 din = new DataInputStream(s.getInputStream();/得到输入流 dout.writeUTF(editText.getText().toString();/向服务器发送消息 textView.setText(服务器发来的消息: + din.readUTF();/接收服务器发来的 消息 catch (Exception e) e.printStackTrace();/打印异常信息 finally try if(dout != null) dout.close();/关闭输入流 if(din !

29、= null) din.close();/关闭输入流 if(s != null) s.close();/关闭Socket连接 catch(Exception e) e.printStackTrace();/打印异常信息 服 务 器 ServerSocket Accept DataInputStream/DataOutputStream Read/Write 服务器端主要代码: ServerSocket ss = null;/ServerSocket的引用 Socket s = null;/Socket的引用 DataInputStream din = null; DataOutputStrea

30、m dout = null; try ss = new ServerSocket(8888);/监听到8888端口 System.out.println(已监听到8888端口!); catch(Exception e) e.printStackTrace();/打印异常信息 while(true) try s = ss.accept();/等待客户端连接 din = new DataInputStream(s.getInputStream(); dout = new DataOutputStream(s.getOutputStream();/得到输入输出流 String msg = din.r

31、eadUTF();/读一个字符串 System.out.println(ip: + s.getInetAddress();/打印客户端IP System.out.println(msg: + msg);/打印客户端发来的消息 System.out.println(=); dout.writeUTF(Hello Client!);/向客户端发送消息 catch(Exception e) e.printStackTrace();/打印异常信息 统一资源定位器URL: URL(Uniform Resource Locator)是一致资源定位器的简称,它表示Internet上 某一资源的地址。通过UR

32、L我们可以访问Internet上的各种网络资源,比如最 常见的WWW,FTP站点。浏览器通过解析给定的URL可以在网络上查找相应 的文件或其他资源。 URL的组成 protocol:/resourceName 协议名(protocol)指明获取资源所使用的传输协议,如http、ftp、 gropher、file等,资源名(resourceName)则应该是资源的完整地址,包括 主机名、端口号、文件名或文件内部的一个引用。例如: http:/ 协议名:/主机名 http:/ 协议名:/机器名文件名 http:/:80/Gamelan/network.html#BOTTOM 协议名:/ 机器名端口

33、号文件名内部引用. 创建一个创建一个URL 为了表示URL, 中实现了类URL。我们可以通过下面的构造方法来初 始化一个URL对象: (1) public URL (String spec); (2) public URL(URL context, String spec); (3) public URL(String protocol, String host, String file); (4) public URL(String protocol, String host, int port, String file); 解析一个解析一个URL 一个URL对象生成后,其属性是不能被改变的

34、,但是我们可以通过类URL所提 供的方法来获取这些属性 从从URL读取读取WWW网络资源网络资源 当我们得到一个URL对象后,就可以通过它读取指定的WWW资源。 通过通过HttpURLConnetction连接连接WWW 通过URL的方法openStream(),我们只能从网络上读取数据,如果我们 同时还想输出数据,例如向服务器端的CGI程序发送一些数据,我们必须先 与URL建立连接,然后才能对其进行读写,这时就要用到类URLConnection 了。CGI是公共网关接口(Common Gateway Interface)的简称,它是用户 浏览器和服务器端的应用程序进行连接的接口,有关CGI程

35、序设计,请读者 参考有关书籍。 类HttpURLConnetction也在包中定义,它表示Java程序和URL 在网络上的通信连接。当与一个URL建立连接时,首先要在一个URL对象上 通过方法openConnection()生成对应的HttpURLConnetction对象。如果连 接过程失败,将产生IOException. HttpURLConnection ucon = null; BufferedReader reader = null; StringBuilder bab=null; try URL myURL = new URL(http:/localhost/test.html);

36、/初始化URL ucon = (HttpURLConnection)myURL.openConnection();/打开连接 ucon.setRequestMethod(GET); ucon.connect(); reader =new BufferedReader(new InputStreamReader(ucon.getInputStream(),gb2312);/得到输入流 String currentline; bab = new StringBuilder(); while(currentline=reader.readLine() != null) bab.append(curr

37、entline);/将收到的信息添加到StringBuilder中 bab.append(rn); jsonstring=bab.toString(); catch (Exception e) e.printStackTrace();/打印异常信息 finally try if(reader!=null) reader.close(); catch (IOException e) e.printStackTrace(); W h a t i JavaScript Object Notation 轻量级的数据交换格式 描述数据的格式 轻量级(格式简单,一个页面的官网) 易于人阅读和编写 易于机器

38、解析和生成 独立于语言文本格式 使 用 早期是网页浏览器与Web服务器之间交互数 据的格式 与XML一起作为Ajax返回的两种主要格式 由于其轻量级的原因,逐渐成为主流的数据 交换格式 对 对 无序的“名称/值对”集合 一个对象以“”(左括号)开始,“”(右 括号)结束 每个“名称”后跟一个“:”(冒号),再后跟 着值,构成一个“名称/值对” 每个“名称/值对”之间用“,”(逗号) 分隔 例如: name: Li Lei, Gender: male, age: 35 数 数 有序的值的集合 一个数组以“”(左中括号)开始,“”(右 中括号)结束 值之间使用“,”(逗号)分隔 例如: 1, 2,

39、 3, 4, 5, 6, 7, 8, 9 A, B, C, D 值 的 字符串 数值 true false null 对象 数组 字 数 J S O N 解析JSON 数据时,首先需要明确待解析的是 JSON Object 还是JSON Array,然后再解析 JSON Object,name 为名称,Lili 是name 的 值,将name 和Lili 用“:”隔开,其文本形 如:name:Lili / 新建JSONObject, jsonString 字符串中为上面的JSON 对象的文本 JSONObject demoJson = new JSONObject(jsonString); /

40、 获取name 名称对应的值 String s = demoJson.getString(name); 解析JSON Array 一个简单的JSONArray,number 为数组名称, 1,2,3为数组的内容,其JSON文本表示如: number:1,2,3 / 新建JSONObject 对象,将jsonString 字符串转换为JSONObject 对象 / jsonString 字符串为上面的文本 JSONObject demoJson = new JSONObject(jsonString); / 获取number 对应的数组 JSONArray numberList = demoJs

41、on.getJSONArray(number); / 分别获取numberList 中的每个值 for(int i=0; inumberList.length(); i+) / 因为数组中的类型为int,所以为getInt,其他getString、getLong 具有类似的用法 System.out.println(numberList.getInt(i); 使 用 V o l 目的:图像缓存,请求的调度 特 自动调度网络请求 多个并发的网络连接 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致 支持请求优先级 支持取消请求的强大API,可以取消单个请求或多个 易于定制 健壮性:便于正确

42、的更新UI和获取数据 包含调试和追踪工具 V o l l 下载Volley 构建一个RequestQueue RequestQueue requestQueue=Volley.newRequestQueue(this);/这里的this指的是Context 创建一个Request private final String url=http:/xxxxx/所需url JsonObjectRequest req=new JsonObjectRequest(url,null,new Response.Listener() Override public void onResponse(JsonObj

43、ect response) , new ResponseError.Listener() Override public void onResponseError(VollerError error) ); 将req添加到requestQueue G s o 下载,放入libs目录 /name:name0,age:0 Person person = gson.fromJson(str, Person.class); /name:name0,age:0,name:name1,age:5,name:name2,age:10 List ps = gson.fromJson(str, new Type

44、TokenList().getType(); 实 使用糯米团的api 接口 http:/apistore.baid rvicedetail/508.ht ml 分 errno: 0, msg: success, deals: deal_id: 11078851, image: *, tiny_image: *, title: 漫火锅, min_title: 漫火锅100元代金券, description: 王府井店100元代金券!可叠加使用,节假日通用,提供免费WiFi! , market_price: 10000, current_price: 9000, promotion_price: 9000, sale_num: 1159, score: 4.85, comment_num: 26, deal_url: *, deal_murl: * , public class contentbean String deal_id; String image

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论