问题描述
我正在处理一个项目,我需要使用 gomobile tool 创建一个 Android 应用程序。 我在 Go 中的示例代码如下
var broker = "127.0.0.1"
//var broker = "broker.mqttdashboard.com"
var port = 1883
opts := mqtt.NewClientOptions()
opts.Addbroker(fmt.Sprintf("tcp://%s:%d",broker,port))
opts.SetClientID("go_mqtt_client")
opts.SetConnectionLostHandler(connectLostHandler) // define what to do when connection is lost
client := mqtt.NewClient(opts)
tokenClient := client.Connect()
if tokenClient.Wait() && tokenClient.Error() != nil {
panic(tokenClient.Error())
}
...
当我使用 "gomobile bind" 绑定此代码时,生成 Golang 插件并在 android 项目中调用它们没有问题。 连接满意,我可以验证本地 mqtt 代理 (mosquitto) 和 mqtt 客户端应用程序也在通信。
但是当我使用 "gomobile build -target=android" 生成 APK 文件时,connect 函数会生成并出错。 为了能够测试日志,我使用了公共代理而不是本地 mqtt 代理。我替换了
var broker = "127.0.0.1"
通过 HiveMQ 公共代理地址(我已经验证了公共代理功能)
var broker = "broker.mqttdashboard.com"
从 mqtt 客户端应用程序连接到 mqtt 代理似乎存在问题。这是我在日志中发现的确切错误消息:
E/Go: panic: network Error: dial tcp: lookup broker.mqttdashboard.com:没有与主机名关联的地址 goroutine 11 [running]: E/Golog: panic: network Error: dial tcp: lookup broker.mqttdashboard.com: 没有与主机名关联的地址 E/Go: main.starting()
这是由我的代码中的 "panic(tokenClient.Error())" 部分生成的。
知道为什么使用“gomobile build”没有建立连接,而当我使用“gomobile bind”时它正在工作?
解决方法
这是我解决问题的方法。
-
我将 AndoridManifest.xml 文件添加到主 go 包所在的目录中。
-
在清单标签(
)之间添加了以下行