Vision Pro开发 - 使用MQTT与硬件通信

138 阅读2分钟

之前实现过使用Vision Pro通过MQTT协议,控制硬件,感兴趣的同学可以先看一下视频。

【Vision Pro 基于MQTT和485的硬件控制-哔哩哔哩】 b23.tv/LYxRwLw

接下来我们看看如何实现的吧

1. 底层协议

1.1. 三方库

本来以为很简单的继承三方库就好了,找到了我比较熟悉的emqx的库github.com/emqx/CocoaM… 但是无奈,目前还没有支持visionOS,所以无法添加依赖

1.2. 协议实现源码

所以换个思路,网上搜索一下,是否有swift代码的MQTT客户端的实现,果然让我找到了:

github.com/PasiSaleniu…

然后只要把核心实现的文件,加入到项目中就可以使用了

图片

图片

2. 业务逻辑

2.1. 初始化

MqttManager中定义消息Topic

enum MQTT_TOPIC: String {    case topic_type1 = "TYPE1"    case topic_type2 = "TYPE2"}

MqttManager定义初始化方法

init(host: String) {    mqtt = LightMQTT(host: host)    setupMQTT()}
private func setupMQTT() {    mqtt.receivingMessage = { [weak self] topic, message in         print("Received message: (message) on topic: (topic)")         DispatchQueue.main.async {             if topic == MQTT_TOPIC.topic_type1.rawValue {                 self?.receivedType1Message = message             } else if topic == MQTT_TOPIC.topic_type2.rawValue {                 self?.receivedType2Message = message             } else {                 print("topic unknown")             }         }    }}

业务代码中调用

var mqttManager = MQTTManager(host: "mqtt.xxx.com")

2.2. 连接服务器

MqttManager定义连接服务器方法

func isConnected() -> Bool {    return mqtt.isConnected}
func connect() {    mqtt.connect { success in        if success {            print("MQTT connected successfully")            self.mqtt.subscribe(to: MQTT_TOPIC.type1.rawValue)            self.mqtt.subscribe(to: MQTT_TOPIC.type2.rawValue)        } else {            print("MQTT connection failed")        }    }}

业务代码中调用

View {    // your code}.onAppear {    mqttManager.connect()    print("connected")}

2.3. 断线重连

定义一个1秒一次的计时器timer,用来检测连接是否在线

@State var timer = Timer.publish(every1on: .main, in: .common).autoconnect()

计时器的接收方法,判断是否连接已断开,如果已断开,则重连

View {    // your code}.onReceive(timer) { time in    if !mqttManager.isConnected() {        print("mqtt disconnected, reconnect")        mqttManager.connect()    }}

2.4. 接收消息

业务代码中调用

View {    // your code}.onReceive(mqttManager.$receivedType1Message) { message in    if let state = MQTT_MSG(rawValue: message) {        print(state)        if state == .reset {            // your code        }    }}

2.5. 发送消息

MqttManager定义发送方法

func sendMessage(type: String, value: Int) {    let message: [String: Any] = [        "source": "S1",        "status": 0,        "type": type,        "value": value    ]        if let data = try? JSONSerialization.data(withJSONObject: message, options: .prettyPrinted) {        mqtt.publish(to: "Topic1", message: data)    }}

3. 服务器端搭建

服务端我们一般称之为MQTT Broker

3.1. Linux服务器上用docker搭建

参考这个网址就可以了:docs.emqx.com/en/emqx/lat…

3.2. windows PC局域网部署

mosquitto.org/download/下载…](p9-xtjj-sign.byteimg.com/tos-cn-i-73…

C:\Program Files\mosquitto\mosquitto.conf

修改后记得重启broker服务

注意事项:

  1. 打开防火墙,或者开放端口可以让局域网内访问到
  2. 配置文件修改 listener,监听地址改为0.0.0.0,否则只能本机访问
listener 1883 0.0.0.0

3.允许匿名访问

allow_anonymous true