Google cloud platform 如何在发布/订阅主题上使用物联网遥测事件?

Google cloud platform 如何在发布/订阅主题上使用物联网遥测事件?,google-cloud-platform,iot,google-cloud-pubsub,android-things,telemetry,Google Cloud Platform,Iot,Google Cloud Pubsub,Android Things,Telemetry,我读过谷歌云物联网API。我为Android编写了一个简单的应用程序。基于此,谷歌的。我的应用程序已成功连接到IoT平台,并已发送测试数据 我的申请代码 ConnectionParams connectionParams = new ConnectionParams.Builder() .setProjectId("my_pid") .setRegistry("my_reg", "my_server") .setDevice

我读过谷歌云物联网API。我为Android编写了一个简单的应用程序。基于此,谷歌的。我的应用程序已成功连接到IoT平台,并已发送测试数据

我的申请代码

ConnectionParams connectionParams = new ConnectionParams.Builder()
            .setProjectId("my_pid")
            .setRegistry("my_reg", "my_server")
            .setDeviceId("my_device_name")
            .build();
IotCoreClient client = new IotCoreClient.Builder()
            .setConnectionParams(connectionParams)
            .setKeyPair(keys)
            .setTelemetryQueue(new LinkedTransferQueue<TelemetryEvent>())
            .build();

client.connect();

client.publishDeviceState("Test data\n".getBytes());

client.publishTelemetry(new TelemetryEvent("Sonata".getBytes(), null,TelemetryEvent.QOS_AT_LEAST_ONCE));
这段代码是可行的,但我在谷歌云平台上找不到“Sonata”数据,我不明白如何在发布/订阅主题上使用遥测事件

已更新

我找到了解决方案。第一步,我在主题中添加了订户。例子。Topic
projects/my project id/topics/firstTop
订户示例(fsub是订户名称)
projects/my project id/subscriptions/fsub
,我用java编写了简单的订户代码,并从Android的things设备发送了消息。我得到了遥测数据

这是java中的订户代码

import com.google.api.gax.core.CredentialsProvider;
import com.google.auth.Credentials;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.common.collect.Lists;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

public class SubscriberExample {
    private static final String PROJECT_ID = "my-project-id";
    private static final BlockingQueue<PubsubMessage> messages = new LinkedBlockingDeque<>();

