Skip to content

Commit

Permalink
bump to 0.3 - delay caster setup until V2.0
Browse files Browse the repository at this point in the history
Focus on singel base, multi rover, privat user
  • Loading branch information
hagre committed Sep 17, 2020
1 parent 4ee8214 commit ef58f72
Showing 1 changed file with 46 additions and 89 deletions.
135 changes: 46 additions & 89 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,126 +1,83 @@
# RVMP (RTCM-VIA-MQTT-PROTOCOL)

RVMP (RTCM-VIA-MQTT-PROTOCOL) V0.2 (first very basic approach, but some features for future are in preperation). (GNU GPL V3)
RVMP (RTCM-VIA-MQTT-PROTOCOL) V0.3 (first very basic approach, but some features for future are in preperation). (GNU GPL V3)

In use by RVMT (RTCM Via MQTT Transmitter - https://github.com/hagre/RVMT_RTCM-VIA-MQTT-TRANSMITTER) using the MQTT msg/protocol (as a secure and opensource alternative to NTRIP) to get RTK correction data from BaseStations to Broker and to Rover GPS units.

Caster is on https://github.com/hagre/RVMT_RTCM-VIA-MQTT-CASTER
Caster is/will be on https://github.com/hagre/RVMT_RTCM-VIA-MQTT-CASTER

Basicly, this is a try to implement something like a NTRIP caster with MQTT features. There are a lot of similarities to NTRIP (V1.0/V2.0), because it is a known and usefull protocol with most needed features for this task.

Attension: Topics are casesensitive!!

# Basic Workflow Description: v.0.2
+ Basestation(s) are checking if a caster exists/is implemented or a simple base-client relay configuration is used
+ Basestation(s) is/are publishing to MQTT broker (RTK/Base/...) and/or (RTK/MNTP/... - simple relay config) and deliver basic information (needed for Mountpointlist and ..)
+ Basestationen are continuosly evaluating the RTCM input and presenting the avaliable feature (incl update if somthing new,..)
+ Basestationen have to present relevant MNTPList msg if in use as simple relay
The basic system setup can be:

+ Caster (if implemented) publish basic infos on RTK/Caster/... , to be recogniced by other users
+ Caster (if implemented) is subscribing to broker and receiving all msg from connected basestations.
+ Only caters have permission to read RTK/Base/... input
+ Caster is keeping track of avaliable basstations (all, old and active ones).
+ Caster is creating an Mountpointlist of possible active stations and publishing it to the broker under RTK/MNTPList/...
+ Caster can activate RTCM transmission of connected and active basstation if needed
+ Caster are tranforming/copy all the necessary RTCM datar from the RTK/Base/... to the RTK/MNTP/... topic (readeable for all RTK users)
+ If a basestation is lost the last will show "off", the caster will remove it from the active Mountpointlist
For most users with 1 Base and 1 or more Rovers -----------------> My focus until V2.0
1.) Base (Transmitter) - via MQTT - Broker/Server - via MQTT - Client/Receiver/Rover

+ Clients can connect to the broker (user/password protected) and post the user id, this will request the caster to resend the Mountpointlist
+ Clients can select to subscribe to the required RTCM msg from the desired MNTP (mountpoint) or all of them. RTK/MNTP/<NAME of MNTP>/RTCM/#
+ If the Client is leaving, the lastwill "byebye" gets activated.
+ Caster can switch off publishing of the Basestations publishing RTCM (maintaining in STBY) if the last client has closed the subscription.
For users with more than 1 Base and different "customers" with lots of rovers (accountmanagement) -----------------> Not until V2.0
2.) Base (Transmitter) - via MQTT - Broker/Server - via MQTT - Caster (Relaying/managing the Topics) - via MQTT - Client/Receiver/Rover


# Basic Workflow Description: v.0.3
+ Basestation(s) is/are publishing to MQTT broker (RTK/Base/...) and deliver basic information
+ Basestationen are continuosly evaluating the RTCM input and presenting the avaliable feature (incl update if something new,..)

+ Clients can connect to the broker (user/password protected)
+ Clients can select to subscribe to the required RTCM msg from the desired RTK/Base/...
+ Clients can switch off publishing of the Basestations publishing RTCM (maintaining in STBY) if the last client has closed the subscription.


# More Details on the used Topics:

