Qt开发北斗定位系统融合百度地图API及Qt程序打包发布

2023-11-13

Qt开发北斗定位系统融合百度地图API及Qt程序打包发布

1、上位机介绍

最近有个接了一个小型项目,内容很简单,就是解析北斗GPS的串口数据然后输出经纬度,但接过来觉得太简单,就发挥了主观能动性,增加了百度地图API,不但能实时定位,还能在地图上标识出位置信息,用的QT5.5。上位机运行图片如图所示:整体运行比较流畅。

上一个版本的界面

windows版本界面

windows卫星图图片

Linux版本界面

底层设别

原理就是界面上集成一个WebKits/WebView,让Qt和Javascript进行交互。但需要注意Qt5.6以上版本取消了WebView的模块,换成了webenginewidgets,看上去配置好麻烦,甚至还要自己编译什么的,虽然性能可能有指数性的提升,但对于我这个做嵌入式软件和硬件,上位机会个基础的就算是很好的人来说,还是webkits好一点。

2017/07/22 更新:


在本文后续版本已经适配了Qt 5.6 以上版本的QWebEngine版本,摒弃了QWebKits组件,后续若有经费的话,将继续更新支持QWebChannel通信通道。两个版本都可以在本文尾部的附件中下载,欢迎学习讨论。


2. 开发介绍

本设计开发主要涉及三个方面:

  • 串口开发(北斗GPS基于UART的,波特率115200,8,1),这个北斗GPS模块隔1s发一次GPS数据组,会通信几个卫星接收数据,时而一些卫星不反馈数据。
  • 数据解析。数据解析模块包括把几个卫星的数据按协议分开然后解析出来,这里有个难点在于Qt串口和CH340缓存BUG导致的数据包粘连和数据不连续解决。
  • 地图API驱动

2.1 串口开发

串口开发不用说了,请参考我前几篇有个蓝牙的博客,上面有源码,Qt on Android 蓝牙开发,本设计中的串口部分就是基于那个串口开发的。串口开发自动检测连接设备,不需要进入管理器和找到COM口是多少,自动和串口进行连接。

2.2 数据解析

串口数据粘包和数据不连续很头疼,进入一个串口接收槽函数QString rxArray.append(serialPort->readAll() ); 接收数据不完整,或者说会分好几次进行接收,而且分好几次接收长度没有规律,所以无法直接使用接收的数据。

1S钟GPS发送一次数据为:

/*
$GNRMC,114821.880,V,3957.378130,N,11620.848015,E,0.000,0.000,230417,,E,N*23
$GNGGA,114821.880,3957.378130,N,11620.848015,E,0,00,127.000,100.800,M,0,M,,*6D
$GNGLL,3957.378130,N,11620.848015,E,114821.880,V,N*52
$GNGSA,A,1,,,,,,,,,,,,,127.000,127.000,127.000*2A
$GNGSA,A,1,,,,,,,,,,,,,127.000,127.000,127.000*2A
$GPGSV,1,1,4,17,57,315,21,22,35,67,,28,75,176,,30,12,204,*74
*/

数据量比较巨大,所以这里增加处理机制,尽量保存完整数据。

// 接收数据槽函数

