正点原子嵌入式linux驱动开发——Linux WIFI驱动

news2024/11/27 19:35:18

WIFI的使用已经很常见了,手机、平板、汽车等等,虽然可以使用有线网络,但是有时候很多设备存在布线困难的情况,此时WIFI就是一个不错的选择。正点原子STM32MP1开发板支持USB和SDIO这两种接口的WIFI,本章就来学习一下如何在STM32MP1开发板上使用USB和SDIO这两种WIFI。

硬件原理图分析

正点原子的STM32MP1开发板板载了SDIO WIFI使用芯片的为RTL8723DS,原理图如下所示:

RTL8732DS原理图

从上图中可以看出,板载的WIFI为SDIO接口,D0-4所对应的硬件引脚为:PF0、PF4、PF5和 PD7,CMD对应的硬件引脚为PF1,CLK所对应的硬件引脚为PG15

WIFI驱动添加与编译

正点原子的STM32MP1开发板目前支持两种接口的WIFI:USB和SDIO,其中USB WIFI使用的芯片为RTL8188EUS,SDIO接口的WIFI 使用芯片为RTL8723DS,这两个都是realtek公司出品的WIFI芯片。WIFI驱动不需要自己编写,因为realtek公司提供了WIFI驱动源码,因此只需要将WIFI驱动源码添加到Linux内核中,然后通过图形界面配置,选择将其编译成模块即可

正点原子的STM32MP1开发板上有一个板载RTL8723DS WIFI,接口为SDIORTL8723DS芯片是WIFI和蓝牙二合一,这一章只讲解WIFI。正点原子STM32MP157开发板上的RTL8723DS模组有两种封装形式的,如下图所示:

RTL8723DS板载SDIO WIFI

上图中这两个都是RTL8723DS模组,封装、功能一模一样,只是元器件布局不同而已。另外,正点原子还有一款采用RTL8188EUS芯片的USB WIFI,如下图所示:

RTL8188 USB WIFI

向Linux内核添加WIFI驱动

移植驱动

将rtl8723ds目录拷贝到Ubuntu下Linux内核源码中的drivers/net/wireless/realtek/目录下,此目录存放着Linux主线上的所有realtek公司的WIFI驱动
文件,拷贝完成以后此目录如下图所示:

拷贝后的realtek目录

修改drivers/net/wireless/realtek/Kconfig

打开drivers/net/wireless/ realtek/Kconfig,在里面加入下面这一行内容:

source "drivers/net/wireless/realtek/rtl8723ds/Kconfig"

添加完成以后的如下图所示:

修改后的Kconfig

修改drivers/net/wireless/realtek/Makefile

打开drivers/net/wireless/realtek/Makefile,在里面加入下面以后内容:

obj-$(CONFIG_RTL8723DS) += rtl8723ds/

修改以后的Makefile文件如下图所示:

修改后的Makefile

上图中第11行,这里新添加一个内核配置,会根据CONFIG_RTL8723DS这个宏来决定8723ds WIFI驱动是编译进内核还是模块。

配置USB支持设备

在编译RTL8188和RTL8723驱动之前需要先配置Linux内核

配置USB支持设备

USB配置默认已经选中了,这里只是看一下都有哪些要配置,配置路径如下:

-> Device Drivers
-> <*> USB support
-> <*> Support for Host-side USB //选中
-> <*> EHCI HCD (USB 2.0) support //选中
-> <*> OHCI HCD (USB 1.1) support //选中
-> <*> ChipIdea Highspeed Dual Role Controller //选中
-> [*] ChipIdea device controller-> //选中
-> [*] ChipIdea host controller //选中

配置支持WIFI设备

配置路径如下:

-> Device Drivers
-> [*] Network device support
-> [*] Wireless LAN
-> <*> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP) //选中
-> [*] Support downloading firmware images with Host AP driver //选中
-> [*] Support for non-volatile firmware download //选中

配置完如下图所示:

配置支持WIFI设备

配置支持IEEE802.11

配置路径如下:(注意:是配置成模块,不是编译进内核)

-> Networking support (NET [=y])
-> Wireless (WIRELESS [=y])
-> cfg80211 - wireless configuration API //编译成模块

