Android BitTube 学习

BitTube来龙去脉

SensorManager.cpp文件展开客户端从JNI获取SensorServer服务,创建SensorEventConnection,SensorEventQueue,并通过SensorEventQueue与SensorEventConnection加交互
从底层获取数据,android_hardware_SensorManager.cpp作为客户端JNI层获取Sensor信息的"集散中心"而SystemSensorManager作为应用层Sensor信息的处理中心


(一)客户端创建EventQueue

sp<SensorEventQueue> SensorManager::createEventQueue()
{
    sp<SensorEventQueue> queue;

    Mutex::Autolock _l(mLock);
    while (assertStateLocked() == NO_ERROR) {
        sp<ISensorEventConnection> connection =
                mSensorServer-> createSensorEventConnection();    // 二.  创建传感器事件connection
        if (connection == NULL) {
            // SensorService just died.
            ALOGE("createEventQueue: connection is NULL. SensorService died.");
            continue;
        }
        queue = new   SensorEventQueue(connection); //  三.  创建传感器事件
        break;
    }
    return queue;
}

(二)创建createSensorEventConnection

    BpSensorServer::createSensorEventConnection
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
        remote()->transact( CREATE_SENSOR_EVENT_CONNECTION, data, &reply); // 2.1 BnSensorServer::onTransact
        return interface_cast<ISensorEventConnection>(reply.readStrongBinder()); // 2.4 读取BnSensorServer端创建的BpBinder对象
    }


     2.1  BnSensorServer接受BpSensorServer请求创建EventConnection
     status_t BnSensorServer::onTransact(
              uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
     {
         switch(code) {
             case GET_SENSOR_LIST: {
            ......
             } break;
             case   CREATE_SENSOR_EVENT_CONNECTION: {
                 CHECK_INTERFACE(ISensorServer, data, reply);
                 sp<ISensorEventConnection> connection( createSensorEventConnection()); // 2.2调用SensorServer服务
                 reply->writeStrongBinder(connection->asBinder()); // 2.3 利用Parcel对象传递构建BpBinder代理对象
                 return NO_ERROR;
             } break;
         }
         return BBinder::onTransact(code, data, reply, flags);
     }

     2.2 调用SensorServer服务创建SensorEventConnection
     sp<ISensorEventConnection> SensorService::createSensorEventConnection()
     {
         uid_t uid = IPCThreadState::self()->getCallingUid();
         sp<SensorEventConnection> result(new SensorEventConnection(this, uid)); // 2.3调用子类创建
         return result;
     }

     也即
     SensorService::SensorEventConnection::SensorEventConnection(
        const sp<SensorService>& service, uid_t uid)
    :   mService(service),   mChannel(new BitTube()),  mUid(uid)
     {
     }
      mChannel 为服务端的BitTube,mService值为SenSorServer服务

     2.3 本地端(BnSensorServer)发送创建好的Binder对象,SensorEventConnection继承BnSensorEventConnection,
通过 asBinder()  转成BpSensorEventConnection对象

      reply->writeStrongBinder(connection->asBinder());

     2.4 代理端(BpSensorServer)获取SensorEventConnection的BpBinder代理对象

     interface_cast<ISensorEventConnection>(reply.readStrongBinder());

     
(三)创建SensorEventQueue

     SensorEventQueue::SensorEventQueue(const sp<ISensorEventConnection>& connection)
         : mSensorEventConnection(connection)  //  connection为 第二步中创建的BpSensorEventConnection
     {
     }

     3.1 获取传感器通道
     void SensorEventQueue::onFirstRef()
     {
         mSensorChannel = mSensorEventConnection->getSensorChannel(); // 3.2 BpSensorEventConnection::getSensorChannel()
     }

     3.2 BpSensorEventConnection获取SensorChannel
     virtual sp<BitTube> getSensorChannel() const
     {
        Parcel data, reply;
        data. writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor()); // writeInterfaceToken为Bp代理端向服务端发送数据时编写的RPC报头
        remote()->transact( GET_SENSOR_CHANNEL, data, &reply); // 3.3 BnSensorEventConnection 获取SensorChannel
        return new BitTube(reply); // 3.5 利用收到的mReceiveFd,创建客户端BitTube
     }

     status_t BnSensorEventConnection::onTransact(
         uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
     {
         switch(code) {
             case   GET_SENSOR_CHANNEL: {
                 CHECK_INTERFACE(ISensorEventConnection, data, reply);
                 sp<BitTube> channel( getSensorChannel()); // 3.4 SensorEventConnection::getSensorChannel获取SensorChannel
                 channel->writeToParcel(reply);
                 return NO_ERROR;
             } break;
             case ENABLE_DISABLE: {

                    ......

             } break;
             case SET_EVENT_RATE: {

                    ......

             } break;
         }
         return BBinder::onTransact(code, data, reply, flags);
     }

     3.4 调用SensorEventConnection::getSensorChannel()返回服务端创建的mChannel ( BitTube )
     sp<BitTube> SensorService::SensorEventConnection::getSensorChannel() const
     {
         return mChannel;
     }
     接着调用writeToParcel  传送传感器(状态接受描述符)mReceiveFd返回给BpSensorEventConnection创建客户端BitTube
     status_t BitTube::writeToParcel(Parcel* reply) const
     {
         if (mReceiveFd < 0)
             return -EINVAL;

         status_t result =   reply->writeDupFileDescriptor( mReceiveFd );
         close(mReceiveFd);
         mReceiveFd = -1;
         return result;
     }


     3.5 创建客户端BitTube

     BitTube::BitTube(const Parcel& data)
    : mSendFd(-1), mReceiveFd(-1)
     {
           mReceiveFd  =   dup( data.readFileDescriptor());
         if (mReceiveFd >= 0) {
             int size = SOCKET_BUFFER_SIZE;
             setsockopt( mReceiveFd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));
             setsockopt( mReceiveFd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));
             fcntl( mReceiveFd, F_SETFL, O_NONBLOCK);
         } else {
             mReceiveFd = -errno;
             ALOGE("BitTube(Parcel): can't dup filedescriptor (%s)",
                     strerror(-mReceiveFd));
         }
     }
     
   
 备注:注意mReceiveFd描述符的传输过程,writeDupFileDescriptor,dup(data.readFileDescriptor()) ,SensorEventQueue::waitForEvent
通过getFd()获取mReceiveFd,SensorEventQueue::getLooper()通过Looper::addFd(getFd(), getFd(), ALOOPER_EVENT_INPUT, NULL, NULL)
对mReceiveFd(读通道or管道)进行监听epoll_wait

相关链接:






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值