void Widget::RxData(){


    QString rxString;

    rxArray.append(serialPort->readAll());
    //qDebug() << QString(rxArray);
    if( serialRead == true ){
        // 数据对齐,如果上次数据是一半,抛弃数据,重新接受
        times++;
        rxString = QString(rxArray);
        //qDebug() << "rec:" << rxString;
        ui->textBrowser->append(tr("--------------------------------------------------------------------------"));
        ui->textBrowser->append("从北斗GPS传感器第("+QString::number(times)+")次接受数据:");
        ui->textBrowser->append(tr("--------------------------------------------------------------------------"));
        ui->textBrowser->append(QString(rxArray));
        gpsDatasProcessing( rxArray );
        rxArray.clear();
        serialRead = false;
        if( times%50 == 0 ) {
            ui->textBrowser->clear();
        }
        ui->textBrowser->append(tr("--------------------------------------------------------------------------\r"));
    }else{
        return;
    }
    // 解析数据

}
void Widget::gpsDatasProcessing(QByteArray GPSBuffer)
{

    QString GPSBufferString = QString( GPSBuffer );
    int error_pos = 0;
    QString GNRMC_String = NULL;
    QString GPGGA_String = NULL;
    QString GPGSV_String = NULL;
    QString GPRMC_String = NULL;
    QString GPGLL_String = NULL;
    QString GNGGA_String = NULL;
    bool latiflag = false;
    bool atiflag = false;
    bool utcflag = false;
    bool speedflag = false;
    bool longtiflag = false;

    QList<QString> gpsStringList = GPSBufferString.split('\n');


    // 由于定时间隔,数据包发生黏连,纠正数据。
    if( gpsStringList.at(0).at(0) != '$' ) {
        QString ErrorString =  gpsStringList.at(gpsStringList.length()-1) + gpsStringList.at(0);
        error_pos = 1;
        if( ErrorString.contains("$GNRMC") ){
            GNRMC_String = ErrorString;
        }else if( ErrorString.contains("$GPGGA") ) {
            GPGGA_String = ErrorString;
        }else if( ErrorString.contains("$GPGSV")  ) {
            GPGSV_String = ErrorString;
        }else if( ErrorString.contains("$GPRMC") ) {
            GPRMC_String = ErrorString;
        }else if( ErrorString.contains("$GPGLL") ) {
            GPGLL_String = ErrorString;
        }else if( ErrorString.contains("$GNGGA") ) {
            GNGGA_String = ErrorString;
        }

    }else{
        error_pos = 0;
    }
    // 从QList中得到数据
    for( int i = error_pos; i < gpsStringList.length()- error_pos; i++ ) {
        if( gpsStringList.at(i).contains("$GNRMC") ){
            GNRMC_String = gpsStringList.at(i);
        }else if( gpsStringList.at(i).contains("$GPGGA") ) {
            GPGGA_String = gpsStringList.at(i);
        }else if( gpsStringList.at(i).contains("$GPGSV")  ) {
            GPGSV_String = gpsStringList.at(i);
        }else if( gpsStringList.at(i).contains("$GPRMC") ) {
            GPRMC_String = gpsStringList.at(i);
        }else if( gpsStringList.at(i).contains("$GPGLL") ) {
            GPGLL_String = gpsStringList.at(i);
        }else if( gpsStringList.at(i).contains("$GNGGA") ) {
            GNGGA_String = gpsStringList.at(i);
        }
    }
    if( !GPGGA_String.isNull() ) {
        QList<QString> gpggaStrList = GPGGA_String.split(",");
        QString utcstr = gpggaStrList.at(1);
        ui->lineEdit_UTC->setText("格林威治时间:"+utcstr.mid(0,2)+":"+utcstr.mid(2,2)+":"+utcstr.mid(4,2));
        QString latistr = gpggaStrList.at(2);
        ui->lineEdit_latitude->setText("北纬"+latistr.mid(0,2)+"度"+latistr.mid(2,7)+"分");
        QString altistr = gpggaStrList.at(4);
        ui->lineEdit_longitude->setText("西经"+altistr.mid(0,3)+"度"+altistr.mid(3,7)+"分");
        utcflag = true;
        latiflag = true;
        atiflag = true;
    }
    if( !GNGGA_String.isNull() ) {
        if( !latiflag ) {
            QList<QString> gnggaStrList = GNGGA_String.split(",");
            QString utcstr = gnggaStrList.at(1);
            UTC2BTC(&utcstr);
            ui->lineEdit_UTC->setText("北京时间:"+utcstr.mid(0,2)+":"+utcstr.mid(2,2)+":"+utcstr.mid(4,2));
            QString latistr = gnggaStrList.at(2);
            ui->lineEdit_latitude->setText("北纬"+latistr.mid(0,2)+"°"+latistr.mid(2,9)+"'");
            double double_lati = latistr.mid(0,2).toDouble()+(latistr.mid(2,7).toDouble()+0.25)/60;
            QString altistr = gnggaStrList.at(4);
            ui->lineEdit_longitude->setText("西经"+altistr.mid(0,3)+"°"+altistr.mid(3,9)+"'");
            double double_alti = altistr.mid(0,3).toDouble()+(altistr.mid(3,7).toDouble()+0.25)/60;

            setCoordinate(QString::number(double_alti),QString::number(double_lati));
            //setCoordinate(QString::number(108.886119),QString::number(34.223921));
            qDebug()<< "纬度:"<<QString::number(double_alti)<<"|"<<"经度:"<< QString::number(double_lati) << "\n";
            QString longtistr = gnggaStrList.at(9);
            ui->lineEdit_altitude->setText(longtistr+"m ");
            ui->lineEdit_speed->setText("无效PPS");

            utcflag = true;
            latiflag = true;
            atiflag = true;

        }
    }

}
void Widget::slotSerialTimerOut()
{
    if( serialRead == false ){
        serialRead = true;
    }
}

