IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 极致敏捷-使用C语言在Taskbus中一天实现ADS-B接收机和实时飞行地图 -> 正文阅读

[C++知识库]极致敏捷-使用C语言在Taskbus中一天实现ADS-B接收机和实时飞行地图

大家知道利用 RTLSDR可以接收1090MHz的ADS-B信号,观察头顶的飞机。ADS-B信号是一种脉码调制的古老信号,可以理解为定时调幅信号。通过简单的按时比大小,就可以暴躁解调。
ADS/B
(本图片来自网络)
但是,github上的ADS-B项目,比如 dump1090,gr-air,要么是基于特定接收机,要么必须要GNU-Radio环境。这个环境对windows那是不太友好的。我们希望基于全C/C++语言,本地迅速实现一套带地图的实时ADS接收机——最好一天搞定!

taskBus 配合 stdio 包装器后,灵活性非常强,我们就花一天时间来移植这种接收机功能。在发行版中有完整的绿色版可执行文件,在win-10下理论上配好USRP-B210就能使用了。

1 上午-改造 dump1090为stdio版本

原始的dump1090代码参考:
https://github.com/antirez/dump1090/blob/master/dump1090.c
这个程序是和RTLSDR硬件绑定的,写的很不错,非常通俗易懂。它的解调就是暴躁的调幅信号比大小:

 for (j = 0; j < mlen - MODES_FULL_LEN*2; j++) {
        int low, high, delta, i, errors;
        int good_message = 0;

        if (use_correction) goto good_preamble; /* We already checked it. */

        /* 这,够直接!ADS前导同步就这样解调了. */
        if (!(m[j] > m[j+1] &&
            m[j+1] < m[j+2] &&
            m[j+2] > m[j+3] &&
            m[j+3] < m[j] &&
            m[j+4] < m[j] &&
            m[j+5] < m[j] &&
            m[j+6] < m[j] &&
            m[j+7] > m[j+8] &&
            m[j+8] < m[j+9] &&
            m[j+9] > m[j+6]))
        {
           continue;
        }

1.1 从键盘而不是RTLSDR输入数据

不过这个东西是要RTLSDR 电视棒的。我们把无关的全删了,而后从 stdin直接获取数据:

int main(int argc, char **argv) {
	int i;
	unsigned char * stdin_buf = malloc(MODES_DATA_LEN);
	short * stdin_buf16 = malloc(MODES_DATA_LEN * 2);
	int len = MODES_DATA_LEN;
	setmode(fileno(stdout), O_BINARY);
	setmode(fileno(stdin), O_BINARY);
	//...
	while(1) {
		len = fread(stdin_buf16,2,MODES_DATA_LEN,stdin);
		//RTLSDR是1字节的无符号,要转换一下。
		for (i = 0;i<len;++i)
					stdin_buf[i] = stdin_buf16[i]/256 + 128;
		memcpy(Modes.data, Modes.data+MODES_DATA_LEN, (MODES_FULL_LEN-1)*4);
		memcpy(Modes.data+(MODES_FULL_LEN-1)*4, stdin_buf, len);
		computeMagnitudeVector();
		detectModeS(Modes.magnitude, Modes.data_len/2);
	}
	free(stdin_buf);
	free(stdin_buf16);
	return 0;
}

“别跟我说多线程、加锁,对于这种2M带宽的窄带信号,直接单线程开撸了”——这是开玩笑。其实,仔细学习dump1090,就能发现它还是老鸟写的。用查表的方法取代了sqrt,显著降低了开销,使得单线程也很实时。

1.2 printf 输出 qplanetosm绘图指令

在原版的dump1090输出基础上,我们加入qplanetosm的绘图指令输出:

void interactiveShowData(void) {
    struct aircraft *a = Modes.aircrafts;
    //...
    while(a ) {
		if (a->need_display)
		{
			a->need_display=0;
			int altitude = a->altitude, speed = a->speed;
			/* Convert units to metric if --metric was specified. */
			if (Modes.metric) {
				altitude /= 3.2828;
				speed *= 1.852;
			}
			fprintf(stdout,"source=adsb;destin=geomarker;function=update_icon;icon=flight;name=%s;lat=%f;lon=%f;rotate=%d;smooth=1;scale=%f\n",
				a->hexaddr, a->lat, a->lon, a->track, (altitude/30000.0+1),
				(int)(now - a->seen));

			fprintf(stdout,"source=adsb;destin=geomarker;function=update_props;name=%s;LABEL=%s;Alt=%d;Speed=%d;lat=%f;lon=%f;track=%d;msgs=%ld;time=%d;\n",
				a->hexaddr, a->flight, altitude, speed,
				a->lat, a->lon, a->track, a->messages,
				(int)(now - a->seen));
			fflush(stdout);
		}
        a = a->next;
    }
}

这样,就可以用我们以前自己开发的地图进行绘制了。关于绘图指令,参考:
https://blog.csdn.net/goldenhawking/article/details/50629028

1.3 完整代码

完整代码(一个c文件搞定)见https://gitcode.net/coloreaglestdio/taskbus/-/blob/master/module_templates/stdio/recv_adsb/recv_adsb.c

2 下午-引入taskBus

使用taskBus的包装器,分别包装两个模块。

  1. ads-b 接收模块
  2. 地图模块

包装后的工程:
在这里插入图片描述注意,地图需要qplanetosm发行版的支持。可以点开链接下载编译好的win10x64版本。

在调试的时候,遇到一些小问题:

  1. windows下,优先级nice的值要调大,这样才不会被网页、听歌弄得USRP停了。
  2. windows下,注意地图、ads等EXE文件的路径。有的时候有中文是不行的。

3 晚上-运行工程

接上我的山寨USRP-B210,直接运行,就可以看到飞机了!
在这里插入图片描述

4 总结-taskbus敏捷开发

可以看见,通过该方法,可以把毫不相干的各种程序很快移植到TaskBus上,构造出实时信号处理系统。这种灵活的构造能力,显著把使用者的精力集中到算法开发上去了。

基于taskBus设计软件系统,就是命令行管道系统的扩展。可以理解为把线性1:1:1的管道,变成一个交织的m:n:k图结构,大大提高了灵活性。同时,对图中的1:1、1:2节点,更可以重用控制台程序,无需进行通道封装,非常方便。

同时,采用这种松散、轻量的策略,可以把团队手头不相干的历史财富迅速串联起来,形成合力。这是小型非计算机专业团队提高整体开发能力的关键。

5. 法律提示

需要注意的是,ADS-B接收可以,万万不要去上传。保护国土安全人人有责。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-02 13:24:33  更:2022-05-02 13:24:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:56:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码