# Basestation (MNTP) publish:
# Basestation publish:
Welcome msg: (transmitted when a new connection is established, or a feature is updated, .. )
+ RTK/Base/(NAME of BASE)/Status/FirmwareVer/ - e.g "2.2" - Version of transmitter firmware [QOS = 1, retain = true] [read acces only by caster app, read/write by Basestation ]
+ RTK/Base/(NAME of BASE)/Status/ProtocolVer/ - e.g "0.1" - Version of protocol [QOS = 1, retain = true] [read acces only by caster app, read/write by Basestation ]
+ RTK/Base/(NAME of BASE)/Status/RTCM/(TYPE of MSG)/ - e.g "1", "0.5" or "30" - time in seconds between update (~frequenz) [QOS = 1, retain = true] [read acces only by caster app, read/write by Basestation ]
+ RTK/Base/(NAME of BASE)/Status/Operation/ - "ONLINE" full working RTCM, "STBY" receiving RTCM, but not transmitting over MQTT, "ERROR" having some trouble, "OFF" - not avaliable [QOS = 1, retain = true, last_will = "OFFLINE"] [read acces only by caster app, read/write by Basestation ]
+ RTK/Base/(NAME of BASE)/Status/Error/ - type of error e.g "NO_RTCM_INPUT" [QOS = 1, retain = false] [read acces only by caster app, read/write by Basestation ] //further work required
+ //planning to implement: RTK/Base/(NAME of BASE)/Status/Position/Lat/ - LatPosition [QOS = 1, retain = true] [read acces only by caster app, read/write by Basestation ] //further work required
+ //planning to implement: RTK/Base/(NAME of BASE)/Status/Position/Long/ - LongPosition [QOS = 1, retain = true] [read acces only by caster app, read/write by Basestation ] //further work required
+ //planning to try: RTK/MNTP/(NAME of BASE)/Command/Out/PW/ - e.g "Password" [QOS = 1, retain = false] [read acces only by caster app, read/write by Basestation ] //further work required
+ //planning to try: RTK/MNTP/(NAME of BASE)/Command/Out/USER/ - e.g "Username" (? username == <NAME of MNTP>) [QOS = 1, retain = false] [read acces only by caster app, read/write by Basestation ] //further work required
+ RTK/Base/(NAME of BASE)/Status/FirmwareVer - e.g "2.2" - Version of transmitter firmware [QOS = 1, retain = true] [read acces only by caster app, read/write by Basestation ]
+ RTK/Base/(NAME of BASE)/Status/ProtocolVer - e.g "0.1" - Version of protocol [QOS = 1, retain = true] [read acces only by caster app, read/write by Basestation ]
+ RTK/Base/(NAME of BASE)/Status/RTCM/(TYPE of MSG) - e.g "1", "0.5" or "30" - time in seconds between update (~frequenz) [QOS = 1, retain = true] [read acces only by caster app, read/write by Basestation ]
+ RTK/Base/(NAME of BASE)/Status/Operation - "ONLINE" full working RTCM, "STBY" receiving RTCM, but not transmitting over MQTT, "ERROR" having some trouble, "OFF" - not avaliable [QOS = 1, retain = true, last_will = "OFFLINE"] [read acces only by caster app, read/write by Basestation ]
+ RTK/Base/(NAME of BASE)/Status/Error - type of error e.g "NO_RTCM_INPUT" [QOS = 1, retain = false] [read acces only by caster app, read/write by Basestation ] //further work required
+ RTK/Base/(NAME of BASE)/Serial/Out - Serial transmission from GPS if required (config of chip) and acivated by client [retain = false]
+ //planning to implement: RTK/Base/(NAME of BASE)/Status/Position/Lat - LatPosition [QOS = 1, retain = true] [read acces only by caster app, read/write by Basestation ] //further work required
+ //planning to implement: RTK/Base/(NAME of BASE)/Status/Position/Long - LongPosition [QOS = 1, retain = true] [read acces only by caster app, read/write by Basestation ] //further work required

for each RTCM msg type:
+ RTK/Base/NAME of BASE/RTCM/<TYPE of MSG>/ [retain = false] [read acces only by caster app, read/write by Basestation ]

# Basestation (MNTP) subscribe:
RTK/Caster/Status/Operation/
+ RTK/Base/(NAME of BASE)/Command/In/RTCM/
+ RTK/Base/(NAME of BASE)/Command/In/GPS/
+ RTK/Base/(NAME of BASE)/Command/In/Transmitter/
+ //planning to try: RTK/Base/(NAME of BASE)Command/In/Serial/
+ //planning to try: RTK/Base/(NAME of BASE)/Serial/In/

# Caster subscribe:
+ RTK/Base/+/Status/Firmware/
+ RTK/Base/+/Status/Protocol/
+ RTK/Base/+/Status/RTCM/(TYPE of MSG)/
+ RTK/Base/+/Status/Operation/
+ RTK/Base/+/Status/Error/
+ RTK/Base/+/Status/Position/Lat/
+ RTK/Base/+/Status/Status/Position/Long/
+ //planning to try: RTK/MNTP/+/Command/Out/PW/
+ //planning to try: RTK/MNTP/+/Command/Out/USER/
+ RTK/Base/+/RTCM/#

some calculation in the caster ....
- acvtivate or deactivate Basestations
- solve errors witch reboot if required
- copy RTCM from RTK/Base/(NAME of BASE)/... to RTK/MNTP/(NAME of MNTP)
- keep track of the Basestations
- construct and update Mountpointlist (all possible avaliable Basestations )
- keep track of the Basestations

