class

MeshCoreTCPMux::Protocol

Inherits Reference < Object

Namespace for the TCP multiplexer: transport, protocol validation, and per-client state.

Constants

CMD_ADD_UPDATE_CONTACT = 9_u8
CMD_APP_START = 1_u8
CMD_DEVICE_QUERY = 22_u8
CMD_EXPORT_CONTACT = 17_u8
CMD_EXPORT_PRIVATE_KEY = 23_u8
CMD_FACTORY_RESET = 51_u8
CMD_GET_ADVERT_PATH = 42_u8
CMD_GET_ALLOWED_REPEAT_FREQ = 60_u8
CMD_GET_AUTOADD_CONFIG = 59_u8
CMD_GET_BATT_AND_STORAGE = 20_u8
CMD_GET_CHANNEL = 31_u8
CMD_GET_CONTACT_BY_KEY = 30_u8
CMD_GET_CONTACTS = 4_u8
CMD_GET_CUSTOM_VARS = 40_u8
CMD_GET_DEFAULT_FLOOD_SCOPE = 64_u8
CMD_GET_DEVICE_TIME = 5_u8
CMD_GET_STATS = 56_u8
CMD_GET_TUNING_PARAMS = 43_u8
CMD_HAS_CONNECTION = 28_u8
CMD_IMPORT_CONTACT = 18_u8
CMD_IMPORT_PRIVATE_KEY = 24_u8
CMD_LOGOUT = 29_u8
CMD_REBOOT = 19_u8
CMD_REMOVE_CONTACT = 15_u8
CMD_RESET_PATH = 13_u8
CMD_RUN_CLI_COMMAND = 66_u8
CMD_SEND_ANON_REQ = 57_u8
CMD_SEND_BINARY_REQ = 50_u8
CMD_SEND_CHANNEL_DATA = 62_u8
CMD_SEND_CHANNEL_TXT_MSG = 3_u8
CMD_SEND_CONTROL_DATA = 55_u8
CMD_SEND_LOGIN = 26_u8
CMD_SEND_PATH_DISCOVERY_REQ = 52_u8
CMD_SEND_RAW_DATA = 25_u8
CMD_SEND_RAW_PACKET = 65_u8
CMD_SEND_SELF_ADVERT = 7_u8
CMD_SEND_STATUS_REQ = 27_u8
CMD_SEND_TELEMETRY_REQ = 39_u8
CMD_SEND_TRACE_PATH = 36_u8
CMD_SEND_TXT_MSG = 2_u8
CMD_SET_ADVERT_LATLON = 14_u8
CMD_SET_ADVERT_NAME = 8_u8
CMD_SET_AUTOADD_CONFIG = 58_u8
CMD_SET_CHANNEL = 32_u8
CMD_SET_CUSTOM_VAR = 41_u8
CMD_SET_DEFAULT_FLOOD_SCOPE = 63_u8
CMD_SET_DEVICE_PIN = 37_u8
CMD_SET_DEVICE_TIME = 6_u8
CMD_SET_FLOOD_SCOPE_KEY = 54_u8
CMD_SET_OTHER_PARAMS = 38_u8
CMD_SET_PATH_HASH_MODE = 61_u8
CMD_SET_RADIO_PARAMS = 11_u8
CMD_SET_RADIO_TX_POWER = 12_u8
CMD_SET_TUNING_PARAMS = 21_u8
CMD_SHARE_CONTACT = 16_u8
CMD_SIGN_DATA = 34_u8
CMD_SIGN_FINISH = 35_u8
CMD_SIGN_START = 33_u8
CMD_SYNC_NEXT_MESSAGE = 10_u8
DESCRIPTORS = {CMD_APP_START => d(CMD_APP_START, :app_start, Grammar::Single, [RESP_SELF_INFO]), CMD_SEND_TXT_MSG => d(CMD_SEND_TXT_MSG, :send_txt_msg, Grammar::Single, [RESP_SENT], CommandFlags::ScopeSend), CMD_SEND_CHANNEL_TXT_MSG => d(CMD_SEND_CHANNEL_TXT_MSG, :send_channel_txt_msg, Grammar::Single, [RESP_OK], CommandFlags::ScopeSend), CMD_GET_CONTACTS => d(CMD_GET_CONTACTS, :get_contacts, Grammar::Contacts, [RESP_CONTACTS_START, RESP_CONTACT, RESP_END_OF_CONTACTS]), CMD_GET_DEVICE_TIME => d(CMD_GET_DEVICE_TIME, :get_device_time, Grammar::Single, [RESP_CURRENT_TIME]), CMD_SET_DEVICE_TIME => d(CMD_SET_DEVICE_TIME, :set_device_time, Grammar::Single, [RESP_OK]), CMD_SEND_SELF_ADVERT => d(CMD_SEND_SELF_ADVERT, :send_self_advert, Grammar::Single, [RESP_OK]), CMD_SET_ADVERT_NAME => d(CMD_SET_ADVERT_NAME, :set_advert_name, Grammar::Single, [RESP_OK]), CMD_ADD_UPDATE_CONTACT => d(CMD_ADD_UPDATE_CONTACT, :add_update_contact, Grammar::Single, [RESP_OK]), CMD_SYNC_NEXT_MESSAGE => d(CMD_SYNC_NEXT_MESSAGE, :sync_next_message, Grammar::Inbox, [RESP_CONTACT_MESSAGE, RESP_CHANNEL_MESSAGE, RESP_NO_MORE_MESSAGES, RESP_CONTACT_MESSAGE_V3, RESP_CHANNEL_MESSAGE_V3, RESP_CHANNEL_DATA]), CMD_SET_RADIO_PARAMS => d(CMD_SET_RADIO_PARAMS, :set_radio_params, Grammar::Single, [RESP_OK]), CMD_SET_RADIO_TX_POWER => d(CMD_SET_RADIO_TX_POWER, :set_radio_tx_power, Grammar::Single, [RESP_OK]), CMD_RESET_PATH => d(CMD_RESET_PATH, :reset_path, Grammar::Single, [RESP_OK]), CMD_SET_ADVERT_LATLON => d(CMD_SET_ADVERT_LATLON, :set_advert_latlon, Grammar::Single, [RESP_OK]), CMD_REMOVE_CONTACT => d(CMD_REMOVE_CONTACT, :remove_contact, Grammar::Single, [RESP_OK]), CMD_SHARE_CONTACT => d(CMD_SHARE_CONTACT, :share_contact, Grammar::Single, [RESP_OK]), CMD_EXPORT_CONTACT => d(CMD_EXPORT_CONTACT, :export_contact, Grammar::Single, [RESP_EXPORT_CONTACT]), CMD_IMPORT_CONTACT => d(CMD_IMPORT_CONTACT, :import_contact, Grammar::Single, [RESP_OK]), CMD_REBOOT => d(CMD_REBOOT, :reboot, Grammar::Disconnecting, Array(UInt8).new, CommandFlags::Maintenance), CMD_GET_BATT_AND_STORAGE => d(CMD_GET_BATT_AND_STORAGE, :get_batt_and_storage, Grammar::Single, [RESP_BATTERY_AND_STORAGE]), CMD_SET_TUNING_PARAMS => d(CMD_SET_TUNING_PARAMS, :set_tuning_params, Grammar::Single, [RESP_OK]), CMD_DEVICE_QUERY => d(CMD_DEVICE_QUERY, :device_query, Grammar::Single, [RESP_DEVICE_INFO]), CMD_EXPORT_PRIVATE_KEY => d(CMD_EXPORT_PRIVATE_KEY, :export_private_key, Grammar::Single, [RESP_PRIVATE_KEY, RESP_DISABLED]), CMD_IMPORT_PRIVATE_KEY => d(CMD_IMPORT_PRIVATE_KEY, :import_private_key, Grammar::Single, [RESP_OK, RESP_DISABLED], CommandFlags::Maintenance), CMD_SEND_RAW_DATA => d(CMD_SEND_RAW_DATA, :send_raw_data, Grammar::Single, [RESP_OK]), CMD_SEND_LOGIN => d(CMD_SEND_LOGIN, :send_login, Grammar::Single, [RESP_SENT], CommandFlags::RemoteLease | CommandFlags::ScopeSend), CMD_SEND_STATUS_REQ => d(CMD_SEND_STATUS_REQ, :send_status_req, Grammar::Single, [RESP_SENT], CommandFlags::RemoteLease | CommandFlags::ScopeSend), CMD_HAS_CONNECTION => d(CMD_HAS_CONNECTION, :has_connection, Grammar::Single, [RESP_OK]), CMD_LOGOUT => d(CMD_LOGOUT, :logout, Grammar::Single, [RESP_OK]), CMD_GET_CONTACT_BY_KEY => d(CMD_GET_CONTACT_BY_KEY, :get_contact_by_key, Grammar::Single, [RESP_CONTACT]), CMD_GET_CHANNEL => d(CMD_GET_CHANNEL, :get_channel, Grammar::Single, [RESP_CHANNEL_INFO], CommandFlags::VerifyIndex), CMD_SET_CHANNEL => d(CMD_SET_CHANNEL, :set_channel, Grammar::Single, [RESP_OK]), CMD_SIGN_START => d(CMD_SIGN_START, :sign_start, Grammar::Single, [RESP_SIGN_START], CommandFlags::Signing), CMD_SIGN_DATA => d(CMD_SIGN_DATA, :sign_data, Grammar::Single, [RESP_OK], CommandFlags::Signing), CMD_SIGN_FINISH => d(CMD_SIGN_FINISH, :sign_finish, Grammar::Single, [RESP_SIGNATURE], CommandFlags::Signing), CMD_SEND_TRACE_PATH => d(CMD_SEND_TRACE_PATH, :send_trace_path, Grammar::Single, [RESP_SENT], CommandFlags::RemoteLease), CMD_SET_DEVICE_PIN => d(CMD_SET_DEVICE_PIN, :set_device_pin, Grammar::Single, [RESP_OK]), CMD_SET_OTHER_PARAMS => d(CMD_SET_OTHER_PARAMS, :set_other_params, Grammar::Single, [RESP_OK]), CMD_SEND_TELEMETRY_REQ => d(CMD_SEND_TELEMETRY_REQ, :send_telemetry_req, Grammar::SelfTelemetry, [PUSH_TELEMETRY_RESPONSE]), CMD_GET_CUSTOM_VARS => d(CMD_GET_CUSTOM_VARS, :get_custom_vars, Grammar::Single, [RESP_CUSTOM_VARS]), CMD_SET_CUSTOM_VAR => d(CMD_SET_CUSTOM_VAR, :set_custom_var, Grammar::Single, [RESP_OK]), CMD_GET_ADVERT_PATH => d(CMD_GET_ADVERT_PATH, :get_advert_path, Grammar::Single, [RESP_ADVERT_PATH]), CMD_GET_TUNING_PARAMS => d(CMD_GET_TUNING_PARAMS, :get_tuning_params, Grammar::Single, [RESP_TUNING_PARAMS]), CMD_SEND_BINARY_REQ => d(CMD_SEND_BINARY_REQ, :send_binary_req, Grammar::Single, [RESP_SENT], CommandFlags::RemoteLease | CommandFlags::ScopeSend), CMD_FACTORY_RESET => d(CMD_FACTORY_RESET, :factory_reset, Grammar::Disconnecting, [RESP_OK], CommandFlags::Maintenance), CMD_SEND_PATH_DISCOVERY_REQ => d(CMD_SEND_PATH_DISCOVERY_REQ, :send_path_discovery_req, Grammar::Single, [RESP_SENT], CommandFlags::RemoteLease | CommandFlags::ScopeSend), CMD_SET_FLOOD_SCOPE_KEY => d(CMD_SET_FLOOD_SCOPE_KEY, :set_flood_scope_key, Grammar::Single, [RESP_OK]), CMD_SEND_CONTROL_DATA => d(CMD_SEND_CONTROL_DATA, :send_control_data, Grammar::Single, [RESP_OK]), CMD_GET_STATS => d(CMD_GET_STATS, :get_stats, Grammar::Single, [RESP_STATS], CommandFlags::VerifySubtype), CMD_SEND_ANON_REQ => d(CMD_SEND_ANON_REQ, :send_anon_req, Grammar::Single, [RESP_SENT], CommandFlags::RemoteLease | CommandFlags::ScopeSend), CMD_SET_AUTOADD_CONFIG => d(CMD_SET_AUTOADD_CONFIG, :set_autoadd_config, Grammar::Single, [RESP_OK]), CMD_GET_AUTOADD_CONFIG => d(CMD_GET_AUTOADD_CONFIG, :get_autoadd_config, Grammar::Single, [RESP_AUTOADD_CONFIG]), CMD_GET_ALLOWED_REPEAT_FREQ => d(CMD_GET_ALLOWED_REPEAT_FREQ, :get_allowed_repeat_freq, Grammar::Single, [RESP_ALLOWED_REPEAT_FREQ]), CMD_SET_PATH_HASH_MODE => d(CMD_SET_PATH_HASH_MODE, :set_path_hash_mode, Grammar::Single, [RESP_OK]), CMD_SEND_CHANNEL_DATA => d(CMD_SEND_CHANNEL_DATA, :send_channel_data, Grammar::Single, [RESP_OK], CommandFlags::ScopeSend), CMD_SET_DEFAULT_FLOOD_SCOPE => d(CMD_SET_DEFAULT_FLOOD_SCOPE, :set_default_flood_scope, Grammar::Single, [RESP_OK]), CMD_GET_DEFAULT_FLOOD_SCOPE => d(CMD_GET_DEFAULT_FLOOD_SCOPE, :get_default_flood_scope, Grammar::Single, [RESP_DEFAULT_FLOOD_SCOPE]), CMD_SEND_RAW_PACKET => d(CMD_SEND_RAW_PACKET, :send_raw_packet, Grammar::Single, [RESP_OK]), CMD_RUN_CLI_COMMAND => d(CMD_RUN_CLI_COMMAND, :run_cli_command, Grammar::Single, [RESP_CLI_REPLY])}
DEVICE_INFO_SIZE = 82
ERR_BAD_STATE = 4_u8
ERR_ILLEGAL_ARG = 6_u8
ERR_TABLE_FULL = 3_u8
ERR_UNSUPPORTED_CMD = 1_u8
MAX_EXPOSED_PROTOCOL_LEVEL = 14_u8
MAX_PATH_SIZE = 64
MAX_PAYLOAD = 176

