소스 검색

* simple_secure_chat: round trip time diagnostics, plus better timeout estimations

Scott Powell 1 년 전
부모
커밋
cd92308c41
1개의 변경된 파일17개의 추가작업 그리고 9개의 파일을 삭제
  1. 17 9
      examples/simple_secure_chat/main.cpp

+ 17 - 9
examples/simple_secure_chat/main.cpp

@@ -41,9 +41,10 @@
   #error "need to provide a 'board' object"
 #endif
 
-#define FLOOD_SEND_TIMEOUT_MILLIS   8000
-#define DIRECT_TIMEOUT_BASE         1500
-#define DIRECT_TIMEOUT_FACTOR        800   // per hop millis
+#define SEND_TIMEOUT_BASE_MILLIS          300
+#define FLOOD_SEND_TIMEOUT_FACTOR         16.0f
+#define DIRECT_SEND_PERHOP_FACTOR         3.7213f
+#define DIRECT_SEND_PERHOP_EXTRA_MILLIS   100
 
 /* -------------------------------------------------------------------------------------- */
 
@@ -193,19 +194,20 @@ protected:
 
   void processAck(const uint8_t *data) {
     if (memcmp(data, &expected_ack_crc, 4) == 0) {     // got an ACK from recipient
-      Serial.println("Got ACK!");
+      Serial.printf("   Got ACK! (round trip: %d millis)\n", _ms->getMillis() - last_msg_sent);
       // NOTE: the same ACK can be received multiple times!
       expected_ack_crc = 0;  // reset our expected hash, now that we have received ACK
       txt_send_timeout = 0;
     } else {
       uint32_t crc;
       memcpy(&crc, data, 4);
-      MESH_DEBUG_PRINTLN("  unknown ACK received: %08X (expected: %08X)", crc, expected_ack_crc);
+      MESH_DEBUG_PRINTLN(" unknown ACK received: %08X (expected: %08X)", crc, expected_ack_crc);
     }
   }
 
 public:
   uint32_t expected_ack_crc;
+  unsigned long last_msg_sent;
 
   MyMesh(mesh::Radio& radio, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables)
      : mesh::Mesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables)
@@ -225,6 +227,7 @@ public:
 
     // calc expected ACK reply
     mesh::Utils::sha256((uint8_t *)&expected_ack_crc, 4, temp, 5 + text_len, self_id.pub_key, PUB_KEY_SIZE);
+    last_msg_sent = _ms->getMillis();
 
     return createDatagram(PAYLOAD_TYPE_TXT_MSG, recipient.id, recipient.shared_secret, temp, 5 + text_len);
   }
@@ -330,14 +333,19 @@ void loop() {
       const char *text = &command[5];
       mesh::Packet* pkt = the_mesh.composeMsgPacket(recipient, 0, text);
       if (pkt) {
+        uint32_t t = radio.getTimeOnAir(pkt->payload_len + pkt->path_len + 2) / 1000;
+
         if (recipient.out_path_len < 0) {
           the_mesh.sendFlood(pkt);
-          txt_send_timeout = the_mesh.futureMillis(FLOOD_SEND_TIMEOUT_MILLIS);
-          Serial.println("   (message sent - FLOOD)");
+          txt_send_timeout = the_mesh.futureMillis(SEND_TIMEOUT_BASE_MILLIS + (FLOOD_SEND_TIMEOUT_FACTOR * t));
+          Serial.printf("   (message sent - FLOOD, t=%d)\n", t);
         } else {
           the_mesh.sendDirect(pkt, recipient.out_path, recipient.out_path_len);
-          txt_send_timeout = the_mesh.futureMillis(DIRECT_TIMEOUT_FACTOR*recipient.out_path_len + DIRECT_TIMEOUT_BASE);
-          Serial.println("   (message sent - DIRECT)");
+
+          txt_send_timeout = the_mesh.futureMillis(SEND_TIMEOUT_BASE_MILLIS + 
+                     ( (t*DIRECT_SEND_PERHOP_FACTOR + DIRECT_SEND_PERHOP_EXTRA_MILLIS) * (recipient.out_path_len + 1)));
+
+          Serial.printf("   (message sent - DIRECT, t=%d)\n", t);
         }
       } else {
         Serial.println("   ERROR: unable to create packet.");