如何使用golang对象在Android中实现客户端侦听器?

问题描述

问题描述:

我正在做一个小项目,我需要将现有的 mqtt 客户端库从 Golang 移植到 Android。 我发现使用 gomobile repository 作为一种选择,可以防止在不同的编程语言(GO 和 Java)中复制相同的功能

要使用这个库,我们有两种不同的选择:

  1. 完全使用 Go 设计 Android 应用,并使用“gomobile -build”生成 APK 文件。然后可以使用 adb 工具将 APK 文件加载到 Android 设备或模拟器。
  2. 实现一些功能,然后使用“gomobile -bind”将它们绑定到现有的 Android 项目中。使用此选项,有一些 restriction 用于转换和构建 Golang 对象。

就我而言,我打算选择第二个选项。还尝试将以下小示例 GO 实现转换为 Android(借用自 here)。

package main

import (
    "fmt"
    mqtt "github.com/eclipse/paho.mqtt.golang"
    "log"
    "time"
)

var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client,msg mqtt.Message) {
    fmt.Printf("Received message: %s from topic: %s\n",msg.Payload(),msg.Topic())
}

var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {
    fmt.Println("Connected")
}

var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client,err error) {
    fmt.Printf("Connect lost: %v",err)
}

func main() {
    var broker = "broker.emqx.io"
    var port = 1883
    opts := mqtt.NewClientOptions()
    opts.Addbroker(fmt.Sprintf("tcp://%s:%d",broker,port))
    opts.SetClientID("go_mqtt_client")
    opts.SetUsername("emqx")
    opts.SetPassword("public")
    opts.SetDefaultPublishHandler(messagePubHandler)
    opts.OnConnect = connectHandler
    opts.OnConnectionLost = connectLostHandler
    client := mqtt.NewClient(opts)
    if token := client.Connect(); token.Wait() && token.Error() != nil {
        panic(token.Error())
    }

    sub(client)
    publish(client)

    client.disconnect(250)
}

func publish(client mqtt.Client) {
    num := 10
    for i := 0; i < num; i++ {
        text := fmt.Sprintf("Message %d",i)
        token := client.Publish("topic/test",false,text)
        token.Wait()
        time.Sleep(time.Second)
    }
}

func sub(client mqtt.Client) {
    topic := "topic/test"
    token := client.Subscribe(topic,1,nil)
    token.Wait()
  fmt.Printf("Subscribed to topic: %s",topic)
}

我的问题:

转换示例代码后,我不确定如何实现侦听器端。 问题是“gomobile -bind”无法将所有用户数据类型(即客户端转换为 Java)。 我可以实现连接,订阅和发布,但不能实现监听器(换句话说,当我在Android中调用相应的方法时,“opts.SetDefaultPublishHandler(messagePubHandler)”不会重复工作)

有什么建议吗?

这个是试过的,但是不行

var Options *mqtt.ClientOptions
var ReceivedMsg string

func Addbroker(broker string,port int) {
    Options = mqtt.NewClientOptions()
    Options.Addbroker(fmt.Sprintf("tcp://%s:%d",port))
}
var MessagePubHandler mqtt.MessageHandler = func(client mqtt.Client,msg mqtt.Message) {
    ReceivedMsg = " Message " + string(msg.Payload()) + " received on topic" + msg.Topic()
    fmt.Printf(ReceivedMsg)
}

 
func Listener(clientId string) {
    Options.SetClientID(clientId)
    Options.SetDefaultPublishHandler(MessagePubHandler)
    Options.OnConnect = ConnectHandler
    Options.OnConnectionLost = ConnectionLostHandler
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...