Describes the supported native companion wire protocol. The broker uses these rules to reject malformed commands and recognize complete, correctly owned replies. The known v14 dialect caps decoded payloads at 176 bytes and ordinary encoded paths at 64 bytes.

MIN_SUPPORTED_UPSTREAM_PROTOCOL_LEVEL = 13_u8
NO_PATH_ENCODING = 255_u8
PATH_COUNT_MASK = 63_u8
PATH_WIDTH_SHIFT_MASK = 3_u8
PUSH_ADVERT = 128_u8
PUSH_BINARY_RESPONSE = 140_u8
PUSH_CONTACT_DELETED = 143_u8
PUSH_CONTACTS_FULL = 144_u8
PUSH_CONTROL_DATA = 142_u8
PUSH_LOG_RX_DATA = 136_u8
PUSH_LOGIN_FAILURE = 134_u8
PUSH_LOGIN_SUCCESS = 133_u8
PUSH_MSG_WAITING = 131_u8
PUSH_NEW_ADVERT = 138_u8
PUSH_PATH_DISCOVERY_RESPONSE = 141_u8
PUSH_PATH_UPDATED = 129_u8
PUSH_RAW_DATA = 132_u8
PUSH_SEND_CONFIRMED = 130_u8
PUSH_STATUS_RESPONSE = 135_u8
PUSH_TELEMETRY_RESPONSE = 139_u8
PUSH_TRACE_DATA = 137_u8
RESP_ADVERT_PATH = 22_u8
RESP_ALLOWED_REPEAT_FREQ = 26_u8
RESP_AUTOADD_CONFIG = 25_u8
RESP_BATTERY_AND_STORAGE = 12_u8
RESP_CHANNEL_DATA = 27_u8
RESP_CHANNEL_INFO = 18_u8
RESP_CHANNEL_MESSAGE = 8_u8
RESP_CHANNEL_MESSAGE_V3 = 17_u8
RESP_CLI_REPLY = 29_u8
RESP_CONTACT = 3_u8
RESP_CONTACT_MESSAGE = 7_u8
RESP_CONTACT_MESSAGE_V3 = 16_u8
RESP_CONTACTS_START = 2_u8
RESP_CURRENT_TIME = 9_u8
RESP_CUSTOM_VARS = 21_u8
RESP_DEFAULT_FLOOD_SCOPE = 28_u8
RESP_DEVICE_INFO = 13_u8
RESP_DISABLED = 15_u8
RESP_END_OF_CONTACTS = 4_u8
RESP_ERR = 1_u8
RESP_EXPORT_CONTACT = 11_u8
RESP_NO_MORE_MESSAGES = 10_u8
RESP_OK = 0_u8
RESP_PRIVATE_KEY = 14_u8
RESP_SELF_INFO = 5_u8
RESP_SENT = 6_u8
RESP_SIGN_START = 19_u8
RESP_SIGNATURE = 20_u8
RESP_STATS = 24_u8
RESP_TUNING_PARAMS = 23_u8
RESPONSE_NAMES = {RESP_OK => "ok", RESP_ERR => "err", RESP_CONTACTS_START => "contacts_start", RESP_CONTACT => "contact", RESP_END_OF_CONTACTS => "end_of_contacts", RESP_SELF_INFO => "self_info", RESP_SENT => "sent", RESP_CONTACT_MESSAGE => "contact_message", RESP_CHANNEL_MESSAGE => "channel_message", RESP_CURRENT_TIME => "current_time", RESP_NO_MORE_MESSAGES => "no_more_messages", RESP_EXPORT_CONTACT => "export_contact", RESP_BATTERY_AND_STORAGE => "battery_and_storage", RESP_DEVICE_INFO => "device_info", RESP_PRIVATE_KEY => "private_key", RESP_DISABLED => "disabled", RESP_CONTACT_MESSAGE_V3 => "contact_message_v3", RESP_CHANNEL_MESSAGE_V3 => "channel_message_v3", RESP_CHANNEL_INFO => "channel_info", RESP_SIGN_START => "sign_start", RESP_SIGNATURE => "signature", RESP_CUSTOM_VARS => "custom_vars", RESP_ADVERT_PATH => "advert_path", RESP_TUNING_PARAMS => "tuning_params", RESP_STATS => "stats", RESP_AUTOADD_CONFIG => "autoadd_config", RESP_ALLOWED_REPEAT_FREQ => "allowed_repeat_freq", RESP_CHANNEL_DATA => "channel_data", RESP_DEFAULT_FLOOD_SCOPE => "default_flood_scope", RESP_CLI_REPLY => "cli_reply", PUSH_ADVERT => "advert", PUSH_PATH_UPDATED => "path_updated", PUSH_SEND_CONFIRMED => "send_confirmed", PUSH_MSG_WAITING => "msg_waiting", PUSH_RAW_DATA => "raw_data", PUSH_LOGIN_SUCCESS => "login_success", PUSH_LOGIN_FAILURE => "login_failure", PUSH_STATUS_RESPONSE => "status_response", PUSH_LOG_RX_DATA => "log_rx_data", PUSH_TRACE_DATA => "trace_data", PUSH_NEW_ADVERT => "new_advert", PUSH_TELEMETRY_RESPONSE => "telemetry_response", PUSH_BINARY_RESPONSE => "binary_response", PUSH_PATH_DISCOVERY_RESPONSE => "path_discovery_response", PUSH_CONTROL_DATA => "control_data", PUSH_CONTACT_DELETED => "contact_deleted", PUSH_CONTACTS_FULL => "contacts_full"}
STATS_TYPE_CORE = 0_u8
STATS_TYPE_PACKET = 2_u8
STATS_TYPE_RADIO = 1_u8
UPSTREAM_APP_TARGET = 14_u8