配置完如下图所示:

IEEE 802.11配置项

使能STAGING配置

配置路径如下:

-> Device Drivers
-> [*] Staging drivers //选中

配置完如下图所示:

使能STAGING配置

配置好以后重新编译一下Linux 内核,得到新的uImage,后面使用新的编译出来的uImage启动系统。

设备树的配置

pinctrl的配置

首先肯定是sdmmc3引脚配置信息,打开stm32mp15-pinctrl.dtsi,找到如下所示内容:

sdmmc3引脚配置

示例代码53.1.3.1中就是sdmmc3的默认引脚配置,这个是ST官方根据自己的EVK开发板编写的,和正点原子STM32MP157开发板上的SDMMC3引脚一致,所以不需要修改

sdmmc3控制器节点信息

打开stm32mp151.dtsi文件,找到名为“sdmmc3”的节点,内容如下:

sdmmc3节点

示例代码53.1.3.2中的sdmmc3节点不需要修改,这里只是看一下sdmmc3完整节点信息。从第13行可以看出,sdmmc3设备默认是关闭的。

使能sdmmc3节点

打开stm32mp157d-atk.dts文件,用追加代码的方式去使能sdmmc3节点,追加的内容如下所示:

示例代码 53.2.3.3 要追加的 sdmmc3 节点
1  &sdmmc3 {
2      pinctrl-names = "default", "opendrain", "sleep";
3      pinctrl-0 = <&sdmmc3_b4_pins_a>;
4      pinctrl-1 = <&sdmmc3_b4_od_pins_a>;
5      pinctrl-2 = <&sdmmc3_b4_sleep_pins_a>;
6      non-removable;
7      st,neg-edge;
8      bus-width = <4>;
9      vmmc-supply = <&v3v3>;
10     status = "okay";
11     keep-power-in-suspend;
12 };

示例代码53.2.3.3给sdmmc3节点追加了pinctrl配置和使能了sdmmc3。

重点来了,这里是正点原子编写linux驱动开发教程时候的一个坑。

大家都知道STM32MP1有三个SDMMC接口 , 它们的物理地址分别为:0x58005000-0x58005FFF、0x58007000-0x58007FFF和0x48004000-0x480043FF。从它们的物理地址可以知道,它们的初始化顺序是根据物理地址:SDMMC3→SDMMC1→SDMMC2。假如三个SDMMC接口都使能,那么在Linux里所对应的操作文件为:/dev/mmcblk0(SDMMC3)、/dev/mmcblk1(SDMMC1)和/dev/mmcblk2(SDMMC2)。要注意,出厂系统uboot启动linux的时候,启动EMMC上的文件系统使用的是mmcblk2。但是在本教程前面讲解系统移植的时候说过挂载EMMC里面文件系统的时候使用mmcblk1,那是因为那个时候还没有使能SDMMC3这个接口,所以mmcblk1就是EMMC。

编译WIFI驱动

执行“make menuconfig”命令,打开Linux内核配置界面,然后按照如下路径选择将rtl8723ds和rtl8188eus驱动编译成模块。

rtl8723ds驱动配置

配置路径如下:

-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> Wireless LAN (WLAN [=y])
-> Realtek devices (WLAN_VENDOR_REALTEK [=y])
-> Realtek 8723D SDIO or SPI WiFi //编译为模块

配置完如下图所示:

把rtl8723ds配置成模块

rtl8188cus驱动配置

配置路径如下:

-> Device Drivers
-> Staging drivers (STAGING [=y])
-> Realtek RTL8188EU Wireless LAN NIC driver

配置完如下图所示:

把rtl8188eus配置成模块

已经把两种WIFI都配置成模块,接着就用以下命令去编译成模块:

make dtbs //重新编译设备树
make modules -j12 //编译驱动模块

在本章节里配置了三处为模块,分别是:IEEE 802.11、rtl8723ds和rtl8188eus。它们所对应
的模块名为:cfg8011.ko、8723ds.ko和r8188eu.ko。

编译完成后在所对应的目录下生成模块文件。比如:rtl8188eus WIFI驱动源码在linux源码下drivers/staging/rtl8188eu/目录里,所以rtl8188eus 的模块文件就在此目录下。

