1 cmsc628: introduction to mobile computing nilanjan banerjee mobile systems programming...

31
1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of Maryland Baltimore County, MD

Upload: blaze-henderson

Post on 23-Dec-2015

246 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

1

CMSC628: Introduction to Mobile Computing

Nilanjan Banerjee

Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron

University of MarylandBaltimore County, MD

Page 2: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

2

Socket Programming

TCP and UDP

Page 3: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

3

Socket programming

Socket API• introduced in BSD4.1

UNIX, 1981• explicitly created, used,

released by apps • client/server paradigm • two types of transport

service via socket API: – unreliable datagram – reliable, byte stream-

oriented

a host-local, application-created,

OS-controlled interface (a “door”) into which

application process can both send and

receive messages to/from another

application process

socket

Goal: learn how to build client/server application that communicate using sockets

Page 4: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

4

TCP

Page 5: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

2: Application Layer5

Socket-programming using TCP

Socket: a door between application process and end-end-transport protocol (UCP or TCP)

TCP service: reliable transfer of bytes from one process to another

process

TCP withbuffers,

variables

socket

controlled byapplicationdeveloper

controlled byoperating

system

host orserver

process

TCP withbuffers,

variables

socket

controlled byapplicationdeveloper

controlled byoperatingsystem

host orserver

internet

Page 6: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

2: Application Layer6

Socket programming with TCP

Client must contact server• server process must first

be running• server must have

created socket (door) that welcomes client’s contact

Client contacts server by:• creating client-local TCP

socket• specifying IP address,

port number of server process

• When client creates socket: client TCP establishes connection to server TCP

• When contacted by client, server TCP creates new socket for server process to communicate with client– allows server to talk

with multiple clients– source port numbers

used to distinguish clients

TCP provides reliable, in-order transfer of bytes (“pipe”) between client and server

application viewpoint

Page 7: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

7

Stream jargon

• A stream is a sequence of characters that flow into or out of a process.

• An input stream is attached to some input source for the process, eg, keyboard or socket.

• An output stream is attached to an output source, eg, monitor or socket.

Page 8: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

8

Socket programming with TCP

Example client-server app:

1) client reads line from standard input (inFromUser stream) , sends to server via socket (outToServer stream)

2) server reads line from socket

3) server converts line to uppercase, sends back to client

4) client reads, prints modified line from socket (inFromServer stream)

outT

oSer

ver

to network from network

inFr

omS

erve

r

inFr

omU

ser

keyboard monitor

Process

clientSocket

inputstream

inputstream

outputstream

TCPsocket

Clientprocess

client TCP socket

Page 9: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

9

Client/server socket interaction: TCP

wait for incomingconnection requestconnectionSocket =welcomeSocket.accept()

create socket,port=x, forincoming request:welcomeSocket =

ServerSocket()

create socket,connect to hostid, port=xclientSocket =

Socket()

closeconnectionSocket

read reply fromclientSocket

closeclientSocket

Server (running on hostid) Client

send request usingclientSocketread request from

connectionSocket

write reply toconnectionSocket

TCP connection setup

Page 10: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

10

Example: Java client (TCP)

import java.io.*; import java.net.*; class TCPClient {

public static void main(String argv[]) throws Exception { String sentence; String modifiedSentence;

BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));

Socket clientSocket = new Socket("hostname", 6789);

DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

Createinput stream

Create client socket,

connect to server

Createoutput stream

attached to socket

Page 11: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

11

Example: Java client (TCP), cont.

BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

sentence = inFromUser.readLine();

outToServer.writeBytes(sentence + '\n');

modifiedSentence = inFromServer.readLine();

System.out.println("FROM SERVER: " + modifiedSentence);

clientSocket.close(); } }

Createinput stream

attached to socket

Send lineto server

Read linefrom server

Page 12: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

12

Example: Java server (TCP)

import java.io.*; import java.net.*;

class TCPServer {

public static void main(String argv[]) throws Exception { String clientSentence; String capitalizedSentence;

ServerSocket welcomeSocket = new ServerSocket(6789); while(true) { Socket connectionSocket = welcomeSocket.accept();

BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

Createwelcoming socket

at port 6789

Wait, on welcomingsocket for contact

by client

Create inputstream, attached

to socket

Page 13: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

13

Example: Java server (TCP), cont

DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());

clientSentence = inFromClient.readLine();

capitalizedSentence = clientSentence.toUpperCase() + '\n';

outToClient.writeBytes(capitalizedSentence); } } }

