Module: Meshtastic
- Defined in:
- lib/meshtastic.rb,
lib/meshtastic/atak.rb,
lib/meshtastic/mesh.rb,
lib/meshtastic/mqtt.rb,
lib/meshtastic/admin.rb,
lib/meshtastic/rtttl.rb,
lib/meshtastic/config.rb,
lib/meshtastic/xmodem.rb,
lib/meshtastic/apponly.rb,
lib/meshtastic/atak_pb.rb,
lib/meshtastic/channel.rb,
lib/meshtastic/mesh_pb.rb,
lib/meshtastic/mqtt_pb.rb,
lib/meshtastic/version.rb,
lib/meshtastic/admin_pb.rb,
lib/meshtastic/paxcount.rb,
lib/meshtastic/portnums.rb,
lib/meshtastic/rtttl_pb.rb,
lib/meshtastic/config_pb.rb,
lib/meshtastic/localonly.rb,
lib/meshtastic/telemetry.rb,
lib/meshtastic/xmodem_pb.rb,
lib/meshtastic/apponly_pb.rb,
lib/meshtastic/channel_pb.rb,
lib/meshtastic/clientonly.rb,
lib/meshtastic/deviceonly.rb,
lib/meshtastic/paxcount_pb.rb,
lib/meshtastic/portnums_pb.rb,
lib/meshtastic/localonly_pb.rb,
lib/meshtastic/storeforward.rb,
lib/meshtastic/telemetry_pb.rb,
lib/meshtastic/clientonly_pb.rb,
lib/meshtastic/deviceonly_pb.rb,
lib/meshtastic/module_config.rb,
lib/meshtastic/cannedmessages.rb,
lib/meshtastic/remote_hardware.rb,
lib/meshtastic/storeforward_pb.rb,
lib/meshtastic/module_config_pb.rb,
lib/meshtastic/cannedmessages_pb.rb,
lib/meshtastic/connection_status.rb,
lib/meshtastic/remote_hardware_pb.rb,
lib/meshtastic/connection_status_pb.rb
Overview
Plugin used to interact with Meshtastic nodes
Defined Under Namespace
Modules: ATAK, Admin, Apponly, Cannedmessages, Channel, Clientonly, Config, ConnectionStatus, Deviceonly, Localonly, MQTT, Mesh, ModuleConfig, Paxcount, Portnums, RTTTL, RemoteHardware, Storeforward, Telemetry, Xmodem
Constant Summary collapse
- TAKPacket =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.TAKPacket").msgclass
- GeoChat =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.GeoChat").msgclass
- Group =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.Group").msgclass
- Status =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.Status").msgclass
- Contact =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.Contact").msgclass
- PLI =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.PLI").msgclass
- Team =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.Team").enummodule
- MemberRole =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.MemberRole").enummodule
- Position =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.Position").msgclass
- User =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.User").msgclass
- RouteDiscovery =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.RouteDiscovery").msgclass
- Routing =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.Routing").msgclass
- Data =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.Data").msgclass
- Waypoint =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.Waypoint").msgclass
- MqttClientProxyMessage =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.MqttClientProxyMessage").msgclass
- MeshPacket =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.MeshPacket").msgclass
- NodeInfo =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.NodeInfo").msgclass
- MyNodeInfo =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.MyNodeInfo").msgclass
- LogRecord =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.LogRecord").msgclass
- QueueStatus =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.QueueStatus").msgclass
- FromRadio =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.FromRadio").msgclass
- ToRadio =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.ToRadio").msgclass
- Compressed =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.Compressed").msgclass
- NeighborInfo =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.NeighborInfo").msgclass
- Neighbor =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.Neighbor").msgclass
- DeviceMetadata =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.DeviceMetadata").msgclass
- Heartbeat =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.Heartbeat").msgclass
- NodeRemoteHardwarePin =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.NodeRemoteHardwarePin").msgclass
- HardwareModel =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.HardwareModel").enummodule
- Constants =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.Constants").enummodule
- CriticalErrorCode =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.CriticalErrorCode").enummodule
- ServiceEnvelope =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.ServiceEnvelope").msgclass
- MapReport =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.MapReport").msgclass
- VERSION =
'0.0.53'- AdminMessage =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.AdminMessage").msgclass
- HamParameters =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.HamParameters").msgclass
- NodeRemoteHardwarePinsResponse =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.NodeRemoteHardwarePinsResponse").msgclass
- RTTTLConfig =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.RTTTLConfig").msgclass
- XModem =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.XModem").msgclass
- ChannelSet =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.ChannelSet").msgclass
- ChannelSettings =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.ChannelSettings").msgclass
- ModuleSettings =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.ModuleSettings").msgclass
- PortNum =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.PortNum").enummodule
- LocalConfig =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.LocalConfig").msgclass
- LocalModuleConfig =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.LocalModuleConfig").msgclass
- DeviceMetrics =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.DeviceMetrics").msgclass
- EnvironmentMetrics =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.EnvironmentMetrics").msgclass
- PowerMetrics =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.PowerMetrics").msgclass
- AirQualityMetrics =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.AirQualityMetrics").msgclass
- TelemetrySensorType =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.TelemetrySensorType").enummodule
- DeviceProfile =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.DeviceProfile").msgclass
- PositionLite =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.PositionLite").msgclass
- NodeInfoLite =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.NodeInfoLite").msgclass
- DeviceState =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.DeviceState").msgclass
- ChannelFile =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.ChannelFile").msgclass
- OEMStore =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.OEMStore").msgclass
- ScreenFonts =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.ScreenFonts").enummodule
- StoreAndForward =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.StoreAndForward").msgclass
- RemoteHardwarePin =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.RemoteHardwarePin").msgclass
- RemoteHardwarePinType =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.RemoteHardwarePinType").enummodule
- CannedMessageModuleConfig =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.CannedMessageModuleConfig").msgclass
- HardwareMessage =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.HardwareMessage").msgclass
- DeviceConnectionStatus =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.DeviceConnectionStatus").msgclass
- WifiConnectionStatus =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.WifiConnectionStatus").msgclass
- EthernetConnectionStatus =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.EthernetConnectionStatus").msgclass
- NetworkConnectionStatus =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.NetworkConnectionStatus").msgclass
- BluetoothConnectionStatus =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.BluetoothConnectionStatus").msgclass
- SerialConnectionStatus =
::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.SerialConnectionStatus").msgclass
Class Method Summary collapse
-
.authors ⇒ Object
- Author(s)
-
0day Inc.
-
.generate_packet_id(opts = {}) ⇒ Object
- Supported Method Parameters
-
packet_id = Meshtastic.generate_packet_id( last_packet_id: ‘optional - Last Packet ID (Default: 0)’ ).
-
.help ⇒ Object
Display a List of Every Meshtastic Module.
-
.send_data(opts = {}) ⇒ Object
- Supported Method Parameters
-
Meshtastic.send_data( from: ‘required - From ID (String or Integer)’, to: ‘optional - Destination ID (Default: 0xFFFFFFFF)’, channel: ‘optional - Channel ID (Default: 0)’, data: ‘required - Data to Send’, want_ack: ‘optional - Want Acknowledgement (Default: false)’, hop_limit: ‘optional - Hop Limit (Default: 3)’, port_num: ‘optional - (Default: Meshtastic::PortNum::PRIVATE_APP)’, psks: ‘optional - hash of :channel => psk key value pairs (default: { LongFast: “AQ==” })’ ).
-
.send_packet(opts = {}) ⇒ Object
- Supported Method Parameters
-
Meshtastic.send_packet( mesh_packet: ‘required - Mesh Packet to Send’, from: ‘required - From ID (String or Integer)’, to: ‘optional - Destination ID (Default: 0xFFFFFFFF)’, channel: ‘optional - Channel ID (Default: 0)’, want_ack: ‘optional - Want Acknowledgement (Default: false)’, hop_limit: ‘optional - Hop Limit (Default: 3)’, psks: ‘optional - hash of :channel => psk key value pairs (default: { LongFast: “AQ==” })’ ).
-
.send_text(opts = {}) ⇒ Object
- Supported Method Parameters
-
Meshtastic.send_text( from: ‘required - From ID (String or Integer)’, to: ‘optional - Destination ID (Default: 0xFFFFFFFF)’, channel: ‘optional - Channel ID (Default: 0)’, text: ‘optional - Text Message (Default: SYN)’, want_ack: ‘optional - Want Acknowledgement (Default: false)’, want_response: ‘optional - Want Response (Default: false)’, hop_limit: ‘optional - Hop Limit (Default: 3)’, on_response: ‘optional - Callback on Response’, psks: ‘optional - hash of :channel => psk key value pairs (default: { LongFast: “AQ==” })’ ).
-
.send_to_radio(opts = {}) ⇒ Object
- Supported Method Parameters
-
Meshtastic.send_to_radio( to_radio: ‘required - ToRadio Message to Send’ ).
Class Method Details
.authors ⇒ Object
- Author(s)
-
0day Inc. <support@0dayinc.com>
270 271 272 273 274 |
# File 'lib/meshtastic.rb', line 270 public_class_method def self. "AUTHOR(S): 0day Inc. <support@0dayinc.com> " end |
.generate_packet_id(opts = {}) ⇒ Object
- Supported Method Parameters
-
packet_id = Meshtastic.generate_packet_id(
last_packet_id: 'optional - Last Packet ID (Default: 0)')
247 248 249 250 251 252 |
# File 'lib/meshtastic.rb', line 247 public_class_method def self.generate_packet_id(opts = {}) last_packet_id = opts[:last_packet_id] ||= 0 last_packet_id = 0 if last_packet_id.negative? (last_packet_id + 1) & 0xffffffff end |
.help ⇒ Object
Display a List of Every Meshtastic Module
278 279 280 |
# File 'lib/meshtastic.rb', line 278 public_class_method def self.help constants.sort end |
.send_data(opts = {}) ⇒ Object
- Supported Method Parameters
-
Meshtastic.send_data(
from: 'required - From ID (String or Integer)', to: 'optional - Destination ID (Default: 0xFFFFFFFF)', channel: 'optional - Channel ID (Default: 0)', data: 'required - Data to Send', want_ack: 'optional - Want Acknowledgement (Default: false)', hop_limit: 'optional - Hop Limit (Default: 3)', port_num: 'optional - (Default: Meshtastic::PortNum::PRIVATE_APP)', psks: 'optional - hash of :channel => psk key value pairs (default: { LongFast: "AQ==" })')
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
# File 'lib/meshtastic.rb', line 127 public_class_method def self.send_data(opts = {}) # Send a text message to a node from = opts[:from] from_hex = from.delete('!').bytes.map { |b| b.to_s(16).rjust(2, '0') }.join if from.is_a?(String) from = from_hex.to_i(16) if from_hex raise 'ERROR: from parameter is required.' unless from to = opts[:to] ||= 0xFFFFFFFF to_hex = to.delete('!').bytes.map { |b| b.to_s(16).rjust(2, '0') }.join if to.is_a?(String) to = to_hex.to_i(16) if to_hex channel = opts[:channel] ||= 0 data = opts[:data] want_ack = opts[:want_ack] ||= false hop_limit = opts[:hop_limit] ||= 3 port_num = opts[:port_num] ||= Meshtastic::PortNum::PRIVATE_APP max_port_num = Meshtastic::PortNum::MAX raise "ERROR: Invalid port_num" unless port_num.positive? && port_num < max_port_num public_psk = '1PG7OiApB1nwvP+rz05pAQ==' psks = opts[:psks] ||= { LongFast: public_psk } raise 'ERROR: psks parameter must be a hash of :channel => psk key value pairs' unless psks.is_a?(Hash) psks[:LongFast] = public_psk if psks[:LongFast] == 'AQ==' data_len = data.payload.length max_len = Meshtastic::Constants::DATA_PAYLOAD_LEN raise "ERROR: Data Length > #{max_len} Bytes" if data_len > max_len mesh_packet = Meshtastic::MeshPacket.new mesh_packet.decoded = data send_packet( mesh_packet: mesh_packet, from: from, to: to, channel: channel, want_ack: want_ack, hop_limit: hop_limit, psks: psks ) rescue StandardError => e raise e end |
.send_packet(opts = {}) ⇒ Object
- Supported Method Parameters
-
Meshtastic.send_packet(
mesh_packet: 'required - Mesh Packet to Send', from: 'required - From ID (String or Integer)', to: 'optional - Destination ID (Default: 0xFFFFFFFF)', channel: 'optional - Channel ID (Default: 0)', want_ack: 'optional - Want Acknowledgement (Default: false)', hop_limit: 'optional - Hop Limit (Default: 3)', psks: 'optional - hash of :channel => psk key value pairs (default: { LongFast: "AQ==" })')
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 |
# File 'lib/meshtastic.rb', line 182 public_class_method def self.send_packet(opts = {}) mesh_packet = opts[:mesh_packet] from = opts[:from] from_hex = from.delete('!').bytes.map { |b| b.to_s(16).rjust(2, '0') }.join if from.is_a?(String) from = from_hex.to_i(16) if from_hex raise 'ERROR: from parameter is required.' unless from to = opts[:to] ||= 0xFFFFFFFF to_hex = to.delete('!').bytes.map { |b| b.to_s(16).rjust(2, '0') }.join if to.is_a?(String) to = to_hex.to_i(16) if to_hex channel = opts[:channel] ||= 0 want_ack = opts[:want_ack] ||= false hop_limit = opts[:hop_limit] ||= 3 public_psk = '1PG7OiApB1nwvP+rz05pAQ==' psks = opts[:psks] ||= { LongFast: public_psk } raise 'ERROR: psks parameter must be a hash of :channel => psk key value pairs' unless psks.is_a?(Hash) psks[:LongFast] = public_psk if psks[:LongFast] == 'AQ==' # my_info = Meshtastic::FromRadio.my_info # wait_connected if to != my_info.my_node_num && my_info.is_a(Meshtastic::Deviceonly::MyInfo) mesh_packet.from = from mesh_packet.to = to mesh_packet.channel = channel mesh_packet.want_ack = want_ack mesh_packet.hop_limit = hop_limit mesh_packet.id = generate_packet_id if mesh_packet.id.zero? # mesh_packet.channel_id = psks.keys.first # mesh_packet.gateway_id = "!#{from.to_s(16).downcase}" if psks nonce_packet_id = [mesh_packet.id].pack('V').ljust(8, "\x00") nonce_from_node = [from].pack('V').ljust(8, "\x00") nonce = "#{nonce_packet_id}#{nonce_from_node}".b psk = psks[psks.keys.first] dec_psk = Base64.strict_decode64(psk) cipher = OpenSSL::Cipher.new('AES-128-CTR') cipher = OpenSSL::Cipher.new('AES-256-CTR') if dec_psk.length == 32 cipher.encrypt cipher.key = dec_psk cipher.iv = nonce decrypted_payload = mesh_packet.decoded.to_proto encrypted_payload = cipher.update(decrypted_payload) + cipher.final mesh_packet.encrypted = encrypted_payload end # puts mesh_packet.to_h to_radio = Meshtastic::ToRadio.new to_radio.packet = mesh_packet send_to_radio(to_radio: to_radio) rescue StandardError => e raise e end |
.send_text(opts = {}) ⇒ Object
- Supported Method Parameters
-
Meshtastic.send_text(
from: 'required - From ID (String or Integer)', to: 'optional - Destination ID (Default: 0xFFFFFFFF)', channel: 'optional - Channel ID (Default: 0)', text: 'optional - Text Message (Default: SYN)', want_ack: 'optional - Want Acknowledgement (Default: false)', want_response: 'optional - Want Response (Default: false)', hop_limit: 'optional - Hop Limit (Default: 3)', on_response: 'optional - Callback on Response', psks: 'optional - hash of :channel => psk key value pairs (default: { LongFast: "AQ==" })')
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/meshtastic.rb', line 64 public_class_method def self.send_text(opts = {}) # Send a text message to a node from = opts[:from] from_hex = from.delete('!').bytes.map { |b| b.to_s(16).rjust(2, '0') }.join if from.is_a?(String) from = from_hex.to_i(16) if from_hex raise 'ERROR: from parameter is required.' unless from to = opts[:to] ||= 0xFFFFFFFF to_hex = to.delete('!').bytes.map { |b| b.to_s(16).rjust(2, '0') }.join if to.is_a?(String) to = to_hex.to_i(16) if to_hex channel = opts[:channel] ||= 0 text = opts[:text] ||= 'SYN' want_ack = opts[:want_ack] ||= false want_response = opts[:want_response] ||= false hop_limit = opts[:hop_limit] ||= 3 on_response = opts[:on_response] public_psk = '1PG7OiApB1nwvP+rz05pAQ==' psks = opts[:psks] ||= { LongFast: public_psk } raise 'ERROR: psks parameter must be a hash of :channel => psk key value pairs' unless psks.is_a?(Hash) psks[:LongFast] = public_psk if psks[:LongFast] == 'AQ==' # TODO: verify text length validity max_txt_len = Meshtastic::Constants::DATA_PAYLOAD_LEN raise "ERROR: Text Length > #{max_txt_len} Bytes" if text.length > max_txt_len port_num = Meshtastic::PortNum::TEXT_MESSAGE_APP data = Meshtastic::Data.new data.payload = text data.portnum = port_num data.want_response = want_response # puts data.to_h send_data( from: from, to: to, channel: channel, data: data, want_ack: want_ack, want_response: want_response, hop_limit: hop_limit, port_num: port_num, on_response: on_response, psks: psks ) rescue StandardError => e raise e end |
.send_to_radio(opts = {}) ⇒ Object
- Supported Method Parameters
-
Meshtastic.send_to_radio(
to_radio: 'required - ToRadio Message to Send')
258 259 260 261 262 263 264 265 266 |
# File 'lib/meshtastic.rb', line 258 public_class_method def self.send_to_radio(opts = {}) to_radio = opts[:to_radio] raise 'ERROR: Invalid ToRadio Message' unless to_radio.is_a?(Meshtastic::ToRadio) to_radio.to_proto rescue StandardError => e raise e end |