# ==应用开发==

## APP

CMakeLists.txt

```cmake
cmake_minimum_required(VERSION 3.10)

########################## 可单独生成 toolchain.cmake #################################################
set(CMAKE_SYSTEM_NAME Linux)     					# 设置目标系统名字
set(CMAKE_SYSTEM_PROCESSOR arm)  					# 设置目标处理器架构

# 该变量的值会传递给 gcc 编译器的--sysroot 选项，也就是--sysroot=${CMAKE_SYSROOT}，--sysroot 选项指定了编译器的 sysroot 目录，也就是编译器的系统根目录，编译过程中需要链接的库、头文件等，就会去该目录下寻找，譬如标准 C 库、标准 C 头文件这些。
set(CMAKE_SYSROOT /home/ml/sdk/buildroot/output/rockchip_rk3566/host/aarch64-buildroot-linux-gnu/sysroot/)  # ⭐指定了目标系统的根目录

# 设置编译器路径
set(CMAKE_C_COMPILER    /home/ml/sdk/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER  /home/ml/sdk/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++)
# 为编译器添加编译选项
#set(CMAKE_C_FLAGS "-march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7")
#set(CMAKE_CXX_FLAGS "-march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7")

# NEVER：仅搜索主机系统路径。
# ONLY：只搜索 CMAKE_SYSROOT。
# BOTH：将搜索主机系统路径和 CMAKE_SYSROOT 中的路径。
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)	# 限制find_library()的搜索路径。
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)	# 限制find_file()和 find_path()的搜索路径。

#set(ENV{LD_LIBRARY_PATH} "${CMAKE_SYSROOT}/lib:$ENV{LD_LIBRARY_PATH}")  # 添加库路径到 LD_LIBRARY_PATH

#set(CMAKE_LIBRARY_PATH "/opt/atk-dlrk356x-toolchain/lib/")      # 添加依赖库find路径：用于指定库文件被find_library()时的目录列表。
#set(CMAKE_INCLUDE_PATH "/opt/atk-dlrk356x-toolchain/include")   # 添加依赖库头文件find路径：用于指定find_path()头文件时应考虑的额外目录列表。

set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/myinstall)         # 设置安装目录，当前CMakeLists.txt所在目录下的myinstall文件夹
######################################################################################################

# 设置项目名称
project(mongoose VERSION 1.0)

# 包含工具链文件
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/toolchain.cmake CACHE STRING "Toolchain file")

# 查找所有源文件
file(GLOB SOURCES "${CMAKE_SOURCE_DIR}/*.cpp" "${CMAKE_SOURCE_DIR}/*.c")

# 添加可执行文件
add_executable(${PROJECT_NAME} ${SOURCES})

# 指定头文件目录
target_include_directories(${PROJECT_NAME} PRIVATE mongoose)
```



```sh
root@RK356X:/mnt# ./mongoose
terminate called after throwing an instance of 'std::runtime_error'
  what():  locale::facet::_S_create_c_locale name not valid
Aborted
```

## WIFI&蓝牙

泰山派开发板板载了WIFI+蓝牙二合一模块，这里默认贴的是AP6212。

```sh
vi /data/cfg/wpa_supplicant.conf									# 修改配置文件
wpa_supplicant -B -i wlan0 -c /data/cfg/wpa_supplicant.conf			# wpa_supplicant重新读取配置文件，启动，后面wpa_cli会和它进行通讯。
wpa_cli -i wlan0 -p /var/run/wpa_supplicant scan					# [可选]WIFI扫描，wpa_cli跟wpa_supplicant通信，确保wpa_supplicant运行。
wpa_cli -i wlan0 -p /var/run/wpa_supplicant scan_results			# [可选]显示扫描结果
wpa_cli -i wlan0 -p /var/run/wpa_supplicant reconnect				# 发起连接
ping lckfb.com
```



## LED控制

RK3588的GPIO引脚号的计算方式，参考如下公式：( A、B、C、D 分别代表数值 0、1、2、3)

GPIO3_A1 = 3x32 + 0x8 +1 = 97

