2017-05-05 21 views
2

我正在使用Swift gRPC库(它好奇地未在gRPC的网站上列出,但它有一个GitHub repo)构建了针对macOS的Google Assistant SDK的实现。我已经获得了我的OAuth2凭据和令牌,并且正在尝试发起初始请求以开始对话,但它未能这样做。如何验证Assistant SDK的gRPC调用?

我总是得到错误Google_Assistant_Embedded_V1Alpha1_EmbeddedAssistantClientError error 1.)gRPC.CallError error 1.

我跑Wireshark的尝试和调试的问题,我看到我的电脑尝试建立连接,但最终还是结束了中止连接。我认为这可能是由于TLS问题引起的,但我不确定实际情况是否如此,或者如何解决该问题。

我注意到,您可以指定证书的服务初始化函数具有过载,但我不知道要放什么东西在那里(或者,如果需要在所有使用该功能)

typealias AssistantService = Google_Assistant_Embedded_V1Alpha1_EmbeddedAssistantService 
typealias AssistantCall = Google_Assistant_Embedded_V1Alpha1_EmbeddedAssistantConverseCall 
typealias AudioInConfig = Google_Assistant_Embedded_V1alpha1_AudioInConfig 
typealias AudioOutConfig = Google_Assistant_Embedded_V1alpha1_AudioOutConfig 
typealias ConverseRequest = Google_Assistant_Embedded_V1alpha1_ConverseRequest 
typealias ConverseConfig = Google_Assistant_Embedded_V1alpha1_ConverseConfig  

var service: AssistantService? 
var currentCall: AssistantCall? 

public init() { 
    service = AssistantService(address: Constants.ASSISTANT_API_ENDPOINT) 
    let token = "Bearer \(UserDefaults.standard.string(forKey: Constants.AUTH_TOKEN_KEY)!)" 
    service?.metadata = Metadata(["authorization" : token]) 
} 

func initiateRequest() { 
    var request = ConverseRequest() 
    request.config = ConverseConfig() 

    var audioInConfig = AudioInConfig() 
    audioInConfig.sampleRateHertz = 16000 
    audioInConfig.encoding = .linear16 
    request.config.audioInConfig = audioInConfig 


    var audioOutConfig = AudioOutConfig() 
    audioOutConfig.sampleRateHertz = 16000 
    audioOutConfig.encoding = .linear16 
    audioOutConfig.volumePercentage = 50 
    request.config.audioOutConfig = audioOutConfig 

    do { 
     currentCall = try service?.converse(completion: { result in 
      print("Result code \(result.statusCode)") 
      print("Result description \(result.description)") 
      print("Metadata \(String(describing: result.initialMetadata))") 
      print("Status message \(result.statusMessage ?? "Error")") 
      print("Obj description \(String(describing: result))") 
      print("result \(result)") 
     }) 

     try currentCall?.send(request) { err in 
      print("Error in initial request: \(err)") 
     } 
    } catch { 
     print("Initial error \(error)") 
    } 
} 

这是什么Wireshark的它的样子,如果是任何帮助: enter image description here

回答

1

我不得不添加roots.pem文件中找到here到我的项目,按如下方式使用它:

let u = Bundle.main.url(forResource: "roots", withExtension: "pem")! 
let certificate = try! String(contentsOf: u) 
let token = "Bearer \(UserDefaults.standard.string(forKey: Constants.AUTH_TOKEN_KEY)!)" 
service = AssistantService(address: Constants.ASSISTANT_API_ENDPOINT, certificates: certificate, host: nil) 
service?.metadata = Metadata(["authorization" : token]) 
0

我不知道斯威夫特,你的Wireshark的屏幕截图可能掩盖重要的信息,但我相信一个或两个以下可能是问题:

  1. Constants.ASSISTANT_API_ENDPOINT需要设置为“embeddedassistant.googleapis.com”。 (目前尚不清楚,但我不认为Wireshark中显示的目的地址是API端点,它应该是)。

  2. Constants.AUTH_TOKEN_KEY应该是您已经获得的身份验证令牌OAuth2舞蹈。请记住它到期(通常在一个小时后),你需要得到一个新的。我不知道Swift的配置是如何工作的,但是在其他的你不需要指定auth信息的“Bearer”部分,因为你没有专门传递头文件。

+0

是的,我确实已将API端点设置为该URL。 (我隐藏了屏幕截图以隐藏我的IP)。对于验证令牌,我每次刷新它都会刷新它。此外,您认为auth信息的“基本”部分是什么? – vanshg

+0

哎呀。大脑 - 我的一部分。意思是“承载者”,这个问题已得到解决。 – Prisoner

+0

不幸的是,删除“承载者”似乎也不能解决问题 – vanshg

0

请看到一些new examples在调用谷歌云API的GRPC-迅速的项目。我简化了客户端的创建,默认使用TLS,并在库二进制文件中嵌入默认的roots.pem。您可以看到here以及支持Google Application Default Credentials的auth library的使用情况。