## UWB中TOF测距法的公式推导

#### UWB中TOF测距法的公式推导

UWB常用测距方法有两种：飞行时间测距法（TOF）和到达时间差法（TDOA）。这里说一下TOF。

#### TOF

TOF定位方式需要基站和标签往返通信，因此就造成了TOF功耗大大提高，续航时间相对较短.

TOF又分为两种：单边双向测距和双边双向测距。

#### 单边双向测距 $T_{prop} = \frac{1}{2}(T_{round}-T_{reply})$

$\hat{T}_{prop} = \frac{1}{2}[T_{round}(1+e_A)-T_{reply}(1+e_B)]$

$Error = \hat{T}_{prop} - T_{prop} = \frac{1}{2}(T_{round}\cdot e_A-T_{reply}\cdot e_B) = \frac{1}{2}T_{reply}(e_A-e_B) + T_{prop}\cdot e_A$

$Error = \hat{T}_{prop} - T_{prop} \approx \frac{1}{2}T_{reply}(e_A-e_B)$

#### 双边双向测距 $T_{prop} = \frac{1}{2}(T_{round1}-T_{reply1})$

$T_{prop} = \frac{1}{2}(T_{round2}-T_{reply2})$

\begin{flalign}T_{round1} \times T_{round2} = (2T_{prop}+T_{reply1})(2T_{prop}+T_{reply2}) = 4T_{prop}^2+2T_{prop}(T_{reply1}+T_{reply2})+T_{reply1}T_{reply2} \end{flalign}

\begin{flalign} T_{round1} \times T_{round2} - T_{reply1}T_{reply2} = 4T_{prop}^2+2T_{prop}(T_{reply1}+T_{reply2}) \\ = T_{prop}(4T_{prop}+2T_{reply1}+2T_{reply2}) \\ = T_{prop}(T_{round1} + T_{round2} + T_{reply1} + T_{reply2}) \end{flalign}

$T_{prop} = \frac{T_{round1} \times T_{round2} - T_{reply1} \times T_{reply2}}{T_{round1} + T_{round2} + T_{reply1} + T_{reply2}}$

\begin{flalign} \hat{T}_{prop} = \frac{T_{round1}(1+e_A) \times T_{round2}(1+e_B) - T_{reply1}(1+e_B) \times T_{reply2}(1+e_A)}{T_{round1}(1+e_A) + T_{round2}(1+e_B) + T_{reply1}(1+e_B) + T_{reply2}(1+e_A)} \\ = \frac{(4T_{prop}^2+2T_{prop}(T_{reply1}+T_{reply2}))(1+e_A)(1+e_B)} {4T_{prop}+2(T_{reply1}+T_{reply2})+(2T_{prop}+T_{reply1}+T_{reply2})(e_A+e_B)}\\ =\frac{2(1+e_A)(1+e_B)}{(1+e_A)+(1+e_B)}T_{prop} \end{flalign}

$T_{prop} = \frac{(1+e_A)+(1+e_B)}{2(1+e_A)(1+e_B)}\hat{T}_{prop}$

\begin{flalign} Error = \hat{T}_{prop} - T_{prop} = \left(1-\frac{(1+e_A)+(1+e_B)}{2(1+e_A)(1+e_B)}\right)\hat{T}_{prop} \\ = \frac{e_A+e_B+2e_A e_B}{2(1+e_A)(1+e_B)}\hat{T}_{prop} \end{flalign}

$Error \approx \frac{e_A+e_B}{2}\hat{T}_{prop}$

$T_{prop} = \frac{1}{4}(T_{round1}-T_{reply1}+T_{round2}-T_{reply2})$

\begin{flalign} \hat{T}_{prop} = \frac{1}{4}\left[T_{round1}(1+e_A)-T_{reply1}(1+e_B)+T_{round2}(1+e_B)-T_{reply2}(1+e_A)\right] \end{flalign}

\begin{flalign} Error = \hat{T}_{prop} - T_{prop} = \frac{1}{4}\left[(T_{round1}-T_{reply2})e_A +(T_{round2}-T_{reply1})e_B\right] \\ =\frac{1}{4}\left[2(e_A+e_B)T_{prop} +(e_A-e_B)(T_{reply1}-T_{reply2})\right] \end{flalign}

$Error \approx \frac{1}{4}(e_A-e_B)(T_{reply1}-T_{reply2})$

