前言:
- 本篇默认你设备端已配置完成telemetry
- 设备正常推送数据
- 服务器正常接收数据
步骤:
1. 引入pom
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-starter</artifactId>
<version>2.7.0.RELEASE</version>
</dependency>
2. 新增.properties配置
# 50050是设备向你服务器推送数据的端口。根据实际情况填写
grpc.server.port=50050
3. 新增proto文件夹和java、resource平级目录
* 把设备厂家提供的.porto文件拖进去
4. pom.xml增加proto的plugin
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<pluginId>grpc-java</pluginId>
<protocArtifact>com.google.protobuf:protoc:3.0.2:exe:${os.detected.classifier}</protocArtifact>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.2.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
如遇${os.detected.classifier}无法解析等问题,可在maven的settings.xml中加入
<profiles>
<profile>
<id>os-properties</id>
<properties>
<!--Linux-->
<!--<os.detected.name>linux</os.detected.name>
<os.detected.arch>x86_64</os.detected.arch>
<os.detected.classifier>linux-x86_64</os.detected.classifier>
-->
<!--Windows-->
<os.detected.classifier>windows-x86_64</os.detected.classifier>
</properties>
</profile>
</profiles>
5. 根据porto文件自动生成Java代码
如下图所示,执行1、2步
顺利的话会在target下生产如下Java代码(.porto文件不同,生成的java代码会有差异)
6. 写service(根据你的.porto文件具体实现,基本都是继承 ***ImplBase方法)
package com.demo.telemetry.service;
import grpc_dialout.GRPCDialoutGrpc;
import grpc_dialout.GrpcDialout;
import io.grpc.stub.StreamObserver;
import lombok.extern.slf4j.Slf4j;
import net.devh.boot.grpc.server.service.GrpcService;
/**
*
* 根据你的.porto文件具体实现,基本都是继承 ***ImplBase方法
*/
@GrpcService
@Slf4j
public class DeviceGRPCService extends GRPCDialoutGrpc.GRPCDialoutImplBase {
/**
* @param responseObserver
* @return
*/
@Override
public StreamObserver<GrpcDialout.DialoutMsg> dialout(StreamObserver<GrpcDialout.DialoutResponse> responseObserver) {
return new StreamObserver<GrpcDialout.DialoutMsg>() {
@Override
public void onNext(GrpcDialout.DialoutMsg dialoutMsg) {
try {
// 这里会获取到设备推送的数据
log.info("====================>dialoutMsg:" + dialoutMsg);
} catch (Exception e) {
log.error("dataPublish onNext:" + e);
}
}
@Override
public void onError(Throwable throwable) {
System.out.println("saveUsers error " + throwable.getMessage());
log.info("saveUsers error " + throwable.getMessage());
}
@Override
public void onCompleted() {
responseObserver.onCompleted();
}
};
}
}
7. end
请将此项目打包发布到设备推送到的那台服务器上 看log是否接收到数据
如果未接收到数据,请在服务器上执行 tcpdump -i ens192 port 50050 进行确认
- ens192 是你的网卡 (修改成自己的)
- 50050 是telemetry那台设备推送到你服务器的端口(修改成自己的)
友情提示:服务器防火墙记得打开
--------------------------------------------------------------------------
* 如果需要源码,可以私我~如接入遇到问题,一起沟通探讨~