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

View File

@ -106,7 +106,9 @@
<HintPath>..\packages\MaterialDesignThemes.1.4.0.473\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath> <HintPath>..\packages\MaterialDesignThemes.1.4.0.473\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </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"> <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> <HintPath>..\packages\Microsoft.Maps.MapControl.WPF.1.0.0.3\lib\net40-Client\Microsoft.Maps.MapControl.WPF.dll</HintPath>
<Private>True</Private> <Private>True</Private>

View File

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

View File

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

View File

@ -54,10 +54,10 @@
Fill="{Binding RtcmManager.BaseState,Converter={StaticResource ColorConverter}}"/> Fill="{Binding RtcmManager.BaseState,Converter={StaticResource ColorConverter}}"/>
<TextBlock Margin="5" Text="Gps"/> <TextBlock Margin="5" Text="Gps"/>
<Rectangle Margin="0,0,15,0" Width="20" Height="20" <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"/> <TextBlock Margin="5" Text="Glonass"/>
<Rectangle Margin="0,0,15,0" Width="20" Height="20" <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="北斗"/> <TextBlock Margin="5" Text="北斗"/>
<Rectangle Margin="0,0,15,0" Width="20" Height="20" <Rectangle Margin="0,0,15,0" Width="20" Height="20"
Fill="{Binding RtcmManager.BeidouState,Converter={StaticResource ColorConverter}}"/> 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.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.EF6" version="1.0.109.0" targetFramework="net46" />
<package id="System.Data.SQLite.Linq" 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> </packages>