Comunicando nuestras apps con el mundo exterior

60
Comunicando nuestras apps con el mundo exterior Roberto Luis Bisbé rlbisbe.net @rlbisbe

description

En esta charla vemos varias manera de conectar un dispositivo Windows Phone con una Raspberry Pi así como con un ordenador Windows 8 usando WebSockets, StreamSockets y finalmente, bluetooth

Transcript of Comunicando nuestras apps con el mundo exterior

Page 1: Comunicando nuestras apps con el mundo exterior

Comunicando nuestras appscon el mundo exterior

Roberto Luis Bisbé

rlbisbe.net

@rlbisbe

Page 2: Comunicando nuestras apps con el mundo exterior

@rlbisbe

• Ingeniero en Informática @ UAM

•Desarrollador @ frontiers

•WP, W8 & Android dev

•rlbisbe.net

Page 3: Comunicando nuestras apps con el mundo exterior

Corría el año 2006…

Page 4: Comunicando nuestras apps con el mundo exterior

Corría el año 2006…

Page 5: Comunicando nuestras apps con el mundo exterior

Penetrómetro

Page 6: Comunicando nuestras apps con el mundo exterior

Penetrómetro

Page 7: Comunicando nuestras apps con el mundo exterior

.NET CompactFramework

.NETFrameworkUSB

Remote API

Page 8: Comunicando nuestras apps con el mundo exterior

Comunicar nuestras appscon el mundo exterior

Page 9: Comunicando nuestras apps con el mundo exterior

Imagen: https://flic.kr/p/aKN6u6

Examinandola superficie

Page 10: Comunicando nuestras apps con el mundo exterior

Raspberry PI

•ARM

•Linux

•USB

•Ethernet

•Sensores

Page 11: Comunicando nuestras apps con el mundo exterior

Raspberry PI

•ARM

•Linux

•USB

•Ethernet

•Sensores

Page 12: Comunicando nuestras apps con el mundo exterior

API REST!

Page 13: Comunicando nuestras apps con el mundo exterior

Web Sockets

Page 14: Comunicando nuestras apps con el mundo exterior

! Web Socket

•SignalR• .NET

•socket.io•node.js•Python

• faye• ruby

Page 15: Comunicando nuestras apps con el mundo exterior

Qué es WebSocket

•Bidireccional

•HTTP

•Soporte nativo en 8.x

Page 16: Comunicando nuestras apps con el mundo exterior

Servidor

var server = http.createServer(app)

server.listen(1430)

var wss = new WebSocketServer({ server: server });