## 智能硬件Nvidia Jetson Nano B01

#### 产品参数

GPU 128-core Maxwell Quad-core ARM A57 @ 1.43 GHz 4 GB 64-bit LPDDR4 25.6 GB/s micro SD 卡 4K @ 30   |   4x 1080p @ 30   |   9x 720p @ 30 (H.264/H.265) 4K @ 60   |   2x 4K @ 30   |   8x 1080p @ 30   |   18x 720p @ 30 (H.264/H.265) 2x MIPI CSI-2 D-PHY lanes 千兆以太网，M.2 Key E 接口外扩 (可外接： AC8265 双模网卡 ) HDMI 和 DP 显示接口 4x USB 3.0，USB 2.0 Micro-B GPIO，I2C，I2S，SPI，UART 260-pin 连接器

#### Jetson Nano系统安装

1、JetPack介绍

JetPack SDK包括最新的Linux驱动程序包(L4T)，带有Linux操作系统和CUDA-X加速库，以及用于深度学习、计算机视觉、加速计算和多媒体的API。 它还包括用于主机和开发人员套件的示例、文档和开发人员工具，并支持更高级别的SDK，例如用于流式视频分析的DeepStream和用于机器人的Isaac。

2、JetPack 4.4

JetPack 目前最新版本是4.4，支持Vulkan 1.2、TensorRT 7.1.3 、cuDNN 8.0、CUDA 10.2 等。

3、下载和安装

• 下载 Jetson Nano镜像，镜像中包含提供引导加载程序、Ubuntu18.04、必要的固件、NVIDIA驱动程序、示例文件系统等。
• 使用 Etcher 或者 Raspberry Pi Imager 将镜像烧录到SD卡（建议至少32G）中。

1.执行更新

2.安装vino服务端

3.开启VNC 服务

4.配置VNC服务

#### 设置开机自启动

1.创建VNC自动启动文件

2.添加以下内容到vino-server.desktop文件中

## 关于HTTP请求走私的小记

#### 0x01 HTTP请求走私是什么

HTTP请求走私是一种干扰网站处理从一个或多个用户接收的HTTP请求序列的方式的技术。使攻击者可以绕过安全控制，未经授权访问敏感数据并直接危害其他应用程序用户。

#### 0x02 为什么会产生HTTP请求走私

RFC2616规范

##### 扩展：为什么会出现多次请求

HTTP1.0之前的协议设计中，客户端每进行一次HTTP请求，需要同服务器建立一个TCP链接。

Keep-Alive：在HTTP请求中增加一个特殊的请求头Connection: Keep-Alive，告诉服务器，接收完这次HTTP请求后，不要关闭TCP链接，后面对相同目标服务器的HTTP请求，重用这一个TCP链接。这样只需要进行一次TCP握手的过程，可以减少服务器的开销，节约资源，还能加快访问速度。这个特性在HTTP1.1中默认开启的。

Pipeline(http管线化)：http管线化是一项实现了多个http请求但不需要等待响应就能够写进同一个socket的技术，仅有http1.1规范支持http管线化。在这里，客户端可以像流水线一样发送自己的HTTP请求，而不需要等待服务器的响应，服务器那边接收到请求后，需要遵循先入先出机制，将请求和响应严格对应起来，再将响应发送给客户端。

## Transfer-Encoding 的作用

1, Transfer-Encoding只是在传输过程中才有的,并非请求URL对应实体的本身特性.
2, Transfer-Encoding是一个"跳到跳"头,而Content-Encoding是"端到端"头.

Transfer-Encoding中有一类特定编码:chunked编码.该编码将实体分块传送并逐块标明长度,直到长度为0块表示传输结束, 这在实体长度未知时特别有用(比如由数据库动态产生的数据). HTTP1.1标准规定,只要使用了Transfer-Encoding的地方就必须使用chunked编码,并且chunked必须为最后一层编码.任何HTTP 1.1应用都必须能处理chunked编码.

#### 参考链接

Transfer-Encoding 的作用

## RS485 软件流控 及 数据完整性确保

（本文的内容这个连接都有包含，但本文会更加通俗的讲解一下关键细节。）

CDNET 协议有 3 个级别，由首字节的高两位决定：

Level 0 格式

CDNET 的端口号可以看做类似电脑的 UDP 端口，也可以看做是一个命令号。

Level 1 格式

