您的位置:首页 > 移动开发 > Android开发

基于DHT11温湿度传感器的Android硬件访问服务的简单实现(二)

2017-04-21 08:34 429 查看
这一部分的内容主要实现硬件访问服务的实现,即Service Layer层的实现。

一、编写aidl文件

aidl文件的全称是 Android Interface Description Language,即Android接口描述语言。只需要编写这个文件把它放到Android系统当中进行编译,就会生成同名的java文件,这个生产的java文件当中已经包含基本的服务框架,包括服务的实现类以及服务的代理类。

编写的aidl文件如下所示:

package android.os;

/** {@hide} */
interface IDht11Service
{
byte[] dht11GetDatas();
} 这个aidl文件当中只定义了一个抽象方法,这个抽象方法的功能使用来读取温湿度传感器的数据,它的具体实现后面会有讲解。
把这个文件放入Android系统的这个目录: frameworks/base/core/java/android/os,修改frameworks/base/Android.mk文件,添加这样一句话:

LOCAL_SRC_FILES += \
core/java/android/os/IDht11Service.aidl \ 执行 mmm frameworks/base命令,在out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os这个目录下生产了ILedService.java,它的内容如下:
/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: frameworks/base/core/java/android/os/IDht11Service.aidl
*/
package android.os;
/** {@hide} */
public interface IDht11Service extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements android.os.IDht11Service
{
private static final java.lang.String DESCRIPTOR = "android.os.IDht11Service";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an android.os.IDht11Service interface,
* generating a proxy if needed.
*/
public static android.os.IDht11Service asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof android.os.IDht11Service))) {
return ((android.os.IDht11Service)iin);
}
return new android.os.IDht11Service.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_dht11GetDatas:
{
data.enforceInterface(DESCRIPTOR);
byte[] _result = this.dht11GetDatas();
reply.writeNoException();
reply.writeByteArray(_result);
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements android.os.IDht11Service
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
@Override public byte[] dht11GetDatas() throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
byte[] _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
mRemote.transact(Stub.TRANSACTION_dht11GetDatas, _data, _reply, 0);
_reply.readException();
_result = _reply.createByteArray();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
static final int TRANSACTION_dht11GetDatas = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
}
public byte[] dht11GetDatas() throws android.os.RemoteException;
这个文件实现了基本的硬件访问服务的框架,它里面包含了一个子类Stub类,在Stub类中包含了一个子类Proxy类,还有一个在aidl中实现的抽象方法。Stub类是服务的实现类,而Proxy是服务的代理类。

二、编写服务访问类

在上面的服务Stub类当中调用了抽象方法dht11GetDatas(),现在需要编写一个服务一个服务访问类Dht11Service.java来实现这个抽象方法。

package com.android.server;

import android.os.IDht11Service;

public class Dht11Service extends IDht11Service.Stub{
private static final String TAG = "Dht11Service";

/* constructor method */
public Dht11Service(){
native_dht11Open();
}

/* get datas form DHT11 */
public byte[] dht11GetDatas() throws android.os.RemoteException
{
return native_dht11GetDatas();
}

/* implement native methods */
public native static byte[] native_dht11GetDatas(); // get datas
public native static int native_dht11Open(); // open dht11 device
public native static void native_dht11Close(); // close dht11 device

}

在这个类中定义了三个本地化方法:

/* implement native methods */
public native static byte[] native_dht11GetDatas(); // get datas
public native static int native_dht11Open(); // open dht11 device
public native static void native_dht11Close(); // close dht11 device
通过这三个方法来实现具体的硬件的访问,这三个方法的具体实现放在了JNI层当中,具体内容请参考后续博文(注意:在构造函数中已经打开了设备)。

三、添加服务访问类到Android系统当中

修改frameworks/base/services/java/com/android/server/SystemServer.java这个文件,在startOtherServices()这个方法中添加如下代码,把DHT11的访问服务添加进去,如下所示:

Slog.i(TAG, "Dht11 Service");
ServiceManager.addService("dht11", new Dht11Service()); 把Dht11Service.java这个文件放入frameworks/base/services/core/java/com/android/server这个目录当中,不需要修改frameworks/base/services/core/Android.mk这个文件,也可以包含新添加的文件,因为在这个文件当中有相应的编译选项在编译的时候回自动去扫描新添加的文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