CMSC628: Introduction to Mobile Computing

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

description

CMSC628: Introduction to Mobile Computing. Nilanjan Banerjee. University of Maryland Baltimore County , MD. Mobile Systems Programming (Acknowledgment to Deepa Shinde and Cindy Atheron. Socket Programming. TCP and UDP. a host-local , application-created , - PowerPoint PPT Presentation

Transcript of CMSC628: Introduction to Mobile Computing

Page 1: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

2

Socket Programming

TCP and UDP

Page 3: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

4

TCP

Page 5: CMSC628: Introduction to Mobile Computing

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 byapplicationdevelopercontrolled byoperatingsystem

host orserver

internet

Page 6: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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 serverCreate

output streamattached to socket

Page 11: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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 6789Wait, on welcoming

socket for contactby client

Create inputstream, attached

to socket

Page 13: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

14

UDP

Page 15: CMSC628: Introduction to Mobile Computing

15

Socket programming with UDPUDP: 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 packetUDP: transmitted data may be received out of order, or

lost

application viewpointUDP provides unreliable transfer

of groups of bytes (“datagrams”) between client and server

Page 16: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

17

Example: Java client (UDP)

send

Pac

ket

to network from network

rece

iveP

acke

t

inFr

omU

ser

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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.netContains 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.telephonyContains 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: CMSC628: Introduction to Mobile Computing

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 toAfter pairing the devices communicate amongst each other over a RF communication channel

Page 24: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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: CMSC628: Introduction to Mobile Computing

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 }}