Comunicando nuestras apps con el mundo exterior

Preview:

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

Comunicando nuestras appscon el mundo exterior

Roberto Luis Bisbé

rlbisbe.net

@rlbisbe

@rlbisbe

• Ingeniero en Informática @ UAM

•Desarrollador @ frontiers

•WP, W8 & Android dev

•rlbisbe.net

Corría el año 2006…

Corría el año 2006…

Penetrómetro

Penetrómetro

.NET CompactFramework

.NETFrameworkUSB

Remote API

Comunicar nuestras appscon el mundo exterior

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

Examinandola superficie

Raspberry PI

•ARM

•Linux

•USB

•Ethernet

•Sensores

Raspberry PI

•ARM

•Linux

•USB

•Ethernet

•Sensores

API REST!

Web Sockets

! Web Socket

•SignalR• .NET

•socket.io•node.js•Python

• faye• ruby

Qué es WebSocket

•Bidireccional

•HTTP

•Soporte nativo en 8.x

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

})

}

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

})

}

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

})

}

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"));

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"));

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"));

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"));

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();

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();

Ejemplo completo

DEMO

C# Node JSWebSocket

WebSocket

•Bidireccional

•HTTP

•Soporte nativo en 8.x

Bajando de nivel

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

StreamSockets

•Flujo de datos sobre TCP

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

•Permisos

Servidor - Conexión

var listenSocket = new StreamSocketListener();

listenSocket.ConnectionReceived += ConnectionReceived;

await listenSocket.BindServiceNameAsync("5000");

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);

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);

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);

Cliente - Conexión

var connectionSocket = new StreamSocket();

var serverHost = new HostName(server);

await connectionSocket.ConnectAsync(serverHost, port);

Cliente - Envío

var writer = new DataWriter(connectionSocket.OutputStream);

writer.WriteInt32(bytes.Length);

writer.WriteBytes(bytes);

await writer.StoreAsync();

writer.DetachStream();

Cliente - Envío

var writer = new DataWriter(connectionSocket.OutputStream);

writer.WriteInt32(bytes.Length);

writer.WriteBytes(bytes);

await writer.StoreAsync();

writer.DetachStream();

Cliente - Envío

var writer = new DataWriter(connectionSocket.OutputStream);

writer.WriteInt32(bytes.Length);

writer.WriteBytes(bytes);

await writer.StoreAsync();

writer.DetachStream();

Ejemplo completo

DEMO

WinRT C# WinRT C#Socket

StreamSockets

•Flujo de datos sobre TCP

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

•Requiere permisos

En las profundidades

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

Pebble Smartwatch

• iOS & Android

•APIs

•SDK

•Bluetooth!

Las cosas no siempre salen como esperamos

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

Volvamos a la Raspberry PI

•ARM

•Linux

•USB

•Ethernet

•Sensores

Volvamos a la Raspberry PI

•ARM

•Linux

•USB

•Ethernet

•Sensores

Volvamos a la Raspberry PI

•ARM

•Linux

•USB + Bluetooth

•Ethernet

•Sensores

Bluetooth IS EVIL

•P2P

•Alcance

•Consumo

•Servicios

•Ancho de banda

•Pairing, Búsqueda, Conexión

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()

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()

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()

Cliente - Búsqueda

chatServiceInfoCollection =

await DeviceInformation.FindAllAsync(

RfcommDeviceService.GetDeviceSelector(

RfcommServiceId.SerialPort));

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);

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);

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);

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);

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);

Ejemplo completo

DEMO

C# PythonBluetooth Serial Port

Bluetooth IS STILL EVIL

•P2P

•Alcance

•Consumo

•Servicios

•Ancho de banda

•Pairing, Búsqueda, Conexión

Podemos comunicar nuestras apps con el mundo exterior

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

Preguntas?Hay regalitos…

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

roberto.luis@rlbisbe.net

@rlbisbe