在内核的源码目录下,把三个模块拷贝到开发板nfs根目录下,拷贝命令如下:

sudo cp drivers/staging/rtl8188eu/r8188eu.ko ~/linux/nfs/rootfs/lib/modules/5.4.31/
sudo cp net/wireless/cfg80211.ko ~/linux/nfs/rootfs/lib/modules/5.4.31/
sudo cp drivers/net/wireless/realtek/rtl8723ds/8723ds.ko ~/linux/nfs/rootfs/lib/modules/5.4.31/

因为重新配置过Linux内核和设备树,因此也需要使用新的uImage启动和设备树,将新编译出来的uImage镜像文件和stm32mp157d-atk.dtb拷贝到U
Ubuntu中的tftpboot目录下。

驱动加载测试

固件拷贝

有些模块是需要固件配合使用的,比如cfg80211.ko驱动模块要读取/lib/firmware/regulatory.db文件。需要用到的固件如下图所示:

固件

regulatory.db固件和regulatory.db.p7s固件都是cfg80211.ko模块需要加载的。rtl8188wufw.bin固件是r8188.ko模块需要加载的

在开发板根文件系统中创建存放固件的文件夹,这里创建“lib/firmware/rtlwifi”目录来存放固件,nfs挂载的文件系统就直接在Ubuntu系统下运行以下命令:

sudo mkdir ~/linux/nfs/rootfs/lib/firmware/rtlwifi -p

把regulatory.db和regulatory.db.p7s固件文件拷贝到刚刚创建的firmware目录下,把rtl8188wufw.bin固件拷贝rtlwifi目录下。拷贝完结果如下所示:

拷贝固件后结果

RTL8723 SDIO WIFI驱动测试

重启开发板以后,首先测试一下板载的SDIO WIFI。进入到目录/lib/modules/5.4.31中,运行以下命令进行加载8723ds.ko这个驱动模块:

depmod //第一次加载驱动的时候需要运行此命令
modprobe cfg80211.ko //先加载 cfg80211.ko,IEEE 协议
modprobe 8723ds.ko //RTL8723DS 模块加载 8723ds.ko 模块

如果驱动加载成功的话如图所示:

RTL8723DS驱动加载成功

在加载cfg80211.ko模块时,如果没有固件就会报下图警告,还是可以使用的:

加载cfg80211.ko模块报警

输入“ifconfig -a”命令,查看wlanX(X=0….n)网卡是否存在,一般都是wlan0,除非板子上有多个WIFI模块在工作,结果如下图所示:

当前开发板所有网卡

从上图中可以看出,当前开发板有一个叫做“wlan0”的网卡,这个就是RTL8723DS对应的网卡。

注意!后面重启开发板的话会自动加载RTL8723驱动,不需要再手动加载!!

RTL8188EUS USB WIFI驱动测试

接着把RTL8188 USB WIFI接到开发板上,运行以下命令进行加载:

depmod
modprobe r8188eu.ko

如果驱动加载成功的话如下图所示:

RTL8188EUS驱动加载成功

从上图可以看出,RTL8188EUS USB WIFI驱动加载成功,同样使用“ifconfig -a”命令查看一下是否有wlanX(X=0…n)网卡存在,如果有的话就说明RTL8188 USB WIFI驱动工作正常。

同样的,以后重启开发板的话会自动加载RTL8188驱动,不需要我们再手动加载!!

不管是RTL8188 USB WIFI还是RTL8723 SDIO WIFI,驱动测试都工作正常,但是WIFI要想联网,需要移植一些其他第三方组件,否则无法连接路由器

WIFI联网测试

buildroot WIFI工具配置

首先要给文件系统添加一些操作WIFI的工具。进入buildroot源码目录里,接着运行“make
menuconfig”进入图形配置界面,配置如下:

