mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-11-02 19:02:00 +00:00
* new TXT_TYPE_CLI_COMMAND (3)
This commit is contained in:
@@ -530,20 +530,20 @@ void MyMesh::onMessageRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t
|
|||||||
queueMessage(from, TXT_TYPE_PLAIN, pkt, sender_timestamp, NULL, 0, text);
|
queueMessage(from, TXT_TYPE_PLAIN, pkt, sender_timestamp, NULL, 0, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyMesh::onCommandDataRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp,
|
void MyMesh::onCommandDataRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp, const char *text) {
|
||||||
|
markConnectionActive(from); // in case this is from a server, and we have a connection
|
||||||
|
queueMessage(from, TXT_TYPE_CLI_DATA, pkt, sender_timestamp, NULL, 0, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MyMesh::onCLICommandRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp,
|
||||||
const char *text, char* reply) {
|
const char *text, char* reply) {
|
||||||
markConnectionActive(from); // in case this is from a server, and we have a connection
|
markConnectionActive(from); // in case this is from a server, and we have a connection
|
||||||
if (from.isRemoteCLIAllowed()) {
|
if (from.isRemoteCLIAllowed()) {
|
||||||
if (text[0] == '>') { // is this a CLI reply?
|
if (!handleCommand(text, sender_timestamp, reply)) {
|
||||||
queueMessage(from, TXT_TYPE_CLI_DATA, pkt, sender_timestamp, NULL, 0, &text[1]);
|
strcat(reply, "Unknown command"); // reply may have cmd prefix from 'text'
|
||||||
} else {
|
|
||||||
*reply++ = '>'; // ensure the special 'is reply' prefix
|
|
||||||
if (!handleCommand(text, sender_timestamp, reply)) {
|
|
||||||
strcat(reply, "Unknown command"); // reply may have cmd prefix from 'text'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
queueMessage(from, TXT_TYPE_CLI_DATA, pkt, sender_timestamp, NULL, 0, text);
|
queueMessage(from, TXT_TYPE_CLI_COMMAND, pkt, sender_timestamp, NULL, 0, text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -134,6 +134,8 @@ protected:
|
|||||||
void onMessageRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp,
|
void onMessageRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp,
|
||||||
const char *text) override;
|
const char *text) override;
|
||||||
void onCommandDataRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp,
|
void onCommandDataRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp,
|
||||||
|
const char *text) override;
|
||||||
|
void onCLICommandRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp,
|
||||||
const char *text, char* reply) override;
|
const char *text, char* reply) override;
|
||||||
void onSignedMessageRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp,
|
void onSignedMessageRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp,
|
||||||
const uint8_t *sender_prefix, const char *text) override;
|
const uint8_t *sender_prefix, const char *text) override;
|
||||||
|
|||||||
@@ -704,7 +704,7 @@ void MyMesh::onPeerDataRecv(mesh::Packet *packet, uint8_t type, int sender_idx,
|
|||||||
memcpy(&sender_timestamp, data, 4); // timestamp (by sender's RTC clock - which could be wrong)
|
memcpy(&sender_timestamp, data, 4); // timestamp (by sender's RTC clock - which could be wrong)
|
||||||
uint8_t flags = (data[4] >> 2); // message attempt number, and other flags
|
uint8_t flags = (data[4] >> 2); // message attempt number, and other flags
|
||||||
|
|
||||||
if (!(flags == TXT_TYPE_PLAIN || flags == TXT_TYPE_CLI_DATA)) {
|
if (!(flags == TXT_TYPE_PLAIN || flags == TXT_TYPE_CLI_DATA || flags == TXT_TYPE_CLI_COMMAND)) {
|
||||||
MESH_DEBUG_PRINTLN("onPeerDataRecv: unsupported text type received: flags=%02x", (uint32_t)flags);
|
MESH_DEBUG_PRINTLN("onPeerDataRecv: unsupported text type received: flags=%02x", (uint32_t)flags);
|
||||||
} else if (sender_timestamp >= client->last_timestamp) { // prevent replay attacks
|
} else if (sender_timestamp >= client->last_timestamp) { // prevent replay attacks
|
||||||
bool is_retry = (sender_timestamp == client->last_timestamp);
|
bool is_retry = (sender_timestamp == client->last_timestamp);
|
||||||
|
|||||||
@@ -443,7 +443,7 @@ void MyMesh::onPeerDataRecv(mesh::Packet *packet, uint8_t type, int sender_idx,
|
|||||||
memcpy(&sender_timestamp, data, 4); // timestamp (by sender's RTC clock - which could be wrong)
|
memcpy(&sender_timestamp, data, 4); // timestamp (by sender's RTC clock - which could be wrong)
|
||||||
uint8_t flags = (data[4] >> 2); // message attempt number, and other flags
|
uint8_t flags = (data[4] >> 2); // message attempt number, and other flags
|
||||||
|
|
||||||
if (!(flags == TXT_TYPE_PLAIN || flags == TXT_TYPE_CLI_DATA)) {
|
if (!(flags == TXT_TYPE_PLAIN || flags == TXT_TYPE_CLI_DATA || flags == TXT_TYPE_CLI_COMMAND)) {
|
||||||
MESH_DEBUG_PRINTLN("onPeerDataRecv: unsupported command flags received: flags=%02x", (uint32_t)flags);
|
MESH_DEBUG_PRINTLN("onPeerDataRecv: unsupported command flags received: flags=%02x", (uint32_t)flags);
|
||||||
} else if (sender_timestamp >= client->last_timestamp) { // prevent replay attacks, but send Acks for retries
|
} else if (sender_timestamp >= client->last_timestamp) { // prevent replay attacks, but send Acks for retries
|
||||||
bool is_retry = (sender_timestamp == client->last_timestamp);
|
bool is_retry = (sender_timestamp == client->last_timestamp);
|
||||||
@@ -463,7 +463,7 @@ void MyMesh::onPeerDataRecv(mesh::Packet *packet, uint8_t type, int sender_idx,
|
|||||||
|
|
||||||
uint8_t temp[166];
|
uint8_t temp[166];
|
||||||
bool send_ack;
|
bool send_ack;
|
||||||
if (flags == TXT_TYPE_CLI_DATA) {
|
if (flags == TXT_TYPE_CLI_DATA || flags == TXT_TYPE_CLI_COMMAND) {
|
||||||
if (client->isAdmin()) {
|
if (client->isAdmin()) {
|
||||||
if (is_retry) {
|
if (is_retry) {
|
||||||
temp[5] = 0; // no reply
|
temp[5] = 0; // no reply
|
||||||
|
|||||||
@@ -240,8 +240,12 @@ protected:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void onCommandDataRecv(const ContactInfo& from, mesh::Packet* pkt, uint32_t sender_timestamp, const char *text, char* reply) override {
|
void onCommandDataRecv(const ContactInfo& from, mesh::Packet* pkt, uint32_t sender_timestamp, const char *text) override {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void onCLICommandRecv(const ContactInfo& contact, mesh::Packet* pkt, uint32_t sender_timestamp, const char *text, char* reply) override {
|
||||||
|
}
|
||||||
|
|
||||||
void onSignedMessageRecv(const ContactInfo& from, mesh::Packet* pkt, uint32_t sender_timestamp, const uint8_t *sender_prefix, const char *text) override {
|
void onSignedMessageRecv(const ContactInfo& from, mesh::Packet* pkt, uint32_t sender_timestamp, const uint8_t *sender_prefix, const char *text) override {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -576,7 +576,7 @@ void SensorMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender_i
|
|||||||
sendAckTo(*from, ack_hash, packet->getPathHashSize());
|
sendAckTo(*from, ack_hash, packet->getPathHashSize());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (flags == TXT_TYPE_CLI_DATA) {
|
} else if (flags == TXT_TYPE_CLI_DATA || flags == TXT_TYPE_CLI_COMMAND) {
|
||||||
from->last_timestamp = sender_timestamp;
|
from->last_timestamp = sender_timestamp;
|
||||||
from->last_activity = getRTCClock()->getCurrentTime();
|
from->last_activity = getRTCClock()->getCurrentTime();
|
||||||
|
|
||||||
|
|||||||
@@ -256,13 +256,17 @@ void BaseChatMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender
|
|||||||
sendAckTo(from, ack_hash, 6);
|
sendAckTo(from, ack_hash, 6);
|
||||||
}
|
}
|
||||||
} else if (flags == TXT_TYPE_CLI_DATA) {
|
} else if (flags == TXT_TYPE_CLI_DATA) {
|
||||||
|
char *text = (char *)&data[5];
|
||||||
|
onCommandDataRecv(from, packet, sender_timestamp, text); // let UI know
|
||||||
|
// NOTE: no ack expected for CLI_DATA replies
|
||||||
|
} else if (flags == TXT_TYPE_CLI_COMMAND) {
|
||||||
uint8_t temp[166];
|
uint8_t temp[166];
|
||||||
char *command = (char *)&data[5];
|
char *command = (char *)&data[5];
|
||||||
char *reply = (char *)&temp[5];
|
char *reply = (char *)&temp[5];
|
||||||
*reply = 0;
|
*reply = 0;
|
||||||
|
|
||||||
onCommandDataRecv(from, packet, sender_timestamp, command, reply); // let UI know
|
onCLICommandRecv(from, packet, sender_timestamp, command, reply); // let UI know
|
||||||
// NOTE: no ack expected for CLI_DATA replies
|
// NOTE: no ack expected for CLI_COMMAND replies
|
||||||
|
|
||||||
int text_len = strlen(reply);
|
int text_len = strlen(reply);
|
||||||
if (text_len > 0) {
|
if (text_len > 0) {
|
||||||
|
|||||||
@@ -113,7 +113,8 @@ protected:
|
|||||||
virtual void onContactPathUpdated(const ContactInfo& contact) = 0;
|
virtual void onContactPathUpdated(const ContactInfo& contact) = 0;
|
||||||
virtual bool onContactPathRecv(ContactInfo& from, uint8_t* in_path, uint8_t in_path_len, uint8_t* out_path, uint8_t out_path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len);
|
virtual bool onContactPathRecv(ContactInfo& from, uint8_t* in_path, uint8_t in_path_len, uint8_t* out_path, uint8_t out_path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len);
|
||||||
virtual void onMessageRecv(const ContactInfo& contact, mesh::Packet* pkt, uint32_t sender_timestamp, const char *text) = 0;
|
virtual void onMessageRecv(const ContactInfo& contact, mesh::Packet* pkt, uint32_t sender_timestamp, const char *text) = 0;
|
||||||
virtual void onCommandDataRecv(const ContactInfo& contact, mesh::Packet* pkt, uint32_t sender_timestamp, const char *text, char* reply) = 0;
|
virtual void onCommandDataRecv(const ContactInfo& contact, mesh::Packet* pkt, uint32_t sender_timestamp, const char *text) = 0;
|
||||||
|
virtual void onCLICommandRecv(const ContactInfo& contact, mesh::Packet* pkt, uint32_t sender_timestamp, const char *text, char* reply) = 0;
|
||||||
virtual void onSignedMessageRecv(const ContactInfo& contact, mesh::Packet* pkt, uint32_t sender_timestamp, const uint8_t *sender_prefix, const char *text) = 0;
|
virtual void onSignedMessageRecv(const ContactInfo& contact, mesh::Packet* pkt, uint32_t sender_timestamp, const uint8_t *sender_prefix, const char *text) = 0;
|
||||||
virtual uint32_t calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis) const = 0;
|
virtual uint32_t calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis) const = 0;
|
||||||
virtual uint32_t calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t path_len) const = 0;
|
virtual uint32_t calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t path_len) const = 0;
|
||||||
|
|||||||
@@ -4,8 +4,10 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define TXT_TYPE_PLAIN 0 // a plain text message
|
#define TXT_TYPE_PLAIN 0 // a plain text message
|
||||||
#define TXT_TYPE_CLI_DATA 1 // a CLI command
|
#define TXT_TYPE_CLI_DATA 1 // a CLI command -or- reply
|
||||||
#define TXT_TYPE_SIGNED_PLAIN 2 // plain text, signed by sender
|
#define TXT_TYPE_SIGNED_PLAIN 2 // plain text, signed by sender
|
||||||
|
#define TXT_TYPE_CLI_COMMAND 3 // a CLI command (explictly)
|
||||||
|
|
||||||
#define DATA_TYPE_RESERVED 0x0000 // reserved for future use
|
#define DATA_TYPE_RESERVED 0x0000 // reserved for future use
|
||||||
#define DATA_TYPE_DEV 0xFFFF // developer namespace for experimenting with group/channel datagrams and building apps
|
#define DATA_TYPE_DEV 0xFFFF // developer namespace for experimenting with group/channel datagrams and building apps
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user