使用 Android Things 构建 RESTful API 接口是非常有用的,无论何时,我们都必须将 Android Things 连接到外部系统。本文将介绍如何使用 Android Things 构建 RESTful API 接口,以便其他应用程序或应用程序可以调用此 API。有几种情况,Android Things 必须与外部系统集成,并且需要有一个 RESTful 接口来调用它的服务。即使这个集成问题有不同的解决方案,在 Android Things 中实现一个 RESTful API 接口,也可以保证与使用不同技术实现的其他系统的兼容性。
我们之前已经讨论过,如何在 Android Things 和 Firebase 之间交换数据,以及如何将 Android Things 与云平台进行整合。本文涵盖了不同的集成方面。根据我们不得不面对的情况,我们可以选择正确的整合策略。我们需要记住,当我们不得不在不同系统之间交换数据时,最好的选择之一就是使用 MQTT 协议。
为了将我们的注意力集中在 Android Things 中构建 RESTful API 接口的过程中,我们将使用一个简单的读取温度,压力和湿度的传感器。这个传感器是 BMP280 - 一个 I2C 传感器。
本教程由两个不同的部分组成:
在这第一步中,我们介绍了如何将 BMP280 传感器连接到 Android Things。无论如何,这个话题在这个博客上已经有好几次了,但是为了更新你的记忆,BMP280 是一个 I2C 传感器,所以它使用四个引脚连接到 Android Things:
电路连接图如题图所示。
请参阅 Android Things Peripherals I/O 以了解此项目中使用的引脚。此项目使用树莓派,但您可以使用任何兼容 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 项目使用 Restlet 框架。这个框架提供了几个实现,其中一个是 Android。在 Android 中使用和简化构建 Restful API 接口的过程非常简单。
公开 RESTful API 接口的过程由三个步骤组成:
在深入实现细节之前,请将以下库添加到我们的 Android Things 项目中:
这些库是使用 Android Things 实现 RESTful API 接口所必需的。
让我们看看如何实施所有这些步骤。
我们应该实现两个 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,它处理到传感器的连接。
在这一步中,有必要实现一个 Android 服务来处理传入的请求。正如您可能已经知道的那样,我们必须使用 Android 服务,因为 Android 服务比 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
来获得当前的温度/press
以获取当前压力然后该类实现 onHandleIntent
来管理启动和停止服务器。
这是这个过程中的最后一步,并考虑构建 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)定义的意向服务。
就是这样,我们可以运行 Android Things 应用并对其进行测试。
在这一步中,我们可以测试应用程序并检查结果。
例如,要读取温度,让我们打开一个浏览器,并写下以下 URL 来获取温度:
http://<raspberry_ip>:port/sensor/temp
获取压力值:
http://<raspberry_ip>:port/sensor/temp
结果是保存有温度或压力的 JSON 数据。
在这篇文章的最后,希望您已经了解了如何使用 Android Things 实现一个 RESTful API 接口以及如何调用它。这是一个简单的项目,但它展示了我们如何使用 Restful API 接口将 Android Things 与外部系统集成。我们可以进一步扩展这个 Android Things 项目来实现其他的 API。例如,我们可以使用 POST 请求发送数据并控制远程外围设备,如电机或 LED。
英语原文链接:https://dzone.com/articles/restful-api-interface-using-android-things
观光\评论区