→ Target packages
→ Networking applications
→ [*] wireless tools //选中
→[*] Install shared library //选中
→ [*] wpa_supplicant //选中
→ [*] Enable nl80211 support //选中
→[*] Enable AP mode //选中
→ [*] Enable Wi-Fi Display //选中
→ [*] Enable mesh networking //选中
→ [*] Enable autoscan //选中
→ [*] Enable EAP //选中
→ [*] Enable HS20 //选中
→ [*] Enable syslog support //选中
→ [*] Enable WPS //选中
→ [*] Enable WPA3 support //选中
→ [*] Install wpa_cli binary //选中
→ [*] Install wpa_client shared library //选中
→ [*] Install wpa_passphrase binary //选中
→ [*] Enable support for the DBus control interface //选中
→ [*] Introspection support //选中

配置完成后如下图所示:

buildroot WIFI工具配置

配置完成后重新编译文件系统,编译完成后,进入output/images目录,运行以下命令把文件系统替换进去:

cd output/images/ //进入到 output/images 目录
sudo tar -axvf rootfs.tar -C /home/zuozhongkai/linux/nfs/rootfs //解压到 nfsroot 目录

上述命令将buildroot中output/images/rootfs.tar这个压缩包解压到/home/zuozhongkai/linux/nfs/rootfs这个目录中,这个目录就是教程中的nfsroot目录,根据自己的实际情况解压到对应的目录文件中。

重启开发板。

WIFI工具测试

先看下iwlist命令的使用的方法,命令如下:

iwlist --help

iwlist使用方法如下图:

iwlist命令使用方法

iwlist命令测试WIFI之前得先让WIFI模块工作起来。这里就以板载的RTL8723 WIFI为例。先加载RTL8723驱动模块8723ds.ko,因为之前使用了depmod命令去分析了模块之间的依赖,所以重启系统会自动加载模块。运行以下命令打开WIFI网卡:

ifconfig wlan0 up

SDIO WIFI已经启动了,现在可以使用iwlist去扫描网络(一定要接天线!!),输入如下命令扫描当前存在的无线网络:

iwlist wlan0 scanning

上述命令就会搜索当前环境下的所有WIFI热点,然后将这些热点的信息全部打印出来,包括MAC地址、ESSID(WIFI名字)、频率、速率,信号质量等等,如下图所示:

扫描到的WIFI信息

上图只是扫描出来的一部分截图,可以看出有两个WIFI热点,一个名为“ZZK”,一个名为“stone”。这两个都是2.4G频段的WIFI,RTL8723只支持2.4G频段WIFI,因此扫描不出来5G频段WIFI,这点要注意一下

接下来使用wpa_supplicant这个工具来连接WIFI热点。简单介绍一下wpa_supplicant命令的使用,这个命令的参数有很多,下面就列出常用的参数:

  • -D:指定设备,有三个设备分别为:nl80211、wext和wired。设备是固定的根据驱动源码决定使用那个设备。
  • -c:指定wpa_supplicant配置文件。
  • -i:指定网口,比如WiFi网口名为wlan0。
  • -B:表示在后台运行。

RTL8723 SDIO WIFI联网测试

确保RTL8723能扫描出要连接的WIFI热点,比如这里连接上图中“ZZK”这个热点。

要连接的WIFI热点扫描到以后就可以连接了,默认情况下,开发板根文件系统/etc目录下会有一个名为“wpa_supplicant.conf”的配置文件,没有的话就自行创建一下。此文件用于配置要连接的WIFI 热点以及对应的密钥,比如要连接到“ZZK”这个热点上,因此wpa_supplicant.conf文件内容如下所示:

示例代码 53.3.3.1 wpa_supplicant.conf 文件内容
1 ctrl_interface=/var/run/wpa_supplicant
2 ctrl_interface_group=0
3 update_config=1
4
5 network={
6     ssid="ZZK"
7     psk="xxxxxxxxxxxxx"
8 }

第6行,ssid是要连接的WIFI热点名字,这里要连接的是“ZZK”这个WIFI热点。

第7行,psk就是要连接的WIFI热点密码,根据自己的实际情况填写即可。

注意,wpa_supplicant.conf文件对于格式要求比较严格,“=”前后一定不能有空格,缩进应该采用空格,否则的话会出现wpa_supplicant.conf文件解析错误!最重要的一点!wpa_supplicant.conf文件内容要自己手动输入,不要偷懒复制粘贴!!!