2.3 百度地图API

百度地图API我找了很多资料,参考资料本文附录,非常感谢博客名“灿哥哥”,“我是大坏蛋”的整理,“灿哥哥”在文章中不但提供了离线地图和方法,还提供了对于地图的基本介绍,对于地图上面的操作,请参考灿哥哥的博客。但就我开发我想提出两点:

  • 本设计使用的是离线地图,地图包30M左右,不联网也可以使用。把地图包,放在编译的release或者debug文件夹下,载Qt主程序中的url协商地图html的位置。
  • 如果使用的是在线地图就需要连接网络,最重要的是坐标转换,经纬度需要和百度地图坐标进行一个转换,这个转换是通过百度地图API的接口进行的,而且普通用户转换还有次数限制。  
  • 这个离线地图不需要转换,直接使用经纬度就可以定位。

下面代码可以看到Qt和Javascript如何互动的。

void Widget::getCoordinate(QString lon,QString lat)
{
    QString tempLon="鼠标经度:"+lon+"°";
    QString tempLat="鼠标纬度:"+lat+"°";
    ui->labelMouseLongitude->setText(tempLon);
    ui->labelMouseLatitude->setText(tempLat);
}

void Widget::setCoordinate(QString lon,QString lat)
{
    QWebFrame *webFrame = ui->webView->page()->mainFrame();
    QString cmd = QString("showAddress(\"%1\",\"%2\")").arg(lon).arg(lat);
    webFrame->evaluateJavaScript(cmd);
}
void Widget::on_pushButtonStreetMap_clicked()
{
    QWebFrame *frame = ui->webView->page()->mainFrame();
    QString cmd = QString("showStreetMap()");
    frame->evaluateJavaScript(cmd);
    ui->pushButtonSatelliteMap->setEnabled(true);
    ui->pushButtonStreetMap->setEnabled(false);
}

void Widget::on_pushButtonSatelliteMap_clicked()
{
    QWebFrame *frame = ui->webView->page()->mainFrame();
    QString cmd = QString("showSatelliteMap()");
    frame->evaluateJavaScript(cmd);
    ui->pushButtonSatelliteMap->setEnabled(false);
    ui->pushButtonStreetMap->setEnabled(true);
}

void Widget::slotPopulateJavaScriptWindowObject()
{
    ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("ReinforcePC", this);

}

3. 程序打包

做完这个程序之后呢,我开始研究如何给程序打包,终于在两个小时内搞定了。

Step1:把所需要的dll文件集成出来。

Step2:用工具把dll文件exe文件和其他文件封装起来,做成msi或者exe文件。

工具就是一个Qt自带的windeployqt工具,另一个是Advanced installer安装包打包程序。

3.1 搜集dll文件

1)在开始菜单找到Qt文件夹,里面有个像是cmd命令行一样的东西,我的是MinGW的。反正运行出来这个样子:

搜集dll的cmd

2)进入Qt的工程文件夹,在release或者debug里面(看你用的是release编译还是debug编译了),找到生成的exe文件夹,把这个exe文件复制到一个方便找,方便输入路径的地方。我放在了D:\setup文件里了。

3)在刚才出那个命令行里面输入: cd /d D:\setup 切换到这个文件夹。

4)输入命令: windeployqt xxx.exe xxx.exe就是你刚才编译出exe的名字。

然后你会发现Qt把所有这个exe文件需要的.dll文件和其他支持库文件都放在这个文件夹了。实际上到了这步你可以打成压缩包然后发布到任何电脑,解压直接运行

3.2 使用Advanced Installer打包程序

我还是比较喜欢把他弄成安装包,这样更方便,更正式。Advanced Installer这个工具简直太赞了,打包的程序安装界面十分的正式,一点都不山寨,还有很多安装包的皮肤可供选择。如图为打好包的图标:

打包后的程序

运行后的效果如图:

810200-20170429151710912-894965617.png

810200-20170429151723147-346274556.png

img

里面还提供了导入注册表、安装后创建快捷方式等等方便的配置。

** 下载地址:http://down7.pc6.com/gm1/Advanced%20Installer.zip **

使用教程,还是参考后面的参考文献中的【4】,这里不在赘述了。

本文附件:

[1] 本程序旧版安装包下载地址如下百度云盘地址 提取码:41hx (2017-04-29)