# Caster publish:
+ RTK/Caster/Status/Operation/ - "ON" full working "OFF" - not avaliable [QOS = 1, retain = true, last_will = "OFF"] [read acces by all RTK users, read/write by caster]
+ RTK/MNTP/(NAME of MNTP)/RTCM/(TYPE of MSG)/ [retain = false] [read acces by all RTK users, read/write by caster]
commands to Basestation
+ RTK/MNTP/(NAME of MNTP)/Command/In/RTCM/ - "ON" or "OFF" to activate/deactivate RTCM transmission if required [QOS = 1, retain = false] [read/write acces by caster app, read by correct Basestation ]
+ RTK/MNTP/(NAME of MNTP)/Command/In/GPS/ - "REBOOT" to force an GPS reboot [retain = false] [QOS = 1, read/write acces by caster app, read by correct Basestation ]
+ RTK/MNTP/(NAME of MNTP)/Command/In/Transmitter/ - "REBOOT" to force an transmitter reboot (e.g ESP32 modul) [QOS = 1, retain = false] [read/write acces by caster app, read by correct Basestation ]
+ RTK/MNTPList/(NAME of BASE)/Status/Protocol/ [QOS = 1, retain = true] [read/write acces by caster app, read by clients ]
+ RTK/MNTPList/(NAME of BASE)/Status/RTCM/(TYPE of MSG)/ [QOS = 1, retain = true] [read/write acces by caster app, read by clients ]
+ RTK/MNTPList/(NAME of BASE)/Status/Operation/ [QOS = 1, retain = true] [read/write acces by caster app, read by clients ]
+ RTK/MNTPList/(NAME of BASE)/Status/Position/Lat/ [QOS = 1, retain = true] [read/write acces by caster app, read by clients ]
+ RTK/MNTPList/(NAME of BASE)/Status/Position/Long/ [QOS = 1, retain = true] [read/write acces by caster app, read by clients ]
+ RTK/Base/NAME of BASE/RTCM/<TYPE of MSG> [retain = false] [read acces only by caster app, read/write by Basestation ]

# Basestation subscribe:
+ RTK/Base/(NAME of BASE)/Command/In/RTCM
+ RTK/Base/(NAME of BASE)/Command/In/GPS
+ RTK/Base/(NAME of BASE)/Command/In/Transmitter
+ RTK/Base/(NAME of BASE)/Command/In/Serial
+ RTK/Base/(NAME of BASE)/Serial/In

# Clients publish:
+ RTK/User/Subscribe/(NAME of USER)/ - "(NAME of MNTP)" to request MNTP transmission, caster will provide needet data if on the mountpointlist [QOS = 1, retain = false, last_will = "ByeBye"] [read/write acces by clients app, read by caster ]
NIL

# Clients subscribe:
initially and refresh if needed
+ RTK/MNTPList/# - get complete list
or
+ RTK/MNTPList/(NAME of MNTP)/# - get single desired MNTP
continously
+ RTK/MNTP/(NAME of MNTP)/Status/Operation/ - check operation of desired MNTP
+ RTK/MNTP/(NAME of MNTP)/RTCM/# - get all RTCM msg avaliable
+ RTK/Base/(NAME of Base)/Status/Operation - check operation of desired Base
+ RTK/Base/(NAME of Base)/RTCM/# - get all RTCM msg avaliable
or
+ RTK/MNTP/(NAME of MNTP)/RTCM/(TYPE of MSG)/ - just for each desired msg type
+ RTK/Base/(NAME of Base)/RTCM/(TYPE of MSG) - just for each desired msg type

# //MaintenanceClient subscribe:
+ //planning: RTK/Base/(NAME of BASE)/Serial/Out/
+ RTK/Base/(NAME of BASE)/Serial/Out

# //MaintenanceClient publish:
+ //planning: RTK/Base/(NAME of BASE)/Serial/In/ - Serial transmission to GPS if required (config of chip) [retain = false] //serial transmission will be included in a later version
+ //planning to try: RTK/Base/(NAME of BASE)/Command/In/Serial/ - "ON" or "OFF" to activate/deactivate Serial transmission to GPS if required (config of chip) [retain = false] //serial transmission will be included in a later version

+ RTK/Base/(NAME of BASE)/Serial/In - Serial transmission to GPS if required (config of chip) [retain = false]
+ RTK/Base/(NAME of BASE)/Command/In/Serial - "ON" or "OFF" to activate/deactivate Serial transmission to GPS if required (config of chip) [retain = false]

# Hints:
+ MNTP - Mountpoint
+ (NAME of MNTP) == "(NAME of BASE)"- e.g. XYZ01
+ (NAME of BASE)- e.g. XYZ01
+ (TYPE of MSG) - e.g. 1074


# further plans:
+add PW acces for Basestation (if required at all)
+add a special client ID (user "BaseMaintenance") for mantenance my basestations with serial com
+serial com with base (RTK/Base/(NAME of BASE)/Command/In/Serial/ ...)
+ add PW acces for Basestation (if required at all)
+ add a special client ID (user "BaseMaintenance") for mantenance my basestations with serial com

+ Caster setup

in far future
+ RTK/User/Subscribe/(NAME of USER)/Position/
+ and construckt/calculate virtual basestation on user request for user position - give virtual name MNTP and publish accordingly

0 comments on commit ef58f72

Please sign in to comment.