每当我们必须将Android Things连接到外部系统时, 使用Android Things构建Restful API接口都是很有用的。 本文介绍了如何使用Android Things构建Restful API接口,以便其他应用程序可以调用此API。 在多种情况下,Android Things必须与外部系统集成,并且必须有一个Restful接口来调用其服务。 即使对此集成问题有不同的解决方案,在Android Things中实现Restful API接口也可以保证与使用不同技术实现的其他系统具有较大的兼容性。
我们已经讨论了如何在Android Things和Firebase之间交换数据,或者如何将Android Things与云平台集成,本文涵盖了另一个集成方面。 根据我们必须面对的场景,我们可以选择正确的集成策略。 我们不必忘记,必须在不同系统之间交换数据时的最佳选择之一是使用MQTT协议。
为了使我们专注于在Android Things中构建Restful API接口的过程,我们将使用一个简单的传感器来读取温度,压力和湿度。 该传感器是BMP280,它是一个I2C传感器。
本教程有两个不同的部分:
- 原理图:如何将传感器连接到Android Things
- 如何建立一个Restful API接口以读取传感器数据
如何将BMP280连接到Android Things
在第一步中,我们介绍了如何将BMP280传感器连接到Android Things。 无论如何,为了刷新您的记忆,这个博客上已经多次涉及该主题,BMP280是I2C传感器,因此它使用4个引脚连接到Android Things:
- Vcc
- 地面
- 时钟(CLK)
- 数据(SDA)
显示连接的示意图是:
请参阅Android Things Peripherals I / O,以了解此项目中使用的引脚。 无论如何,该项目使用Raspberry Pi,您可以使用任何与Android Things兼容的平台。
使用Android Things Studio创建一个新项目,并将以下依赖项添加到gradle文件中:
dependencies {
...
compile 'com.google.android.things.contrib:driver-bmx280:0.4'
}
让我们创建一个新类来管理与传感器的连接并读取温度和压力:
package com.survivingwithandroid.androidthings.api;
import com.google.android.things.contrib.driver.bmx280.Bmx280;
import com.google.android.things.pio.PeripheralManagerService;
import java.io.IOException;
public class DeviceManager {
private static DeviceManager me;
private static final String I2C_BUS = "I2C1";
private Bmx280 sensor;
private DeviceManager() {
init();
}
public static final DeviceManager getInstance() {
if (me == null)
me = new DeviceManager();
return me;
}
private void init() {
try {
sensor = new Bmx280(I2C_BUS);
sensor.setTemperatureOversampling(Bmx280.OVERSAMPLING_1X);
sensor.setPressureOversampling(Bmx280.OVERSAMPLING_1X);
}
catch(IOException ioe) {
ioe.printStackTrace();
}
}
public float readTemp() {
if (sensor != null)
try {
return sensor.readTemperature();
} catch (IOException e) {
e.printStackTrace();
}
return 0;
}
public float readPress() {
if (sensor != null)
try {
return sensor.readPressure();
} catch (IOException e) {
e.printStackTrace();
}
return 0;
}
}
就是这样,现在Android Things已连接到传感器,并且Android Things应用可以读取其值。
使用Android Things构建Restful API接口
这是本文中最有趣的部分。 本段的目标是使用Android Things构建一个Restful API接口,以便我们可以公开一组服务来读取传感器的温度和压力。 换句话说,我们可以想象我们有一个外部应用程序或一个应用程序想要远程读取传感器的温度和压力。
为此,该Android Things项目使用Restlet框架 。 该框架提供了几种实现,其中一种是针对Android OS的。 它非常易于使用,并简化了在Android中构建Restful API接口的过程。
公开Restful API接口的过程分为三个步骤:
- 定义作为服务公开的资源
- 构建一个Android服务来处理传入的请求
- 定义一个简单的Android活动以启动和停止服务
在深入研究实现细节之前,有必要将以下库添加到我们的Android Things项目中:
- org.restlet.jar
- org.restlet.ext.nio.jar
- org.restlet.ext.json.jar
这些库对于使用Android Things实现Restful API接口是必需的。
让我们看看如何实现所有这些步骤。
步骤1:定义资源以公开为服务
以前,我们应该实现两个Restful API:一个读取温度,另一个读取压力。 为此,有必要实现两个不同的类:
public class SensorTempResource extends ServerResource {
@Get("json")
public Representation getTemperature() {
JSONObject result = new JSONObject();
float temp = DeviceManager.getInstance().readTemp();
try {
result.put("temp", temp);
}
catch(JSONException jsoe) {
}
return new StringRepresentation(result.toString(), MediaType.APPLICATION_ALL_JSON);
}
}
另一个是压力:
public class SensorPressResource extends ServerResource {
@Get("json")
public Representation getPressure() {
JSONObject result = new JSONObject();
float press = DeviceManager.getInstance().readPress();
try {
result.put("press", press);
}
catch(JSONException jsoe) {
}
return new StringRepresentation(result.toString(), MediaType.APPLICATION_ALL_JSON);
}
}
这两个类都扩展了ServerResource
,并且外部应用程序可以使用HTTP GET请求来调用它们,因为我们希望从传感器读取信息。
此外,此API返回JSON数据结构。 您可以注意到,在先前的类中,它们调用了DeviceManager
,它在前面的步骤中实现,用于处理与传感器的连接。
第2步:构建Android服务以处理传入的请求
在此步骤中,有必要实现一个Android服务来处理传入的请求。 您可能已经知道,我们必须使用Android Service,因为Android Service的寿命比Android Activity更长,并且即使应用UI不再可用,我们是否也希望完成任务。
这个Android Things项目使用IntentService,该类为:
public class APIServerService extends IntentService {
private String LOG_NAME = getClass().getName();
private Component restComponent;
private static final int PORT = 8090;
public static final String START_API_SERVER = "com.survivingwithandroid.api.start";
public static final String STOP_API_SERVER = "com.survivingwithandroid.api.stop";
public APIServerService() {
super("APiServerService");
// start the Rest server
restComponent = new Component();
restComponent.getServers().add(Protocol.HTTP, PORT); // listen on 8090
// Router to dispatch Request
Router router = new Router();
router.attach("/temp", SensorTempResource.class);
router.attach("/press", SensorPressResource.class);
restComponent.getDefaultHost().attach("/sensor", router);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
if (intent != null) {
String action = intent.getAction();
try {
if (action.equals(START_API_SERVER)) {
Log.d(LOG_NAME, "Starting API Server");
restComponent.start();
}
else if (action.equals(STOP_API_SERVER)) {
Log.d(LOG_NAME, "Stopping API Server");
restComponent.stop();
}
}
catch(Exception ex) {
ex.printStackTrace();
}
}
}
}
此类非常简单:一开始,它定义服务器侦听的端口,然后定义路由器。 在这种情况下,路由器必须将请求分派到不同的资源。 我们可以假设附加以下URI:
- / temp获取当前温度
- /按以获得当前压力
然后,该类实现onHandleIntent来管理服务器的启动和停止。
步骤3:定义活动
这是此过程的最后一步,并计划构建Android Things Activity:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent i = new Intent(this, APIServerService.class);
i.setAction(APIServerService.START_API_SERVER);
startService(i);
}
@Override
protected void onDestroy() {
super.onDestroy();
Intent i = new Intent(this, APIServerService.class);
i.setAction(APIServerService.STOP_API_SERVER);
startService(i);
}
}
在此类中,简单地,Android Things应用程序使用两种类型的Intent调用先前定义的Intent Service。
就是这样,我们可以运行Android Things应用并对其进行测试。
使用Android Things测试Restful API接口
在此步骤中,我们可以测试应用程序并检查结果。
例如,要读取温度,让我们打开浏览器并输入以下URL:
http://:port/sensor/temp
在获得压力的同时:
http://:port/sensor/temp
结果是保存温度或压力的JSON数据。
摘要
希望在本文的结尾,您获得了如何使用Android Things实现Restful API接口以及如何调用它的知识。 这是一个简单的项目,但它演示了如何使用Restful API接口将Android Things与外部系统集成。 我们可以进一步扩展实现其他API的Android Things项目。 例如,我们可以使用POST请求发送数据并控制远程外围设备,例如电动机或LED。
翻译自: https://www.javacodegeeks.com/2017/11/building-restful-api-interface-using-android-things.html