App target selects response formats; firmware level independently describes features.

Class methods

app_start_payload(app_name : String, reserved : Bytes = Bytes.new(7, 0_u8)) : Bytes
Source
describe_command(payload : Bytes, include_payload = false) : String
Source
describe_response(payload : Bytes, include_payload = false) : String
Source
descriptor(payload : Bytes) : CommandDescriptor | Nil
Source
device_query_payload(target : UInt8 = UPSTREAM_APP_TARGET) : Bytes
Source
downgrade_inbox(payload : Bytes, target_version : UInt8) : Bytes
Source
downstream_device_info(payload : Bytes) : Bytes
Source
hex(bytes : Bytes) : String
Source
known_response?(code : UInt8) : Bool
Source
normalize_device_query(payload : Bytes, target : UInt8 = UPSTREAM_APP_TARGET) : Bytes
Source
plain_dm?(payload : Bytes) : Bool
Source
received_text_message_identity(payload : Bytes) : String | Nil
Source
response_name(code : UInt8) : String
Source
validate_command(payload : Bytes) : ValidationResult
Source
validate_device_info!(payload : Bytes) : UInt8
Source
validate_response!(descriptor : CommandDescriptor, payload : Bytes, command : Bytes | Nil = nil, phase : Int32 = 0) : ResponseDisposition
Source
validate_response_shape!(p : Bytes) : Nil
Source
validate_self_info!(payload : Bytes) : Bytes
Source

Nested types