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

Comunicando nuestras apps con el mundo exterior

Embed Size (px)

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

Citation preview

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