AWS IOT MQTT: устройства случайно показывают как автономный режим при подписке на более чем 50 вещей в приложении iOSIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 AWS IOT MQTT: устройства случайно показывают как автономный режим при подписке на более чем 50 вещей в приложении iOS

Сообщение Anonymous »

Я разрабатываю приложение для iOS с использованием AWS IoT Core и MQTT для управления устройствами Smart Home. Каждое устройство имеет соответствующую AWS IoT Thing », а приложение подписывается на тень Delta Delta по теме каждой вещи: < /p>
$aws/things//shadow/update/delta
< /code>
Примечание: эта проблема возникает только в приложении iOS. Та же самая логика отлично работает в приложении Android с 80+ вещами. Эти устройства на самом деле находятся в Интернете, но их сообщения Shadow Delta никогда не появляются.if IoTConnection.sharedInstance.checkIOTConnectionStatus() {
IoTConnection.sharedInstance.subscribeToAllModules(true)
IoTConnection.sharedInstance.subscribeForDelta()
}

func subscribeToAllModules(_ getStatus:Bool)
{
if UserDefaults.standard.bool(forKey: "isLoggedIn")
{
DispatchQueue.global().async {

let array = dbManager.fetchList(query: "select serialNumber from master", columnName: "serialNumber", .master) as! [String]
////print(array)
for srnum in array {

self.subscribeWithSerialnumber(serialnumber: srnum, operation: .update)
if srnum.contains("zdp") {
self.subscribeWithSerialnumber(serialnumber: srnum, operation: .get)
}

// if !srnum.contains("1001") {
// self.subscribeWithSerialnumber(serialnumber: srnum, operation: .update)
// if srnum.contains("zdp") {
// self.subscribeWithSerialnumber(serialnumber: srnum, operation: .get)
// }
// } else {
// print("Condition failed")
// }

}

if getStatus && !isSceneExecuting {

let modules = dbManager.fetchData("select serialNumber,moduleType from master", .master)

modules.forEach { (module) in

let dict = Module_Data.getActiveModuleGroupsWithApplianceCount(moduleString: module["moduleType"]! as! String)

if dict.keys.contains("LI") || dict.keys.contains("DL") || dict.keys.contains("FA") || dict.keys.contains("PM") || dict.keys.contains("CM") {

let srnum = module["serialNumber"]! as! String
if (RoomDetails.roomExecution != nil && !RoomDetails.roomExecution.sentSerialNumbers.contains(srnum)) || RoomDetails.roomExecution == nil {

// debugPrint("sent ping msg to \(srnum)")
self.updateThing(thingname: srnum, json: self.pingMsg, shadowOperation: .update)
}
}

}
//
//
// array = dbManager.fetchList(query: "select serialNumber from master where moduleType like '%SS00%' and moduleType like '%LK00%' and moduleType like '%WL00%' and moduleType like '%WR00%'", columnName: "serialNumber", .master) as! [String]
// for srnum in array {
//
// }
}
}
}
}

func subscribeForDelta() {

if let email = UserDefaults.standard.string(forKey: "email") {

self.subscribeWithSerialnumber(serialnumber: email.alphanumeric, operation: .get)
self.updateThing(thingname: email.alphanumeric, json: "", shadowOperation: .get)
let topic = "$aws/things/\(email.alphanumeric)/shadow/update/delta"
debugPrint("ITC: Subscribing for delta topic: \(topic)")
let subscribed = iotDataManager!.subscribe(toTopic: topic, qoS: .messageDeliveryAttemptedAtMostOnce) { (data) in

debugPrint("ITC: Delta payload received")
debugPrint(data)
do {
let d = try JSONSerialization.jsonObject(with: data, options: []) as! Dictionary
self.identifyDelta(devices: d["state"] as! Dictionary)

} catch {
////print("exception \(error)")
}
}

debugPrint("ITC: Delta topic subscription success: \(subscribed)")
}
}

func subscribeWithSerialnumber(serialnumber : String, operation: ShadowOperation) {

let topic = "$aws/things/\(serialnumber)/shadow/\(operation.rawValue)/accepted"
// ////print(topic)
debugPrint("ITC: Subscribing to topic: \(topic)")
// iotDataManager.subscribe(toTopic: topic, qoS: .messageDeliveryAttemptedAtMostOnce) { (obj, str, data) in

// }
let result = iotDataManager.subscribe(toTopic: topic, qoS: .messageDeliveryAttemptedAtMostOnce) { (data) in
debugPrint("ITC: Received MQTT message for \(serialnumber):")
debugPrint(data)
do {
let d = try JSONSerialization.jsonObject(with: data, options: []) as! Dictionary
debugPrint("ITC: subscribeWithSerialnumber Full JSON shadow response:")
debugPrint(d)
let state = d["state"] as! Dictionary

debugPrint(state)
let reported = state["reported"]

if let delta = state["delta"] as? [String:String] {

if let emailId = UserDefaults.standard.string(forKey: "email") {

if emailId.alphanumeric == serialnumber {

self.identifyDelta(devices: delta)
if operation == .get {
self.unsubscribeToSerialnumber(serialnumber: serialnumber, shadowOperation: .get)
}
}
}
}

if(reported != nil && UserDefaults.standard.string(forKey: "email")?.alphanumeric != serialnumber)
{
// if serialnumber.contains("zdp") {
//
// }
print("\(reported!) \(serialnumber)")
let reportedDict = reported as! Dictionary

if operation == .get {

if serialnumber.contains("zdp") && reportedDict.keys.contains("ZBSEQ") {

UserDefaults.standard.setValue(reportedDict["ZBSEQ"]! as! String, forKey: "ZBSEQ-\(serialnumber)")
}

self.delegate?.getAck?(response: reportedDict, serialNumber: serialnumber)
}
else if operation == .update && !(reportedDict.keys.count == 1 && Array(reportedDict.keys)[0].contains("ACParams"))
{
self.saveResponseForSerialNumber(serialnumber: serialnumber, response: reportedDict, version: String(describing: d["version"]!), timestamp: String(describing: d["timestamp"]!))
}
else if (reportedDict.keys.count == 1 && Array(reportedDict.keys)[0].contains("ACParams"))
{
self.parseResponseForGet(serialNumber: serialnumber, reported: reportedDict)
}

if serialnumber.contains("slm") {
self.saveLockResponse(reportedDict,serialnumber)
}
}
} catch {
////print("exception \(error)")
debugPrint("JSON Parse Error:")
debugPrint(error)
}
}

// if result {
// debugPrint("subscribed to \(serialnumber)")
// }
// else {
// debugPrint("not subscribed to \(serialnumber)")
// }

}
< /code>
Приложение использует Awsiotdatamanager для MQTT и FMDB для локального хранилища SQLite.
Shadow Deltas используются для запуска обновлений состояний. Задержка).
Попытки подписки на ведение журнала.
Мониторинг для ввода /вывода SQLITE основной нагрузки (некоторые предупреждения наблюдались).
Ручная подписание после воссоединения.
все еще, проблема сохраняется, когда количество устройств> 50. На сколько теневых тем может быть подписано одновременно? Темы в iOS? Та же самая логика отлично работает в приложении Android с 80+ вещами.


Подробнее здесь: https://stackoverflow.com/questions/796 ... r-50-thing
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»