在本教程中,我们将介绍如何使用Android Things和Twilio构建SMS通知系统。 本教程的主要目标是逐步描述如何实现基于Android Things的IoT系统,该系统通过Twilio发送SMS通知。
我们都知道物联网作为颠覆性技术的重要性,正在颠覆几个经济领域。 我们无需描述什么是物联网以及如何使用它 。 此外,由Google生产的新型物联网操作系统Android Things已达到在生产环境中使用所必需的成熟度。 最新的Android Things版本1.0是第一个稳定的版本,有望在开发基于Android的IoT应用程序时引入新的范例。 我们在之前的文章中介绍了Android Things的多个方面,因此没有必要再强调一下Android Things在物联网生态系统中扮演的重要角色。
关于物联网,一个重要方面是当特定事件发生时如何向用户发送通知。 通知事件可以是警报,信息消息,警告消息等。 我们可以通过多种方式来提醒用户有关特定事件的信息,例如:
发送推送通知
发送电子邮件警报
发送短信通知
在之前的文章中,我们已经介绍了其中一些方法。 在本教程中,本教程将介绍如何实现SMS通知系统。 毕竟,SMS是在多个比赛中广泛使用的第一种也是最早的通知方法。
目录
1.短信通知系统项目概述
2.使用Android Things读取BMP280 / BME280数据传感器
3.配置Twilio接受来自Android Things的连接
4.在Android Things中实现Twilio客户端以发送SMS通知
5.总结
1.短信通知系统项目概述
在深入研究项目详细信息之前,对我们将要实现的内容以及该项目基础上的总体体系结构进行概述很有用。
为了将注意力集中在主要项目主题上,或者使用Android Things构建一个SMS通知系统,我们可以假设我们将通知的事件是由使用简单温度传感器读取的值触发的。
即使这可能是一种简单的方法,也可以对其进行进一步扩展。 首先,我们可以假设还有其他类型的传感器可以触发SMS通知。 此外,我们可以假设Android Things设备是多个MCU的收集器,这些MCU管理多个传感器并使用MQTT或其他协议与Android Things交换数据。 这样,可以集中SMS通知系统,并且几个MCU可以利用该系统。
也就是说,下图描述了我们将在此IoT项目中实现的Android Things项目架构。
本教程中使用的传感器是BMP280或BME280,但是可以使用其他种类的传感器,只要它们与Android Things平台兼容即可。
为了使事情变得简单,这个Android Things IoT项目可以分为以下几个部分:
- 使用Android Things读取BMP280 / BME280数据传感器
- 配置Twilio接受来自Android Things的连接
- 在Android Things中实现Twilio客户端以发送短信通知
让我们从第一步开始。
2.使用Android Things读取BMP280 / BME280数据传感器
该项目的第一部分使用Android Things API读取传感器数据。 您可能已经知道,Android Things中有几种策略可用于从传感器读取数据:
- 一次性读取传感器数据
- 连续读取传感器数据
在第一种策略中,Android Things应用仅读取一次传感器数据,并且要获得多个数据样本,我们必须在特定的时间间隔内读取数据。 另一方面,Android Things可以连续从传感器读取数据。 当需要连续监控物理量(例如温度,压力等)时,第二种方法很有用。 该物联网项目使用了第二种方法。
现在是时候使用Android Studio创建一个Android Things项目,让我们修改build.gradle并添加以下内容:
dependencies {
....
implementation 'com.google.android.things.contrib:driver-bmx280:1.0'
}
这将添加必要的类,以使Android Things与BMP280 / BME280交换数据。
现在,在MainActivity中,我们必须添加以下行:
private Bmx280SensorDriver driver;
private SensorManager sensorManager;
其中SensorManager是管理Android Things中的传感器的Android Things API类。
下一步是初始化传感器并注册侦听器:
private void initSensor() {
try {
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensorManager.registerDynamicSensorCallback(sensorCallback);
driver = new Bmx280SensorDriver("I2C1") ;
driver.registerTemperatureSensor();
}
catch(IOException ioe) {
Log.e(TAG, "Error initializing the driver", ioe);
}
}
sensorCallback是我们必须实现的列表器,以便知道何时连接传感器:
private SensorManager.DynamicSensorCallback sensorCallback = new
SensorManager.DynamicSensorCallback() {
@Override
public void onDynamicSensorConnected(Sensor sensor) {
if (sensor.getType() == Sensor.TYPE_AMBIENT_TEMPERATURE)
sensorManager.registerListener(sensorListener, sensor,
SensorManager.SENSOR_DELAY_NORMAL);
else if (sensor.getType() == Sensor.TYPE_PRESSURE)
sensorManager.registerListener(pressSensorListener, sensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onDynamicSensorDisconnected(Sensor sensor) {
super.onDynamicSensorDisconnected(sensor);
}
};
BMP280或BME280是一个读取温度和压力的传感器,因此我们注册了两个侦听器。 此外,该应用程序使用SENSOR_DELAY_NORMAL定义必须多久获取一次传感器数据。 最后,该应用注册了传感器侦听器,以了解传感器何时读取新值:
private SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float temp = event.values[0];
// Here we will implement the logic to send the message
}
}
}
现在我们准备配置Twilio。
3.配置Twilio接受来自Android Things的连接
在本节中,我们将介绍如何配置Twilio以从Android Things设备发送SMS通知。 如果您在Twilio上没有帐户,则可以使用此链接进行注册。 拥有帐户后,您可以创建一个新项目,我们将使用该项目向我们的智能手机发送短信通知:
现在,您必须创建一个自定义手机号码才能发送您的SMS。 使用Twilio控制台,您可以轻松创建。 发送者编号准备好后,在Twilio仪表板中,您需要为Android Things客户端提供客户端发送SMS通知所需的所有信息:
在完成Twilio配置之前,您可以在(菜单->运行时-> API资源管理器)中尝试Twilio API调试器。 现在,您必须选择可编程SMS并获取控制台以发送通知消息:
单击“发出请求”,您应该在智能手机上收到短信。
4.在Android Things中实现Twilio客户端以发送SMS通知
这是该项目的最后一步,我们将在Android Things中实现Twilio客户端,当发生特定事件时,该客户端将向我们的智能手机发送短信通知。 在此示例中,我们可以假设监视温度并在超过阈值时发送SMS。
让我们创建一个名为TwilioCient.java的新类。 此类将管理所有通信详细信息。 为此,我们将使用OkHTTP。
让我们在此类内创建一个静态方法,如下所示:
public static void sendSMS(String body) {
client = new OkHttpClient.Builder()
.authenticator(new Authenticator() {
@Override
public Request authenticate(Route route, Response response) throws IOException {
String credential =
Credentials.basic(TWILIO_ACCOUNT_SID,
TWILIO_AUTH_TOKEN);
return response.request()
.newBuilder()
.header("Authorization", credential)
.build();
}
}).build();
RequestBody reqBody = new FormBody.Builder()
.add("To", DEST_PHONE_NUMBER)
.add("From", ORIGIN_PHONE_NUMBER)
.add("Body", body)
.build();
Request req = new Request.Builder()
.url(TWILIO_BASE_URL)
.post(reqBody)
.build();
client.newCall(req).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "Error", e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i(TAG, "Ok message sent");
Log.d(TAG, "Response ["+
response.body().string()
+"]");
}
});
}
此方法需要注意一些重要方面:
- 我们使用自定义身份验证器通过TWILIO_ACCOUNT_SID和TWILIO_AUTH_TOKEN访问API,如仪表板所示
- 将URL(TWILIO_BASE_URL)附加到Twilio API URL上并添加帐户ID
就这样。 最后,我们可以通过以下方式修改MainActivity类:
...
public void onSensorChanged(SensorEvent event) {
float temp = event.values[0];
if (temp > 30) {
if ( lastTime == 0 || (System.currentTimeMillis() - lastTime) > 60000) {
Log.d(TAG, "Sending message...");
TwillioClient.sendSMS("Alert! the temperatus is over 30°C");
lastTime = System.currentTimeMillis();
}
else {
// Log.d(TAG, "Message Already sent...waiting");
}
}
}
在这种方法中,我们不仅发送SMS通知,还检查我们是否尚未发送消息。
5.总结
在本文的结尾,您学习了如何使用Android Things实现SMS通知系统,以及如何将Twilio与Android Things集成。 如前所述,这个简单的教程可以进一步扩展以涵盖几种需要通过SMS通知使用事件的用例。
翻译自: https://www.javacodegeeks.com/2018/07/build-sms-notification-system.html