    static class MessageReceiverExample implements MessageReceiver {
        @Override
        public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
            messages.offer(message);
            consumer.ack();
        }
    }

    public static void main(String... args) throws Exception {
        String subscriptionId = "YOUR_SUBSCRIBER_ID";
        ProjectSubscriptionName subscriptionName = ProjectSubscriptionName.of(PROJECT_ID, subscriptionId);
        Subscriber subscriber = null;
        try {
            GoogleCredentials credentials = GoogleCredentials
                    .fromStream(new FileInputStream("~/google_cloud_pubsub-Project-0b66ab8c5060.json")) // you can get here https://cloud.google.com/docs/authentication/getting-started
                    .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
            subscriber = Subscriber.newBuilder(subscriptionName, new MessageReceiverExample())
                    .setCredentialsProvider(new CredentialsProvider() {
                        @Override
                        public Credentials getCredentials() throws IOException {
                            return credentials;
                        }
                    }).build();
            subscriber.startAsync().awaitRunning();
            while (true) {
                PubsubMessage message = messages.take();
                System.out.println("Message Id: " + message.getMessageId());
                System.out.println("Data: " + message.getData().toStringUtf8());
            }
        } finally {
            if (subscriber != null) {
                subscriber.stopAsync();
            }
        }
    }
}
import com.google.api.gax.core.CredentialsProvider;
导入com.google.auth.Credentials;
导入com.google.auth.oauth2.GoogleCredentials;
导入com.google.cloud.pubsub.v1.AckReplyConsumer;
导入com.google.cloud.pubsub.v1.MessageReceiver;
导入com.google.cloud.pubsub.v1.Subscriber;
导入com.google.common.collect.list;
导入com.google.pubsub.v1.ProjectSubscriptionName;
导入com.google.pubsub.v1.PubsubMessage;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.util.concurrent.BlockingQueue;
导入java.util.concurrent.LinkedBlockingDeque;
公共类订阅示例{
私有静态最终字符串项目\u ID=“我的项目ID”;
private static final BlockingQueue messages=new LinkedBlockingDeque();
静态类MessageReceiver示例实现MessageReceiver{
@凌驾
public void receiveMessage(PubsubMessage消息,AckReplyConsumer消费者){
消息。提供(消息);
consumer.ack();
}
}
公共静态void main(字符串…参数)引发异常{
String subscriptionId=“您的订户ID”;
ProjectSubscriptionName subscriptionName=ProjectSubscriptionName.of(项目ID,subscriptionId);
订户=null;
试一试{
GoogleCredentials=GoogleCredentials
.fromStream(新文件输入流(“~/google\u cloud\u pubsub-Project-0b66ab8c5060.json”)//您可以在这里获得https://cloud.google.com/docs/authentication/getting-started
.createScope(列表.newArrayList(“https://www.googleapis.com/auth/cloud-platform"));
subscriber=subscriber.newBuilder(subscriptionName,newmessagereceiverexample())
.setCredentialsProvider(新的CredentialsProvider(){
@凌驾
公共凭据getCredentials()引发IOException{
返回凭证;
}
}).build();
subscriber.startAsync().awaitRunning();
while(true){
PubsubMessage=messages.take();
System.out.println(“消息Id:+Message.getMessageId());
System.out.println(“数据:”+message.getData().toStringUtf8());
}
}最后{
if(订户!=null){
subscriber.stopAsync();
}
}
}
}

首先要检查它是否正常工作,并且连接是否真的要连接到您的项目,最简单的方法是查看项目的Google云平台控制台,在IoT核心部分(IoT核心->注册表->设备)的设备页面上,有一个“配置和状态历史记录”选项卡,您应该在那里看到“测试数据”(如publishDeviceState调用所设置的)。这应该可以确认至少其他一切都按照预期工作

假设是这样的话,现在您需要查看发布/订阅文档,开始了解如何使用发布/订阅。这是主要的文档页面。我的建议是查看作为快速启动和运行的地方。根据您想要做的,这可能也是一个很好的选择

这些产品中的每一个都会根据发布到云发布/订阅中的消息触发。因此,只要您调用“publishTelemetry”,它就会将遥测发送到IoT Core,IoT Core会在您创建消息时将消息发布到IoT Core注册表中指定的发布/订阅主题中。然后触发的产品(GCF和数据流)接收可从中获取遥测数据的发布/订阅对象。文档中有关于如何执行此操作的示例

import com.google.api.gax.core.CredentialsProvider;
import com.google.auth.Credentials;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.common.collect.Lists;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

public class SubscriberExample {
    private static final String PROJECT_ID = "my-project-id";
    private static final BlockingQueue<PubsubMessage> messages = new LinkedBlockingDeque<>();

    static class MessageReceiverExample implements MessageReceiver {
        @Override
        public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
            messages.offer(message);
            consumer.ack();
        }
    }

    public static void main(String... args) throws Exception {
        String subscriptionId = "YOUR_SUBSCRIBER_ID";
        ProjectSubscriptionName subscriptionName = ProjectSubscriptionName.of(PROJECT_ID, subscriptionId);
        Subscriber subscriber = null;
        try {
            GoogleCredentials credentials = GoogleCredentials
                    .fromStream(new FileInputStream("~/google_cloud_pubsub-Project-0b66ab8c5060.json")) // you can get here https://cloud.google.com/docs/authentication/getting-started
                    .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
            subscriber = Subscriber.newBuilder(subscriptionName, new MessageReceiverExample())
                    .setCredentialsProvider(new CredentialsProvider() {
                        @Override
                        public Credentials getCredentials() throws IOException {
                            return credentials;
                        }
                    }).build();
            subscriber.startAsync().awaitRunning();
            while (true) {
                PubsubMessage message = messages.take();
                System.out.println("Message Id: " + message.getMessageId());
                System.out.println("Data: " + message.getData().toStringUtf8());
            }
        } finally {
            if (subscriber != null) {
                subscriber.stopAsync();
            }
        }
    }
}