|          | 复用功能     | GPIO     | 引脚编号 | 复用功能 | 复用功能 |             |      |
| -------- | ------------ | -------- | -------- | -------- | -------- | ----------- | ---- |
|          | 3.3V         | 3.3V     | 1        | 2        | 5V       | 5V          |      |
|          | I2C2_SDA_M0  | GPIO0_B6 | 3        | 4        | 5V       | 5V          |      |
|          | I2C2_SCL_M0  | GPIO0_B5 | 5        | 6        | GND      | GND         |      |
|          | GPIO         | GPIO1_A4 | 7        | 8        | GPIO3_B7 | UART3_TX_M1 |      |
|          | GND          | GND      | 9        | 10       | GPIO3_C0 | UART3_RX_M1 |      |
| 97       | GPIO         | GPIO3_A1 | 11       | 12       | GPIO3_C4 | PWM14_M0    |      |
| 98       | GPIO         | GPIO3_A2 | 13       | 14       | GND      | GND         |      |
| 99       | GPIO         | GPIO3_A3 | 15       | 16       | GPIO3_A4 | GPIO        | 100  |
|          | 3.3V         | 3.3V     | 17       | 18       | GPIO3_A5 | GPIO        | 101  |
|          | SPI3_MOSI_M1 | GPIO4_C3 | 19       | 20       | GND      | GND         |      |
|          | SPI3_MISO_M1 | GPIO4_C5 | 21       | 22       | GPIO3_A6 | GPIO        | 102  |
|          | SPI3_CLK_M1  | GPIO4_C2 | 23       | 24       | GPIO4_C6 | SPI3_CS0_M1 |      |
|          | GND          | GND      | 25       | 26       | GPIO3_A7 |             |      |
|          | I2C3_SDA_M1  | GPIO3_B6 | 27       | 28       | GPIO3_B5 | I2C3_SCL_M1 |      |
|          | GPIO         | GPIO3_B0 | 29       | 30       | GND      | GND         |      |
|          | GPIO         | GPIO3_C2 | 31       | 32       | GPIO3_C5 | PWM15_IR_M0 |      |
| 3 RK_PB1 | PWM8_M0      | GPIO3_B1 | 33       | 34       | GND      | GND         |      |
| 3 RK_PB2 | PWM8_M0      | GPIO3_B2 | 35       | 36       | GPIO3_C3 | GPIO        |      |
|          | GPIO         | GPIO0_B7 | 37       | 38       | GPIO3_B3 | GPIO        |      |
|          | GND          | GND      | 39       | 40       | GPIO3_B4 | GPIO        |      |

```sh

root@RK356X:/sys/class/gpio/gpio25# echo 97 > /sys/class/gpio/export
root@RK356X:/sys/class/gpio/gpio25# echo 98 > /sys/class/gpio/export
root@RK356X:/sys/class/gpio/gpio25# echo 99 > /sys/class/gpio/export
root@RK356X:/sys/class/gpio/gpio25# echo 100 > /sys/class/gpio/export
root@RK356X:/sys/class/gpio/gpio25# echo 101 > /sys/class/gpio/export
root@RK356X:/sys/class/gpio/gpio25# echo 102 > /sys/class/gpio/export

echo out > /sys/class/gpio/gpio97/direction
echo out > /sys/class/gpio/gpio98/direction
echo out > /sys/class/gpio/gpio99/direction
echo out > /sys/class/gpio/gpio100/direction
echo out > /sys/class/gpio/gpio101/direction
echo out > /sys/class/gpio/gpio102/direction

echo 1 > /sys/class/gpio/gpio97/value
echo 1 > /sys/class/gpio/gpio98/value
echo 1 > /sys/class/gpio/gpio99/value
echo 1 > /sys/class/gpio/gpio100/value
echo 1 > /sys/class/gpio/gpio101/value
echo 1 > /sys/class/gpio/gpio102/value //待验证？？
```



## ADS-B模块：GNS5894

**模块测试：**

```sh
stty -F /dev/ttyS4 3000000
cat /dev/ttyS4
```

**控制命令：协议切换**

11引脚：UART PS(低：HULC协议；高：Text协议)，HULC协议的波特率921600、8N1、**RTS/CTS**，Text协议的波特率3000000、8N1、**RTS/CTS**。

Text协议在很大程度上与所谓的 AVR 协议兼容，而 HULC 协议的 Mode-S 消息与所谓的 Beast 二进制协议兼容，方便将 GNS 5894 TAC 与现有软件连接。

### 1.Text协议

**命令格式**