Read in linefrom socket

Create outputstream,

attached to socket

Write out lineto socket

End of while loop,loop back and wait foranother client connection

Page 14: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

14

UDP

Page 15: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

15

Socket programming with UDP

UDP: no “connection” between client and server• no handshaking• sender explicitly attaches IP address and port of

destination to each packet• server must extract IP address, port of sender from

received packet

UDP: transmitted data may be received out of order, or lost

application viewpoint

UDP provides unreliable transfer of groups of bytes (“datagrams”)

between client and server

Page 16: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

16

Client/server socket interaction: UDP

closeclientSocket

Server (running on hostid)

read reply fromclientSocket

create socket,clientSocket = DatagramSocket()

Client

Create, address (hostid, port=x,send datagram request using clientSocket

create socket,port=x, forincoming request:serverSocket = DatagramSocket()

read request fromserverSocket

write reply toserverSocketspecifying clienthost address,port number

Page 17: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

17

Example: Java client (UDP)

sendP

ack

et

to network from network

rece

iveP

ack

et

inF

rom

Use

r

keyboard monitor

Process

clientSocket

UDPpacket

inputstream

UDPpacket

UDPsocket

Output: sends packet (TCP sent “byte stream”)

Input: receives packet (TCP received “byte stream”)

Clientprocess

client UDP socket

Page 18: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

18

Example: Java client (UDP)

import java.io.*; import java.net.*; class UDPClient { public static void main(String args[]) throws Exception { BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName("hostname"); byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence = inFromUser.readLine();

sendData = sentence.getBytes();

Createinput stream

Create client socket

Translate hostname to IP

address using DNS

Page 19: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

19

Example: Java client (UDP), cont.

DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); clientSocket.send(sendPacket); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); String modifiedSentence = new String(receivePacket.getData(),0,receivePacket.getLength()); System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); }

}

Create datagram with data-to-send,

length, IP addr, port

Send datagramto server

Read datagramfrom server

Page 20: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

20

Example: Java server (UDP)

import java.io.*; import java.net.*; class UDPServer { public static void main(String args[]) throws Exception { DatagramSocket serverSocket = new DatagramSocket(9876); byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while(true) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

serverSocket.receive(receivePacket);

Createdatagram socket

at port 9876

Create space forreceived datagram

Receivedatagra

m

Page 21: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

2: Application Layer21

Example: Java server (UDP), cont

String sentence = new String(receivePacket.getData()); InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); String capitalizedSentence = sentence.toUpperCase();

sendData = capitalizedSentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); serverSocket.send(sendPacket); } }

}

Get IP addrport #, of

sender

Write out datagramto socket

End of while loop,loop back and wait foranother datagram

Create datagramto send to client

Page 22: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

Required Packages

Package Description

org.apache.*Represents a number of packages that provide fine control and functions for HTTP communications. You might recognize Apache as the popular open source Web server.

android.net

Contains additional network access sockets beyond the core java.net.* classes. This package includes the URI class, which is used frequently in Android application development beyond traditional networking.

android.net.http Contains classes for manipulating SSL certificates.

android.net.wifi

Contains classes for managing all aspects of WiFi (802.11 wireless Ethernet) on the Android platform. Not all devices are equipped with WiFi capability, particularly as Android makes headway in the "flip-phone" strata of cell phones from manufacturers like Motorola and LG.

android.telephony

Contains classes required for managing and sending SMS (text) messages. Over time, an additional package will likely be introduced to provide similar functions on non-GSM networks, such as CDMA, or something like android.t lephony.cdma.

Page 23: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

How does the Bluetooth protocol work?

discovery

pairing

RFComm

Scanning for other BTDevices --- inquiry scan Followed by page scan. Take about 15-20 seconds

Authentication process where two devices exchange a pin. Once paired the info is maintained in service discovery db

Service Discovery Every server device publishes a set of service that client connect to

After pairing the devices communicate amongst each other over a RF communication channel

Page 24: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

Android implementation overview?

BluetoothAdapter

BluetoothDevice

BluetoothServerSocket

BluetoothSocket

Access to the local Bluetooth device and its properties

Access to any Bluetooth device (usually remote)

Socket interface for the server-end

Socket interface for the client-end

Page 25: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