wss.on("connection", function (ws) {

ws.on("message", function (data) {

ws.send("response");

})

ws.on("close", function () {

//Closed

})

}

Page 17: Comunicando nuestras apps con el mundo exterior

Servidor

var server = http.createServer(app)

server.listen(1430)

var wss = new WebSocketServer({ server: server });

wss.on("connection", function (ws) {

ws.on("message", function (data) {

ws.send("response");

})

ws.on("close", function () {

//Closed

})

}

Page 18: Comunicando nuestras apps con el mundo exterior

Servidor

var server = http.createServer(app)

server.listen(1430)

var wss = new WebSocketServer({ server: server });

wss.on("connection", function (ws) {

ws.on("message", function (data) {

ws.send("response");

})

ws.on("close", function () {

//Closed

})

}

Page 19: Comunicando nuestras apps con el mundo exterior

Cliente - Conexión

var webSocket = new MessageWebSocket();

webSocket.Control.MessageType = SocketMessageType.Utf8;

webSocket.MessageReceived += ProcessMessageReceived;

webSocket.Closed += Closed;

await webSocket.ConnectAsync(new Uri("ws://IP:9999"));

Page 20: Comunicando nuestras apps con el mundo exterior

Cliente - Conexión

ver webSocket = new MessageWebSocket();

webSocket.Control.MessageType = SocketMessageType.Utf8;

webSocket.MessageReceived += ProcessMessageReceived;

webSocket.Closed += Closed;

await webSocket.ConnectAsync(new Uri("ws://IP:9999"));

Page 21: Comunicando nuestras apps con el mundo exterior

Cliente - Conexión

ver webSocket = new MessageWebSocket();

webSocket.Control.MessageType = SocketMessageType.Utf8;

webSocket.MessageReceived += ProcessMessageReceived;

webSocket.Closed += Closed;

await webSocket.ConnectAsync(new Uri("ws://IP:9999"));

Page 22: Comunicando nuestras apps con el mundo exterior

Cliente - Conexión

ver webSocket = new MessageWebSocket();

webSocket.Control.MessageType = SocketMessageType.Utf8;

webSocket.MessageReceived += ProcessMessageReceived;

webSocket.Closed += Closed;

await webSocket.ConnectAsync(new Uri("ws://IP:9999"));

Page 23: Comunicando nuestras apps con el mundo exterior

Cliente - Envío y recepción

var _messageWriter = new DataWriter(webSocket.OutputStream);

_messageWriter.WriteString(message);

await _messageWriter.StoreAsync();

var stream = new

StreamReader(args.GetDataStream().AsStreamForRead());

string message = stream.ReadToEnd();

Page 24: Comunicando nuestras apps con el mundo exterior

Cliente - Envío y recepción

var _messageWriter = new DataWriter(webSocket.OutputStream);

_messageWriter.WriteString(message);

await _messageWriter.StoreAsync();

var stream = new

StreamReader(args.GetDataStream().AsStreamForRead());

string message = stream.ReadToEnd();

Page 25: Comunicando nuestras apps con el mundo exterior

Ejemplo completo

DEMO

C# Node JSWebSocket

Page 26: Comunicando nuestras apps con el mundo exterior

WebSocket

•Bidireccional

•HTTP

•Soporte nativo en 8.x

Page 27: Comunicando nuestras apps con el mundo exterior

Bajando de nivel

Imagen: https://flic.kr/p/aKN6u6

Page 28: Comunicando nuestras apps con el mundo exterior

StreamSockets

•Flujo de datos sobre TCP

•Texto, imágenes, audio, vídeo…

•Permisos

Page 29: Comunicando nuestras apps con el mundo exterior

Servidor - Conexión

var listenSocket = new StreamSocketListener();

listenSocket.ConnectionReceived += ConnectionReceived;

await listenSocket.BindServiceNameAsync("5000");

Page 30: Comunicando nuestras apps con el mundo exterior

Servidor - Recepción

DataReader reader = new DataReader(connectionSocket.InputStream);

uint sizeFieldCount = await reader.LoadAsync(sizeof(long));

if (sizeFieldCount != sizeof(long)) return;

uint resultLength = (uint)reader.ReadInt32();

uint actualResultLength = await reader.LoadAsync(resultLength);

if (resultLength != actualResultLength) return;

var byteResult = new byte[resultLength];

reader.ReadBytes(byteResult);

Page 31: Comunicando nuestras apps con el mundo exterior

Servidor - Recepción

DataReader reader = new DataReader(connectionSocket.InputStream);

uint sizeFieldCount = await reader.LoadAsync(sizeof(long));

if (sizeFieldCount != sizeof(long)) return;

uint resultLength = (uint)reader.ReadInt32();

uint actualResultLength = await reader.LoadAsync(resultLength);

if (resultLength != actualResultLength) return;

var byteResult = new byte[resultLength];

reader.ReadBytes(byteResult);

Page 32: Comunicando nuestras apps con el mundo exterior

Servidor - Recepción

uint sizeFieldCount = await reader.LoadAsync(sizeof(long));

if (sizeFieldCount != sizeof(long)) return;

uint resultLength = (uint)reader.ReadInt32();

uint actualResultLength = await reader.LoadAsync(resultLength);

if (resultLength != actualResultLength) return;

var byteResult = new byte[resultLength];

reader.ReadBytes(byteResult);

Page 33: Comunicando nuestras apps con el mundo exterior

Cliente - Conexión

var connectionSocket = new StreamSocket();

var serverHost = new HostName(server);

await connectionSocket.ConnectAsync(serverHost, port);

Page 34: Comunicando nuestras apps con el mundo exterior

Cliente - Envío

var writer = new DataWriter(connectionSocket.OutputStream);

writer.WriteInt32(bytes.Length);

writer.WriteBytes(bytes);

await writer.StoreAsync();

writer.DetachStream();

Page 35: Comunicando nuestras apps con el mundo exterior

Cliente - Envío

var writer = new DataWriter(connectionSocket.OutputStream);

writer.WriteInt32(bytes.Length);

writer.WriteBytes(bytes);

await writer.StoreAsync();

writer.DetachStream();

Page 36: Comunicando nuestras apps con el mundo exterior

Cliente - Envío

var writer = new DataWriter(connectionSocket.OutputStream);

writer.WriteInt32(bytes.Length);

writer.WriteBytes(bytes);

await writer.StoreAsync();

writer.DetachStream();

Page 37: Comunicando nuestras apps con el mundo exterior

Ejemplo completo

DEMO

WinRT C# WinRT C#Socket

Page 38: Comunicando nuestras apps con el mundo exterior

StreamSockets

•Flujo de datos sobre TCP

•Texto, imágenes, audio, vídeo…

•Requiere permisos

Page 39: Comunicando nuestras apps con el mundo exterior

En las profundidades

Imagen: https://flic.kr/p/48XdaQ

Page 40: Comunicando nuestras apps con el mundo exterior

Pebble Smartwatch

• iOS & Android

•APIs

•SDK

•Bluetooth!

Page 41: Comunicando nuestras apps con el mundo exterior

Las cosas no siempre salen como esperamos

Imagen: https://flic.kr/p/8bDAS1

Page 42: Comunicando nuestras apps con el mundo exterior

Volvamos a la Raspberry PI

•ARM

•Linux

•USB

•Ethernet

•Sensores

Page 43: Comunicando nuestras apps con el mundo exterior

Volvamos a la Raspberry PI

•ARM

•Linux

•USB

•Ethernet

•Sensores

Page 44: Comunicando nuestras apps con el mundo exterior

Volvamos a la Raspberry PI

•ARM

•Linux

•USB + Bluetooth

•Ethernet

•Sensores

Page 45: Comunicando nuestras apps con el mundo exterior

Bluetooth IS EVIL

•P2P

•Alcance

•Consumo

•Servicios

•Ancho de banda

•Pairing, Búsqueda, Conexión

Page 46: Comunicando nuestras apps con el mundo exterior

Servidor

server_sock=BluetoothSocket( RFCOMM )

server_sock.bind(("",22))

server_sock.listen(22)

client_sock, client_info = server_sock.accept()

while True:

data = client_sock.recv(1024)

client_sock.close()

server_sock.close()

Page 47: Comunicando nuestras apps con el mundo exterior

Servidor

server_sock=BluetoothSocket( RFCOMM )

server_sock.bind(("",22))

server_sock.listen(22)

client_sock, client_info = server_sock.accept()

while True:

data = client_sock.recv(1024)

client_sock.close()

server_sock.close()

Page 48: Comunicando nuestras apps con el mundo exterior

Servidor

server_sock=BluetoothSocket( RFCOMM )

server_sock.bind(("",22))

server_sock.listen(22)

client_sock, client_info = server_sock.accept()

while True:

data = client_sock.recv(1024)

client_sock.close()

server_sock.close()

Page 49: Comunicando nuestras apps con el mundo exterior

Cliente - Búsqueda

chatServiceInfoCollection =

await DeviceInformation.FindAllAsync(

RfcommDeviceService.GetDeviceSelector(

RfcommServiceId.SerialPort));

Page 50: Comunicando nuestras apps con el mundo exterior

Cliente – Conexión

var chatServiceInfo = chatServiceInfoCollection[0];

var service =

await RfcommDeviceService.FromIdAsync(chatServiceInfo.Id);

await chatSocket.ConnectAsync(

service.ConnectionHostName,

service.ConnectionServiceName);

var chatWriter = new DataWriter(chatSocket.OutputStream);

var chatReader = new DataReader(chatSocket.InputStream);

Page 51: Comunicando nuestras apps con el mundo exterior

Cliente – Conexión

var chatServiceInfo = chatServiceInfoCollection[0];

var service =

await RfcommDeviceService.FromIdAsync(chatServiceInfo.Id);

await chatSocket.ConnectAsync(

service.ConnectionHostName,

service.ConnectionServiceName);

var chatWriter = new DataWriter(chatSocket.OutputStream);

var chatReader = new DataReader(chatSocket.InputStream);

Page 52: Comunicando nuestras apps con el mundo exterior

Cliente – Conexión

var chatServiceInfo = chatServiceInfoCollection[0];

var service =

await RfcommDeviceService.FromIdAsync(chatServiceInfo.Id);

await chatSocket.ConnectAsync(

service.ConnectionHostName,

service.ConnectionServiceName);

var chatWriter = new DataWriter(chatSocket.OutputStream);

var chatReader = new DataReader(chatSocket.InputStream);

Page 53: Comunicando nuestras apps con el mundo exterior

Cliente – Envío y recepción

chatWriter.WriteString("open");

await chatWriter.StoreAsync();

byte[] buffer = new byte[10];

await chatSocket.InputStream.ReadAsync(

buffer.AsBuffer(), 10,

InputStreamOptions.Partial);

string result = System.Text.Encoding.UTF8.GetString(buffer, 0, 10);

Page 54: Comunicando nuestras apps con el mundo exterior

Cliente – Envío y recepción

chatWriter.WriteString("open");

await chatWriter.StoreAsync();

byte[] buffer = new byte[10];

await chatSocket.InputStream.ReadAsync(

buffer.AsBuffer(), 10,

InputStreamOptions.Partial);

string result = System.Text.Encoding.UTF8.GetString(buffer, 0, 10);

Page 55: Comunicando nuestras apps con el mundo exterior

Ejemplo completo

DEMO

C# PythonBluetooth Serial Port

Page 56: Comunicando nuestras apps con el mundo exterior

Bluetooth IS STILL EVIL

•P2P

•Alcance

•Consumo

•Servicios

•Ancho de banda

•Pairing, Búsqueda, Conexión

Page 57: Comunicando nuestras apps con el mundo exterior

Podemos comunicar nuestras apps con el mundo exterior

Page 58: Comunicando nuestras apps con el mundo exterior

WebSockets, sockets, bluetooth, GPS, infrarrojos, sonido, NFC, sensores

Page 59: Comunicando nuestras apps con el mundo exterior

Preguntas?Hay regalitos…

Page 60: Comunicando nuestras apps con el mundo exterior

Gracias!Enlaces, código y slides en rlbisbe.net

[email protected]

@rlbisbe