From e9aec54508a8dbceb9997714fd1c14bb5098f183 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 11 Feb 2024 17:45:03 -0800 Subject: [PATCH] Hook up store and forward as reccomended by @GUVWAF --- Meshtastic/Helpers/BLEManager.swift | 31 +++++++++++++- Meshtastic/Protobufs/meshtastic/mesh.pb.swift | 8 ++++ .../meshtastic/storeforward.pb.swift | 41 ++++++++++--------- 3 files changed, 58 insertions(+), 22 deletions(-) diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 33c64012..c0a71255 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -2374,7 +2374,8 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate /// send a request for ClientHistory with a time period matching the heartbeat var sfPacket = StoreAndForward() sfPacket.rr = StoreAndForward.RequestResponse.clientHistory - sfPacket.history.window = 120 // storeAndForwardMessage.heartbeat.period + sfPacket.history.window = UInt32(toUser.userNode?.storeForwardConfig?.historyReturnWindow ?? 120) + sfPacket.history.lastRequest = UInt32(toUser.userNode?.storeForwardConfig?.lastRequest?.timeIntervalSince1970 ?? Date().timeIntervalSince1970) var meshPacket: MeshPacket = MeshPacket() meshPacket.to = UInt32(toUser.num) meshPacket.from = UInt32(fromUser.num) @@ -2401,7 +2402,14 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate func storeAndForwardPacket(packet: MeshPacket, connectedNodeNum: Int64, context: NSManagedObjectContext) { if let storeAndForwardMessage = try? StoreAndForward(serializedData: packet.decoded.payload) { - // Request Response + + // Handle the text variant as a text message packet + if storeAndForwardMessage.variant == StoreAndForward.OneOf_Variant.text(packet.decoded.payload) { + MeshLogger.log("📮 Store and Forward history text message received \(storeAndForwardMessage)") + textMessageAppPacket(packet: packet, connectedNode: connectedNodeNum, context: context) + return + } + // Handle each of the store and forward request / response messages switch storeAndForwardMessage.rr { case .unset: MeshLogger.log("📮 Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)") @@ -2424,6 +2432,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate newConfig.enabled = true newConfig.isRouter = storeAndForwardMessage.heartbeat.secondary == 0 newConfig.lastHeartbeat = Date() + routerNode.storeForwardConfig = newConfig } do { @@ -2441,6 +2450,24 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate case .routerBusy: MeshLogger.log("🐝 Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)") case .routerHistory: + /// Set the Router History Last Request Value + guard let routerNode = getNodeInfo(id: Int64(packet.from), context: context) else { + return + } + if routerNode.storeForwardConfig != nil { + routerNode.storeForwardConfig?.lastRequest = Date(timeIntervalSince1970: TimeInterval(storeAndForwardMessage.history.lastRequest)) + } else { + let newConfig = StoreForwardConfigEntity(context: context) + newConfig.lastRequest = Date(timeIntervalSince1970: TimeInterval(storeAndForwardMessage.history.lastRequest)) + routerNode.storeForwardConfig = newConfig + } + + do { + try context.save() + } catch { + context.rollback() + print("💥 Save Store and Forward Router Error") + } MeshLogger.log("📜 Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)") case .routerStats: MeshLogger.log("📊 Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)") diff --git a/Meshtastic/Protobufs/meshtastic/mesh.pb.swift b/Meshtastic/Protobufs/meshtastic/mesh.pb.swift index 7496d559..1380fba9 100644 --- a/Meshtastic/Protobufs/meshtastic/mesh.pb.swift +++ b/Meshtastic/Protobufs/meshtastic/mesh.pb.swift @@ -130,6 +130,10 @@ enum HardwareModel: SwiftProtobuf.Enum { /// Canary Radio Company - CanaryOne: https://canaryradio.io/products/canaryone case canaryone // = 29 + /// + /// Waveshare RP2040 LoRa - https://www.waveshare.com/rp2040-lora.htm + case rp2040Lora // = 30 + /// /// --------------------------------------------------------------------------- /// Less common/prototype boards listed here (needs one more byte over the air) @@ -280,6 +284,7 @@ enum HardwareModel: SwiftProtobuf.Enum { case 27: self = .senseloraRp2040 case 28: self = .senseloraS3 case 29: self = .canaryone + case 30: self = .rp2040Lora case 32: self = .loraRelayV1 case 33: self = .nrf52840Dk case 34: self = .ppr @@ -338,6 +343,7 @@ enum HardwareModel: SwiftProtobuf.Enum { case .senseloraRp2040: return 27 case .senseloraS3: return 28 case .canaryone: return 29 + case .rp2040Lora: return 30 case .loraRelayV1: return 32 case .nrf52840Dk: return 33 case .ppr: return 34 @@ -401,6 +407,7 @@ extension HardwareModel: CaseIterable { .senseloraRp2040, .senseloraS3, .canaryone, + .rp2040Lora, .loraRelayV1, .nrf52840Dk, .ppr, @@ -2589,6 +2596,7 @@ extension HardwareModel: SwiftProtobuf._ProtoNameProviding { 27: .same(proto: "SENSELORA_RP2040"), 28: .same(proto: "SENSELORA_S3"), 29: .same(proto: "CANARYONE"), + 30: .same(proto: "RP2040_LORA"), 32: .same(proto: "LORA_RELAY_V1"), 33: .same(proto: "NRF52840DK"), 34: .same(proto: "PPR"), diff --git a/Meshtastic/Protobufs/meshtastic/storeforward.pb.swift b/Meshtastic/Protobufs/meshtastic/storeforward.pb.swift index 925eb558..891e8ef0 100644 --- a/Meshtastic/Protobufs/meshtastic/storeforward.pb.swift +++ b/Meshtastic/Protobufs/meshtastic/storeforward.pb.swift @@ -66,13 +66,13 @@ struct StoreAndForward { } /// - /// Empty Payload - var empty: Bool { + /// Text from history message. + var text: Data { get { - if case .empty(let v)? = variant {return v} - return false + if case .text(let v)? = variant {return v} + return Data() } - set {variant = .empty(newValue)} + set {variant = .text(newValue)} } var unknownFields = SwiftProtobuf.UnknownStorage() @@ -90,8 +90,8 @@ struct StoreAndForward { /// TODO: REPLACE case heartbeat(StoreAndForward.Heartbeat) /// - /// Empty Payload - case empty(Bool) + /// Text from history message. + case text(Data) #if !swift(>=4.1) static func ==(lhs: StoreAndForward.OneOf_Variant, rhs: StoreAndForward.OneOf_Variant) -> Bool { @@ -111,8 +111,8 @@ struct StoreAndForward { guard case .heartbeat(let l) = lhs, case .heartbeat(let r) = rhs else { preconditionFailure() } return l == r }() - case (.empty, .empty): return { - guard case .empty(let l) = lhs, case .empty(let r) = rhs else { preconditionFailure() } + case (.text, .text): return { + guard case .text(let l) = lhs, case .text(let r) = rhs else { preconditionFailure() } return l == r }() default: return false @@ -268,11 +268,11 @@ struct StoreAndForward { var heartbeat: Bool = false /// - /// Is the heartbeat enabled on the server? + /// Maximum number of messages the server will return. var returnMax: UInt32 = 0 /// - /// Is the heartbeat enabled on the server? + /// Maximum history window in minutes the server will return messages from. var returnWindow: UInt32 = 0 var unknownFields = SwiftProtobuf.UnknownStorage() @@ -296,7 +296,8 @@ struct StoreAndForward { var window: UInt32 = 0 /// - /// The window of messages that was used to filter the history client requested + /// Index in the packet history of the last message sent in a previous request to the server. + /// Will be sent to the client before sending the history and can be set in a subsequent request to avoid getting packets the server already sent to the client. var lastRequest: UInt32 = 0 var unknownFields = SwiftProtobuf.UnknownStorage() @@ -312,7 +313,7 @@ struct StoreAndForward { // methods supported on all messages. /// - /// Number of that will be sent to the client + /// Period in seconds that the heartbeat is sent out that will be sent to the client var period: UInt32 = 0 /// @@ -371,7 +372,7 @@ extension StoreAndForward: SwiftProtobuf.Message, SwiftProtobuf._MessageImplemen 2: .same(proto: "stats"), 3: .same(proto: "history"), 4: .same(proto: "heartbeat"), - 5: .same(proto: "empty"), + 5: .same(proto: "text"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -421,11 +422,11 @@ extension StoreAndForward: SwiftProtobuf.Message, SwiftProtobuf._MessageImplemen } }() case 5: try { - var v: Bool? - try decoder.decodeSingularBoolField(value: &v) + var v: Data? + try decoder.decodeSingularBytesField(value: &v) if let v = v { if self.variant != nil {try decoder.handleConflictingOneOf()} - self.variant = .empty(v) + self.variant = .text(v) } }() default: break @@ -454,9 +455,9 @@ extension StoreAndForward: SwiftProtobuf.Message, SwiftProtobuf._MessageImplemen guard case .heartbeat(let v)? = self.variant else { preconditionFailure() } try visitor.visitSingularMessageField(value: v, fieldNumber: 4) }() - case .empty?: try { - guard case .empty(let v)? = self.variant else { preconditionFailure() } - try visitor.visitSingularBoolField(value: v, fieldNumber: 5) + case .text?: try { + guard case .text(let v)? = self.variant else { preconditionFailure() } + try visitor.visitSingularBytesField(value: v, fieldNumber: 5) }() case nil: break }