Android Things 教程:通过 MQTT 控制 LED

MQTT,即消息队列遥测传输,是一种类似于 HTTP 超文本传输协议的流行协议,用于客户端和服务器之间的通信。由于 MQTT 的头部占用空间小,可靠性高,MQTT 更受物联网应用青睐。MQTT 使用非常小的字节数据来描述正在传输的信息的内容。 将其集成到不同的项目中也很容易,并且有许多库可用于开发客户端和代理(简单形式的 MQTT 服务器)代码。

在这个演示中,我将使用 Eclipse 的一个开源库 PAHO。由于 Android Things 使用其他 API 扩展了核心 Android 框架,因此我们可以使用 PAHO 中的相同 Java 库,在运行 Android Things 的设备上构建 MQTT 客户端,在我们的例子中是 Raspberry Pi 3。

一旦你设置了你的 RPi 与 Android Things,并设置你的 Android Studio,我们可以开始编码演示。

安装 MQTT 代理:Mosquitto

首先,我们把我们的经纪人放在一台机器上。 我正在使用 Mosquitto for Macbook 来设置 Broker。使用 Brew 来安装,在终端上键入以下命令以安装 Mosquitto:

brew install mosquitto

脚本完成后,通过提供的指令来启动:

ln -sfv /usr/local/opt/mosquitto/*.plist ~/Library/LaunchAgents

launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mosquitto.plist

就这么简单。现在,可以通过在两个不同的选项卡或终端窗口上,运行以下命令来测试您的安装:

mosquitto_sub -t topic/state
mosquitto_pub -t topic/state -m “Hello World”

集成 MQTT 到 Android Things

接着,我们将把 PAHO Java 库整合到 Android Things 应用程序中。在 Android Studio 项目中,我们将 PAHO 库添加到我们的项目中。

1.将以下的源(repositories)添加到项目的 build.gradle

repositories {
    jcenter()
    maven {
        url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
    }
}

2.将 PAHO 依赖添加到应用程序的 build.gradle

dependencies {
    provided 'com.google.android.things:androidthings:0.1-devpreview'
    compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.2'
}

3.使你的 activity 实现 MqttCallback,并在 Activity 类的 onCreate() 方法中添加以下代码:

try {
    MqttClient client = new MqttClient("tcp://192.168.1.7:1883", "AndroidThingSub", new MemoryPersistence());
    client.setCallback(this);
    client.connect();

    String topic = "topic/led";
    client.subscribe(topic);

} catch (MqttException e) {
    e.printStackTrace();
}

这里的 192.168.1.7 是作为 MQTT 代理的、我的 Macbook 的本地 IP 地址。1883 是代理监听的端口。客户已经订阅了名为 topic/ led 的主题。

4.声明成员变量

public static final String LED_PIN = "BCM22"; //physical pin #15
private Gpio ledPin;

onCreate() 方法中添加以下代码,以初始化您的 GPIO 引脚,并将其配置为输出引脚:

PeripheralManagerService service = new PeripheralManagerService();
try {
    // Create GPIO connection for LED.
    ledPin = service.openGpio(LED_PIN);
    // Configure as an output.
    ledPin.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
} catch (IOException e) {
    Log.e(TAG, "Error on PeripheralIO API", e);
}

5.MqttCallback 类会要求你实现三种方法。将下面的代码添加到这些方法来接收输入消息,并根据收到的数据更改 GPIO 引脚的状态。

@Override
public void connectionLost(Throwable cause) {
    Log.d(TAG, "connectionLost....");
}

@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
    String payload = new String(message.getPayload());
    Log.d(TAG, payload);
    switch (payload) {
        case "ON":
            Log.d(TAG, "LED ON");
            ledPin.setValue(true);
            break;
        case "OFF":
            Log.d(TAG, "LED OFF");
            ledPin.setValue(false);
            break;
        default:
            Log.d(TAG, "Message not supported!");
            break;
    }
}

@Override
public void deliveryComplete(IMqttDeliveryToken token) {
    Log.d(TAG, "deliveryComplete....");
}

6.现在,按照以下原理图设置带有 LED 的面包板和 Raspberry Pi 3:

Android Things 电路图

7.通过在终端上运行 ADB 命令,将 Raspberry Pi 3 与 Android Studio 连接起来:

adb connect Android.local

然后点击运行(Run)。

8.现在,在您的终端上,键入以下命令来控制 LED 的状态:

mosquitto_pub -h 127.0.0.1 -t topic/led -m "ON"
mosquitto_pub -h 127.0.0.1 -t topic/led -m "OFF"

如命令所示,ON 将打开 LEDOFF 将关闭。IP 地址 127.0.0.1 适用于 Macbook 上运行的 MQTT 代理。

完整的项目可以在我的 GitHub 源码库上找到:MQTT_LED

原文链接:https://medium.com/@abhi007tyagi/android-things-led-control-via-mqtt-b7509576c135

1 人评价

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.