Comunicando nuestras apps con el mundo exterior Roberto Luis Bisbé rlbisbe.net @rlbisbe
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…