1*8caefee3SMatthias Ringwald package com.bluekitchen.btstack; 2*8caefee3SMatthias Ringwald 3*8caefee3SMatthias Ringwald import java.io.IOException; 4*8caefee3SMatthias Ringwald import java.io.InputStream; 5*8caefee3SMatthias Ringwald import java.io.OutputStream; 6*8caefee3SMatthias Ringwald 7*8caefee3SMatthias Ringwald import android.net.LocalSocket; 8*8caefee3SMatthias Ringwald import android.net.LocalSocketAddress; 9*8caefee3SMatthias Ringwald 10*8caefee3SMatthias Ringwald public class SocketConnectionUnix extends SocketConnection { 11*8caefee3SMatthias Ringwald 12*8caefee3SMatthias Ringwald private LocalSocket socket; 13*8caefee3SMatthias Ringwald private String unixSocketName = "/data/btstack/BTstack"; 14*8caefee3SMatthias Ringwald private InputStream in; 15*8caefee3SMatthias Ringwald private OutputStream out; 16*8caefee3SMatthias Ringwald private byte inHeader[] = new byte[6]; 17*8caefee3SMatthias Ringwald private byte inPayload[] = new byte[2000]; 18*8caefee3SMatthias Ringwald SocketConnectionUnix()19*8caefee3SMatthias Ringwald public SocketConnectionUnix(){ 20*8caefee3SMatthias Ringwald socket = null; 21*8caefee3SMatthias Ringwald } 22*8caefee3SMatthias Ringwald 23*8caefee3SMatthias Ringwald /* (non-Javadoc) 24*8caefee3SMatthias Ringwald * @see com.bluekitchen.btstack.SocketConnection#connect() 25*8caefee3SMatthias Ringwald */ 26*8caefee3SMatthias Ringwald @Override connect()27*8caefee3SMatthias Ringwald public boolean connect() { 28*8caefee3SMatthias Ringwald try { 29*8caefee3SMatthias Ringwald socket = new LocalSocket(); 30*8caefee3SMatthias Ringwald LocalSocketAddress socketAddress = new LocalSocketAddress(unixSocketName, LocalSocketAddress.Namespace.FILESYSTEM); 31*8caefee3SMatthias Ringwald socket.connect(socketAddress); 32*8caefee3SMatthias Ringwald in = socket.getInputStream(); 33*8caefee3SMatthias Ringwald out = socket.getOutputStream(); 34*8caefee3SMatthias Ringwald return true; 35*8caefee3SMatthias Ringwald } catch (IOException e) { 36*8caefee3SMatthias Ringwald e.printStackTrace(); 37*8caefee3SMatthias Ringwald return false; 38*8caefee3SMatthias Ringwald } 39*8caefee3SMatthias Ringwald } 40*8caefee3SMatthias Ringwald 41*8caefee3SMatthias Ringwald /* (non-Javadoc) 42*8caefee3SMatthias Ringwald * @see com.bluekitchen.btstack.SocketConnection#sendPacket(com.bluekitchen.btstack.Packet) 43*8caefee3SMatthias Ringwald */ 44*8caefee3SMatthias Ringwald @Override sendPacket(Packet packet)45*8caefee3SMatthias Ringwald public boolean sendPacket(Packet packet) { 46*8caefee3SMatthias Ringwald 47*8caefee3SMatthias Ringwald if (out == null) return false; 48*8caefee3SMatthias Ringwald 49*8caefee3SMatthias Ringwald try { 50*8caefee3SMatthias Ringwald System.out.println("Send "); Util.hexdump(packet.getBuffer(), packet.getPayloadLen()); 51*8caefee3SMatthias Ringwald out.write(headerForPacket(packet)); 52*8caefee3SMatthias Ringwald out.write(packet.getBuffer()); 53*8caefee3SMatthias Ringwald out.flush(); 54*8caefee3SMatthias Ringwald return true; 55*8caefee3SMatthias Ringwald } catch (IOException e) { 56*8caefee3SMatthias Ringwald e.printStackTrace(); 57*8caefee3SMatthias Ringwald return false; 58*8caefee3SMatthias Ringwald } 59*8caefee3SMatthias Ringwald } 60*8caefee3SMatthias Ringwald 61*8caefee3SMatthias Ringwald /* (non-Javadoc) 62*8caefee3SMatthias Ringwald * @see com.bluekitchen.btstack.SocketConnection#receivePacket() 63*8caefee3SMatthias Ringwald */ 64*8caefee3SMatthias Ringwald @Override receivePacket()65*8caefee3SMatthias Ringwald public Packet receivePacket() { 66*8caefee3SMatthias Ringwald 67*8caefee3SMatthias Ringwald if (in == null) return null; 68*8caefee3SMatthias Ringwald 69*8caefee3SMatthias Ringwald int bytes_read = Util.readExactly(in, inHeader, 0, 6); 70*8caefee3SMatthias Ringwald if (bytes_read != 6) return null; 71*8caefee3SMatthias Ringwald 72*8caefee3SMatthias Ringwald int packetType = Util.readBt16(inHeader, 0); 73*8caefee3SMatthias Ringwald int channel = Util.readBt16(inHeader, 2); 74*8caefee3SMatthias Ringwald int len = Util.readBt16(inHeader, 4); 75*8caefee3SMatthias Ringwald 76*8caefee3SMatthias Ringwald Util.readExactly(in, inPayload, 0, len); 77*8caefee3SMatthias Ringwald 78*8caefee3SMatthias Ringwald Packet packet = new Packet(packetType, channel ,inPayload, len); 79*8caefee3SMatthias Ringwald return packet; 80*8caefee3SMatthias Ringwald } 81*8caefee3SMatthias Ringwald 82*8caefee3SMatthias Ringwald /* (non-Javadoc) 83*8caefee3SMatthias Ringwald * @see com.bluekitchen.btstack.SocketConnection#disconnect() 84*8caefee3SMatthias Ringwald */ 85*8caefee3SMatthias Ringwald @Override disconnect()86*8caefee3SMatthias Ringwald public void disconnect() { 87*8caefee3SMatthias Ringwald 88*8caefee3SMatthias Ringwald if (socket != null){ 89*8caefee3SMatthias Ringwald try { 90*8caefee3SMatthias Ringwald socket.close(); 91*8caefee3SMatthias Ringwald } catch (IOException e) { 92*8caefee3SMatthias Ringwald } 93*8caefee3SMatthias Ringwald } 94*8caefee3SMatthias Ringwald } 95*8caefee3SMatthias Ringwald headerForPacket(Packet packet)96*8caefee3SMatthias Ringwald private byte[] headerForPacket(Packet packet) { 97*8caefee3SMatthias Ringwald byte header[] = new byte[6]; 98*8caefee3SMatthias Ringwald Util.storeBt16(header, 0, packet.getPacketType()); 99*8caefee3SMatthias Ringwald Util.storeBt16(header, 2, packet.getChannel()); 100*8caefee3SMatthias Ringwald Util.storeBt16(header, 4, packet.getBuffer().length); 101*8caefee3SMatthias Ringwald return header; 102*8caefee3SMatthias Ringwald } 103*8caefee3SMatthias Ringwald } 104