1.WebSocket封装介绍
项目中的使用的WebSocket是基于开源第三方库Starscream的再次封装,涉及到的类有三个,分别是:
- ZTWebSocketOperation:对WebSocket发送命令数据的封装,具体命令请看ZTWebsocket类的介绍;
- ZTWebSocketResponse:对WebSocket响应数据的封装,对WebSocket发出指令后接受到的响应使用对应的model解析;
- ZTWebsocket:WebSocket命令操作类;
(1)ZTWebSocketOperation
class Operation: BaseModel {
var domain = ""
var id = 0
var service = ""
var identity: String?
var service_data: ServiceData?
init(domain: String, id: Int, service: String) {
self.domain = domain
self.id = id
self.service = service
}a
required init() {
fatalError("init() has not been implemented")
}
}
extension Operation {
class ServiceData: BaseModel {
var plugin_id: String?
var attributes: [DeviceAttribute]?
}
}
(2)ZTWebSocketResponse
// MARK: - WSOperationResponse
class WSOperationResponse<T: HandyJSON>: HandyJSON {
var id = 0
var success = false
var type = ""
var result: T?
required init() {}
}
class EmptyResultResponse: HandyJSON {
required init() {}
}
class SearchDeviceResponse: HandyJSON {
var device = DiscoverDeviceModel()
required init() {}
}
class DeviceStatusResponse: BaseModel {
var device = DeviceStatusModel()
class DeviceStatusModel: BaseModel {
var identity = ""
var type = ""
var instances = [DeviceInstance]()
}
}
class DeviceInstance: HandyJSON {
var type = ""
var instance_id = 0
var attributes = [DeviceAttribute]()
required init() {}
}
// MARK: - WSEventResponse
class WSEventResponse<T: HandyJSON>: HandyJSON {
var event_type = ""
var data: T?
var origin = ""
required init() {}
}
class DeviceStateChangeResponse: BaseModel {
var identity = ""
var instance_id = 0
var attr = DeviceAttribute()
}
(3)ZTWebSocket
//
// ZTWebSocket.swift
// ZhiTing
//
// Created by iMac on 2021/2/3.
//
import UIKit
import Starscream
import Combine
/// Websocket connect status
enum WebsocketConnectStatus {
case connected
case disconnected
}
class ZTWebSocket {
/// websocket
private var socket: WebSocket!
/// connectStatus
var status: WebsocketConnectStatus = .disconnected
/// autoInrecement id (use for record operations)
lazy var id = 0
/// id: (Operation, OperationType)
lazy var operationDict = [Int: (op: Operation, opType: OperationType)]()
/// 重连次数
lazy var reconnectCount = 0
/// 最大重连次数
let maxReconnectCount = 6
/// 是否打印日志
var printDebugInfo = true
/// publishers
/// Socket连接成功publisher
lazy var socketDidConnectedPublisher = PassthroughSubject<Void, Never>()
/// SA发现设备publisher
lazy var discoverDevicePublisher = PassthroughSubject<DiscoverDeviceModel, Never>()
/// 设备状态publisher
lazy var deviceStatusPublisher = PassthroughSubject<DeviceStatusResponse, Never>()
/// 设备状态改变publisher
lazy var deviceStatusChangedPublisher = PassthroughSubject<DeviceStateChangeResponse, Never>()
/// 插件安装回调publisher
lazy var installPluginPublisher = PassthroughSubject<(plugin_id: String, success: Bool), Never>()
/// 设备开关操作成功 publisher
lazy var devicePowerPublisher = PassthroughSubject<(power: Bool, identity: String), Never>()
init(urlString: String