{"id":57,"date":"2026-01-06T20:38:09","date_gmt":"2026-01-06T20:38:09","guid":{"rendered":"https:\/\/michaelwinchester.com\/mesh-plug\/?p=57"},"modified":"2026-09-20T21:35:51","modified_gmt":"2026-09-20T21:35:51","slug":"getting-connected-to-mesh-plug","status":"publish","type":"post","link":"https:\/\/michaelwinchester.com\/mesh-plug\/2026\/01\/06\/getting-connected-to-mesh-plug\/","title":{"rendered":"Getting Connected to Mesh-Plug!"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Mesh-Plug connects your Meshtastic network to WordPress using MQTT. Once connected, your site can receive and display mesh traffic such as node information, chat messages, telemetry, and location data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You do not need to be an IoT engineer to use Mesh-Plug, but setup is smoother if you are comfortable with basic WordPress administration, MQTT broker settings, and the difference between native MQTT and MQTT over WebSockets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide reflects Mesh-Plug 1.3.2 and newer, including current Meshtastic protobuf MQTT support, legacy JSON support, observer mode, live mode, and server-side snapshots.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Mesh-Plug Does<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Meshtastic devices and apps publish packets to an MQTT broker.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mesh-Plug subscribes to those MQTT topics and renders the traffic inside WordPress.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depending on your configuration, Mesh-Plug can show:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Live packet logs<\/li>\n\n\n\n<li>Nodes<\/li>\n\n\n\n<li>Chat messages<\/li>\n\n\n\n<li>Map positions<\/li>\n\n\n\n<li>Telemetry charts<\/li>\n\n\n\n<li>Server-cached observer dashboards<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Mesh-Plug 1.3.2 supports current Meshtastic protobuf MQTT traffic and older JSON MQTT traffic.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Skills and Tools You Should Be Comfortable With<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Installing and configuring WordPress plugins<\/li>\n\n\n\n<li>Editing WordPress pages and shortcodes<\/li>\n\n\n\n<li>Understanding domains, ports, and TLS<\/li>\n\n\n\n<li>Knowing whether a page is public or admin-only<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Helpful but optional:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MQTT Explorer<\/li>\n\n\n\n<li><code>mosquitto_sub<\/code> \/ <code>mosquitto_pub<\/code><\/li>\n\n\n\n<li>Meshtastic CLI<\/li>\n\n\n\n<li>A self-hosted broker such as Mosquitto, EMQX, or HiveMQ<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Requirements<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Required:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>One or more Meshtastic devices running current firmware<\/li>\n\n\n\n<li>Mesh-Plug installed and activated on a WordPress site<\/li>\n\n\n\n<li>An MQTT broker reachable from your Meshtastic gateway<\/li>\n\n\n\n<li>A WebSocket MQTT endpoint reachable from the browser for live mode<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Optional but useful:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A private MQTT broker<\/li>\n\n\n\n<li>MQTT Explorer for diagnostics<\/li>\n\n\n\n<li>Server cache enabled in Mesh-Plug for public observer dashboards<\/li>\n\n\n\n<li>Map Reporting enabled on your Meshtastic node if you want map-report style public location updates<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Important: Devices and Browsers Use Different MQTT Transports<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the most common point of confusion.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Meshtastic devices and mobile apps usually connect to MQTT using native MQTT over TLS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mqtt.example.com:8883<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mesh-Plug runs in a web browser for live mode, so it must use MQTT over WebSockets:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wss:\/\/mqtt.example.com:9001\/mqtt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Same broker. Same topics. Different transport.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>mosquitto_sub<\/code> is useful for testing native MQTT on port <code>8883<\/code>. It does not test your browser WebSocket URL.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Confirm Your Meshtastic MQTT Setup<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In your Meshtastic app, enable MQTT and configure your broker.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typical broker settings:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Host: mqtt.example.com\nPort: 8883\nTLS: enabled\nUsername: your broker username\nPassword: your broker password\nRoot topic: msh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Your channel must also allow uplink if you want packets from your mesh to reach MQTT.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For public or shared channels, remember that current Meshtastic behavior may reduce position precision or require explicit location\/telemetry opt-in. That is expected.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Choose the Right MQTT Topic<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mesh-Plug 1.3.2 defaults new installs to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>msh\/2\/e\/#<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Common topic options:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>msh\/2\/e\/#\nmsh\/2\/c\/#\nmsh\/2\/map\/#\nmsh\/2\/json\/#\nmsh\/#<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use <code>msh\/2\/e\/#<\/code> or <code>msh\/2\/c\/#<\/code> for current Meshtastic protobuf MQTT traffic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use <code>msh\/2\/map\/#<\/code> if you only want Meshtastic map-report packets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use <code>msh\/2\/json\/#<\/code> only if your gateway still publishes legacy JSON MQTT packets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use <code>msh\/#<\/code> while troubleshooting mixed traffic, then narrow the topic once you know what your broker is receiving.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Busy public topics can create a lot of browser work, so avoid broad subscriptions on production dashboards unless you really need them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Configure Mesh-Plug<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In WordPress, go to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Settings \u2192 Mesh-Plug<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Set:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Broker WebSocket URL: wss:\/\/mqtt.example.com:9001\/mqtt\nTopic filter: msh\/2\/e\/#\nUsername: your broker username\nPassword: your broker password<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended baseline:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Keepalive: 20\nReconnect delay: 5000\nAuto-connect: enabled for admin\/operator live pages\nServer cache: enabled for public observer dashboards\nObserver refresh: 5000\nOffline after: 300<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Save the settings.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Add the Mesh-Plug Shortcode<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use the main shortcode:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;mesh_plug]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For a public dashboard, use observer mode:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;mesh_plug mode=\"observer\" height=\"600px\" map_tiles=\"voyager\" fit=\"1\"]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For an admin\/operator dashboard, use live mode on a restricted page:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;mesh_plug mode=\"live\" height=\"700px\" map_tiles=\"dark\" fit=\"once\"]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Observer mode reads from the server snapshot API. It is the best choice for public pages because visitors do not connect directly to your MQTT broker.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Live mode connects directly from your browser to the MQTT broker over WebSockets. Use it for operations, diagnostics, and admin-only pages.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Verify Traffic<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">First, verify native MQTT traffic from your gateway:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mosquitto_sub -v \\\n  -h mqtt.example.com \\\n  -p 8883 \\\n  -u YOUR_USER \\\n  -P 'YOUR_PASSWORD' \\\n  -t 'msh\/#'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Trigger activity from the Meshtastic app:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Exchange user info<\/li>\n\n\n\n<li>Send a chat message<\/li>\n\n\n\n<li>Send position<\/li>\n\n\n\n<li>Wait for telemetry or map report intervals<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You may see protobuf\/binary traffic instead of JSON. That is normal on current Meshtastic setups.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then open your WordPress page with the Mesh-Plug shortcode.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Healthy behavior:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Status shows connected in live mode<\/li>\n\n\n\n<li>Log shows MQTT traffic<\/li>\n\n\n\n<li>Nodes appear after node info, position, or map reports arrive<\/li>\n\n\n\n<li>Chat appears when text messages are received<\/li>\n\n\n\n<li>Map positions appear when valid position or map-report packets are available<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: Public Dashboard Best Practice<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For public pages:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Enable server cache in Mesh-Plug settings.<\/li>\n\n\n\n<li>Use one private\/admin live page to ingest MQTT.<\/li>\n\n\n\n<li>Use observer mode on public pages.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Example public shortcode:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;mesh_plug mode=\"observer\" height=\"600px\" map_tiles=\"voyager\" fit=\"1\"]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This avoids exposing broker credentials or direct MQTT behavior to public visitors.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Connected but No Nodes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Are you subscribed to the right topic?<\/li>\n\n\n\n<li>Is your Meshtastic gateway publishing MQTT uplinks?<\/li>\n\n\n\n<li>Are you receiving encrypted packets only?<\/li>\n\n\n\n<li>Is position or telemetry disabled on the node?<\/li>\n\n\n\n<li>Are map reports enabled if you are relying on <code>msh\/2\/map\/#<\/code>?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Try temporarily subscribing to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>msh\/#<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If traffic appears, narrow the topic afterward.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Log Shows Encrypted Protobuf Payloads<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">That means Mesh-Plug can see packets, but the packet contents are encrypted.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is expected for channel-encrypted traffic. Mesh-Plug cannot decode protected packet contents from the broker without the channel keys.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use unencrypted map reports or an appropriate gateway\/translator if you need public dashboard data.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>mosquitto_sub<\/code> Works but Mesh-Plug Does Not<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You may have confirmed native MQTT on port <code>8883<\/code>, but Mesh-Plug live mode needs WebSockets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wss:\/\/mqtt.example.com:9001\/mqtt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Your broker or reverse proxy must support WebSocket upgrades.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mesh-Plug Connects, Then Disconnects<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Broker WebSocket path<\/li>\n\n\n\n<li>Username\/password<\/li>\n\n\n\n<li>TLS certificate<\/li>\n\n\n\n<li>Broker ACLs<\/li>\n\n\n\n<li>Client connection limits<\/li>\n\n\n\n<li>Topic permissions<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Mesh-Plug logs WebSocket close codes to help diagnose broker compatibility issues.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Positions Look Approximate<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">That may be correct.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Current Meshtastic behavior may reduce position precision for privacy, especially on public or known-key channels. Mesh-Plug now displays coarse positions with an approximate radius instead of silently dropping them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended Baseline<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Start simple:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Broker WebSocket URL: wss:\/\/mqtt.example.com:9001\/mqtt\nTopic: msh\/2\/e\/#\nShortcode: &#91;mesh_plug mode=\"live\" height=\"600px\"]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once live mode works, add a public observer page:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;mesh_plug mode=\"observer\" height=\"600px\" map_tiles=\"voyager\" fit=\"1\"]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then layer in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Server cache<\/li>\n\n\n\n<li>Packet history<\/li>\n\n\n\n<li>Map reports<\/li>\n\n\n\n<li>Telemetry charts<\/li>\n\n\n\n<li>Narrower topic filters<\/li>\n\n\n\n<li>Broker ACLs<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Final Notes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mesh-Plug is designed to scale from a single demo node to a shareable mesh dashboard.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The most reliable setup is:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Meshtastic gateway publishes to a broker over native MQTT\/TLS.<\/li>\n\n\n\n<li>Mesh-Plug live mode connects to the same broker over WebSockets for admin\/operator use.<\/li>\n\n\n\n<li>Mesh-Plug observer mode serves public dashboards from WordPress snapshots.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Start with a known-good topic, confirm traffic, then narrow and harden the setup once it works.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mesh-Plug connects your Meshtastic network to WordPress using MQTT. Once connected, your site can receive and display mesh traffic such as node information, chat messages, telemetry, and location data. You do not need to be an IoT engineer to use Mesh-Plug, but setup is smoother if you are comfortable with basic WordPress administration, MQTT broker [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-57","post","type-post","status-publish","format-standard","hentry","category-mesh-plug"],"_links":{"self":[{"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/posts\/57","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/comments?post=57"}],"version-history":[{"count":4,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/posts\/57\/revisions"}],"predecessor-version":[{"id":234,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/posts\/57\/revisions\/234"}],"wp:attachment":[{"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/media?parent=57"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/categories?post=57"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/tags?post=57"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}