comunicando nuestras apps con el mundo exterior
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, bluetoothTRANSCRIPT
![Page 1: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/1.jpg)
Comunicando nuestras appscon el mundo exterior
Roberto Luis Bisbé
rlbisbe.net
@rlbisbe
![Page 2: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/2.jpg)
@rlbisbe
• Ingeniero en Informática @ UAM
•Desarrollador @ frontiers
•WP, W8 & Android dev
•rlbisbe.net
![Page 3: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/3.jpg)
Corría el año 2006…
![Page 4: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/4.jpg)
Corría el año 2006…
![Page 5: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/5.jpg)
Penetrómetro
![Page 6: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/6.jpg)
Penetrómetro
![Page 7: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/7.jpg)
.NET CompactFramework
.NETFrameworkUSB
Remote API
![Page 8: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/8.jpg)
Comunicar nuestras appscon el mundo exterior
![Page 9: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/9.jpg)
Imagen: https://flic.kr/p/aKN6u6
Examinandola superficie
![Page 10: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/10.jpg)
Raspberry PI
•ARM
•Linux
•USB
•Ethernet
•Sensores
![Page 11: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/11.jpg)
Raspberry PI
•ARM
•Linux
•USB
•Ethernet
•Sensores
![Page 12: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/12.jpg)
API REST!
![Page 13: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/13.jpg)
Web Sockets
![Page 14: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/14.jpg)
! Web Socket
•SignalR• .NET
•socket.io•node.js•Python
• faye• ruby
![Page 15: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/15.jpg)
Qué es WebSocket
•Bidireccional
•HTTP
•Soporte nativo en 8.x
![Page 16: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/16.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/19.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/21.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/24.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/25.jpg)
Ejemplo completo
DEMO
C# Node JSWebSocket
![Page 26: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/26.jpg)
WebSocket
•Bidireccional
•HTTP
•Soporte nativo en 8.x
![Page 27: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/27.jpg)
Bajando de nivel
Imagen: https://flic.kr/p/aKN6u6
![Page 28: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/28.jpg)
StreamSockets
•Flujo de datos sobre TCP
•Texto, imágenes, audio, vídeo…
•Permisos
![Page 29: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/29.jpg)
Servidor - Conexión
var listenSocket = new StreamSocketListener();
listenSocket.ConnectionReceived += ConnectionReceived;
await listenSocket.BindServiceNameAsync("5000");
![Page 30: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/30.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/31.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/32.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/33.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/34.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/35.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/36.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/37.jpg)
Ejemplo completo
DEMO
WinRT C# WinRT C#Socket
![Page 38: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/38.jpg)
StreamSockets
•Flujo de datos sobre TCP
•Texto, imágenes, audio, vídeo…
•Requiere permisos
![Page 39: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/39.jpg)
En las profundidades
Imagen: https://flic.kr/p/48XdaQ
![Page 40: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/40.jpg)
Pebble Smartwatch
• iOS & Android
•APIs
•SDK
•Bluetooth!
![Page 41: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/41.jpg)
Las cosas no siempre salen como esperamos
Imagen: https://flic.kr/p/8bDAS1
![Page 42: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/42.jpg)
Volvamos a la Raspberry PI
•ARM
•Linux
•USB
•Ethernet
•Sensores
![Page 43: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/43.jpg)
Volvamos a la Raspberry PI
•ARM
•Linux
•USB
•Ethernet
•Sensores
![Page 44: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/44.jpg)
Volvamos a la Raspberry PI
•ARM
•Linux
•USB + Bluetooth
•Ethernet
•Sensores
![Page 45: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/45.jpg)
Bluetooth IS EVIL
•P2P
•Alcance
•Consumo
•Servicios
•Ancho de banda
•Pairing, Búsqueda, Conexión
![Page 46: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/46.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/47.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/48.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/49.jpg)
Cliente - Búsqueda
chatServiceInfoCollection =
await DeviceInformation.FindAllAsync(
RfcommDeviceService.GetDeviceSelector(
RfcommServiceId.SerialPort));
![Page 50: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/50.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/51.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/52.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/53.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/54.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/55.jpg)
Ejemplo completo
DEMO
C# PythonBluetooth Serial Port
![Page 56: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/56.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/57.jpg)
Podemos comunicar nuestras apps con el mundo exterior
![Page 58: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/58.jpg)
WebSockets, sockets, bluetooth, GPS, infrarrojos, sonido, NFC, sensores
![Page 59: Comunicando nuestras apps con el mundo exterior](https://reader034.vdocuments.mx/reader034/viewer/2022052601/559351e11a28abd3028b463a/html5/thumbnails/59.jpg)
Preguntas?Hay regalitos…