每条消息都以 '#' （0x23） 开头，以 '' （0x0D， 0x0A） 结尾。中间是 1 到 16 个字节，采用 2 位十六进制表示，使用大写字母，用 '-' （0x2D） 分隔。

```sh
# command-message举例：
#00						# ASCII码发送，需要结尾发送<CR><LF>回车换行
23 30 30 0D 0A			# HEX发送，0D 0A就是回车换行
#43-12-00-00-00-00-00-00-00-00-00-00-00-00-00-00		# ASCII码接收
23 34 33 2D 31 32 2D 30 30 2D 30 30 2D 30 30 2D 30 30 2D 30 30 2D 30 30 2D 30 30 2D 30 30 2D 30 30 2D 30 30 2D 30 30 2D 30 30 2D 30 30 2D 30 30 0D 0A		# HEX接收

#43-02 					# ASCII码发送 
23 34 33 2D 30 32 0D 0A # HEX发送
```

**模块命令**

1. 查看版本

```sh
#00<CR><LF>		# 版本请求
#00-00-80-04-81-yy-ww-bb-xx-xx-xx-xx-xx-xx-xx-xx<CR><LF>
#00<CR><LF>	
#00-00-80-04-81-15-0A-11-01-02-03-01-00-00-00-00
```

2. 模式读取/设置

| 低四位 | 输出模式                          | 高四位 | 模式标志                        |
| ------ | --------------------------------- | ------ | ------------------------------- |
| 0x00   | Mode-S 数据关闭                   | 0x10   | MLAT 模式（不与 0x80 结合使用） |
| 0x01   | 保留                              | 0x80   | RSSI 模式（不与 0x10 结合使用） |
| 0x02   | 默认输出所有Mode-S & Mode-A/C数据 |        |                                 |
| 0x03   | 仅输出 ADS-B 数据 （DF17-19）     |        |                                 |
| 0x04   | 仅输出具有有效 CRC 的 ADS-B 数据  |        |                                 |

注：MLAT 模式就是**时间戳**加数据；RSSI 模式就是**信号强度**加数据。但是不能同时输出这两种模式。

```sh
# 设置模式
# 通过 MLAT 模式(0x10)输出所有Mode-S & Mode-A/C数据(0x02)
#43-12<CR><LF>
#43-12-00-00-00-00-00-00-00-00-00-00-00-00-00-00<CR><LF>

# 读取当前模式
#43<CR><LF>											# 模式命令/请求
#43-02-00-00-00-00-00-00-00-00-00-00-00-00-00-00	# 返回模式02
```

3. Mode-S & Mode-A/C 数据帧接收

在 0x02模式（接收所有 DF 数据）下，12位或56位或112位原始数据帧被输出为4字节或7字节或14字节ASCII帧，MSB优先。以 '*' 开头，以 ';'  结束。

![image-20240914144813244](泰山派开发记录/image-20240914144813244.png)

|      |      |      |      |      |      |
| ---- | ---- | ---- | ---- | ---- | ---- |
|      |      |      |      |      |      |



```sh
# 正常模式（默认）：
*<7或14字节数据> ;<CR><LF>						 	 # Mode-S 格式
*5D4951B4192B49;<CR><LF>							# DF11 Mode-S 7 字节（短报文 Short Squitter）
*5D780AE871C60D;									# DF11 All-call reply
*024101315B7DB6;									# Short air-air surveillance (ACAS)
*20000210BE8DCE;									# Long air-air surveillance (ACAS)

*8D4951B49945B40CE8589F6181B6;<CR><LF>				# DF18 Mode-S 14 字节（扩展报文 Ext.Squitter）
*8D780AE899094D8CF0A02FA77CD2;						# Extended squitter

*<2字节2的2位八进制数据>;<CR><LF>					   # Mode-A/C 格式
*5734;<CR><LF>										# Mode-A/C 数据

# MLAT 模式（可选）：
@<6字节时间戳><4/7/14字节的2位数据>;<6字节时间戳>:6字节MSB优先自由运行12MHz计数器值，十六进制为12位。
@112233445566 5D4951B4192B49;<CR><LF>				# Short Squitter
@1122334455668D4951B49945B40CE8589F6181B6;<CR><LF>	# Ext. Squitter
@1122334455665734;<CR><LF>							# Mode-A/C

# RSSI 模式（可选）：
+<1字节RSSI> <4/7/14字节的2位数据>>;<CR><LF>
<1字节RSSI>: 1字节未校准的对数RSSI值，以2位十六进制表示
+AB5D4951B4192B49;<CR><LF>
+AB8D4951B49945B40CE8589F6181B6;<CR><LF>
+AB5734;<CR><LF>
```

