RVMP (RTCM-VIA-MQTT-PROTOCOL) V0.1 (first very basic approach, but some features for future are in preperation).
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
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 knowen and usefull protocol with most needed features for this task.
Attension: Topics are casesensitive!!
- Basestation(s) is/are publishing to MQTT broker (RTK/Base/...) 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,..)
- Caster is subscribing to broker and receiving all msg from connected basestations.
- 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 ar 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
- Clients can connect to the broker (user/password protected) and post the user id, ths will request the caster to resend the Mountpointlist
- Clients can select to subscribe the required RTCM msg from the disired MNTP (mountpoint)
- If the Client is leaving, the lastwill is "byebye" is activated.
- Caster can switch Off RTCM pubishing of the Basestations if the last client has closed the subscription.
Welcome msg: (transmitted when a new connection is established, or a feature is updated, .. )
- RTK/Base//Status/Tversion/ - e.g "2.2" - Version of transmitter firmware [QOS = 1, retain = true, last_will = null] [read acces only by caster app, read/write by Basestation ] +RTK/Base//Status/Pversion/ - e.g "0.1" - Version of protocol [QOS = 1, retain = true, last_will = null] [read acces only by caster app, read/write by Basestation ]
- RTK/Base//Status/RTCM// - e.g "1", "0.5" or "30" - time in seconds between update (~frequenz) [QOS = 1, retain = true, last_will = null] [read acces only by caster app, read/write by Basestation ]
- RTK/Base//Status/Operation/ - "ON" full working RTCM, "STBY" receiving RTCM, but not transmitting over MQTT, "ERROR" having some trouble, "OFF" - not avaliable [QOS = 1, retain = true, last_will = "OFF"] [read acces only by caster app, read/write by Basestation ]
- RTK/Base//Status/Error/ - type of error e.g "NO_RTCM_INPUT" [QOS = 1, retain = false, last_will = null] [read acces only by caster app, read/write by Basestation ] //further work required
- //planning to implement: RTK/Base//Status/Position/Lat/ - LatPosition [QOS = 1, retain = true, last_will = null] [read acces only by caster app, read/write by Basestation ] //further work required
- //planning to implement: RTK/Base//Status/Position/Long/ - LongPosition [QOS = 1, retain = true, last_will = null] [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, last_will = null] [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 == ) [QOS = 1, retain = false, last_will = null] [read acces only by caster app, read/write by Basestation ] //further work required
for each RTCM msg type:
- RTK/Base/NAME of BASE/RTCM// [retain = false, last_will = null] [read acces only by caster app, read/write by Basestation ]
- RTK/Base//Command/In/RTCM/
- RTK/Base//Command/In/GPS/
- RTK/Base//Command/In/Transmitter/
- //planning to try: RTK/Base/Command/In/Serial/
- //planning to try: RTK/Base//Serial/In/
- RTK/Base//Status/Tversion/
- RTK/Base//Status/Pversion/
- RTK/Base//Status/RTCM//
- 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//... to RTK/MNTP/
- keep track of the Basestations
- construct and update Mountpointlist (all possible avaliable Basestations )
- keep track of the Basestations
- RTK/MNTP//RTCM// [retain = false, last_will = null] [read acces by all RTK users, read/write by caster] commands to Basestation
- RTK/MNTP//Command/In/RTCM/ - "ON" or "OFF" to activate/deactivate RTCM transmission if required [QOS = 1, retain = false, last_will = null] [read/write acces by caster app, read by correct Basestation ]
- RTK/MNTP//Command/In/GPS/ - "REBOOT" to force an GPS reboot [retain = false, last_will = null] [QOS = 1, read/write acces by caster app, read by correct Basestation ]
- RTK/MNTP//Command/In/Transmitter/ - "REBOOT" to force an transmitter reboot (e.g ESP32 modul) [QOS = 1, retain = false, last_will = null] [read/write acces by caster app, read by correct Basestation ]
- RTK/MNTPList//Status/Pversion/ [QOS = 1, retain = true, last_will = null] [read/write acces by caster app, read by clients ]
- RTK/MNTPList//Status/RTCM// [QOS = 1, retain = true, last_will = null] [read/write acces by caster app, read by clients ]
- RTK/MNTPList//Status/Operation/ [QOS = 1, retain = true, last_will = null] [read/write acces by caster app, read by clients ]
- RTK/MNTPList//Status/Position/Lat/ [QOS = 1, retain = true, last_will = null] [read/write acces by caster app, read by clients ]
- RTK/MNTPList//Status/Position/Long/ [QOS = 1, retain = true, last_will = null] [read/write acces by caster app, read by clients ]
- RTK/User/Subscribe// - "" 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 ]
initially and refresh if needed
- RTK/MNTPList/# - get complete list or
- RTK/MNTPList//# - get single desired MNTP continously
- RTK/MNTP//Status/Operation/ - check operation of desired MNTP
- RTK/MNTP//RTCM/# - get all RTCM msg avaliable or
- RTK/MNTP//RTCM// - just for each desired msg type
- //planning: RTK/Base//Serial/Out/
- //planning: RTK/Base//Serial/In/ - Serial transmission to GPS if required (config of chip) [retain = false, last_will = null] //serial transmission will be included in a later version
- //planning to try: RTK/Base/Command/In/Serial/ - "ON" or "OFF" to activate/deactivate Serial transmission to GPS if required (config of chip) [retain = false, last_will = null] //serial transmission will be included in a later version
MNTP - Mountpoint == - e.g. XYZ01 - e.g. 1074
+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/Command/In/Serial/ ...) in far future
- RTK/User/Subscribe//Position/
- and construckt/calculate virtual basestation on user request for user position - give virtual name MNTP and publish accordingly