Bluetooth Permissions

• Permission BLUETOOTH is used ONLY for communication– Requesting a connection, accepting a connection, and transferring data

• Permission BLUETOOTH_ADMIN is used for controlling the device– Device discovery, changing the settings of the Bluetooth device etc.

<manifest> <uses permission android:name=“android.permission.BLUETOOTH”> <uses permission android:name=“android.permission.BLUETOOTH_ADMIN”>

</manifest>

Page 26: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

Setting up the Bluetooth Adapter

– Use BluetoothAdapter to get a reference to the Bluetooth device• If Bluetooth device is not supported the adapter returns a NULL

– Enable Bluetooth device using an Intent and starting a new Activity with the Bluetooth device

• It does ask the user whether he wants to enable the device• How do you know that the Bluetooth device is enabled? --- the resultcode in

onActivityResult() callback will be RESULT_OK.

Bluetooth adapter = BluetoothAdapter.getDefaultAdapter();if(adapter == null){ //Device does not support Bluetooth.}

if(!adapter.isEnabled()) {Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enableBT, REQUEST_ENABLE_BT);

}

Page 27: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

Discovering devices

Set<BluetoothDevice> pairedDevices = adapter.getBondedDevices();

if (pairedDevices.size() > 0) { for(BluetoothDevice device: pairedDevices) { //get access to the devices name through device.getName();

//get access to the devices MAC address through device.getAddress(); }}

//discovering devicesadapter.startDiscover();private final BroadcastReceiver mReceiver = 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);

//get the name of the device through device.getName();//get the MAC address of the device through device.getAddress();

} } IntentFilter filter = new IntentFilter(Bluetooth.ACTION_FOUND); registerReceiver(mReceiver, filte); //register for broadcast receiver when a BT device is found.

– First step is to find devices that you have already paired with: these are devices you do not need to pair to get connected

– Use a broadcast receiver discover new Bluetooth devices

Page 28: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

Enabling Discovery

Intent discoverable = new Intent(BluetoothAdapter.BLUETOOTH_ACTION_DISCOVERABLE);Discoverable.putExtras(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);startActivity(discoverable);

– Why do you need to set a device’s Bluetooth to Discoverable• If you are a server and you want client devices to connect to you• If you want other devices to see you in order to pair with you

– You set it up using an Intent• A parameter that you can set up is the time that you want the device to be

discoverable• Default = 120 seconds, 0 forever, max = 3600, < 0 or > 3600 – default is

taken.

Page 29: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

Connecting to a device (server-side)

– Just like a TCP socket called BluetoothServerSocket– You wait on an accept() (blocking call) till you receive an

incoming connection request– accept() is blocking so it should happen in a separate thread

from the UI thread

public class AcceptConnection extends Thread{private final BluetoothServerSocket soc;

public AcceptConnection() { try {

soc = adapter.listenUsingRfcommWithServiceRecord(NAME, UDID); } catch(IOException e){} }public void run() { BluetoothSocket socket = null; while(true) {

try {soc.accept();} catch(IOException e) { break; }

if(soc != null) {//spawn another thread to manage the connection

}

}

}}

Name of the service

Unique ID for the service

Page 30: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

Connecting to a device (client-end)

– Connect() is a blocking call so needs to happen in a thread separate from the UI thread

– From the remote device, create a Rfcomm channel for data transfer.

 public class ClientThread extends Thread { BluetoothSocket temp = null; public ClientThread(Bluetooth device) { try {

temp = device.createRfcommSocketToServiceRecord(UDID); }catch(Exception e) { } }

public void run() { adapter.cancelDiscover(); try { temp.connect(); } catch(Exception e) { }

//manage the connection }}

Page 31: 1 CMSC628: Introduction to Mobile Computing Nilanjan Banerjee Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron University of

Data transfer using the server/client socket

– Attach an InputStream and an OutputStream to the the socket– Use read(byte[]) and write(byte[]) to read and write --- both are

blocking calls

 public class ClientThread extends Thread { BluetoothSocket temp = null; public ClientThread(Bluetooth device) { try {

temp = device.createRfcommSocketToServiceRecord(UDID); }catch(Exception e) { } }

public void run() { byte[] buffer = new byte[1024]; int numbytes; adapter.cancelDiscover(); try { numbytes = temp.read(buffer); //do whatever you want with the bytes } catch(Exception e) { }

//manage the connection }}