[2] 本程序新版安装包下载地址如下:百度云盘地址 提取码:o59r (2017-07-22更新)

参考文献:

[1] 我是大坏蛋,gps定位Qt界面百度地图api的介绍,CSDN博客,2014-08-24
[2] 灿哥哥,Qt加载百度离线地图,CSDN博客,2016-03-30
[3] winland0704,Qt官方开发环境生成的exe发布方式--使用windeployqt,Qt百度贴吧,2015-04-28
[4] Prodesire,Windows安装包制作指南-Advanced Installer的使用,cnBlogs博客,2016-08-18
[5] jwq2011的专栏,GPS数据包格式+数据解析,CSDN博客,2016-12-15

版权声明:

1· 本文为MULTIBEANS团队研发跟随文章,未经允许不得转载。

2· 文中涉及的内容若有侵权行为,请与本人联系,本人会及时删除。

3· 尊重成果,本文将用的参考文献全部给出,向无私的工程师,爱好者致敬。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt开发北斗定位系统融合百度地图API及Qt程序打包发布 的相关文章

  • Transformer详细解读与预测实例记录

    文章目录 Transformer详细解读与预测实例记录 1 位置编码 1 输入部分 2 位置编码部分 2 多头注意力机制 1 基本注意力机制 2 transformer中的注意力 3 残差和LayerNorm 1 残差 2 LayerNor
  • 错误Unexpected token × in JSON at position 3的解决

    Uncaught SyntaxError Unexpected token in JSON at position 3 at JSON parse
  • Tableau常用函数

    1 ABS number 返回给定数字的绝对值 ABS 7 7 ABS 字段 字段中包含的所有数字的绝对值 2 ATTR expression 如果它的所有行都有一个值 则返回该表达式的值 否则返回星号 会忽略 Null 值 其实维度也可以
  • JAVA_常用API-Math

    目录 前言 一 Math类 Max类的常用方法 例题 1 取绝对值 返回正数 输出结果为 2 向上或者向下取整 3 求指数次方 以及四舍五入 4 生成随机数random 范围是 0 0 1 0 0 0 1 0 总结 前言 本篇文章作为作者学
  • 我们人类与人工智能技术究竟是怎样的关系?

    图片来自pixabay com 来源 赛先生 撰文 爱德华 阿什福德 李 加州大学伯克利分校教授 责编 李珊珊 摘要 数字技术正在和人类文明协同进化 我们依赖技术而生存 技术也依赖我们 这种合作共生的趋势越来越明显 技术并不是所谓的 应用科
  • 解决:java -version,java,javac不是内部或外部命令,也不是可运行的程序 或批处理文件。

    命令行输入java java version javac都显示不是内部或外部命令 1 首先查看了自己的环境变量 经过学习确实都是环境变量出现问题 之前的环境变量都是 JAVA HOME bin 全部换成了绝对路径如 C Program Fi
  • 弃用http改用https的缘故,与密钥的使用,证书意义

    为何弃用http协议 在十几年前 我们的传输协议是http协议 为何到了如今改成了https协议呢 为了安全的考虑 在http协议中 我们的内容是透明的 不被保护的 在黑客等恶意分子的面前 信息极其任意被破译 让我们看看客户端如果使用htt
  • spring笔记1(基础(IoC控制反转、DI依赖注入)、整合Junit、整合web)

    目录 前言 1 spring框架概述 1 什么是spring 1 2 spring由来 1 3spring核心 1 4spring优点 1 5 spring体系结构 2入门案例 IoC 掌握 2 1 导入jar包 2 2 目标类 2 3 配
  • R中关于金融的包

    quantmod 数据和图形 TTR 技术分析 blooter 账户管理 FinancialInstrument 金融产品 quantstrast 策略模型 PerformanceAnalytics 表现分析 这些R包依然在发展中 有些还被
  • 原生js导出excel,并保留样式

    前端表格导出excel一般我们使用xlsx等插件导出 但如果想保留表格的样式导出的话 还需要再使用其他的插件才行 如要保留宽度 字体颜色 背景颜色等样式 这里可以直接使用简短的 原生js方法即可导出带样式的excel文件 直接上代码 原生表
  • 股票实时数据接口

    From http chenpeng info html 1058 做了一点股票分析数据准备 做了个均线图 http stock chenpeng info randomone 查询股票走势请移步 http stock chenpeng i
  • Java内存模型

    Android开发中 存在大量并发的情况 因此也会遇到很多线程安全问题 在查询线程安全相关资料时 通常会查到Java内存模型的知识点 Java内存模型的主要目标是定义程序中各个变量的访问规则 即在虚拟机中将变量存储到内存和从内存中取出变量这
  • 如何一次让ChatGPT输入多个版本的内容供你选择

    随着人工智能的不断进步 我们对于AI工具的需求也在日益增加 尤其是像GPT这样的高级工具 单一的答案输出已经不能满足用户的多元需求 实际上 当我们面对一个问题时 多种答案的输出能让我们更全面地了解和思考 这样我们就可以从各种可能的答案中选择
  • Nikitosh and xor【字典树+dp】

    题目链接 比较明显的 正向一个推过去的字典树 再反向退回来的一个字典树 然后异或和用差分的方式解决 字典树一定是要从第29位开始往下的 千万别从第0位往上 include
  • JavaScript常用的5种排序算法,你都掌握了吗?

    今天给大家带来5种最常见的前端排序算法 注释非常详细 欢迎讨论 1 冒泡排序 Bubble Sort 定义 冒泡排序是一种简单的比较排序算法 它重复地比较相邻的元素 并将顺序错误的相邻元素交换位置 直到整个序列排序完成 代码示例 funct
  • int 0x80系统调用的参数传递规则

    系统调用的参数传递规则 传递给系统调用的参数则必须按照参数顺序依次存放到寄存器ebx ecx edx esi edi中 当系统调用完成之后 返回值存放在eax中 A 当系统调用所需参数的个数不超过5个的时候 执行 int 0x80 指令时
  • Chroom书签同步

    Chroom自带书签管理 而且有些管理书签的插件 我感觉自带书签管理栏就能满足我的个人需求 但是有一个问题 当我换了电脑后 原来的书签怎么同步 我为什么要使用Chroom 用其他浏览器广告太多了 比如360 也试着使用国内的其他浏览器 感觉
  • 如何在vscode配置php开发环境

    3 下载并安装vscodehttps code visualstudio com 下载的是一个压缩包 将其解压至一个目录 4 在vscode中安装调试插件右侧栏中点击扩展 输入xdebug 出来的php debug 点击安装 在菜单栏 文件
  • C++ 常用容器及其使用方法

    文章目录 本章内容概述 一 Vector 1 构造函数 2 增加函数 3 删除函数 4 属性函数 二 Unordered map 1 构造函数 2 增加函数 3 删除函数 4 属性函数 三 Stack 1 构造函数 2 访问方式 3 增加函
  • python: pandas与numpy(一)创建DataFrame数组与数组的简单操作

    目录 前言 1 创建Series数组 2 创建DataFrame数组 使用字典来创建DataFrame 使用列表来创建DataFrame 使用Series数组创建DataFrame 使用numpy函数创建DataFrame 3 在DataF

