本文尽可能详细的介绍下RTCM电文信号数据的筛选和重新播发,以消息类型GPS MSM4为例(初学者,如有错误欢迎批评与指正)。
参考的相关文档与文章如下:
GitHub - MichaelBeechan/RTCM3.3: RTCM3.3
AN018_RTCM3.2格式说明_北云科技.pdf (bynav.com)
RTCM3.3电文信号,消息类型GPS MSM4的解码_rtcm3.3协议-CSDN博客
参考的源代码如下:
RTKLIB: An Open Source Program Package for GNSS Positioning
1.RTCM电文信号构成
(1)电文结构解析
例:
D3 00 8A 43 20 00 40 7F 79 82 00 20 00 22 80 65 80 00 00 00 20 20 00 00 7F FF A7 22 26 26 22 A6 A2 A3 20 FD DC 05 9F 5B 1B C6 36 1C 86 77 0E 32 33 7C 61 97 B4 0F 5E 7F E6 BF DF F8 73 F1 3A 5F 88 BD 49 6B 82 BC A6 C4 CD 85 86 FD F4 1A C0 FF B8 38 01 77 CC 78 42 7D EC C5 40 18 A1 81 7B EC 86 04 76 0F EE 28 53 6E E0 84 36 09 22 26 0C 72 80 D3 4C C2 8E 7A 7F FF FF FF FF FF FF FF 80 00 57 4E 18 59 3D 75 E5 8D D3 E7 86 58 80 71 CE 42
将电文信号转为2进制为:
110100110000000010001010010000110010000000000000010000000111111101111001100000100000000000100000000000000010001010000000011001011000000000000000000000000000000000100000001000000000000000000000011111111111111110100111001000100010011000100110001000101010011010100010101000110010000011111101110111000000010110011111010110110001101111000110001101100001110010000110011101110000111000110010001100110111110001100001100101111011010000001111010111100111111111100110101111111101111111111000011100111111000100111010010111111000100010111101010010010110101110000010101111001010011011000100110011011000010110000110111111011111010000011010110000001111111110111000001110000000000101110111110011000111100001000010011111011110110011000101010000000001100010100001100000010111101111101100100001100000010001110110000011111110111000101000010100110110111011100000100001000011011000001001001000100010011000001100011100101000000011010011010011001100001010001110011110100111111111111111111111111111111111111111111111111111111111111111100000000000000001010111010011100001100001011001001111010111010111100101100011011101001111100111100001100101100010000000011100011100111001000010
以下为官方文档对MSM4的数据分析:
电文结构:
此处数据举例为GPS MSM4:
数据区各个Data Field的含义和所占长度:
以下为自己整理的数据分析结果:
结构 | 数据内容 | 比特数/bits | 备注 | 示例 |
引导字 | 同步码 | 8 | 11010011 | |
保留字 | 保留 | 6 | 0000000 | |
消息长度 | 信息长度 | 10 | 见注1 | 10001010 |
可变长度信息 | 信息类型 | 12 | 见注2 | 10000110010 |
基准站 ID | 12 | 0000000000000 | ||
GNSS 历元时间 | 30 | 010000000111111101111001100000 | ||
MSM 多信息标志 | 1 | 1 | ||
IODS | 3 | 000 | ||
预留 | 7 | 0000000 | ||
锁定引导标志 | 2 | 01 | ||
扩展锁定标志 | 2 | 00 | ||
GNSS 平滑类型标志 | 1 | 0 | ||
GNSS 平滑区间 | 3 | 000 | ||
GNSS 卫星掩码 | 64 | 见注3 | 0000000001000101000000001100101100000000000000000000000000000000 | |
GNSS 信号掩码 | 32 | 见注4 | 01000000010000000000000000000000 | |
GNSS Cell Mask | x | 见注5 | 1111111111111111 | |
GNSS 卫星粗略距离 | 8 | 整毫秒 (见注6) | 01001110 01000100 01001100 01001100 01000101 01001101 01000101 01000110 | |
GNSS 卫星粗略距离 | 10 | 毫秒内 (见注6) | 0100000111 1110111011 1000000010 1100111110 1011011000 1101111000 1100011011 0000111001 | |
GNSS 信号伪距 | 15 | 见注7 | 000011001110111 000011100011001 000110011011111 000110000110010 111101101000000 111101011110011 111111110011010 111111110111111 111100001110011 111100010011101 001011111100010 001011110101001 001011010111000 001010111100101 001101100010011 001101100001011 | |
GNSS 信号载波相位 | 22 | 见注7 | 0000110111111011111010 0000110101100000011111 1111011100000111000000 0000101110111110011000 1111000010000100111110 1111011001100010101000 0000001100010100001100 0000101111011111011001 0000110000001000111011 0000011111110111000101 0000101001101101110111 0000010000100001101100 0001001001000100010011 0000011000111001010000 0001101001101001100110 0001010001110011110100 | |
GNSS 载波相位 锁定时间标志 | 4 | 见注7 | 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 | |
半周模糊度标志 | 1 | 见注7 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | |
GNSS 信号载噪比 | 6 | 见注7 | 101011 101001 110000 110000 101100 100111 101011 101011 110010 110001 101110 100111 110011 110000 110010 110001 | |
多余的7bits | 7 | 见注8 | 0000000 | |
冗余校验 | CRC | 24 | 011100011100111001000010 |
注1:
消息长度为10001010,转10进制为138,即可变长度消息共有138对16进制数(例:43为一对),也就是138*2=276个16进制数,共有276*4=1104bits
注2:
信息类型为10000110010,转10进制为1074,通过查RTCM3消息类型可得,此处指“多信号消息”(MSM):1074 型,全 GPS 伪距和载波相位加信号强度(文章最后会附上RTCM3所有消息类型)
注3:
GNSS 卫星掩码分析:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 |
1代表观测到了该卫星,此处有10号,14号,16号,25号,26号,29号,31号,32号卫星,即卫星数Nsat=8
注4:
GNSS 信号掩码分析:
通过上表可得:
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
1C | 1P | 1W | 2C | 2P | 2W | 2S | 2L | 2X | 5I | 5Q | 5X | 1S | 1L | 1X |
解码得信号为1C,2W,即信号数Nsig=2
注5:
此处GNSS Cell Mask的长度 x=Ncell=Nsat*Nsig=16
此处cell mask为:1111111111111111,则信号位图表为:
10 | 14 | 16 | 25 | 26 | 29 | 31 | 32 | |
1C | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2W | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
信号位图表确定了不同类型观测值的排列顺序,即:
10号卫星1C频率的观测值 | 10号卫星2W频率的观测值 | 14号卫星1C频率的观测值 | ... | 31号卫星2W频率的观测值 | 32号卫星1C频率的观测值 | 32号卫星2W频率的观测值 |
注6:
GNSS 卫星粗略距离一个是整毫秒的数据,一个是毫秒内的数据,共有Nsat个卫星数据,按上述解码的卫星顺序排列,即10,14,16,25,26,29,31,32
注7:
这5个数据字段的值分别按注5的观测顺序排列,因此每个数据字段共有Ncell个值
注8:
信息长度138*8与169+10*(18+49*2)相比多出7bits,具体原因我也不太清楚
(2)通过Java实现数据过滤
主函数:
public static void main(String[] args) {
String oldRtcm = "D3 00 8A 43 20 00 40 7F 79 82 00 20 00 22 80 65 80 00 00 00 20 20 00 \n" +
"00 7F FF A7 22 26 26 22 A6 A2 A3 20 FD DC 05 9F 5B 1B C6 36 1C 86 77 0E \n" +
"32 33 7C 61 97 B4 0F 5E 7F E6 BF DF F8 73 F1 3A 5F 88 BD 49 6B 82 BC A6 \n" +
"C4 CD 85 86 FD F4 1A C0 FF B8 38 01 77 CC 78 42 7D EC C5 40 18 A1 81 7B \n" +
"EC 86 04 76 0F EE 28 53 6E E0 84 36 09 22 26 0C 72 80 D3 4C C2 8E 7A 7F FF \n" +
"FF FF FF FF FF FF 80 00 57 4E 18 59 3D 75 E5 8D D3 E7 86 58 80 71 CE 42";
oldRtcm = oldRtcm.replaceAll("\\s+", "");
System.out.println("原RTCM数据:" + oldRtcm);
String oldData = oldRtcm;
byte[] oldRtcmTo2 = parseHexStr2Byte(oldRtcm);//转2进制
Obs_T obsT = new Obs_T();
obsT.init();//初始化Obs_T对象
Rtcm_T rtcm = new Rtcm_T();
rtcm.obs.data = obsT.data;
for (int i = 0; i < oldRtcmTo2.length; i++) {
String newRtcm = RtcmDecode.input_rtcm3(rtcm, oldRtcmTo2[i], oldData);
if (!"0".equals(newRtcm)) {
System.out.println("新RTCM数据:" + newRtcm);
}
}
}
一般数据都是多包发过来的,这个方法可以将多包数据解析成单条数据进行解码:
public static String input_rtcm3(Rtcm_T rtcm, byte data, String oldData) {
if (rtcm.nbyte == 0) {
if (data != -45) {
return "0";
}
rtcm.buff[rtcm.nbyte++] = data;
return "0";
}
rtcm.buff[rtcm.nbyte++] = data;
if (rtcm.nbyte == 3) {
rtcm.len = RtcmUtils.getbitu(rtcm.buff, 14, 10) + 3;
}
if (rtcm.nbyte < 3 || rtcm.nbyte < rtcm.len + 3) {
return "0";
}
rtcm.nbyte = 0;
if (RtcmUtils.rtk_crc24q(rtcm.buff, rtcm.len) != RtcmUtils.getbitu(rtcm.buff, rtcm.len * 8, 24)) {
return "0";
}
return decode_rtcm3(rtcm, oldData);
}
单条数据解码:
private static String decode_rtcm3(Rtcm_T rtcm, String oldData) {
double tow;
String ret = null;
int type = RtcmUtils.getbitu(rtcm.buff, 24, 12);//获取信号类型
Integer[] week = {0};
String optStr = new String(rtcm.opt);
if (RtcmUtils.strStr(optStr, "-RT_INP") != 0) {
tow = RtcmUtils.time2gpst(RtcmUtils.utc2gpst(RtcmUtils.timeget()), week);
rtcm.time = RtcmUtils.gpst2time(week[0], Math.floor(tow));
}
//判断是哪个信号类型
switch (type) {
case 1074:
ret = decode_msm4(rtcm, RtcmCommon.SYS_GPS, oldData);
break;
case 1084:
ret = decode_msm4(rtcm, RtcmCommon.SYS_GLO, oldData);
break;
case 1094:
ret = decode_msm4(rtcm, RtcmCommon.SYS_GAL, oldData);
break;
case 1104:
ret = decode_msm4(rtcm, RtcmCommon.SYS_SBS, oldData);
break;
case 1114:
ret = decode_msm4(rtcm, RtcmCommon.SYS_QZS, oldData);
break;
case 1124:
ret = decode_msm4(rtcm, RtcmCommon.SYS_CMP, oldData);
break;
case 1134:
ret = decode_msm4(rtcm, RtcmCommon.SYS_IRN, oldData);
break;
}
// if (ret >= 0) {
// if (1001 <= type && type <= 1299) {
// rtcm.nmsg3[type - 1000]++;
// } else if (4070 <= type && type <= 4099) {
// rtcm.nmsg3[type - 3770]++;
// } else {
// rtcm.nmsg3[0]++;
// }
// }
return ret;
}
此处测试数据为GPS MSM4,解码过程中将需要的信号类型数据取出进行重新编码并返回新的RTCM电文信号,主要思路就是将原RTCM数据各部分分别存起来,在解析数据的时候把需要的信号和对应的数据存起来,其他不需要的信号和数据剔除,重新计算messageLength和crc后将各个部分重新拼接在一起重新播发出去,目的是过滤掉不想看到的信号数据:
private static String decode_msm4(Rtcm_T rtcm, int sys, String oldData) {
String dataTo2 = Rtcm.hex2bin(oldData);//转2进制
Msm_H_T h = new Msm_H_T();
double[] r = new double[64];
double[] pr = new double[64];
double[] cp = new double[64];
double[] cnr = new double[64];
Integer[] sync = {0};
Integer[] iod = {0};
Integer[] i = {0};
int j, ncell, rng, rng_m, prv, cpv;
int[] lock = new int[64];
int[] half = new int[64];
ncell = decode_msm_head(rtcm, sys, sync, iod, h, i);
if (ncell < 0) {
return "-1";
}
if (i[0] + h.nsat * 18 + ncell * 48 > rtcm.len * 8) {
return "-1";
}
for (j = 0; j < h.nsat; j++) {
r[j] = 0.0;
}
for (j = 0; j < ncell; j++) {
pr[j] = cp[j] = -1E16;
}
for (j = 0; j < h.nsat; j++) {
rng = RtcmUtils.getbitu(rtcm.buff, i[0], 8);//GNSS 卫星粗略距离(整毫秒)
i[0] += 8;
if (rng != 255) {
r[j] = rng * RtcmCommon.RANGE_MS;
}
}
for (j = 0; j < h.nsat; j++) {
rng_m = RtcmUtils.getbitu(rtcm.buff, i[0], 10);//GNSS 卫星粗略距离(毫秒内)
i[0] += 10;
if (r[j] != 0.0) {
r[j] += rng_m * RtcmCommon.P2_10 * RtcmCommon.RANGE_MS;
}
}
//将数据缓存至RtcmData中
List<int[]> result = new ArrayList<>();
for (int a = 0; a < h.nsat; a++) {
for (int b = 0; b < h.nsig; b++) {
int[] combination = new int[2];
combination[0] = h.sats[a];
combination[1] = h.sigs[b];
result.add(combination);
}
}
RtcmData rtcmData = new RtcmData();
rtcmData.initData(ncell);
String cellMask = dataTo2.substring(24 + 169, 24 + 169 + ncell);//cellMask
String[] cellMaskArr = cellMask.split("");
for (j = 0; j < result.size(); j++) {
rtcmData.data[j].nsat = result.get(j)[0];
rtcmData.data[j].nsig = result.get(j)[1];
rtcmData.data[j].cellMask = cellMaskArr[j];
}
for (j = 0; j < ncell; j++) {
prv = RtcmUtils.getbits(rtcm.buff, i[0], 15);//GNSS 信号伪距
rtcmData.data[j].data[0] = prv;
rtcmData.data[j].rtcm[0] = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 15 * j, 24 + 169 + ncell + 18 * h.nsat + 15 * (j + 1));
i[0] += 15;
if (prv != -16384) {
pr[j] = prv * RtcmCommon.P2_24 * RtcmCommon.RANGE_MS;
}
}
for (j = 0; j < ncell; j++) {
cpv = RtcmUtils.getbits(rtcm.buff, i[0], 22);//GNSS 信号载波相位
rtcmData.data[j].data[1] = cpv;
rtcmData.data[j].rtcm[1] = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * j, 24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * (j + 1));
i[0] += 22;
if (cpv != -2097152) {
cp[j] = cpv * RtcmCommon.P2_29 * RtcmCommon.RANGE_MS;
}
}
for (j = 0; j < ncell; j++) {
lock[j] = RtcmUtils.getbitu(rtcm.buff, i[0], 4);//GNSS 载波相位 锁定时间标志
rtcmData.data[j].data[2] = lock[j];
rtcmData.data[j].rtcm[2] = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * ncell + 4 * j, 24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * ncell + 4 * (j + 1));
i[0] += 4;
}
for (j = 0; j < ncell; j++) {
half[j] = RtcmUtils.getbitu(rtcm.buff, i[0], 1);//半周模糊度标志
rtcmData.data[j].data[3] = half[j];
rtcmData.data[j].rtcm[3] = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * ncell + 4 * ncell + 1 * j, 24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * ncell + 4 * ncell + 1 * (j + 1));
i[0] += 1;
}
for (j = 0; j < ncell; j++) {
cnr[j] = RtcmUtils.getbitu(rtcm.buff, i[0], 6) * 1.0;//GNSS 信号载噪比
rtcmData.data[j].data[4] = cnr[j];
rtcmData.data[j].rtcm[4] = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * ncell + 4 * ncell + 1 * ncell + 6 * j, 24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * ncell + 4 * ncell + 1 * ncell + 6 * (j + 1));
i[0] += 6;
}
//筛选去除不符合的数据
String[] types = {"2"};//去除除2(此处指除L2C以外的信号)
int length = 0;
for (j = 0; j < rtcmData.data.length; j++) {
if (Arrays.asList(types).contains(String.valueOf(rtcmData.data[j].nsig))) {
length++;
}
}
rtcmData.initNewData(length);
int count = 0;
for (j = 0; j < rtcmData.data.length; j++) {
if (Arrays.asList(types).contains(String.valueOf(rtcmData.data[j].nsig))) {
rtcmData.newData[count] = rtcmData.data[j];
count++;
}
}
//重新组装RTCM电文信号
String ydz = dataTo2.substring(0, 8);//引导字
String blz = dataTo2.substring(8, 8 + 6);//保留字
String messageLength = dataTo2.substring(8 + 6, 8 + 6 + 10);//消息长度
System.out.println("head:" + ydz + "-" + blz + "-" + messageLength);
//信息类型 + 基准站ID + 历元时间 + 多信息标志 + IODS + 预留 + 锁定引导标志 + 扩展锁定标志 + 平滑类型标志 + 平滑区间
String dataPart1 = dataTo2.substring(24, 24 + 12 + 12 + 30 + 1 + 3 + 7 + 2 + 2 + 1 + 3);
System.out.println("part1:" + dataPart1);
String wxym = dataTo2.substring(24 + 73, 24 + 73 + 64);//卫星掩码
String xhym = dataTo2.substring(24 + 73 + 64, 24 + 73 + 64 + 32);//信号掩码//cell mask
System.out.println("part2:" + wxym + "-" + xhym + "-" + cellMask);
String wxcljl1 = dataTo2.substring(24 + 169 + ncell, 24 + 169 + ncell + 8 * h.nsat);//卫星粗略距离(整毫秒)
String wxcljl2 = dataTo2.substring(24 + 169 + ncell + 8 * h.nsat, 24 + 169 + ncell + 8 * h.nsat + 10 * h.nsat);//卫星粗略距离(毫秒内)
System.out.println("part3:" + wxcljl1 + "-" + wxcljl2);
//信号伪距 + 信号载波相位 + 载波相位锁定时间标志 + 半周模糊度标志 + 信号载噪比
String dataPart4 = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat, 24 + 169 + ncell + 18 * h.nsat + 48 * ncell);
System.out.println("part4: " + dataPart4);
String redundance = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 48 * ncell, 24 + 169 + ncell + 18 * h.nsat + 48 * ncell + 7);//多余的7bits
String crc = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 48 * ncell + 7, 24 + 169 + ncell + 18 * h.nsat + 48 * ncell + 7 + 24);//crc冗余校验
System.out.println("tail:" + redundance + "-" + crc);
String newCellMask = "";
for (j = 0; j < rtcmData.newData.length; j++) {
newCellMask = newCellMask + rtcmData.newData[j].cellMask;
}
System.out.println("newCellMask:" + newCellMask);
String newDataPart4 = "";
for (j = 0; j < rtcmData.newData.length; j++) {
newDataPart4 = newDataPart4 + rtcmData.newData[j].rtcm[0];
}
for (j = 0; j < rtcmData.newData.length; j++) {
newDataPart4 = newDataPart4 + rtcmData.newData[j].rtcm[1];
}
for (j = 0; j < rtcmData.newData.length; j++) {
newDataPart4 = newDataPart4 + rtcmData.newData[j].rtcm[2];
}
for (j = 0; j < rtcmData.newData.length; j++) {
newDataPart4 = newDataPart4 + rtcmData.newData[j].rtcm[3];
}
for (j = 0; j < rtcmData.newData.length; j++) {
newDataPart4 = newDataPart4 + rtcmData.newData[j].rtcm[4];
}
System.out.println("newDataPart4:" + newDataPart4);
String dataArea = dataPart1 + wxym + xhym + newCellMask + wxcljl1 + wxcljl2 + newDataPart4 + redundance;
int mLength = dataArea.length() / 8;
String newMessageLength = Rtcm.decimalToBinary(mLength, 10);
System.out.println("newMessageLength:" + newMessageLength);
String newRtcm = ydz + blz + newMessageLength + dataArea + crc;
newRtcm = Rtcm.bin2hex(newRtcm);
byte[] newRtcmTo2 = Rtcm.parseHexStr2Byte(newRtcm);
String newCrc = Integer.toHexString(RtcmUtils.rtk_crc24q(newRtcmTo2, mLength + 3)).toUpperCase();
newRtcm = newRtcm.substring(0, newRtcm.length() - 6) + newCrc;
return newRtcm;
// save_msm_obs(rtcm, sys, h, r, pr, cp, null, null, cnr, lock, null, half);
// if (sync[0] != 0) {
// rtcm.obsflag = 0;
// } else {
// rtcm.obsflag = 1;
// }
// return sync[0] != 0 ? 0 : 1;
}
以上就是RTCM3.3电文信号的解码与重组,对协议理解的可能还不够深刻,代码写的比较简单,应该有不少优化空间,欢迎大家批评与指正。
以下为RTCM的信号类型:
RTCM 版本 3 消息类型:
1001 型,GPS L1 码和相位。
1002 型,GPS L1 码,相位和模糊度以及载波噪声比。
1003 型,GPS L1 和 L2 代码和相位。
1004 型,GPS L1 和 L2 码,相位和模糊度以及载波噪声比。
1005 型,天线参考点的站坐标 XYZ。
1006 型,天线参考点和天线高度的站坐标 XYZ。
1007 型,天线描述符和 ID。
1008 型,天线序列号。
1009 型,GLONASS L1 代码和相位。
1010 型,GLONASS L1 码,相位和模糊度以及载波噪声比。
1011 型,GLONASS L1 和 L2 代码和相位。
1012 型,GLONASS L1 和 L2 码,相位和模糊度以及载波噪声比。
1013 类型,修改的儒略日期,闰秒,配置的消息类型和间隔。
1014 和 1017 型,网络 RTK(MAK)消息。
1019 型,GPS 星历。
1020 型,格洛纳斯星历。
1045 型,伽利略星历。
4088 和 4095 型,专有信息。
“状态空间表示”(SSR)消息:
1057 型,广播星历的 GPS 轨道改正
1058 型,广播星历的 GPS 时钟校正
1059 型,GPS 码偏差
1060 型,GPS 广播星历的组合轨道和时钟校正
1061 型,GPS 用户测距精度(URA)
1062 型,广播星历的高速 GPS 时钟校正
1063 型,GLONASS 轨道修正广播星历
1064 型,广播星历的 GLONASS 时钟校正
1065 型,格洛纳斯码偏差
1066 型,GLONASS 广播星历的轨道和时钟联合校正
1067 型,GLONASS 用户测距精度(URA)
1068 型,广播星历的高速 GLONASS 时钟校正
“多信号消息”(MSM):
1071 型,紧凑型.GPS 伪距
1072 型,紧凑型 GPS 载波相位
1073 型,紧凑型 GPS 伪距和载波相位
1074 型,全 GPS 伪距和载波相位加信号强度
1075 型,全 GPS 伪距,载波相位,多普勒和信号强度
1076 型,全 GPS 伪距和载波相位加信号强度(高分辨率)
1077 型,全 GPS 伪距、载波相位、多普勒和信号强度(高分辨率)
1081 型,紧凑型 GLONASS 伪距
1082 型,紧凑型 GLONASS 载波相位
1083 型,紧凑型 GLONASS 伪距和载波相位
1084 型,全 GLONASS 伪距和载波相位加信号强度
1085 型,全 GLONASS 伪距,载波相位,多普勒和信号强度
1086 型,全 GLONASS 伪距和载波相位加信号强度(高分辨率)
1087 型,全 GLONASS 伪距,载波相位,多普勒和信号强度(高分辨率)
1091 型,紧凑伽利略伪距
1092 型,紧凑型伽利略载波相位
1093 型,紧凑伽利略伪距和载波相位
1094 型,全伽利略伪距和载波相位加信号强度
1095 型,全伽利略伪距,载波相位,多普勒和信号强度
1096 型,全伽利略伪距和载波相位加信号强度(高分辨率)
1097 型,全伽利略伪距,载波相位,多普勒和信号强度(高分辨率)
1121 型,紧凑型北斗伪距
1122 型,紧凑型北斗载波相位
1123 型,紧凑型北斗伪距和载波相位
1124 型,全北斗伪距和载波相位加信号强度
1125 型,全北斗伪距,载波相位,多普勒和信号强度
1126 型,全北斗伪距和载波相位加信号强度(高分辨率)
1127 型,全北斗伪距,载波相位,多普勒和信号强度(高分辨率)
1101 型,紧凑型 SBAS 伪距
1102 型,紧凑型 SBAS 载波相位
1103 型,紧凑型 SBAS 伪距和载波相位
1104 型,全 SBAS 伪距和载波相位加信号强度
1105 型,全 SBAS 伪距,载波相位,多普勒和信号强度
1106 型,全 SBAS 伪距和载波相位加信号强度(高分辨率)
1107 型,全 SBAS 伪距,载波相位,多普勒和信号强度(高分辨率)
1111 型,紧凑型 QZSS 伪距
1112 型,紧凑型 QZSS 载波相位
1113 型,紧凑型 QZSS 伪距和载波相位
1114 型,全 QZSS 伪距和载波相位加信号强度
1115 型,全 QZSS 伪距,载波相位,多普勒和信号强度
1116 型,全 QZSS 伪距和载波相位加信号强度(高分辨率)
1117 型,全 QZSS 伪距,载波相位,多普勒和信号强度(高分辨率)