之前实现过使用Vision Pro通过MQTT协议,控制硬件,感兴趣的同学可以先看一下视频。
【Vision Pro 基于MQTT和485的硬件控制-哔哩哔哩】 b23.tv/LYxRwLw
接下来我们看看如何实现的吧
1. 底层协议
1.1. 三方库
本来以为很简单的继承三方库就好了,找到了我比较熟悉的emqx的库github.com/emqx/CocoaM… 但是无奈,目前还没有支持visionOS,所以无法添加依赖
1.2. 协议实现源码
所以换个思路,网上搜索一下,是否有swift代码的MQTT客户端的实现,果然让我找到了:
然后只要把核心实现的文件,加入到项目中就可以使用了
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(every: 1, on: .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服务
注意事项:
- 打开防火墙,或者开放端口可以让局域网内访问到
- 配置文件修改 listener,监听地址改为0.0.0.0,否则只能本机访问
listener 1883 0.0.0.0
3.允许匿名访问
allow_anonymous true