随机推荐

  • logback.xml

  • Mayor‘s posters(线段树染色)

    题目链接 Mayor s posters 2023 4 13 更新了代码 修复了错误的离散化长度 已在代码中注出 大致题意 有n个人依次贴海报 第i个海报的范围是 li ri 后面贴的海报会覆盖掉之前贴的海报 问 最终还能看到多少张海报 解
  • java的3大注释快捷键大全

    单行注释 行注释 一般用于单行或者少量代码 快捷键 光标 ctrl 或者 多行注释 块注释 一般用于多行或者大量代码 快捷键 选中 ctrl shift 文档注释 方法或类注释 一般用于对类和方法的说明 快捷键 光标 回车键 EnTer
  • 蓝桥杯Java必备基础知识总结大全【3W字】持续更新中

    本文会持续更新 如果对您有帮助的话可以点点关注 双击 本人2021年蓝桥杯C B组国二 今年转战Java 并整理此文 希望能够对大家有所帮助 第一次写这么长的文章 可能有的地方写的不是很好 还请大家多多谅解 我会持续进行改进并且更新 更新
  • 海思(MPP)媒体处理软件平台(3)-----VDEC

    sample vdec 视频解码 测试环境 在HI3531D开发板上运行 查看代码使用VSCode 运行 nfsroot mpp sample vdec sample vdec please choose the case which yo
  • [激光原理与应用-68]:光耦继电器、固态继电器、延时继电器、PLC开关信号

    一 PLC开关信号 备注 PLC需要的是开关信号 闭合或断开 不需要TTL电平信号 二 激光器输出信号 三 固态激光器工作原理 四 光耦继电器原理 五 光耦 延时 继电器原理 六 差分转单端原理
  • 排列组合知识

    排列组合的定义 排列 就是从n个元素中取出m个元素 按照一定的顺序排成一列 看到没 是要有顺序排成一列的 组合 也是从n个元素中取出m个元素 只不过是组成一个组 并不要求排成一列 只要组的成员不同就可以了 公式如下 例题 哪里用得上排列组合
  • 【Markdown】图片缩放

    01 原图表示 语法为 替代文本 图片链接地址 其中 替代文本是在无法显示图片时显示的替代文本 而图片链接是指向图片的URL或相对路径 例如 插入Panda图片 panda https img blog csdnimg cn e5f32e4
  • 亚信科技AntDB数据库专家参加向量数据库首次技术标准研讨会

    2023年7月19日下午 中国通信标准化协会大数据技术标准推进委员会数据库与存储工作组 CCSA TC601 WG4 联合中国信通院数据库应用创新实验室 CAICT DBL 在线上召开 向量数据库技术要求 标准首次研讨会 本次会议由中国信通
  • 单端反激——隔离型DC/DC变换器的设计及仿真

    单端反激 隔离型DC DC变换器的设计及仿真 技术指标 1 原理分析 2 参数设计 3 仿真验证 技术指标 输入电压 V s m i n
  • Spring Boot 2.2.6 源码之旅二十五SpringMVC源码之RequestMappingHandlerMapping的初始化三

    Spring Boot 2 2 6 源码之旅二十五SpringMVC源码之RequestMappingHandlerMapping的初始化三 简单流程图 MappingRegistry的一些映射 urlLookup一键多值的url和Requ
  • 那些会阻碍程序员成长的细节[4]

    照例 如果没有读过之前的系列 在这里可以先回顾一下 那些会阻碍程序员成长的细节 1 那些会阻碍程序员成长的细节 2 那些会阻碍程序员成长的细节 3 本文共 1637 字 预计阅读时间 5 分钟 不愿意跟领导走的近 是不是有这样的体会 凡事有
  • 【python标准库学习】re模块

    1 什么是re 正则表达式一门相对通用的语言 在python中也有对正则表达式的支持 那就是的内置re模块 正则表达式就是一系列的规则去匹配字符串然后进行相应的操作 这些规则网上一搜一大片 而re则是运用正则表达式来提供一系列的功能强大的接
  • Vue中如何进行打包与部署?

    Vue中如何进行打包与部署 Vue是一款流行的JavaScript框架 它提供了丰富的功能和组件 可以用于构建现代化的Web应用程序 在开发Vue应用程序时 我们通常需要进行打包和部署 本文将介绍Vue中的打包和部署 包括使用Webpack
  • STL list合并

    知识点来源 cplusplus STL list 网上很多关于list的操作很少有提及到怎么合并 要说这个合并几乎是每个数据结构课提及到的O 1 操作的必修知识点 同时还有人甚至搞不清楚什么叫Merge 归并 和合并 Union 归并的意思
  • linux 查看端口连接数

    一 查看哪些IP连接本机 netstat an 二 查看TCP连接数 1 统计80端口连接数 netstat nat grep i 80 wc l 2 统计httpd协议连接数 ps ef grep httpd wc l 3 统计已连接上的
  • 高斯列主消元法 求非齐次线性方程组 C语言实现代码

    高斯列主元素消去法是由高斯消去法改进的算法 下面浅浅分享一下本人对该方法的理解 Ax b 先说高斯消去法 感觉基本的思路就跟我们手算非齐次线性方程组差不多 在线性代数中 我们求解方程组都是这种思路 消元的过程相当于是 由系数矩阵A和非齐次项
  • linux下代码分析工具Splint

    1 C代码静态分析工具 Its4 读取一个或多个 C C 源程序 将每个源程序分割成函数标志流 然后检查生成的标志是否存在于漏洞数据库中 从而得到每个源程序的所有错误警告列表 并带有相关的描 述 其规则库vulns i4d定义了各种函数的危
  • 【医学图像分割】 MIXED Transformer 、DS-TransUNet、Swin-Unet

  • Qt开发北斗定位系统融合百度地图API及Qt程序打包发布

    Qt开发北斗定位系统融合百度地图API及Qt程序打包发布 1 上位机介绍 最近有个接了一个小型项目 内容很简单 就是解析北斗GPS的串口数据然后输出经纬度 但接过来觉得太简单 就发挥了主观能动性 增加了百度地图API 不但能实时定位 还能在