This commit is contained in:
Garth Vander Houwen 2021-11-23 22:17:22 -08:00
commit ed55a4c35d
29 changed files with 2277 additions and 2498 deletions

View file

@ -33,4 +33,5 @@ jobs:
vercel-args: "--prod"
vercel-org-id: ${{ secrets.ORG_ID}}
vercel-project-id: ${{ secrets.PROJECT_ID}}
scope: ${{ secrets.ORG_ID}}
working-directory: website

View file

@ -24,10 +24,4 @@ yarn build
This command generates static content into the `build` directory and can be served using any static contents hosting service.
## Deployment
```console
GIT_USER=<Your GitHub username> USE_SSH=true yarn deploy
```
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.
[![Powered by Vercel](https://raw.githubusercontent.com/abumalick/powered-by-vercel/master/powered-by-vercel.svg)](https://vercel.com?utm_source=meshtastic&utm_campaign=oss)

View file

@ -60,8 +60,8 @@ We have four predefined channels. These are the most common settings and have be
| Channel setting | Alt Channel Name | Data-rate | SF / Symbols | Coding Rate | Bandwidth | Link Budget |
| :------------------------- | :--------------- | :------------------- | :----------- | :---------- | :-------- | :---------- |
| Short range (but fast) | Short Fast | 21.875 kbps | 7 / 128 | 4/5 | 125 | 134dB |
| Medium range (but fast) | Medium | 5.469 kbps | 7 / 128 | 4/5 | 500 | 140dB |
| Short range (but fast) | Short Fast | 21.875 kbps | 7 / 128 | 4/5 | 500 | 134dB |
| Medium range (but fast) | Medium | 5.469 kbps | 7 / 128 | 4/5 | 125 | 140dB |
| Long range (but slower) | Long Alt | 0.275 kbps | 9 / 512 | 4/8 | 31 | 153dB |
| Very long range (but slow) | Long Slow | 0.183 kbps (default) | 12 / 4096 | 4/8 | 125 | 154dB |
@ -72,7 +72,7 @@ The link budget used by these calculations assumes a transmit power of 17dBm and
You may want to select other channels for your usage. The other settings can be set by using the Python API.
```bash
meshtastic --setchan spread_factor 10 --setchan coding_rate 8 --setchan bandwidth 125
meshtastic --setchan spread_factor 10 --setchan coding_rate 4 --setchan bandwidth 125
```
After applying the settings, you will need to restart the device. After your device is restarted, it will generate a new crypto key and you will need to share the newly generated QR Code or URL to all your other devices.

View file

@ -0,0 +1,33 @@
---
id: publish
title: Publishing Meshtastic
sidebar_label: Publishing Meshtastic
---
This document is a WIP.
If youd like to do real releases with your changes, the procedure is:
## Device
* edit version.properties and check it into the root project
* run bin/promote-release.sh - this should cause github to start a release build (see the CI actions)
* edit the draft release text and click publish
## Android
TBD
## iOS
TBD
## Python
if any dev wants to take this on, send me a note and Ill bless you with pypi
* bump the version in setup.py
* run bin/upload-release.sh
:::note
You need permissions in the github project to make a build:::

View file

@ -4,3 +4,10 @@ title: Concepts
sidebar_label: Concepts
slug: /getting-started/concepts
---
Various high level concepts used in the Meshtastic meta verse:
* mesh networking: By using [low-power radios](https://meshtastic.org/docs/hardware) to connect other low-power radios using LoRa to be able to send and receive messages and data. This can be completely separate from any other network such as the internet. You can start small and get two devices to start experiementing. Do not expect to stream music or videos as LoRa is intended for smaller, lower bandwidth type uses.
* captive portal: Using Meshtastic, you can create a separate wifi network for you join your phone or computer on a mesh network. See [Web Interface](https://meshtastic.org/docs/software/web/web-app-software) for more info. This is ideal in a situation where you are remote, such as in the forest or on a mountain or if there is a major power/internet outage such as in a storm other other disaster.
* Meshtastic channels: Can create a *somewhat* secure method of communication on the same mesh network. They channel can be encrypted, to prevent normal people from listening in on the traffic. But, it could probably be easily cracked by determined indviduals. See [Channel Config](https://meshtastic.org/docs/software/settings/channel) for more info.
* LoRaWan: If you add a LoRa gateway, then you can interact with more networks, such as the internet.

View file

@ -0,0 +1,142 @@
---
id: faq
title: Frequenty Asked Questions (FAQ)
sidebar_label: Frequenty Asked Questions
slug: /getting-started/faq
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
<!--
**** FAQ Contributors, README ***
*
* Best Practices for the FAQ:
*
* - Keep the answers Non-Technical. The FAQ should be targeted to non-geeks.
* - This FAQ is not the authoritative document. Provide a short answer and a link to learn more.
*
****
-->
## General
Q: What is Meshtastic?
* Meshtastic is most awesome long range, low power communications service on the planet earth! That's not even an exageration!
Q: Where can I get additional help, ask questions or bond with the Meshtastic community?
* After reading this FAQ and checking out the links on the left, there are two places ... The preferred place is to check out the [Fourm](https://meshtastic.discourse.group). There you can be part of our growing community and search for previosly posts that may be similar to what you're looking for. We also have the [Meshtastic Discord](https://discord.com/invite/UQJ5QuM7vq) server where you may connect with like minded people.
Q: How can I contribute to Meshtastic?
* Everyone contributes in a different way. Join the [Fourm](https://meshtastic.discourse.group) and/or the [Meshtastic Discord](https://discord.com/invite/UQJ5QuM7vq) and introduce yourself. We're all very friendly. If you'd like to pitch in some code, check out the [Developers](https://meshtastic.org/docs/developers) menu on the left.
## Device (aka Node)
Q: Where do I purchase the device hardware?
* Each [supported device](https://meshtastic.org/docs/hardware/tbeam-hardware) has a "Purchase Link".
Q: I have my hardware. How do I install the firmware and any required drivers?
* See: https://meshtastic.org/docs/getting-started/flashing-esp32
Q: How do I update the firmware to the latest version?
* If the device is running Meshtastic firmware, you might be able to update over-the-air like via the Android app.
Q: My device has gone to sleep. Are received messages lost?
* The LoRa radio on the node is still active and will wake up the CPU when the device is sleeping. If your phone is in range, the node will relay any messages your phone may have missed. If you're in range and your device is active, messages have not been lost.
Q: My device has gone to sleep and I can't send any messages.
* Once the node wakes up from sleep, your phone will relay any delayed messages through your node and to the mesh network. Give it a few minutes and it'll do the right thing.
Q: How do I turn off an esp32 t-beam based device?
* Hold down the middle button for about 10 seconds.
Q: How do I turn on an esp32 t-beam based device?
* Push the power button for about 1 second.
Q: How can I tell the device not to sleep?
* Android instructions see: [Android Usage](https://meshtastic.org/docs/software/android/android-usage#configuration-options)
* Python CLI instructions see: [Python Usage](https://meshtastic.org/docs/software/python/python-cli#changing-device-settings)
### Plugins
Q: What are Plugins?
* Plugins are features that expand the basic device functionalty and/or integrations with other services.
Q: What plugins do we have available?
* To see the list of available plugins, please go to: https://meshtastic.org/docs/software/plugins/plugins
Q: I'd like to write a plugin. How do I get started?
* See: https://meshtastic.org/docs/developers/device/plugin-api
## Android
Q: What versions of Android does the Meshtastic Android App require?
* Answer TBD
Q: What's the cloud icon next to the message?
* Empty Cloud - In route to your device.
* Up Arrow - Queued to be sent over the mesh.
* Check Mark - Delivered over the mesh.
* Cross Mark - Error
Q: How can I clear the message history?
* Clear the storage from Android Settings > App
## iOS
Q: What version of iOS does the Meshtastic iOS App Require?
* The now-in-beta iOS app requires iOS v15.
Q: How do I get the Meshtastic iOS App?
* See [iOS App](https://meshtastic.org/docs/software/ios/ios-development)
## Bluetooth
Q: How do I pair my phone to the device if my device doesn't have a screen?
* Answer TBD (perhaps consider using web if esp32)
Q: Can I have Bluetooth enabled and use WiFi radio?
* No. Only one method will work at a time.
Q: How do I disable WiFi so Bluetooth will work?
* Ensure the wifi_ssid and wifi_password values are blank.
## WiFi / Web Browser
Q: How do I turn on the WiFI radio?
* See: https://meshtastic.org/docs/software/device/device-wifi
Q: When I turn on WiFi, Bluetooth turns off. Why is this?
* Currently WiFi and Bluetooth can not be enabled at the same time.
Q: How do I access the network from my web browser?
* Visit http://meshtastic.local (Note: This is a work in progress.)
## Channels
Q: What is a Meshtastic Channel?
* This is the LoRa channel you're broadcasting on, the modem configuration (spreading factor, bandwidth and error correction), along with a special identifier for your group and optional encryption.
Q: What is a LoRa channel?
* This is the LoRa frequency within the Frequency band your device is configured to use.
Q: How do I share my Meshtastic Channel with other people?
* Your Meshtastic client (Android, iOS, Web or Python) will provide you a URL or QR code. You can email, text or print this URL or QR code and share it with people you want to join your Meshtastic Channel.
Q: What is a Primary Channel?
* This is the first channel that's created for you when you initially setup your Meshtastic Channel.
Q: What is a Secondary Channel?
* As this is a new feature, secondary Channels work on the device and the Python Script. Support for secondary channels by other clients are pending. For more information: https://meshtastic.org/docs/software/device/device-channels#how-to-use-secondary-channels
## Commmand Line / Python
Q: How do I find out more about installing (and using) Meshtastic via command line?
* See https://meshtastic.org/docs/software/python/python-installation
Q: How do I find out more about using python to interact?
* See https://meshtastic.org/docs/software/python/python-usage

View file

@ -13,6 +13,8 @@ import TabItem from '@theme/TabItem';
Plug your device into your computer using a USB cable and then do the following:
:::important
You may need to install a driver from Silicon Labs for the [CP210X USB to UART bridge](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)
Some newer boards may require the drivers for the [CH9102](http://www.wch.cn/downloads/CH343SER_ZIP.html) or [Direct Download](https://github.com/Xinyuan-LilyGO/CH9102_Driver) for Windows 7.
:::
<Tabs
@ -25,25 +27,26 @@ You may need to install a driver from Silicon Labs for the [CP210X USB to UART b
]}>
<TabItem value="linux">
> Open a `Terminal` and enter the following command:
> Connect your Meshtastic device to your USB port, open a `Terminal` and enter the following command:
> ```bash
> lsusb
> ```
> You should see something like: `ID 10c4:ea60 Silicon Labs CP210x UART Bridge` for CP210X or `ID 1a86:55d4 QinHeng Electronics USB Single Serial` for CH9102
</TabItem>
<TabItem value="macos">
> Navigate to `Apple Menu  > About This Mac > System Report... > Hardware > USB`.
> You should see something like `CP210X USB to UART Bridge Controller`. If not download the appropriate drivers
</TabItem>
<TabItem value="windows">
> Navigate to `Device Manager > Ports (COM & LPT)`.
> Navigate to `Device Manager > Ports (COM & LPT)`. You should see something like `Silicon Labs CP210X USB to UART Bridge (COM5)`. If not download the appropriate drivers
</TabItem>
</Tabs>
You should see something like `CP210X USB to UART Bridge Controller`. If you don't, you will need to install the appropriate driver from [Silicon Labs](https://sliabs.com/developers/usb-to-uart-bridge-vcp-drivers).
### Download Latest Firmware
@ -81,7 +84,7 @@ The [T-Beam 0.7](../hardware/tbeam-hardware#t-beam---v07) board is an earlier ve
> If `python3` is not installed, install with
> ```bash
> sudo apt-get update
> sudo apt-get install python3.6
> sudo apt-get install python3
> ```
> If `pip` is not installed, install with
> ```bash

View file

@ -5,6 +5,13 @@ sidebar_label: Overview
slug: /getting-started
---
## What is Meshtastic?
Meshtastic® is a project that lets you use inexpensive GPS mesh radios as an extensible, super long battery life mesh GPS communicator. These radios are great for hiking, skiing, paragliding - essentially any hobby where you don't have reliable internet access. Each member of your private mesh can always see the location and distance of all other members and any text messages sent to your group chat.
The radios automatically create a mesh to forward packets as needed, so everyone in the group can receive messages from even the furthest member. The radios will optionally work with your phone, but no phone is required.
## Purchase a Radio
The easiest way is to [buy a device with the software already installed](https://www.aliexpress.com/item/4001178678568.html). Other devices are [available](/docs/hardware/tbeam-hardware). In the Americas get the 915mhz version, in Europe the 868Mhz, or Asia 923Mhz. See this listing by [The Things Network](https://www.thethingsnetwork.org/docs/lorawan/frequencies-by-country.html) for frequencies by specific countries.
@ -44,10 +51,46 @@ There are many ways to connect to your new radio!
- Bluetooth
- Web app over wifi (in development)
## A good first test (connect via USB and CLI)
If you have at least two radios with the Meshtastic firmware, you may consider connecting one via USB and the other simply powered. Communicate with the USB radio using a CLI like [Meshtastic-python](https://meshtastic.org/docs/software/python/python-installation).
- Ensure you can run "meshtastic --info".
- Ensure the region is set appropriately. If the radios are 915 MHz and you are in the US, then no region changes/settings are necessary. If you are in another region, you may need to run something like: "meshtastic --set region EU865".
- Send a message "meshtastic --sendtext hello1"
- The radio connected via USB should show the message almost instantly.
- Other radios may take a few seconds before they show the message. You may need to press one of the buttons on the other radio to see if the message arrived.
- Run "meshtastic --nodes" to see if other nodes show in the display.
- Messages sent from the USB radio should be sent to the other radio(s) via LoRa. The default settings should have this work by default
## A good second test (connect via Bluetooth)
The Android app is currently more robust than the iOS app. But, they both should be able to interact with the radios.
- Install Android or iOS Meshtastic app
- Start Meshtastic app
- Connect to radio(s) from inside the app
- Pair with radio(s). A paring code should show on the radio. Enter that value when prompted to pair a bluetooth device.
- Note: May want to set the bluetooth timeout (ex: "meshtastic --set wait_bluetooth_secs 28800")
- Send message(s) from inside the app.
- Verify that all radios are receiving the messages. Might have to click on the button on the radio to see most recent message.
## A good third test (connect via Wifi/http)
- Configure the *wifi_ssid* and *wifi_password*. "meshtastic --set wifi_ssid 'xxx' --set wifi_password 'yyy'" (where xxx and yyy are the appropriate values for your neetwork)
- Reboot radio by either removing power or pressing the power button.
- Click on the button to cycle thru to the screen with ip address and verify that there was a connection to the wifi access point.
- Send message(s). "meshtastic --host 192.168.1.200 --sendtext hello"
- Verify that all radios are receiving the messages. Might have to click on the button on the radio(s) to see most recent message.
- Open up a brower to http://meshtastic.local to view the web UI (currently under development). You may need to open http://meshtastic.local/static )
- If you want to switch back to bluetooth, you will need to set the *wifi_ssid* and *wifi_password* values to blank values (ex: '').
## Troubleshooting
For any issues during setup, search [our forum](https://meshtastic.discourse.group) to find a solution. If you can't find one, please post your problem, providing as much detail as possible.
We are also on [Discord](https://discord.gg/UQJ5QuM7vq).
<!--- A guide to setting up your Meshtastic device.
The easiest way is to [buy a device with the software already installed](https://www.aliexpress.com/item/4001178678568.html) In the Americas get the 915mhz version, In Europe the 868Mhz or Asia 923Mhz [Frequency details](https://www.thethingsnetwork.org/docs/lorawan/frequencies-by-country.html).
@ -156,5 +199,4 @@ Requires Python, pip, Gitbash
For any issues during setup, search [our forum](https://meshtastic.discourse.group) to find a solution. If you can't find one, please post your problem, providing as much detail as possible.
--->

View file

@ -24,3 +24,8 @@ sidebar_label: Heltec
[<img src="Heltec WiFi LoRa 32 (V2)" src="/img/hardware/heltec-v2.png" style={{zoom:'25%'}} />](/img/hardware/heltec-v2.png)
* There are two versions of the Heltec (V2). Below is a picture highlighting the visual differences:
[<img src="Heltec WiFi LoRa 32 (V2)" src="/img/hardware/heltec_v2_vs_v21.png" style={{zoom:'25%'}} />](/img/hardware/heltec_v2_vs_v21.png)
* See [hardware update log](https://heltec-automation-docs.readthedocs.io/en/latest/esp32/wifi_lora_32/hardware_update_log.html) for more details

View file

@ -0,0 +1,15 @@
---
id: linux-hardware
title: Linux Compatible Hardware
sidebar_label: Linux
---
This page is a place holder.
The device software can run on Hardware that runs Linux to execute unit tests.
Fledgling support for a Lora USB dongle has been in the works.
This page will be updated with more information as information is made available.
Please be mindful that a lot of this is incomplete, so please don't get too excited and asking for builds and/or timelines.

View file

@ -6,6 +6,14 @@ sidebar_label: LILYGO® T-Echo
The T-Echo has been in development by LILYGO® over the past few months and has now been released.
### See [Getting Started](../getting-started/flashing-nrf52)
* firmware file: `firmware-t-echo-1.x.x.uf2`
* [Purchase link](https://www.aliexpress.com/item/1005002842456390.html)
* TTGO's [GitHub page](https://github.com/Xinyuan-LilyGO/LilyGO-T-Echo) for the T-Echo
### Features
* nRF52840 - Bluetooth BLE 5.0, NFC and very low power consumption
* SX1262 - LoRa transceiver
* 1.54" eInk display
@ -16,8 +24,4 @@ The T-Echo has been in development by LILYGO® over the past few months and has
* Optional case and battery
* firmware file: `firmware-t-echo-1.x.x.uf2`
* [Purchase link](https://www.aliexpress.com/item/1005003026107533.html)
* TTGO's [GitHub page](https://github.com/Xinyuan-LilyGO/LilyGO-T-Echo) for the T-Echo
<img alt="LILYGO T-Echo" src="/img/hardware/t-echo.png" style={{zoom: '15%'}} />

View file

@ -152,7 +152,7 @@ This allows you to change the frequency with which your location is broadcast ac
#### Device sleep period
To use as little power as possible while running on battery, ESP32 based devices go into a sleep mode. Unfortunately, during this sleep mode they turn off their Bluetooth radio. They can be woken early from this sleep by either receiving a message over LoRa (the LoRa receiver never switches off), of by pressing a program button where there is one on the device. This setting allows the length of the sleep mode to be changed from the default of 300 seconds (5 minutes). Setting the period to 0 seconds disables the sleep function on the device.
To use as little power as possible while running on battery, ESP32 based devices go into a sleep mode. Unfortunately, during this sleep mode they turn off their Bluetooth radio. They can be woken early from this sleep by either receiving a message over LoRa (the LoRa receiver never switches off), of by pressing a program button where there is one on the device. This setting allows the length of the sleep mode to be changed from the default of 300 seconds (5 minutes). To keep the bluetooth link alive for eight hours (any usage of the bluetooth protcol from your phone will reset this timer), set this to 28800 seconds.
### Debug page

View file

@ -38,13 +38,13 @@ Any channel you add after that Primary channel is Secondary. Secondary channels
Secondary channels **must** have a PSK (encryption).
```bash title="Adding a channel called testing-channel"
$ meshtastic --ch-add testing-channel
```bash title="Adding a channel called testing"
$ meshtastic --ch-add testing
Connected to radio
Writing modified channels to device
```
The device will now have a Secondary channel called "testing-channel"
The device will now have a Secondary channel called "testing"
```bash title="Expected output"
$ meshtastic --info
@ -52,7 +52,7 @@ Connected to radio
...
Channels:
PRIMARY psk=default { "modemConfig": "Bw125Cr48Sf4096", "psk": "AQ==" }
SECONDARY psk=secret { "psk": "HW7E3nMbiNbvr6MhsDonLCmj7eSAhttzjbIx/r5OQmg=", "name": "testing-channel" }
SECONDARY psk=secret { "psk": "HW7E3nMbiNbvr6MhsDonLCmj7eSAhttzjbIx/r5OQmg=", "name": "testing" }
Primary channel URL: https://www.meshtastic.org/d/#CgUYAyIBAQ
Complete URL (includes all channels): https://www.meshtastic.org/d/#CgUYAyIBAQopIiAdbsTecxuI1u-voyGwOicsKaPt5ICG23ONsjH-vk5CaCoFYWRtaW4
```

View file

@ -1,7 +1,7 @@
---
id: store-forward-plugin
title: Store and forward plugin
sidebar_label: Store and forward
title: Store and Forward plugin
sidebar_label: Store and Forward
---
## About
@ -22,91 +22,101 @@ Initial Requirements:
* * Router nodes are intended to be always online. If this plugin misses any messages, the reliability of the stored messages will be reduced
* Esp32 Processor based device with external PSRAM. (tbeam v1.0 and tbeamv1.1, maybe others)
## Implementation timeline
## Usage Overview
* To use / test this you will want at least 3 devices
* * One device will (currently) need be a tbeam v1.0 and tbeamv1.1 configured as a meshtastic router. Other devices with built in PSRAM will be supported at some point.
* * Two others will be regular clients. Nothing special required.
### Meshtastic channel configuration
Don't use this on the "Very long range (but slow)" or "Long range (but slower)" channel settings. You're welcome to try and report back, but those channels have a very low bitrate.
Either use a custom channel configuration with at an at least 1kbit data rate or use "Medium range (but fast)".
Recommended channel setting is for 1.343kbps:
```bash
meshtastic --setchan spread_factor 11 --setchan coding_rate 4 --setchan bandwidth 500
```
With an aftermarket coaxial antenna or moxon antenna, that will give you roughly the same range as "Long range (but slow)" and 5x the bitrate.
### Router setup
* Configure your device as a meshtastic router.
* * https://meshtastic.org/docs/software/settings/router
* Configure the Store and Forward plugin
* * Required configuration
* * * store_forward_plugin_enabled - Set this to true to enable the plugin. False to disable the plugin.
* * Optional configuration
* * * store_forward_plugin_records - Set this to the maximum number of records to save. Best to leave this at the default (0) where the plugin will use 2/3 of your device's available PSRAM. This is about 11,000 records.
* Name your router node something that makes it easily identifable, aka "Router".
Don't enable the Store and Forward plugin on multile routers!
### Client Usage
Currently, no sepcial configuration is required. To request your history sent to you, send the command into the message field "SF". That's it. This will eventually change to make it easier. At the moment, that message will be sent to everyone on the mesh but we'll (eventually) make it easier to use where there'll be a button (or maybe it'll be transparent) and the command isn't sent as a text message to the mesh.
Available Commands:
| Command | Definition |
| :-----: | :---------------: |
| SF | Send the last few messages I may have missed |
| SFm | Send a 240 byte payload (Used for testing) |
The Store and Forward plugin will only service one client at a time. If a second client requests messages while the S&F is busy, the S&F will send a private message to the second client that they will need to wait.
## Settings
| Setting | Acceptable Values | Default |
| :-----: | :---------------: | :-----: |
| store_forward_plugin_enabled | `true`, `false` | `false` |
| store_forward_plugin_records | integer | `0` |
| store_forward_plugin_replay_max_records (tbd) | integer | `0` |
| store_forward_plugin_replay_max_time (tbd) | integer | `0` |
## Developer TODO
Not necessarily in this order:
UC 1) MVP - automagically forward packets to a client that may have missed packets.
* Client Interface (Web, Android, Python or iOS when that happens) to request packets be resent.
UC 2) Client Interface (Web, Android, Python or iOS when that happens) to optionally request packets be resent. This is to support the case where Router has not detected that the client was away. This is because the router will only know you're away if you've been gone for a period of time but will have no way of knowing if you were offline for a short number of minutes. This will cover the case where you have ducked into a cave or you're swapping out your battery.
* Router sends a heartbeat so the client knows there is a router in range.
UC 3) router sends a periodic “heartbeat” to let the clients know theyre part of the main mesh
* support for a mesh to have multiple routers that have the store & forward functionality (for redundancy)
UC 4) support for a mesh to have multiple routers that have the store & forward functionality (for redundancy)
* Add a default channel at about 1.5kbit / sec
UC 5) Support for "long term" delayed messages and "short term" delayed messages. Handle the cases slightly different to improve user expierence. A short term delayed message would be a message that was resent becaue a node was not heard from for <5 minutes. A long term delayed message is a message that has not been delivered in >5 minutes.
* Eventually we could add a "want_store_and_forward" bit to MeshPacket and that could be nicer than whitelists in this plugin. Initially we'd only set that bit in text messages (and any other plugin messages that can cope with this). This change would be backward wire compatible so can add easily later.
UC 6) Eventually we could add a "want_store_and_forward" bit to MeshPacket and that could be nicer than whitelists in this plugin. Initially we'd only set that bit in text messages (and any other plugin messages that can cope with this). This change would be backward wire compatible so can add easily later.
* Have a "cool down" period to disallow a client to request the history too often.
UC 7) Currently the way we allocate messages in the device code is super inefficient. It always allocates the worst case message size. Really we should dynamically allocate just the # of bytes we need. This would allow many more MeshPackets to be kept in RAM.
* Message with SF status on requests.
UC 8) We'll want a "delayed" bit in MeshPacket. This will indicate that the message was not received in real time.
* Be able to identify if you're within range of a router.
## Things to consider
* Be able to specify the HOP MAX to reduce airtime. Is this necessary?
Not all these cases will be initially implemented. It's just a running stream of thoughts to be considered.
* Restrict operation of S&F on the slow channel configurations.
### Main Mesh Network with Router
* Create a tx queue to prevent the history from being modified in flight.
The store and forward plugin is intended to be enabled on a router that designates your "main" mesh network.
* Only allow n-number of requests to the router at any one time.
### Store and Forward on Multiple Routers
* Set number of max messages from the history.
If multiple routers with the plugin are enabled, they should be able to share their stored database amongst each other. This enable resilliancy from one router going offline.
* Calculate a new channel with 250mhz bandwidth and ~1.5kbit.
### Fragmented networks - No router
*** Done
In this case, the mesh network has been fragmented by two client devices leaving the main network.
* Disable ACK. If the router is within range, so is the requester.
If two Meshtastic devices walk away from the main mesh, they will be able to message each other but not message the main network. When they return to the main network, they will receive the messages they have missed from the main mesh network.
* Currently the way we allocate messages in the device code is super inefficient. It always allocates the worst case message size. Really we should dynamically allocate just the # of bytes we need. This would allow many more MeshPackets to be kept in RAM.
### Fragmented network - With routers
* Allow max history to be defined by radioConfig.preferences.store_forward_plugin_records
In this case, we have two routers separate by a great distance, each serving multiple devices. One of the routers have gone offline. This has now created two physically seaprated mesh networks using the same channel configuration.
* Add a starting to send / finished sending message
Q: How do we rejoin both fragmented networks? Do we care about messages that were unrouted between fagments?
### Identifing Delayed Messages
When a message is replayed for a node, identify the packet as "Delayed". This will indicate that the message was not received in real time.
## Router Data Structures
Structure of received messages:
receivedMessages
Port_No
packetID
to
from
rxTimeMsec
data
Structure of nodes and last time we heard from them. This is a record of any packet type.
receivedRecord
From
rxTimeMillis
## General Operation for UC1 - automagically forward packets to a client that may have missed packets
On every handled packet
* Record the sender from and the time we heard from that sender into senderRecord.
On every handled packet
* If the packet is a message, save the messsage into receivedMessages
On every handled packet, if we have not heard from that sender in a period of time greater than timeAway, let's assume that they have been away from the network.
* In this case, we will resend them all the messages they have missed since they were gone
### Expected problems this implementation
* If the client has been away for less than 5 minutes and has received the previously sent message, the client will gracefully ignore it. This is thanks to PacketHistory::wasSeenRecently in PacketHistory.cpp.
* * If the client has been away for more than 5 minutes and we resend packets that they have already received, it's possible they will see duplicate messages. This should be unlikely but is still possible.
## Designed limitations
The Store and Forward plugin will subscribe to specific packet types and channels and only save those. This will both reduce the amount of data we will need to store and reduce the overhead on the network. Eg: There's no need to replay ACK packets nor is there's no need to replay old location packets.

View file

@ -16,6 +16,14 @@ Installation is easily done through the [Python package installer pip](https://p
:::note
You must use pip version 20 or later. To upgrade to the latest pip, do: `pip install --upgrade pip`
:::
:::info
Make sure that the `PATH variable` also gets installed by checking the box while installing python. If you don't, python may not be available and you may not be able to call `meshtastic` from your CLI. If you do forget to check that box, you will need to install the path environment variable for python on your operating system.
:::
:::important
You may need to install a driver from Silicon Labs for the [CP210X USB to UART bridge](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)
Some newer boards may require the drivers for the [CH9102](http://www.wch.cn/downloads/CH343SER_ZIP.html) or [Direct Download](https://github.com/Xinyuan-LilyGO/CH9102_Driver) for Windows 7.
:::
<Tabs
groupId="operating-system"
@ -34,27 +42,49 @@ You must use pip version 20 or later. To upgrade to the latest pip, do: `pip ins
```bash
lsusb
```
* You should see something like `CP210X USB to UART Bridge Controller`
* If not download the drivers from [Silicon Labs](https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers).
* You should see something like:
* `ID 10c4:ea60 Silicon Labs CP210x UART Bridge` for CP210X
* `ID 1a86:55d4 QinHeng Electronics USB Single Serial` for CH9102
* Check that your computer has Python 3 installed.
* Use the command
```bash
python3 -V
```
* If this does not return a version, install [python](https://www.python.org)
* If this does not return a version, install python
```bash
sudo apt-get update
sudo apt-get install python3
```
* Pip is typically installed if you are using python 3 version >= 3.4
* Check that pip is installed using this command
```bash
pip3 -V
```
* If this does not return a version, install [pip](https://pip.pypa.io/en/stable/installing/)
* If this does not return a version, install pip
```bash
sudo apt-get install python3-pip
```
* Optional: use a python virtual environment (otherwise jump to step "Install pytap2")
* Install python-virtualenvwrapper (arch based distros as an example)
```bash
sudo pacman -Syu python-virtualenvwrapper
```
* Create a virtual environment
```bash
source /usr/bin/virtualenvwrapper.sh
mkvirtualenv meshtastic
workon meshtastic
```
* Install pytap2
```bash
sudo pip3 install --upgrade pytap2
pip3 install --upgrade pytap2
```
* Install meshtastic:
```bash
sudo pip3 install --upgrade meshtastic
pip3 install --upgrade meshtastic
```
</TabItem>
@ -87,6 +117,7 @@ You must use pip version 20 or later. To upgrade to the latest pip, do: `pip ins
pip3 -V
```
* If this does not return a version, install [pip](https://pip.pypa.io/en/stable/installing/)
* Install pytap2
```bash
sudo pip3 install --upgrade pytap2
@ -127,7 +158,7 @@ You must use pip version 20 or later. To upgrade to the latest pip, do: `pip ins
```powershell
pip3 install --upgrade meshtastic
```
</TabItem>
<TabItem value="termux">
@ -158,3 +189,7 @@ Be aware that the Meshtastic CLI is not able to control the nodes over USB throu
:::
</TabItem>
</Tabs>
:::info
You may need to close and re-open the CLI. The path variables may or may not update for the current session when installing.
:::

View file

@ -12,6 +12,30 @@ interface.sendText("hello mesh") # or sendData to send binary data, see document
interface.close()
```
Another example using Python 3 code to send a message to the mesh when WiFi is enabled:
```python
import time
import meshtastic
from pubsub import pub
def onReceive(packet, interface): # called when a packet arrives
print(f"Received: {packet}")
def onConnection(interface, topic=pub.AUTO_TOPIC): # called when we (re)connect to the radio
# defaults to broadcast, specify a destination ID if you wish
interface.sendText("hello mesh")
pub.subscribe(onReceive, "meshtastic.receive")
pub.subscribe(onConnection, "meshtastic.connection.established")
interface = meshtastic.TCPInterface(hostname='192.168.68.74')
while True:
time.sleep(1000)
interface.close()
```
Note: Be sure to change the ip address in the code above to a valid ip address for your setup.
For the rough notes/implementation plan see [TODO](https://github.com/meshtastic/Meshtastic-python/blob/master/TODO.md). See the API for full details of how to use the library.
## A note to developers of this lib
@ -22,4 +46,4 @@ If you need to build a new release you'll need:
```bash title="Command"
apt install pandoc
sudo pip3 install markdown pandoc webencodings pyparsing twine autopep8
```
```

View file

@ -36,21 +36,7 @@ The first time your device restarts after enabling WiFi, it will take an additio
### Upload web interface files
Next download the three files (app.css.gz, app.js.gz and index.html.gz) from:
[https://github.com/meshtastic/meshtastic-web/releases](https://github.com/meshtastic/meshtastic-web/releases)
Then manually upload them to your device by going to:
* Hostname over mDNS
* * [http://meshtastic.local/static](http://meshtastic.local/static)
* If mDNS doesn't work for you
* * http://{your device IP address here}/static
* * Device IP address typically defaults to 192.168.42.1
The web interface application can then be accessed by visiting [http://meshtastic.local/](http://meshtastic.local/) or [http://192.168.42.1/](http://192.168.42.1/)
We do realize this is not "easy" and are exploring ways to simplify this in the future, ideally rolling it out as part of the device firmware.
* Updated (Nov 20, 2021) - The process to use the web interface will soon be included in the default builds downloaded from the usual places. This document will be updated soon. Hang tight :)
### Wifi configuration

View file

@ -15,6 +15,14 @@ const config = {
colorMode: {
respectPrefersColorScheme: true,
},
announcementBar: {
id: "play_store_workaround",
content:
'Android app unavailable in the Google Play Store store. Install by <a href="/docs/software/android/android-installation">side-loading</a> from <a href="https://github.com/meshtastic/Meshtastic-Android/releases">GitHub</a> or <a href="https://www.amazon.com/Geeksville-Industries-Meshtastic/dp/B08CY9394Q">Amazon</a>.',
backgroundColor: "#ff9999",
textColor: "#091E42",
isCloseable: true,
},
navbar: {
title: "Meshtastic",
logo: {
@ -111,7 +119,7 @@ const config = {
],
},
],
copyright: `Meshtastic® trademark is a registered trademark belonging to Geeksville Industries LLC`,
copyright: `<a href="https://vercel.com/?utm_source=meshtastic&utm_campaign=oss" style="color: white">Powered by ▲ Vercel</a> | Meshtastic® trademark is a registered trademark belonging to Geeksville Industries LLC`,
},
algolia: {
apiKey: "01ad7e13d3fe392d2ad26da3c69dbc21",
@ -127,7 +135,6 @@ const config = {
{
docs: {
sidebarPath: require.resolve("./sidebars.js"),
// Please change this to your repo.
editUrl:
"https://github.com/meshtastic/meshtastic/edit/master/website/",
},

View file

@ -33,6 +33,7 @@
"devDependencies": {
"@docusaurus/module-type-aliases": "^2.0.0-beta.8",
"@tsconfig/docusaurus": "^1.0.4",
"@types/node": "^16.11.7",
"typescript": "^4.4.4"
}
}

View file

@ -2,6 +2,7 @@ module.exports = {
Sidebar: {
"Getting Started": [
"getting-started/overview",
"getting-started/faq",
{
"Flashing firmware": [
"getting-started/flashing-esp32",
@ -27,13 +28,11 @@ module.exports = {
"Meshtastic Android": [
"software/android/android-installation",
"software/android/android-usage",
"software/android/location-access"
"software/android/location-access",
],
},
{
"Meshtastic iOS": [
"software/ios/ios-development",
],
"Meshtastic iOS": ["software/ios/ios-development"],
},
{
"Meshtastic.js": [
@ -61,7 +60,7 @@ module.exports = {
],
},
{
"Plugins": [
Plugins: [
"software/plugins/plugins",
"software/plugins/range-test-plugin",
"software/plugins/ext-notif-plugin",
@ -112,19 +111,19 @@ module.exports = {
"software/settings/router",
"software/settings/wifi",
{
"Plugins": [
Plugins: [
"software/settings/environmental-measurement-plugin",
"software/settings/external-notification-plugin",
"software/settings/range-test-plugin",
"software/settings/serial-plugin",
"software/settings/store-and-forward-plugin",
],
"Advanced": [
Advanced: [
"software/settings/channel-advanced",
"software/settings/misc",
],
},
]
],
},
],
Hardware: [
@ -136,11 +135,12 @@ module.exports = {
"hardware/heltec-hardware",
"hardware/techo-hardware",
"hardware/wisBlock-hardware",
"hardware/linux-hardware",
],
},
"hardware/buttons",
{
"Antennas": [
Antennas: [
"hardware/antenna/antenna",
"hardware/antenna/aerials",
"hardware/antenna/non-aerial",
@ -156,6 +156,7 @@ module.exports = {
},
"developers/api",
"developers/build-env",
"developers/publish",
"developers/codespaces",
{
Device: [

View file

@ -5,42 +5,62 @@ import clsx from 'clsx';
import useBaseUrl from '@docusaurus/useBaseUrl';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import Layout from '@theme/Layout';
import Head from '@docusaurus/Head';
import styles from './styles.module.css';
const features = [
{
title: "Diverse Software Ecosystem",
imageUrl: "img/software.svg",
title: "Radio Mesh Text Messaging",
imageUrl: "img/homepage/messages.svg",
description: (
<>
Having an ever-growing, vibrant software ecosystem, there's almost
certainly, a capable solution ready to go for your project. With
libraries for Typescript and Python, apps for all major platforms and a
whole suite of native integrations, there's something for everyone.
Off-grid messaging using inexpensive hardware to create your personal mesh. Radios forward messages to the next to flood the network. Communicate kilometers/miles between nodes. Internet-connected relay nodes enable the conversation to move online too.
</>
),
},
{
title: "Extremely Versatile",
imageUrl: "img/versatility.svg",
title: "Encryption",
imageUrl: "img/homepage/encryption.svg",
description: (
<>
Create a highly scalable mesh with hardware on a multitude of platforms
to fit your unique requirements: Create an environment monitoring mesh
and produce real-time heatmaps, or maybe decentralised, encrypted
messaging network, your imagination is the limit.
Messages are AES256 encrypted. Only radios supplied with your channel settings (which includes the key) should be able to read your messages. Using multichannel settings you can send encrypted messages on one channel and still participate in a default Meshtastic mesh.
</>
),
},
{
title: "Peak Efficiency",
imageUrl: "img/efficiency.svg",
title: "Conserve Battery",
imageUrl: "img/homepage/battery.svg",
description: (
<>
Go for days on end and on a single battery, or extend it infinitely with
a solar cell, communicate with tens kilometres between nodes on
inexpensive beginner friendly hardware.
Go for days on end and on a single battery or extend it infinitely with a solar cell. Power management ensures the device will last the duration of your use.
</>
),
},
{
title: "Extendable",
imageUrl: "img/homepage/extendable.svg",
description: (
<>
Create a highly scalable mesh with hardware on a multitude of platforms to fit your unique requirements: Create an environment monitoring mesh and produce real-time heatmaps, or maybe decentralised, encrypted messaging network, your imagination is the limit.
</>
),
},
{
title: "Platform Agnostic",
imageUrl: "img/homepage/platforms.svg",
description: (
<>
Meshtastic clients are built or being built for all major desktop and mobile platforms. Linux, Windows, Mac, Android, and iOS are all supported or well on their way to being supported.
</>
),
},
{
title: "Open Source",
imageUrl: "img/homepage/opensource.svg",
description: (
<>
All Meshtastic software is open source. If you want an improvement, submit a pull request or file an issue on Github. Happy coding!
</>
),
},
@ -65,10 +85,20 @@ function Home() {
const context = useDocusaurusContext();
const { siteConfig } = context;
return (
<Layout
title=""
description="Description will go into a meta tag in <head />"
>
<Layout>
<Head>
<meta property="og:title" content="Meshtastic" />
<meta
property="og:image"
content={useBaseUrl("img/meshtastic-design/web/social-preview-1200x630.png")}
/>
<meta
property="og:description"
content="Open Source hiking, pilot, skiing and secure GPS mesh communicator"
/>
<meta property="og:url" content="https://meshtastic.org/" />
<meta name="twitter:card" content="summary_large_image" />
</Head>
<header className={clsx("hero hero--primary", styles.heroBanner)}>
<div className="container">
<h1 className="hero__title">

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View file

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="150 150 650 650"
x="0px"
y="0px"
width="1000px"
height="1000px"
version="1.1"
id="svg2552"
sodipodi:docname="battery.svg"
inkscape:version="1.1-dev (f9311a1, 2019-12-25)">
<metadata
id="metadata2558">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2556" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
inkscape:document-rotation="0"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1440"
inkscape:window-height="829"
id="namedview2554"
showgrid="false"
inkscape:zoom="0.35812299"
inkscape:cx="632.38652"
inkscape:cy="857.96959"
inkscape:window-x="0"
inkscape:window-y="23"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1"
showguides="false" />
<g
id="g1421">
<g
style="isolation:isolate"
id="Layer_1"
data-name="Layer 1">
<path
style="stroke-width:0.947916;fill:#8c8ea0;fill-opacity:1"
inkscape:connector-curvature="0"
d="M 247.5,596.33329 H 656.99985 V 353.66671 H 247.5 Z m 30.33333,-212.33326 h 348.8332 v 181.99993 h -348.8332 z"
id="path842" />
<rect
style="fill:#67ea94;fill-opacity:1;stroke-width:0.947916"
x="298.39377"
y="405.74518"
width="307.72208"
height="138.51901"
id="rect844" />
<rect
style="stroke-width:0.947916;fill:#8c8ea0;fill-opacity:1"
x="672.16669"
y="424.44751"
width="30.333321"
height="101.11423"
id="rect846" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="150 150 650 650"
x="0px"
y="0px"
width="1000px"
height="1000px"
version="1.1"
id="svg2552"
sodipodi:docname="encryption.svg"
inkscape:version="1.1-dev (f9311a1, 2019-12-25)">
<metadata
id="metadata2558">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2556" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
inkscape:document-rotation="0"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1440"
inkscape:window-height="829"
id="namedview2554"
showgrid="false"
inkscape:zoom="0.21985622"
inkscape:cx="-461.19183"
inkscape:cy="389.09841"
inkscape:window-x="0"
inkscape:window-y="23"
inkscape:window-maximized="0"
inkscape:current-layer="svg2552" />
<path
id="path2031"
d="m 604.2826,369.65498 h -72.27958 v -85.03476 a 102.04171,102.04171 0 1 0 -204.08336,0 v 85.03476 h -72.27955 a 12.755214,12.755214 0 0 0 -12.75522,12.75521 v 297.62165 a 12.755214,12.755214 0 0 0 12.75522,12.75522 H 604.2826 a 12.755214,12.755214 0 0 0 12.75522,-12.75522 V 382.41019 A 12.755214,12.755214 0 0 0 604.2826,369.65498 Z m -112.67104,0 h -123.3004 v -85.83197 a 61.650202,61.650202 0 1 1 123.3004,0 z"
inkscape:connector-curvature="0"
style="fill:#8c8ea0;fill-opacity:1;stroke-width:1.06293" />
<path
id="path1428"
d="m 540.01854,526.74488 c 0,10.20417 0,20.09437 3.21824,29.35662 -33.83075,39.71777 -131.47682,152.67009 -131.47682,152.67009 l 2.27632,28.49319 c 0,0 27.31578,25.9029 31.39745,21.97821 12.08802,-11.77404 19.46642,-19.78039 19.46642,-19.78039 l 5.68293,-34.02698 36.97835,-2.72373 2.96706,-36.73502 38.95638,-0.74569 0.38462,-39.31745 41.35829,1.64836 7.06443,-14.7882 c 12.16651,5.25908 23.23411,7.3784 37.44146,7.3784 53.76813,0 97.33209,-41.91559 97.33209,-93.56439 0,-51.64881 -43.59536,-93.40742 -97.36349,-93.40742 -53.76813,0 -95.68373,41.9156 -95.68373,93.5644 z m 148.15672,-18.21052 a 30.494773,30.494773 0 1 1 -30.49478,-30.49477 30.463375,30.463375 0 0 1 30.49478,30.49477 z"
inkscape:connector-curvature="0"
style="fill:#67ea94;fill-opacity:1;stroke:#8c8ea0;stroke-width:15.6987;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.1-dev (f9311a1, 2019-12-25)"
sodipodi:docname="extendable.svg"
id="svg2552"
version="1.1"
height="1000px"
width="1000px"
y="0px"
x="0px"
viewBox="150 150 650 650">
<metadata
id="metadata2558">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2556" />
<sodipodi:namedview
inkscape:current-layer="svg2552"
inkscape:window-maximized="0"
inkscape:window-y="23"
inkscape:window-x="0"
inkscape:cy="597.2888"
inkscape:cx="336.80252"
inkscape:zoom="0.38374466"
showgrid="false"
id="namedview2554"
inkscape:window-height="829"
inkscape:window-width="1440"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
inkscape:document-rotation="0"
bordercolor="#666666"
pagecolor="#ffffff" />
<path
style="fill:#67ea94;fill-opacity:1;stroke:#8c8ea0;stroke-opacity:1"
id="path3864"
d="m 626.17928,465.50584 h -26.52301 a 1.9177887,1.9177887 0 0 1 -1.91779,-1.91778 v -74.06499 a 37.262634,37.262634 0 0 0 -37.26264,-37.26264 h -74.06499 a 1.9177887,1.9177887 0 0 1 -1.91779,-1.91779 v -26.52301 c 0,-26.0244 -20.61624,-47.81047 -46.64063,-48.26116 a 47.494037,47.494037 0 0 0 -48.32827,47.47486 v 27.30931 a 1.9177887,1.9177887 0 0 1 -1.91779,1.91779 h -74.06499 a 38.106461,38.106461 0 0 0 -37.99141,37.99139 v 67.48698 a 1.9177887,1.9177887 0 0 0 1.91779,1.91779 h 25.80385 c 28.16273,0 51.47345,24.43262 51.8666,52.59536 0.40273,28.64217 -22.54361,54.80081 -51.09948,54.80081 h -26.57097 a 1.9177887,1.9177887 0 0 0 -1.91779,1.91779 v 67.48698 a 38.106461,38.106461 0 0 0 37.99141,37.99139 h 67.48698 a 1.9177887,1.9177887 0 0 0 1.91778,-1.91779 v -20.06964 c 0,-29.03533 23.73264,-54.0337 52.73919,-54.71451 28.86272,-0.67124 54.65698,19.47514 54.65698,48.21319 v 26.57096 a 1.9177887,1.9177887 0 0 0 1.91778,1.91779 h 68.21575 a 37.262634,37.262634 0 0 0 37.26264,-37.26263 v -74.79375 a 1.9177887,1.9177887 0 0 1 1.91779,-1.9178 h 27.30931 c 26.49425,0 47.48445,-21.73813 47.48445,-48.32827 0,-26.59014 -22.24635,-46.64063 -48.27075,-46.64063 z"
stroke-width="32"
stroke-linejoin="round"
stroke-linecap="round"
stroke="#000"
fill="none"
inkscape:connector-curvature="0" />
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.1-dev (f9311a1, 2019-12-25)"
sodipodi:docname="messages.svg"
id="svg2552"
version="1.1"
height="1000px"
width="1000px"
y="0px"
x="0px"
viewBox="150 150 650 650">
<metadata
id="metadata2558">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2556" />
<sodipodi:namedview
inkscape:current-layer="svg2552"
inkscape:window-maximized="0"
inkscape:window-y="23"
inkscape:window-x="0"
inkscape:cy="676.32321"
inkscape:cx="-42.928485"
inkscape:zoom="0.42598983"
showgrid="false"
id="namedview2554"
inkscape:window-height="829"
inkscape:window-width="1440"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
inkscape:document-rotation="0"
bordercolor="#666666"
pagecolor="#ffffff" />
<g
id="g3794">
<path
inkscape:connector-curvature="0"
d="m 585.20406,337.46384 v 148.39991 a 52.284954,52.284954 0 0 1 -52.13599,52.13601 H 379.31305 a 7.4479993,7.4479993 0 0 0 -4.77683,1.73109 l -9.22817,7.69352 v 20.92747 a 52.284953,52.284953 0 0 0 52.13599,52.136 h 153.75502 a 7.4479989,7.4479989 0 0 1 4.77501,1.7311 l 87.25396,72.74889 v -74.47999 h 37.23999 a 52.284953,52.284953 0 0 0 52.13599,-52.136 v -178.752 a 52.284953,52.284953 0 0 0 -52.13599,-52.136 z"
style="fill:#67ea94;fill-opacity:1;stroke:#8c8ea0;stroke-width:29.79200000000000159px;stroke-linejoin:round;stroke-opacity:1"
id="path839-0-4" />
<path
id="path839"
style="fill:none;stroke:#8c8ea0;stroke-width:29.792px;stroke-linejoin:round;stroke-opacity:1"
d="M 532.55599,255.03389 H 249.53201 a 52.284957,52.284957 0 0 0 -52.13599,52.136 v 178.75199 a 52.284957,52.284957 0 0 0 52.13599,52.13599 h 37.24 v 74.48 l 87.25331,-72.74834 a 7.4479995,7.4479995 0 0 1 4.77603,-1.73166 h 153.75464 a 52.284957,52.284957 0 0 0 52.136,-52.13599 V 307.16989 a 52.284957,52.284957 0 0 0 -52.136,-52.136 z"
inkscape:connector-curvature="0" />
<circle
id="circle841"
r="29.791998"
cy="396.54596"
cx="301.66803"
style="fill:#8c8ea0;fill-opacity:1;stroke:#8c8ea0;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<circle
id="circle843"
r="29.791998"
cy="396.54596"
cx="391.04401"
style="fill:#8c8ea0;fill-opacity:1;stroke:#8c8ea0;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<circle
id="circle845"
r="29.791998"
cy="396.54596"
cx="480.41998"
style="fill:#8c8ea0;fill-opacity:1;stroke:#8c8ea0;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View file

@ -0,0 +1,128 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.1-dev (f9311a1, 2019-12-25)"
sodipodi:docname="opensource.svg"
id="svg2552"
version="1.1"
height="1000px"
width="1000px"
y="0px"
x="0px"
viewBox="150 150 650 650">
<metadata
id="metadata2558">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2556" />
<sodipodi:namedview
inkscape:current-layer="g2767"
inkscape:window-maximized="0"
inkscape:window-y="23"
inkscape:window-x="0"
inkscape:cy="792.26674"
inkscape:cx="55.230787"
inkscape:zoom="0.25792546"
showgrid="false"
id="namedview2554"
inkscape:window-height="829"
inkscape:window-width="1440"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
inkscape:document-rotation="0"
bordercolor="#666666"
pagecolor="#ffffff" />
<g
id="g2144"
transform="matrix(-2403.8462,0,0,0,-624628.82,150)">
<circle
id="circle937-3"
r="72.800003"
cy="348.21353"
cx="-259.90799"
style="stroke-width:0.65" />
<path
id="path939-9"
d="m -259.90798,441.81355 c -45.123,0 -135.2,27.872 -135.2,83.2 v 41.6 h 270.39999 v -41.6 c 0,-55.328 -90.077,-83.2 -135.19999,-83.2 z"
inkscape:connector-curvature="0"
style="stroke-width:0.65" />
</g>
<g
id="g2767"
transform="translate(-72.893828,73.324518)">
<circle
style="fill:#67ea94;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
id="path4674-0"
cx="809.71533"
cy="368.6572"
r="23.734468" />
<circle
r="23.734468"
cy="210.17131"
cx="682.32843"
id="path4674"
style="fill:#67ea94;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none" />
<circle
style="fill:#67ea94;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
id="path4674-4"
cx="682.32843"
cy="369.75418"
r="23.734468" />
<g
style="fill:#8c8ea0;fill-opacity:1"
transform="matrix(1.4200109,0,0,1.4200109,247.07705,-14.128526)"
id="g2753">
<circle
id="circle2148"
r="46.799999"
cy="296.29715"
cx="94.256836"
style="fill:#8c8ea0;fill-opacity:1;stroke-width:0.65" />
<path
id="path2150"
d="m 147.55684,369.09715 c -18.304,-9.295 -38.506,-13 -53.299997,-13 -28.977,0 -88.4000005,17.771 -88.4000005,53.3 v 27.3 H 103.35684 v -10.4455 c 0,-12.35 5.2,-24.7325 14.3,-35.0545 7.2605,-8.242 17.4265,-15.8925 29.9,-22.1 z"
inkscape:connector-curvature="0"
style="fill:#8c8ea0;fill-opacity:1;stroke-width:0.65" />
<path
id="path2152"
d="m 216.45684,363.89715 c -33.8455,0 -101.4,20.904 -101.4,62.4 v 31.2 h 202.8 v -31.2 c 0,-41.496 -67.5545,-62.4 -101.4,-62.4 z"
inkscape:connector-curvature="0"
style="fill:#8c8ea0;fill-opacity:1;stroke-width:0.65" />
<circle
id="circle2154"
r="57.200001"
cy="285.89716"
cx="216.45685"
style="fill:#8c8ea0;fill-opacity:1;stroke-width:0.65" />
</g>
<path
style="fill:#8c8ea0;fill-opacity:1;stroke-width:0.493184"
inkscape:connector-curvature="0"
d="m 714.13879,210.27688 a 31.56376,31.56376 0 1 0 -47.83883,27.03141 v 103.46995 a 31.56376,31.56376 0 1 0 31.56376,0 V 237.89518 a 31.593351,31.593351 0 0 0 16.27507,-27.6183 z m -31.56376,-15.78187 a 15.78188,15.78188 0 1 1 -15.78189,15.78187 15.78188,15.78188 0 0 1 15.78189,-15.78187 z m -0.49319,189.38256 a 15.78188,15.78188 0 1 1 15.78188,-15.78188 15.78188,15.78188 0 0 1 -15.78188,15.78188 z"
id="path1533" />
<path
style="fill:#8c8ea0;fill-opacity:1;stroke-width:0.493184"
inkscape:connector-curvature="0"
d="M 824.61195,340.77824 V 239.86791 a 45.422223,45.422223 0 0 0 -45.37291,-45.3729 h -17.26143 v -26.66645 l -43.33112,42.44832 43.33112,42.44833 v -26.66644 h 17.26143 a 13.809145,13.809145 0 0 1 13.80915,13.80914 v 100.91033 a 31.56376,31.56376 0 1 0 31.56376,0 z m -15.78189,43.09933 a 15.78188,15.78188 0 1 1 15.78189,-15.78188 15.78188,15.78188 0 0 1 -15.78189,15.78188 z"
id="path1535" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

View file

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.1-dev (f9311a1, 2019-12-25)"
sodipodi:docname="platforms.svg"
id="svg2552"
version="1.1"
height="1000px"
width="1000px"
y="0px"
x="0px"
viewBox="150 150 650 650">
<metadata
id="metadata2558">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2556">
<linearGradient
id="linearGradient5705"
osb:paint="solid">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop5703" />
</linearGradient>
</defs>
<sodipodi:namedview
inkscape:current-layer="svg2552"
inkscape:window-maximized="0"
inkscape:window-y="23"
inkscape:window-x="0"
inkscape:cy="438.09337"
inkscape:cx="667.05517"
inkscape:zoom="0.39126799"
showgrid="false"
id="namedview2554"
inkscape:window-height="829"
inkscape:window-width="1440"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
inkscape:document-rotation="0"
bordercolor="#666666"
pagecolor="#ffffff" />
<rect
style="fill:#67ea94;fill-opacity:1;stroke:#000000;stroke-width:2.1259;stroke-opacity:0.894118"
id="rect5697"
width="102.79914"
height="193.76836"
x="655.36603"
y="295.9169"
ry="0" />
<rect
id="rect3910"
style="fill:#67ea94;fill-opacity:1;stroke:#8c8ea0;stroke-width:28.92530000000000001px;stroke-linejoin:round;stroke-opacity:1"
ry="29.051876"
rx="29.051876"
height="274.79065"
width="376.0293"
y="362.05963"
x="225.88797" />
<line
id="line3912"
style="fill:#67ea94;fill-opacity:1;stroke:#8c8ea0;stroke-width:28.92530000000000001px;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:1"
y2="651.31293"
x2="630.84259"
y1="651.31293"
x1="196.96265" />
<path
style="fill:#8c8ea0;fill-opacity:1;stroke:#2c2d3c;stroke-width:0.417192;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path5091"
d="M 759.78194,284.43303 H 654.64949 a 7.5094606,7.5094605 0 0 0 -7.50946,7.50946 V 490.526 a 7.5094606,7.5094605 0 0 0 7.50946,7.50946 H 759.78194 A 7.5094606,7.5094605 0 0 0 767.2914,490.526 V 291.94249 a 7.5094606,7.5094605 0 0 0 -7.50946,-7.50946 z M 662.15895,471.33516 V 311.13333 h 90.11353 v 160.20183 z" />
<g
id="g7659"
transform="matrix(0.78403486,0,0,0.44950568,541.89089,237.0322)"
style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;fill:#2c2d3c;fill-opacity:1">
<g
style="fill:#2c2d3c;fill-opacity:1"
id="g7653"
transform="matrix(0.201804,0,0,0.351989,167.289,216.061)">
<path
style="fill:#2c2d3c;fill-opacity:1"
id="path7651"
d="m 250.912,334.664 -55.737,81.739 -16.286,-11.106 63.864,-93.657 c 1.834,-2.69 4.878,-4.301 8.134,-4.304 3.256,-0.003 6.303,1.602 8.142,4.289 l 64.011,93.51 -16.266,11.135 z"
inkscape:connector-curvature="0" />
</g>
<g
style="fill:#2c2d3c;fill-opacity:1"
id="g7657"
transform="matrix(0.205009,0,0,0.357578,174.224,154.227)">
<path
style="fill:#2c2d3c;fill-opacity:1"
id="path7655"
d="m 89.878,582.923 67.115,-98.421 -16.591,-11.314 -67.115,98.421 z"
inkscape:connector-curvature="0" />
</g>
</g>
<g
style="clip-rule:evenodd;fill:#2c2d3c;fill-opacity:1;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
transform="matrix(4.180922,0,0,2.3970211,-467.70386,-322.83841)"
id="g7659-8">
<g
style="fill:#2c2d3c;fill-opacity:1"
transform="matrix(0.201804,0,0,0.351989,167.289,216.061)"
id="g7653-0">
<path
style="fill:#2c2d3c;fill-opacity:1"
inkscape:connector-curvature="0"
d="m 250.912,334.664 -55.737,81.739 -16.286,-11.106 63.864,-93.657 c 1.834,-2.69 4.878,-4.301 8.134,-4.304 3.256,-0.003 6.303,1.602 8.142,4.289 l 64.011,93.51 -16.266,11.135 z"
id="path7651-2" />
</g>
<g
style="fill:#2c2d3c;fill-opacity:1"
transform="matrix(0.205009,0,0,0.357578,174.224,154.227)"
id="g7657-4">
<path
style="fill:#2c2d3c;fill-opacity:1"
inkscape:connector-curvature="0"
d="m 89.878,582.923 67.115,-98.421 -16.591,-11.314 -67.115,98.421 z"
id="path7655-8" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5 KiB

File diff suppressed because it is too large Load diff