wpa_supplicant.conf文件编写好以后再在开发板根文件系统下创建一个“/var/run/wpa_supplicant”目录,wpa_supplicant工具要用到此目录!命令如下:

mkdir /var/run/wpa_supplicant -p

一切准备好以后就可以使用wpa_supplicant工具让RTL8723 SDIO WIFI连接到热点上,输入如下命令:

wpa_supplicant -Dnl80211 -c /etc/wpa_supplicant.conf -i wlan0 &

当RTL8723连接上WIFI热点以后会输出如下图所示的信息:

连接成功

从上图可以看出,当RTL8723连接到WIFI热点上以后会输出“wlan0: CTRL-EVENT-CONNECTED”字样。接下来就是最后一步了,设置wlan0的IP地址,这里使用udhcpc命令从路由器申请IP地址,输入如下命令:

udhcpc -i wlan0 //从路由器获取 IP 地址

IP地址获取成功以后会输出如下图所示信息:

wlan0网卡详细信息

可以通过电脑ping一下wlan0的192.168.1.196这个IP地址,如果能ping通就说明RTL8723
SDIO WIFI工作正常
。也可以直接在开发板上使用wlan0来ping一下百度网站,输入如下命令:

ping -I 192.168.1.196 www.baidu.com

-I是指定执行ping操作的网卡IP地址,要使用wlan0去ping百度网站,因此要通过“-I”指定wlan0的IP地址。如果WIFI工作正常的话就可以ping通百度网站,如下图所示:

百度ping成功

至此RTL8723 SDIO WIFI就完全驱动起来了,就可以使用WIFI来进行网络通信了。

RTL8188 USB WIFI联网测试

RTL8188 USB WIFI测试和RTL8723的测试方法基本一致。直接把WIFI接到USB HOST接口上。由于RTL8723默认就会开启,因此RTL8188此时就会是wlan1这个网卡,输入如下命令打开wlan1接口:

ifconfig wlan1 up

RTL8188 USB WIFI同样使用wap_supplicant来完成热点连接工作,还是连接“ZZK”这个热点。可以直接使用之前创建的/etc/wpa_supplicant.conf文件,输入以下命令来完成WIFI热点连接:

wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan1 &

注意:这里的设备指定为“wext”,设备跟驱动源码有关。

当RTL8188连接上WIFI热点以后会输出如下图所示的信息:

RTL8188 USB WIFI连接成功

使用udhcpc命令获取IP地址,命令如下:

udhcpc -i wlan1

IP地址获取过程如下图所示:

udhcpc获取IP地址过程

从上图可以看出,wlan1的IP地址为192.168.1.107。可以使用“ifconfig wlan1”查看一下wlan1网卡的详细信息。同样的,可以通过电脑ping一下192.168.1.107测试WIFI是否工作正常,或者在开发板上使用wlan0网卡ping一下百度网址来测试一下WIFI工作是否正常,输入如下命令:

ping -I 192.168.1.107 www.baidu.com

如果ping成功的话结果如下图所示:

ping百度测试成功

至此,如何在STM32MP1开发板上使用WIFI就全部讲解完了,包括USB WIFI和SDIO WIFI。其实不管是在STM32MP1上,还是在其他的SoC上,USB WIFI和SDIO WIFI的驱动都是类似的,可以参考本章教程讲RTL8188、RTL8723这两款WIFI的驱动移植到芯片或者开发板上

总结

WIFI的驱动是买芯片的时候厂家自带的,所以我们要做的就是把驱动移植到内核然后使能去应用。

针对正点原子用的RTL8723DS WIFI,是SDIO接口的,需要把驱动的代码移植到drivers/net/wireless/realtek目录下,然后在drivers/ent/wireless/realtek目录中的Kconfig修改添加刚才rtl8723ds目录下的Kconfig,然后在Makefile中添加rtl8723ds/。

之后需要进入Linux内核图形化配置界面配置WIFI设备和IEEE 802.11使能编译成模块,使能STAGING配置。之后编译WIFI驱动,把WIFI编译成模块。

然后需要在stm32mp157d-atk.dts之中添加代码来使能sdmmc3节点。