在 0x02+ RSSI 模式（所有模式-S & 模式-A/C数据的接收器，带有附加信号强度指示器）下，12 位或 56 位或 112 位原始数据帧输出为 3 字节、8 字节或 15 字节 ASCII 帧，MSB 优先。每个 ASCII 帧都以 '+' 开头，以 ';' 结束。

“+”后面的第一个字节是当前 ADS-B 帧的信号强度指示器。

重要提示：

在数据之前的信号强度指示器（Signal Strength Indicator）仅仅是一个接收到的帧的场强（即信号强度）的指示器，而不是一个可以精确计算出与发射器之间距离的测量值。换句话说，这个信号强度指示器只告诉你信号的强弱，但它不能直接、确定地用来计算出你离信号发射器的确切距离。

该指示器所表示的值大约范围在0x20到0xd5之间。其中，0x20代表较远的距离（即信号较弱），而0xd5代表较近的距离（即信号较强）。这里的0x前缀表示这是一个十六进制数。在实际应用中，不同的设备或系统可能会对这个范围有不同的解释或处理方式，但基本原理相同：它提供的是一个信号强度的相对度量，而不是与发射器之间距离的直接度量。

### 2.HULC协议

参考`GNS5894TAC_ADSBModul_datasheet_V1.1.pdf`，待整理



## AIS模块：GNS5851

**模块测试：**

```sh
stty -F /dev/ttyS3 115200
cat /dev/ttyS3
```






# 术语

## Mode-S 和 Mode-A/C

Mode-S (Mode Select) 和 Mode-A/C (Mode A and Mode C) 是航空监视系统中使用的不同类型的应答信号格式，它们分别用于不同的目的和提供不同的信息。

**Mode-A/C 帧**

Mode-A/C 代表的是传统的二次监视雷达 (SSR, Secondary Surveillance Radar) 所使用的信号格式。Mode-A 和 Mode-C 是两个不同的信号模式，它们通常结合使用来提供飞机的身份识别和高度信息。

- **Mode-A (Mode Alpha)**：提供身份识别信息。飞机上的应答器会在收到询问信号后发送一个四位数的代码，这个代码由空中交通管制员分配给飞机，用于区分不同的飞行器。
- **Mode-C (Mode Charlie)**：提供高度信息。与 Mode-A 类似，但 Mode-C 传输的是飞机的高度信息，通常以百英尺为单位。

**Mode-S 帧**

Mode-S (Mode Select) 是一种更为现代的应答信号格式，它提供了比 Mode-A/C 更多的功能和更高的数据传输能力。Mode-S 被设计用于增强安全性和效率，尤其是在繁忙的空域中。

- **Mode-S 基本模式**：类似于 Mode-A/C，但也提供了飞机的身份识别信息。
- **Mode-S 扩展消息 (ES)**：这是 Mode-S 的扩展版本，可以携带更多的信息，如飞机的位置、速度和其他相关数据。Mode-S ES 可以支持 ADS-B (Automatic Dependent Surveillance-Broadcast) 技术，这是一种自动广播监视技术，允许飞机自主广播其位置和其他飞行信息。
- **Mode-S 增强型**：除了基本的身份识别和 ADS-B 信息外，还可以支持更多功能，如选择性呼叫、数据链通信等。

**区别**

- **信息量**：Mode-S 能够携带更多的信息，而不仅仅是简单的识别和高度信息。
- **安全性**：Mode-S 支持加密通信，增加了安全性。
- **数据速率**：Mode-S 的数据速率更高，可以更快地传输更多的信息。
- **兼容性**：Mode-A/C 是传统的格式，大多数旧的飞机仍然使用；而 Mode-S 是更新的技术标准，主要用于现代化的飞机和先进的空中交通管理系统。

总的来说，Mode-S 提供了更多的功能，增强了空中交通管理的能力，特别是在繁忙的空域中提高了安全性和效率。然而，由于 Mode-A/C 仍在广泛使用，因此许多雷达系统需要同时支持这两种模式。

## MLAT服务器

