Hook up store and forward as reccomended by @GUVWAF

This commit is contained in:
Garth Vander Houwen 2024-02-11 17:45:03 -08:00
parent a5ae02978e
commit e9aec54508
3 changed files with 58 additions and 22 deletions

View file

@ -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)")

View file

@ -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"),

View file

@ -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<D: SwiftProtobuf.Decoder>(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
}