之后还需要把所需固件拷贝到根文件系统中才能加载WIFI驱动。

联网测试需要先在buildroot使能配置相关的WIFI测试工具,然后通过在/etc/wpa_supplicant.conf之中添加信息来完成连接WIFI,通过wpa_supplicant没命令来完成连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1175290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot前后端时间类型传输

springboot前后端时间类型传输 前言1.java使用时间类型java.util.Date2.java使用localDateTime 前言 springboot前后端分离项目总是需要进行时间数据类型的接受和转换,针对打代码过程中不同的类型转化做个总结 1.java使用时间类型java.util.Date springboot的项目中使用了new …

基于前馈神经网络完成鸢尾花分类

目录 1 小批量梯度下降法 1.0 展开聊一聊~ 1.1 数据分组 1.2 用DataLoader进行封装 1.3 模型构建 1.4 完善Runner类 1.5 模型训练 1.6 模型评价 1.7 模型预测 思考 总结 参考文献 首先基础知识铺垫~ 继续使用第三章中的鸢尾花分类任务&#xff0c;将Softm…

OCS2工具箱

实时系统优化控制工具箱 参考视频&#xff1a;ETH 最优控制/MPC 实时求解器 OCS2 使用入门 参考文档&#xff1a;OCS2 求解器入门 选择OCS2 OCS2 是一个 MPC 实时求解器 (SLQ/iLQR)&#xff0c;依赖 Pinocchio 构建机器人动力学模型&#xff0c;采用 RViz 或者 RaiSim 验证 (…

Ansible 自动化运维工具 --- playbook 剧本

文章目录 1. Host inventory ---- 主机清单1.1 简介1.2 inventory文件1.3 Inventory 文件的构成1.3.1 主机与组1.3.2 变量 1.4 inventory 中的常用变量 2. Ansible-playbook剧本2.1 简介2.2 Playbook的结构组成2.3 编写playbook的基本格式与写法2.3.1 基本格式2.3.2 语句的横向…

C语言打印出九九乘法表

#include<stdio.h> int main() {int i,j;for(i1;i<9;i){for(j1;j<9;j){printf("%d*%d%d\t",i,j,i*j); //\t制表符}printf("\n"); //\n输出个回车} }

Redis03-过期策略和淘汰策略

目录 Redis数据过期策略 Redis数据淘汰策略 Redis数据过期策略 Redis使用一种基于过期策略来处理键的过期和自动失效。这种策略可以确保不再需要的数据被自动删除&#xff0c;以释放内存并避免数据过期后仍然在缓存中存留。 Redis的过期删除策略主要有两种&#xff1a; 惰性…

【MySQL数据库】 四

本文主要介绍了mysql数据库的几种常见的约束. 一.数据库约束 我们希望存储的数据是靠谱的,mysql提供一些机制来辅助我们自动的依赖程序对数据进行检查 . 这类查数据的机制,就是约束 一旦约束好了,后续在进行增 删 改的时候,mysql就会自动的对修改的数据做出检查,如果不符合…

并发编程: 2. 线程管控

给定一个线程&#xff0c;只要令std::thread对象与之关联&#xff0c;就能管控该线程的几乎每个细节。 2.1 线程的基本管控 2.1.1 发起线程 线程通过构建std::thread对象而启动&#xff0c;该对象指明线程要运行的任务&#xff08;函数&#xff09;。简单的任务&#xff0c;…

【大数据】NiFi 中的重要术语

NiFi 中的重要术语 1.Flow Controller2.Processor3.Connection4.Controller Service5.Process Group6.FlowFile 那些一个个黑匣子称为 Processor&#xff0c;它们通过称为 Connection 的队列交换名为 FlowFile 的信息块。最后&#xff0c;FlowFile Controller 负责管理这些组件…

隐私安全|隐私安全已从国家法律法规转向商业企业应用,如何理解以及落地建设,相信大家正在经历隐私安全的困扰

网络空间的隐私安全主要是指网络隐私权不受侵犯&#xff0c;网络隐私权是指自然人在网上享有的&#xff0c;与公共利益无关的个人活动领域与个人信息秘密依法受到保护&#xff0c;不被他人非法侵扰&#xff0c;知悉收集&#xff0c;利用和公开的一种人格权&#xff0c;也包括第…

