修改RTK发送部分,限制数据量和封包,通过常量支持以前方式发送,兼容没有修改的固件

This commit is contained in:
pxzleo 2023-05-01 13:55:44 +08:00
parent aea10b8382
commit c3a3877323
7 changed files with 104 additions and 74 deletions

View File

@ -25,7 +25,7 @@ namespace Plane.FormationCreator.Formation
public class CopterCollection : ObservableCollection<ICopter>
{
//软件过期时间---过期将无法添加飞机,并自动退出
public static DateTime Expire_App = DateTime.Parse("2022-12-31");
public static DateTime Expire_App = DateTime.Parse("2023-12-31");
//超级用户过期时间--过期将无法使用内置超级用户登录
public static DateTime Expire_SuperUser = Expire_App;
//允许飞行的飞机数量

View File

@ -30,6 +30,41 @@ namespace Plane.FormationCreator.Formation
private ControlPanelViewModel ControlPanelVM = ServiceLocator.Current.GetInstance<ControlPanelViewModel>();
private CopterManager _copterManager = ServiceLocator.Current.GetInstance<CopterManager>();
private bool _rtcmthreadrun = false;
// rtcm发送类型0:直接发送,
// 11秒只发一种卫星1秒发GPS,第2秒发北斗第3秒发格洛纳斯其他数据随来随发
private int _rtcmsendtype = 1;
const int MSG_GPS = 1074;
const int MSG_GLONASS = 1084;
const int MSG_Beidou = 1124;
const int MSG_BasePos = 1005;
const int MSG_REV = 1033;
public string rtcm_typename(int msgtype)
{
string typename = "Rtcm" + msgtype;
switch (msgtype)
{
case MSG_GPS:
typename = "GPS";
break;
case MSG_GLONASS:
typename = "GLONASS";
break;
case MSG_Beidou:
typename = "北斗";
break;
//位置5秒发一次就可以了
case MSG_BasePos:
typename = "基站位置";
break;
case MSG_REV: //这个没必要发
typename = "版本";
break;
}
return typename;
}
public bool Rtcmthreadrun
{
get { return _rtcmthreadrun; }
@ -142,6 +177,7 @@ namespace Plane.FormationCreator.Formation
dispatcherTimer.Start();
}
//用于刷新界面,显示消息状态,基站和卫星是否有效等
private void OnTimedEvent(object sender, EventArgs e)
{
BaseState = baseTime > DateTime.Now;
@ -168,7 +204,7 @@ namespace Plane.FormationCreator.Formation
}
//显示卫星信号强度条
private void Rtcm_ObsMessage(object sender, EventArgs e)
{
List<rtcm3.ob> obs = sender as List<rtcm3.ob>;
@ -331,28 +367,10 @@ namespace Plane.FormationCreator.Formation
{
int reconnecttimeout = 10;
DateTime lastrecv = DateTime.MinValue;
//系统毫秒数
long ls_send_ms = CurrentTimeMillis();
long ls_send_gps = CurrentTimeMillis();
long ls_send_glonass = CurrentTimeMillis();
long ls_send_baidu = CurrentTimeMillis();
const int MSG_GPS = 1074;
const int MSG_GLONASS = 1084;
const int MSG_Beidou = 1124;
int MSG_BasePos = 1005;
int MSG_REV = 1033;
int Send_type = 0;
long last_send_pos = CurrentTimeMillis()- 5000;//5秒发一次就可以了
bool Ensend = false;
int last_mag = 0;
//新版本打包发送模式
//await _commModuleManager.StartRtcmLoop();
while (Rtcmthreadrun)
{
try
@ -395,62 +413,70 @@ namespace Plane.FormationCreator.Formation
if ((seenmsg = rtcm.Read(buffer[a])) > 0)
{
bpsusefull += rtcm.length;
string msgshowname = rtcm_typename(seenmsg);
_commModuleManager.SetAllCoptersForWifi(_copterManager.Copters);
/* 使
switch (seenmsg)
if (_rtcmsendtype == 0)
{
case MSG_GPS:
if ((CurrentTimeMillis() - ls_send_gps) > 1000)
{
ls_send_gps = CurrentTimeMillis();
Ensend = true;
}
break;
case MSG_GLONASS:
if ((CurrentTimeMillis() - ls_send_glonass) > 1000)
{
ls_send_glonass = CurrentTimeMillis();
Ensend = true;
}
break;
case MSG_Beidou:
if ((CurrentTimeMillis() - ls_send_baidu) > 1000)
{
ls_send_baidu = CurrentTimeMillis();
Ensend = true;
}
break;
}
if ((seenmsg == MSG_REV) || (seenmsg == MSG_BasePos)) Ensend = true;
//Plane.Windows.Messages.Message.Show("---["+ seenmsg + "]RTCM:" + rtcm.length);
// await _commModuleManager.InjectGpsRTCMDataAsync(rtcm.packet, rtcm.length);
if (rtcm.length <= 180)
Ensend = true;
else Ensend = false;
if (Ensend)
await _commModuleManager.InjectGpsDataAsync(rtcm.packet, (ushort)rtcm.length);
}else
if (_rtcmsendtype == 1)
{
// await _commModuleManager.InjectGpsRTCMDataAsync(rtcm.packet, rtcm.length);
Ensend = false;
//第1秒是gps,第2秒是GLONASS第3秒是 Beidou
//1秒内可能发送多个同一种类型的数据看数据大小和原始频率
long curr_s = CurrentTimeMillis()/1000;
int sendtype = (int) (curr_s % 3);
switch (seenmsg)
{
case MSG_GPS:
if (sendtype==0) //第1秒是gps,
Ensend = true;
break;
case MSG_GLONASS:
if (sendtype == 1) //第2秒是GLONASS
Ensend = true;
break;
case MSG_Beidou:
if (sendtype == 2) //第3秒是 Beidou
Ensend = true;
break;
//位置4秒发一次就可以了
case MSG_BasePos:
{
long curr_send_pos = CurrentTimeMillis();
if ((curr_send_pos - last_send_pos) > 4000)
{
last_send_pos = curr_send_pos;
Ensend = true;
}
}
break;
case MSG_REV: //这个没必要发
Ensend = false;
break;
default: //其他类型数据随到随发
Ensend = true;
break;
}
if (Ensend)
{
// Plane.Windows.Messages.Message.Show(DateTime.Now.ToString("HH:mm:ss")+"--Rtcm长度: " + (ushort)rtcm.length+" , 类型: "+ seenmsg);
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "--Rtcm长度: " + (ushort)rtcm.length + " 类型: " + msgshowname + " ("+ seenmsg+")");
await _commModuleManager.InjectGpsDataAsync(rtcm.packet, (ushort)rtcm.length);
}
//else
// Console.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "--放弃发送-----Rtcm长度: " + (ushort)rtcm.length + " 类型: " + msgshowname + " (" + seenmsg + ")");
}
*/
//老的单频rtk发送
await _commModuleManager.InjectGpsDataAsync(rtcm.packet, (ushort)rtcm.length);
string msgname = "Rtcm" + seenmsg;
if (!msgseen.ContainsKey(msgname))
msgseen[msgname] = 0;
msgseen[msgname] = (int)msgseen[msgname] + 1;
await ExtractBasePos(seenmsg);
//await seenRTCM(seenmsg);
//累加消息数量,用于界面显示
if (!msgseen.ContainsKey(msgshowname))
msgseen[msgshowname] = 0;
msgseen[msgshowname] = (int)msgseen[msgshowname] + 1;
//检测基站定位状态和卫星定位状态,用于在界面上显示
await ExtractBasePos(seenmsg);
}
}
await Task.Delay(10);

View File

@ -106,7 +106,9 @@
<HintPath>..\packages\MaterialDesignThemes.1.4.0.473\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Expression.Drawing, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
<Reference Include="Microsoft.Expression.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Unnoficial.Microsoft.Expression.Drawing.1.0.0\lib\Microsoft.Expression.Drawing.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Maps.MapControl.WPF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Maps.MapControl.WPF.1.0.0.3\lib\net40-Client\Microsoft.Maps.MapControl.WPF.dll</HintPath>
<Private>True</Private>

View File

@ -261,7 +261,7 @@ namespace Plane.Util
retrys--;
}
throw new Exception("The ntrip is closed");
throw new Exception("网络RTK基站通讯已关闭!");
}
}

