指挥控制系统(多信号显示控制)
效果如图:对信号源进行各种手势操作,通过wifi控制大屏显示的内容,如何显示自由定制
主要技术用到socketIO版本为10.0.0,服务器的socketIO不一致的情况下回出错,上代码了
1.由于数据需要大量的全局便于定制扩展,写个数据管理的单例
import UIKit
enum AckModel {
case SceneActiveModel
case WindowMoveModel
case WindowDeleted
case WindowCreated
case NewInputNodeAry
case ConnectFail
case SceneCreated
case SceneChanged
case SceneDeleted
case WallCreated
case WallDeleted
case WallSlotBinded
case WallLayoutChanged
case WallRowHeightChanged
case WallColWidthChanged
case WallNameChanged
case WindowSignalChanged
case AllWindowsDeleted
}
protocol VPScreenDelegate: NSObjectProtocol {
func CallBack(dataArray: Any,type:AckModel)
}
class DataMananger: NSObject {
//MARK:socket
//当前墙记录 CurrentWall
var currentWall :CYWall?
var currentScene :CYScene?
var socketClinet : SocketIOClient?
weak var delegate:VPScreenDelegate?
static let shared = DataMananger()
var timer: Timer?
//MARK:数据的数组
lazy var sceneWindowArray:[CYSceneWindow] = {
var foo : [CYSceneWindow] = [CYSceneWindow]()
return foo
}()
lazy var scenesArray:[CYScene] = {
var foo : [CYScene] = [CYScene]()
return foo
}()
lazy var signalsArray:[CYSignal] = {
var foo : [CYSignal] = [CYSignal]()
return foo
}()
lazy var wallsArray:[CYWall] = {
var foo : [CYWall] = [CYWall]()
return foo
}()
lazy var resultArray:[Any] = {
var foo : [Any] = [Any]()
return foo
}()
lazy var inputNodesArray:[CYInputNode] = {
var foo : [CYInputNode] = [CYInputNode]()
return foo
}()
lazy var currentScenesArr:[CYScene]={
var foo : [CYScene] = [CYScene]()
return foo
}()
lazy var currentWindowsArr:[CYSceneWindow]={
var foo : [CYSceneWindow] = [CYSceneWindow]()
return foo
}()
//List call listen
func VPhandleEvent() {
/*
连接状态监听
*/
self.socketClinet?.on("connect"){ data, ack in
}
self.socketClinet?.on(clientEvent: .disconnect) {data, ack in
print("Test: Disconnect")
}
self.socketClinet!.on(clientEvent: .statusChange) {data, ack in
print("Test: statusChange")
}
/*
Window状态监听
*/
self.socketClinet!.on("WindowCreated") {data, ack in
let dic = data[0] as? [String: Any]
let windowModel = CYSceneWindow.deserialize(from: dic!["window"] as? [String: Any])
self.sceneWindowArray.append(windowModel!)
self.delegate?.CallBack(dataArray: data, type: AckModel.WindowCreated)
}
self.socketClinet!.on("WindowDeleted") {data, ack in
let dic = data[0] as? [String: Any]
let windowModel = CYSceneWindow.deserialize(from: dic!["window"] as? [String: Any])
for (index, model) in self.sceneWindowArray.enumerated() {
if model.id == windowModel?.id {
self.sceneWindowArray.remove(at: index)
break
}
}
self.delegate?.CallBack(dataArray: data, type: AckModel.WindowDeleted)
}
self.socketClinet!.on("WindowMoved") {data, ack in
let dic = data[0] as? [String: Any]
let windowModel = CYSceneWindow.deserialize(from: dic!["window"] as? [String: Any])
for (index, model) in self.sceneWindowArray.enumerated() {
if model.id == windowModel?.id {
self.sceneWindowArray.remove(at: index)
break
}
}
self.sceneWindowArray.append(windowModel!)
self.delegate?.CallBack(dataArray: data, type: AckModel.WindowMoveModel)
}
self.socketClinet!.on("WindowSignalChanged") {data, ack in
let dic = data[0] as? [String: Any]
let windowModel = CYSceneWindow.deserialize(from: dic!["window"] as? [String: Any])
for (index, model) in self.sceneWindowArray.enumerated() {
if model.id == windowModel?.id {
self.sceneWindowArray.remove(at: index)
self.sceneWindowArray.insert(windowModel!, at: index)
break
}
}
self.delegate?.CallBack(dataArray: data, type: AckModel.WindowSignalChanged)
}
self.socketClinet!.on("AllWindowsDeleted") {data, ack in
self.sceneWindowArray.removeAll()
self.delegate?.CallBack(dataArray: data, type: AckModel.AllWindowsDeleted)
}
/*
墙 Wall状态监听
*/
self.socketClinet!.on("WallCreated") {data, ack in
let sceneArr:NSArray = data as NSArray
let dic:NSDictionary = sceneArr[0] as! NSDictionary
let newWall :CYWall = CYWall.deserialize(from: dic.object(forKey: "wall") as? [String:Any])!
self.wallsArray.append(newWall)
self.delegate?.CallBack(dataArray: newWall, type: AckModel.WallCreated)
}
self.socketClinet!.on("WallDeleted") {data, ack in
let sceneArr:NSArray = data as NSArray
let dic:NSDictionary = sceneArr[0] as! NSDictionary
let deleteWall: CYWall = CYWall.deserialize(from: dic.object(forKey: "wall") as? [String:Any])!
for (index, wall) in self.wallsArray.enumerated() {
if wall.id == deleteWall.id {
self.wallsArray.remove(at: index)
break
}
}
self.refreshCurrentWall()
self.delegate?.CallBack(dataArray: deleteWall, type: AckModel.WallDeleted)
}
self.socketClinet!.on("WallSlotBinded") {data, ack in
replaceWallModel(data)
self.delegate?.CallBack(dataArray: [Any](), type: AckModel.WallSlotBinded)
}
self.socketClinet!.on("WallLayoutChanged") {data, ack in
replaceWallModel(data)
self.delegate?.CallBack(dataArray: [Any](), type: AckModel.WallLayoutChanged)
}
self.socketClinet!.on("WallRowHeightChanged") {data, ack in
replaceWallModel(data)
self.delegate?.CallBack(dataArray: [Any](), type: AckModel.WallRowHeightChanged)
}
self.socketClinet!.on("WallColWidthChanged") {data, ack in
replaceWallModel(data)
self.delegate?.CallBack(dataArray: [Any](), type: AckModel.WallColWidthChanged)
}
self.socketClinet!.on("WallNameChanged") {data, ack in
replaceWallModel(data)
self.delegate?.CallBack(dataArray: [Any](), type: AckModel.WallNameChanged)
}
func replaceWallModel(_ data: [Any]) {
let sceneArr:NSArray = data as NSArray
let dic:NSDictionary = sceneArr[0] as! NSDictionary
let changeWall :CYWall = CYWall.deserialize(from: dic.object(forKey: "wall") as? [String:Any])!
for (index, wall) in self.wallsArray.enumerated() {
if wall.id == changeWall.id {
self.wallsArray.remove(at: index)
self.wallsArray.insert(changeWall, at: index)
break
}
}
}
/*
Scene 状态监听
*/
self.socketClinet!.on("SceneCreated") {data, ack in
let sceneArr:NSArray = data as NSArray
let dic:NSDictionary = sceneArr[0] as! NSDictionary
let newScene :CYScene = CYScene.deserialize(from: dic.object(forKey: "scene") as? [String:Any])!
self.scenesArray.append(newScene)
self.updateCurrentSceneArray()
self.delegate?.CallBack(dataArray: newScene, type: AckModel.SceneCreated)
}
self.socketClinet!.on("SceneChanged") {data, ack in
let sceneArr:NSArray = data as NSArray
let dic:NSDictionary = sceneArr[0] as! NSDictionary
let changeScene :CYScene = CYScene.deserialize(from: dic.object(forKey: "scene") as? [String:Any])!
for scene in self.scenesArray {
if scene.id == changeScene.id {
scene.name = changeScene.name
break
}
}
self.updateCurrentSceneArray()
self.delegate?.CallBack(dataArray: changeScene, type: AckModel.SceneCreated)
}
self.socketClinet!.on("SceneDeleted") {data, ack in
let sceneArr:NSArray = data as NSArray
let dic:NSDictionary = sceneArr[0] as! NSDictionary
let deleteScene :CYScene = CYScene.deserialize(from: dic.object(forKey: "scene") as? [String:Any])!
for (index, scene) in self.scenesArray.enumerated() {
if scene.id == deleteScene.id {
self.scenesArray.remove(at: index)
break
}
}
self.updateCurrentSceneArray()
self.delegate?.CallBack(dataArray: deleteScene, type: AckModel.SceneCreated)
}
self.socketClinet!.on("SceneActived") {data, ack in
let sceneArr:NSArray = data as NSArray
let dic:NSDictionary = sceneArr[0] as! NSDictionary
let activeScene :CYScene = CYScene.deserialize(from: dic.object(forKey: "scene") as? [String:Any])!
self.delegate?.CallBack(dataArray: activeScene, type: AckModel.SceneActiveModel)
}
/*
InputNode 状态监听
*/
self.socketClinet!.on("InputNodeCablesChanged") {data, ack in
// self.inputNodeCabChangeDelegate?.InputNodeCabChangeDelegate(data: data)
}
self.socketClinet!.on("InputNodeChanged") {data, ack in
// self.inputNodeChanageDelegate?.InputNodeChangedDelegate(data: data)
}
self.socketClinet!.on("InputNodeCreated") {data, ack in
// self.inputNodeCreatedDelegate?.InputNodeCreatedDelegate(data: data)
}
self.socketClinet!.on("InputNodeDeleted") {data, ack in
// self.inputNodeDeletedDelegate?.InputNodeDeletedDelegate(data: data)
}
/*
Signal 信号状态监听
*/
self.socketClinet!.on("SignalCreated") {data, ack in
}
self.socketClinet!.on("SignalDeleted") {data, ack in
}
self.socketClinet!.on("SignalUpdated") {data, ack in
}
}
private override init() {
super.init()
registerDefaultsFromSettingsBundle()
getSettingsBundlValue()
self.timer = Timer.scheduledTimer(timeInterval: Double(UpdateFPS!)!, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
self.timer?.fireDate = Date()
let sokctURL = "http://" + IPAddress! + ":9093"
self.socketClinet = SocketIOClient.init(socketURL: URL(string: sokctURL)!)
self.socketClinet?.joinNamespace("/domain")
self.VPhandleEvent()
self.socketClinet?.connect()
}
//MARK: - 读取SettingsBundle
func getSettingsBundlValue() {
IPAddress = (UserDefaults.standard.object(forKey: "splice_ip") as! String)
UpdateFPS = (UserDefaults.standard.object(forKey: "fps") as! String)
}
func registerDefaultsFromSettingsBundle() {
let settingsBundle = Bundle.main.path(forResource: "Settings", ofType: "bundle")
if settingsBundle == nil {
print("Could not find Settings.bundle")
return
}
let str = settingsBundle!+"/Root.plist"
let settings = NSDictionary(contentsOfFile: str)
let preferences = settings!["PreferenceSpecifiers"] as! [[String: Any]]
var defaultsToRegister = [String: String]()
for dic in preferences {
if let key = dic["Key"] {
defaultsToRegister.updateValue(dic["DefaultValue"]! as! String, forKey: key as! String)
}
}
UserDefaults.standard.register(defaults: defaultsToRegister)
UserDefaults.standard.synchronize()
}
@objc func timerAction() {
if inputNodesArray.count > 0 {
NetManage.getNearsFramesWithInputNodes(inputNodesArray: inputNodesArray) { (newInputNodesArray, error) in
if error == nil {
self.delegate?.CallBack(dataArray: newInputNodesArray as Any, type: AckModel.NewInputNodeAry)
}else{
self.delegate?.CallBack(dataArray: [] as Any, type: AckModel.ConnectFail)
}
}
}
}
func refreshData(result:@escaping(_ success:Bool)->Void){
SVProgressHUD.show()
SVProgressHUD.setDefaultMaskType(.clear)
NetManage.getAllWalls { (Walldata, err) in
//墙获取
if err == nil{
self.wallsArray.removeAll()
for dic in Walldata as! [Any]{
let wall = CYWall.deserialize(from: dic as? [String:Any])
print(wall!.name)
self.wallsArray.append(wall!)
}
// 场景获取
NetManage.getAllScenes(result: { (sceneData, err) in
if err == nil {
self.scenesArray.removeAll()
for dic in sceneData as! [Any]{
let scene = CYScene.deserialize(from: dic as? [String:Any])
self.scenesArray.append(scene!)
}
//getSceneWindow 窗口
NetManage.getAllSceneWindows(result: { (windowsData, err) in
if err == nil {
self.sceneWindowArray.removeAll()
for dic in windowsData as! [Any]{
let window = CYSceneWindow.deserialize(from: dic as? [String:Any])
self.sceneWindowArray.append(window!)
}
NetManage.getAllInputNodes(result: { (inputData, err) in
if err == nil {
self.inputNodesArray.removeAll()
for dic in inputData as! [Any]{
let inputNode = CYInputNode.deserialize(from: dic as? [String:Any])
self.inputNodesArray.append(inputNode!)
}
NetManage.getAllSignal(result: { (signalData, err) in
if err == nil {
self.signalsArray.removeAll()
for (index, dic) in (signalData as! [Any]).enumerated() {
let signal = CYSignal.deserialize(from: dic as? [String:Any])
if let v = UserDefaults.standard.value(forKey: (signal?.id)!) {
signal?.orderIndex = v as! Int
}else{
signal?.orderIndex = index
UserDefaults.standard.set(index, forKey: (signal?.id)!)
UserDefaults.standard.synchronize()
}
self.signalsArray.append(signal!)
}
self.signalsArray.sort(by: { (v1, v2) -> Bool in
v1.orderIndex < v2.orderIndex
})
// print(self.signalsArray.count,self.inputNodesArray.count,self.wallsArray.count,self.sceneWindowArray.count)
result(true)
}else{
result(false)
}
})
}else{
result(false)
}
})
}else{
result(false)
}
})
}else{
result(false)
}
})
}else{
result(false)
}
}
}
func refreshCurrentWall(){
//let defaults1 = UserDefaults.standard
var wallIndex = defaults.integer(forKey: "currentWall")
if wallIndex >= self.wallsArray.count {
wallIndex = 0
defaults.set(0, forKey: "currentWall")
defaults.synchronize()
}
self.currentWall = self.wallsArray[wallIndex]
self.updateCurrentSceneArray()
}
func updateCurrentSceneArray(){
self.currentScenesArr.removeAll()
for scene in scenesArray {
if scene.wallid == currentWall?.id {
currentScenesArr.append(scene)
//获取当前场景
if scene.id == self.currentWall!.activeSceneId{
self.currentScene = scene
}
}
}
self.getCurrentWindowsArray()
}
//
func getCurrentWindowsArray(){
self.currentWindowsArr.removeAll()
for windowModel in self.sceneWindowArray {
if windowModel.sceneid == self.currentScene?.id{
self.currentWindowsArr.append(windowModel)
}
}
}
func didSelectedWallActive(index:Int){
self.currentWall = self.wallsArray[index]
defaults.set(index, forKey: "currentWall")
}
func didSelectedSceneActive(id:String){
}
}
单例的生成
static let shared = DataMananger()
SocketIO的连接:
let sokctURL = "http://" + IPAddress! + ":9093"
self.socketClinet = SocketIOClient.init(socketURL: URL(string: sokctURL)!)
self.socketClinet?.joinNamespace("/domain")
self.VPhandleEvent()
self.socketClinet?.connect()