基于鹰栖息算法的无人机航迹规划-附代码

基于鹰栖息算法的无人机航迹规划 文章目录 基于鹰栖息算法的无人机航迹规划1.鹰栖息搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鹰栖息算法来优化无人机航迹规划。 1.鹰栖息…

ActiveMq学习⑧__ActiveMQ的消息持久化机制

ActiveMQ的消息存储和持久化 MQ的高可用 事务持久签收可持久化 &#xff08;类似于与mq消息的同步机制&#xff09; 为了避免意外宕机以后丢失信息&#xff0c;需要做到重启后可以恢复消息队列&#xff0c;消息系统一半都会采用持久化机制。 ActiveMQ的消息持久化机制 Act…

canvas实现刮奖功能

canvas刮奖原理很简单&#xff0c;就是在刮奖区添加两个canvas&#xff0c;第一个canvas用于显示刮开后显示的内容&#xff0c;可以是一张图片或一个字符串&#xff0c;第二个canvas用于显示涂层&#xff0c;可以用一张图片或用纯色填充&#xff0c;第二个canvas覆盖在第一个ca…

逆向学习记录(5)刷机

首要前提&#xff1a;手机刷机必须OEM解锁&#xff08;BL解锁&#xff09;&#xff0c;否则不能刷机&#xff01; 1、根据手机机型下载手机系统包&#xff0c;首次登陆网址需要同意协议。然后在右侧选机型&#xff0c;中间就出来各种适合本机型的系统。 下载网址 https://dev…

47基于matlab的水印提取,将水印和载体进行图像融合

基于matlab的水印提取&#xff0c;将水印和载体进行图像融合&#xff0c;成为一体&#xff0c;可对合成图像进行加噪处理&#xff0c;剪切处理&#xff0c;小波压缩处理&#xff0c;旋转处理等操作&#xff0c;最后对合成图像实现水印提取&#xff0c;程序已调通&#xff0c;可…

【AI好好玩02】利用Lama Cleaner本地实现AIGC试玩:擦除对象、替换对象、更换风格等等

目录 一、安装二、擦除功能1. LaMa模型实操实例一&#xff1a;去除路人实操实例二&#xff1a;去水印实操实例三&#xff1a;老照片修复 2. LDM模型3. ZITS模型4. MAT模型5. FcF模型6. Manga模型 三、替换对象功能1. sd1.52. sd23. anything44. realisticVision1.45. 四个模型的…

Tomcat安装配置教程

目录 1、安装tomcat1.1、查看JDK版本1.2、 匹配对应的JDK版本1.3、 下载Tomcat1.3.1、 安装包版&#xff08;推荐&#xff0c;不用配环境&#xff09;1.3.2、 压缩包版 2、 运行Tomcat3、 不能运行问题 1、安装tomcat 1.1、查看JDK版本 由于不同版本tomcat对于jdk的版本有要求…

Mac 下安装golang环境

一、下载安装包 安装包下载地址 下载完成&#xff0c;直接继续----->下一步到结束即可安装成功&#xff1b; 安装成功之后&#xff0c;验证一下&#xff1b; go version二、配置环境变量 终端输入vim ~/.zshrc进入配置文件&#xff0c;输入i进行编辑 打开的不管是空文本…

redis教程 二 redis客户端Jedis使用

文章目录 Redis的Java客户端-JedisJedis快速入门创建工程&#xff1a;引入依赖&#xff1a;建立连接测试&#xff1a;释放资源Jedis连接池创建Jedis的连接池改造原始代码 Redis的Java客户端-SpringDataRedis快速入门导入pom坐标配置文件测试代码 数据序列化器StringRedisTempla…

“第六十一天”

这三个也算一类的&#xff0c;减和加的处理差不多&#xff0c;不过这个题多了限制是被减数大于减数&#xff0c;要是想再完整一点&#xff0c;可以把小于的情况也考虑进去&#xff0c;不过这个我是如果被减数小于减数的话&#xff0c;我就用减数加被减数&#xff0c;然后最后打…