xref: /btstack/port/mtk/LEScan/src/com/bluekitchen/btstack/SocketConnectionUnix.java (revision 8caefee39d444df6d8908a96a844825f10fbdaa4)
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