通过socket实现Android framework和Hal双向通信

本文介绍通过socket实现Framework和Hal双向通信。在hal层实现socket server端,并随着hal层服务启动而启动。FWK/App端创建客户端并和socket server连接。

1. hal层实现socket server

1.1 socket server接口定义

该类实现socket server相关功能。

1.2 socket server接口实现

主要调用:

a. 调用socket_local_server创建socket服务,socket名字要唯一。

b. 调用listen监听事件

c. 创建线程调用poll等待事件:

i. POLLRDHUP或POLLERR事件表明连接断开,需要清除相关信息

ii. POLLIN事件。如果是socket fd返回的,说明有新的连接请求。调用accept接受请求,并保存该函数返回的fd,标记对应client。

iii. POLLIN事件。其他fd返回为消息内容。调用recv读取消息内容,并处理消息。

d. 调用write给客户端发送消息

2. 客户端实现

实现java客户端。

主要调用:

a. 创建LocalSocket对象,并调用connect连接server

b. 获取socket输入输出流。

c. 创建线程调用BufferedReader.readLine读取输入内容。无消息时阻塞。返回NULL表明连接可能断开需要做异常处理。

d. 调用PrintWriter相关接口发送数据

Handler.Callback mHandlerCb = new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        switch(msg.what) {
            //重新连接socket
            case MSG_RECONNECT_SOCKET: {
                    if(mConnect != null) {
                        mConnect.interrupt();
                        mConnect = null;
                    }
                    mConnect = new CameraSocket();
            }
            break;
        }
        return true;
    }
};

private class SocketClient extends Thread {
    private LocalSocket mClientSocket;
    private String mSocketName;

    private PrintWriter mWriter;
    private BufferedReader mReader;

    SocketClient() {
        mSocketName = "camera_hal_server";
        Slog.i(TAG, "socket name:" + mSocketName);

        connect();
    }

    void connect() {
        try {
            mClientSocket = new LocalSocket();
            mClientSocket.connect(new LocalSocketAddress(mSocketName));
            Slog.i(TAG, "Client=======connect success=========");
            mWriter = new PrintWriter(mClientSocket.getOutputStream());
            mReader = new BufferedReader(new InputStreamReader(mClientSocket.getInputStream()));
            this.start();
         } catch (IOException e) {
         }
    }

    void close() {
        try {
            if(mReader != null) {
                mReader.close();
                mReader = null;
            }
            if(mWriter != null) {
                mWriter.close();
                mWriter = null;
            }
            mClientSocket.close();
        } catch (IOException e) {
        }
    }

    @Override
    public void run() {
        super.run();

        //receive message
        receive();

        //Socket client over. close it.
        close();
    }

    void receive() {
        String result="";
        while (mReader != null) {
            try {
                result = mReader.readLine();
                Slog.i(TAG, "receive:" + result);
                if (result == null) {
                    //连接可能断开,重新连接
                    mHandle.sendMessageDelayed(mHandle.obtainMessage(MSG_RECONNECT_SOCKET), 1000);
                }

                //处理服务端发来的消息
                //processServerMessage
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //发送数据到server
    void send() {
        if (mWriter!=null) {
            String value = "Hello server!";
            mWriter.println(value);
            mWriter.flush();
        }
    }         
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值