MLAT服务器，全称Multiple Lateral-sounding Radar（多点定位雷达）服务器，是一种利用多个地面站接收来自飞行器的广播式自动相关监视(ADS-B)信号，通过测量信号到达不同地面站的时间差，并结合地面站的精确位置信息，来计算飞行器位置的技术平台。以下是关于MLAT服务器的详细解释：

一、技术原理

- **信号接收**：MLAT系统通过多个地面站接收飞行器发射的ADS-B信号。
- **时间差测量**：由于信号传播速度有限，不同地面站接收到信号的时间会有所不同。系统通过测量这些时间差，构建出一组方程。
- **位置计算**：结合地面站的精确位置信息，利用三角定位的原理，通过解这组方程来求解飞行器的位置。

二、系统特点

- **无需额外设备**：MLAT系统不需要在飞行器上安装额外的设备，仅利用现有的ADS-B设备即可实现精确的定位。
- **广泛适用性**：由于依赖的是ADS-B信号，MLAT系统可以应用于大多数已加装ADS-B应答机的飞行器。
- **高精度**：通过多个地面站的联合观测，MLAT系统能够提供高精度的飞行器位置信息。

三、应用领域

- **航空交通管制**：MLAT技术为航空交通管制提供了实时、精确的飞行器位置信息，有助于提升管制效率和安全性。
- **飞行器追踪**：在飞行器追踪领域，MLAT系统能够实现对飞行器的持续、精确追踪，为飞行器的运行管理提供有力支持。
- **空中交通管理**：MLAT技术的应用有助于优化空中交通流量，减少航班延误和冲突，提升整体航空运输效率。

四、系统构建

- **硬件要求**：MLAT系统需要安装多个地面接收机（如RadarCape），并在一台服务器上安装多点定位中央处理系统软件。
- **网络连接**：通过以太网、移动网络或互联网将地面接收机与中央MLAT服务器连接，实现数据的实时传输和处理。
- **数据处理**：中央MLAT服务器接收来自地面接收机的数据，进行位置解算，并将结果提供给用户或相关系统。

综上所述，MLAT服务器是一种基于多点定位技术的服务器平台，通过接收和处理来自多个地面站的ADS-B信号，实现对飞行器的精确定位。该技术在航空交通管制、飞行器追踪和空中交通管理等领域具有广泛的应用前景和重要的实用价值。

## GNSS数据格式RMC/GGA

RMC（推荐最小数据）和GGA（全球定位信息）数据句（sentences）

1. RMC（Recommended Minimum Specific GNSS Data）
   - RMC是一种GNSS（全球导航卫星系统）数据格式，它提供了卫星导航系统的最小推荐数据集。
   - RMC数据句包含了时间、位置、速度等基本信息，但不包括所有可能的GNSS数据字段。
   - 它被设计为在数据传输带宽有限的情况下，仍能提供足够的导航信息。
2. GGA（Global Positioning System Fix Data）
   - GGA是GPS（全球定位系统）数据格式的一种，用于提供关于GPS定位的信息。
   - GGA数据句包含了定位的时间、质量指示、纬度、经度、高度等关键信息。
   - 它通常用于GPS接收机的标准输出，以提供关于当前位置的详细信息。

## Mode-S协议

AA：地址公布 ;

AC：海拔代码 ;

AF：应用领域 ;

AP：地址/奇偶校验 ;

AQ：收购 ;

CA：能力 ;

CC：交联能力 ;

CF：控制场 ;

CL：代码标签 ;

DF：下行格式 ;

DI：标号标识 ;

DR：下行请求 ;

DS：数据选择器 ;

ELM：Extended length message 扩长消息 ;

FS：航班状态 ;

IC：询问器代码 ;

ID：Identità ;KE：控制，ELM ;

MA：消息，Comm-A ;

MB：消息，Comm-B ;

MC：消息，Comm-C ;

MD：消息，Comm-D ;

ME：消息，扩展 squitter ;

MU：消息，ACAS ;

MV：消息，ACAS ;

NC：C 段数 ;

ND：D 段数 ;

PC：协议 ;

PI：奇偶校验/询问器标识符 ;

PR：回复概率 ;

RC：回复控制 ;

RI：回复信息 ;

RL：回复长度 ;

RR：回复请求 ;

SD：特殊标号;

UF：上行格式 ;

UM：实用程序消息 ;

VS：垂直状态