MULTI_NET & MULTICAST

SEQUENCE
0: 无序列号;
1: 追加 1 字节序列号 SEQ_NUM, 这个是重点，稍后会主要说明。

PORT_SIZE:

Level 2 格式

Level 1 没有大数据分包功能，因为通常 MCU 也用不到那么大的数据包，即使是烧录代码这种要传大数据的功能，也是可以在命令内部定义地址和数据长度的，譬如我的 STM32 总线代码升级的命令定义：

CDBUS 协议将前 0~9 保留专用，10 及其后的用户可以随便用，保留的部分目前也就用了 4 个，而且也不是强制的，用户愿意实现就实现，不用或者自己想怎么用就怎么用也没问题。 上篇文章说了端口或命令 0x01 是用来查询设备信息的，命令 0x03 是用来设置地址的，还详细说了如何使用这两个端口来实现地址自动分配，剩下两个端口其中 0x02 是用来设置波特率的， 对于本文最关键的端口 0x00 是用于流控、完整性确保、大数据拆包的了，其定义如下：

Port 0

Port 0 本身的命令不可以启用 SEQUENCE.

Port 0 命令定义:

(-> 和 <- 是端口层的数据流, >> 和 << 是 CDNET 数据包层面的数据流，不含最低层的 CDBUS 的部分)

#### 参考链接

RS485 软件流控 及 数据完整性确保

## 完整教程：设计一款小巧但强大的传感器

● 如何设计小型共享数据和电源通信接口

● 如何为传感器设计超低噪声电源

● 微控制器和软件架构选择

● 选择合适的MEMS振动传感器

● 集成数字硬件设计和机械外壳

● 电脑上的数据采集UI示例

## 【玩转ESP32】ESP32串口使用

#### 1、ESP32串口

ESP32芯片有三个UART控制器(UART0, UART1UART2)，其中UART0GPIO3用于U0RXDGPIO1用于U0TXD）用作下载、调试串口，引脚不可改变； UART1UART2的引脚是可以设置的。 UART1默认引脚是GPIO9用作U1RXDGPIO10用作U1TXD，但是这两个引脚也是用于外接flash的，因此在使用UART1的时候需要设置其他引脚； UART2默认引脚是GPIO16用作U2RXDGPIO17用作U2TXD #### 2、API

components/driver/include/driver/uart.h中可以查看api；

#### 4、使用总结

1. 初始化串口参数，（队列指针、缓冲区、引脚等）；
2. 任务中阻塞等待串口队列 。

## 如何实现 ESP32 固件的 OTA 在线升级更新

#### 2、OTA 简介

OTA（空中）更新是使用 Wi-Fi 连接而不是串行端口将固件加载到 ESP 模块的过程。

##### 2.1、ESP32 的 OTA 升级有三种方式：
• Arduino IDE：主要用于软件开发阶段，实现不接线固件烧写
• Web Browser：通过 Web 浏览器手动提供应用程序更新模块
• HTTP Server：自动使用http服务器 - 针对产品应用

OTA 进程没有强加的安全性，需要确保开发人员只能从合法/受信任的来源获得更新。更新完成后，模块将重新启动，并执行新的代码。开发人员应确保在模块上运行的应用程序以安全的方式关闭并重新启动。

##### 2.3、OTA 升级策略 - 针对 HTTP

ESP32 连接 HTTP 服务器，发送请求 Get 升级固件；每次读取1KB固件数据，写入Flash。

ESP32 SPI Flash 内有与升级相关的（至少）四个分区：OTA data、Factory App、OTA_0、OTA_1。其中 FactoryApp 内存有出厂时的默认固件。 #### 3、OTA 实例解析

##### 3.3、HTTP 服务器实现更新

ESPhttpUpdate 类可以检查更新并从 HTTP Web 服务器下载二进制文件。可以从网络或 Internet 上的每个 IP 或域名地址下载更新，主要应用于远程服务器更新升级。

refer：

## 根据温度、气压计算海拔高度

##### 1. hypsometric 公式

$\Large h = \frac{[(\frac{P_0}{P})^{\frac{1}{5.257}}-1] \times (T + 273.15)}{0.0065} \tag{1}$

(1)

##### 2. barometric 公式

$\Large h = 44330 \times \left [ 1 - (\frac{P}{P_0})^{\frac{1}{5.255}} \right ] \tag{2}$

(2)