View File

@ -2278,6 +2278,7 @@ namespace Plane.Util
return i;
}
}
}
}

View File

@ -54,10 +54,10 @@
Fill="{Binding RtcmManager.BaseState,Converter={StaticResource ColorConverter}}"/>
<TextBlock Margin="5" Text="Gps"/>
<Rectangle Margin="0,0,15,0" Width="20" Height="20"
Fill="{Binding RtcmManager.GlonassState,Converter={StaticResource ColorConverter}}"/>
Fill="{Binding RtcmManager.GpsState ,Converter={StaticResource ColorConverter}}"/>
<TextBlock Margin="5" Text="Glonass"/>
<Rectangle Margin="0,0,15,0" Width="20" Height="20"
Fill="{Binding RtcmManager.GpsState,Converter={StaticResource ColorConverter}}"/>
Fill="{Binding RtcmManager.GlonassState,Converter={StaticResource ColorConverter}}"/>
<TextBlock Margin="5" Text="北斗"/>
<Rectangle Margin="0,0,15,0" Width="20" Height="20"
Fill="{Binding RtcmManager.BeidouState,Converter={StaticResource ColorConverter}}"/>

View File

@ -15,4 +15,5 @@
<package id="System.Data.SQLite.Core" version="1.0.109.1" targetFramework="net46" />
<package id="System.Data.SQLite.EF6" version="1.0.109.0" targetFramework="net46" />
<package id="System.Data.SQLite.Linq" version="1.0.109.0" targetFramework="net46" />
<package id="Unnoficial.Microsoft.Expression.Drawing" version="1.0.0" targetFramework="net46" />
</packages>