Я разрабатываю приложение для 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
AWS IOT MQTT: устройства случайно показывают как автономный режим при подписке на более чем 50 вещей в приложении iOS ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как я могу исправить ошибку EOF в нарушение протокола (_SSL.C: 2393) с AWS IOT и MQTT
Anonymous » » в форуме Python - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-