StudyNotes

1.1 整体数据流动过程

image-20220208190232963

1.2 WIFI网卡

image-20220208195925967

image-20220208200103077

image-20220208200438113

image-20220208200550028

image-20220208200718155

image-20220208200828494

image-20220208202924342

image-20220208203053283

image-20220208203201223

image-20220208204111759

1.2.1 iw工具

image-20220209095707258

image-20220209100329499

image-20220209100453455

在小公司或者在家庭里面,直接使用 AP 就行,直接在里面预先设置好密码,如果外部设备连接到 AP 上,密码对了就会连接上。

1.2.2 wpa工具

image-20220209100724855

image-20220209100912362

修改Makefile,因为需要交叉编译,所以需要修改里面的

CC= arm-linux-gcc

image-20220209101128022

image-20220209101214178

发现需要 openssl 库的支持,所以还需要找到这个依赖库进行编译,然后将编译出来的 头文件、库文件 全部拷贝到交叉编译工具链中。

image-20220209101452231

拿到一个新的库,先ls看看有没有说明readme文件。

image-20220209101724028

image-20220209101939363

image-20220209102132221

shared 是指定生成动态库

–prefix=DIR是指定之后 make install 的时候安装到哪个目录下面

// 编译之前的配置,就是为了自动生成一个 Makefile
// no-asm 是不使用里面的汇编代码进行优化,这里使用汇编代码就会出错提示给 X86 使用的
./config shared no-asm --prefix=$PWD/tmp
    
// 因为不能直接指定交叉编译器,所以上面的指令生成的 Makefile中,需要手动修改里面的编译指令
CC= arm-linux-gcc
AR= arm-linux-ar $(ARFLAGS) r
RANLIB= arm-linux-ranlib
NM= arm-linux-nm
MAKEDEPPROG= arm-linux-gcc

image-20220209102709962

image-20220209102912262

image-20220209102954156

image-20220209103816786

wpa的操作,好像都是修改配置文件,然后使用 supplicant 命令来操作

image-20220209104200450

image-20220209104453730

上面的文件 .conf 就是下面这个样子

image-20220209104434677

然后查看状态

image-20220209104609865

image-20220209104653080

image-20220209104722822

image-20220209104812664

image-20220209105213358

不同的加密方式,需要拷贝不同的配置文件出来,然后修改里面的 热点名称和密码。

image-20220209105419562

image-20220209105549824

image-20220209105711422

如果不借助 iw,wpa 这些应用工具,我们连接配置好WIFI网卡之后,也只能查询或者设置一下 IP地址,但是却还不能上网,因为我们的 WIFI还没有连接到热点或者网络上面。所以借助 iw 和 wpa 这些工具可以很方便的连接到外部网络上。

image-20220209110442775

DNS的配置

image-20220209110834036

image-20220209111139701

1.2.3 dhcp 自动获得IP

之前通过 iw,wpa 工具连接到热点之后,我们都是通过手工的方式来设置 IP,我们能不能设置自动获得 IP呢?

可以的,就是通过移植一个 dhcp 库来实现自动获得 IP。

image-20220209111428182

image-20220209111552107

image-20220209111932147

image-20220209111959148

image-20220209112106136

image-20220209112253429

image-20220209113541845

image-20220209113741990

image-20220209113814930

image-20220209113902073

image-20220209114016391

一连接上 WIFI AP ,就自动指定 dhclient

image-20220209115118893

image-20220209114327204

image-20220209114507244

image-20220209114823253

image-20220209114953546

一连接上 WIFI AP ,就自动指定 dhclient

image-20220209115406873

image-20220209115509941

image-20220209120243509

image-20220209120349953

1.2.4 疑问

image-20220209120709841

1.2.5 使用WIFI网卡_AP模式

image-20220209120941702

我们手机一般工作于 STA 模式,能不能将开发板作为 AP模式,让手机连接开发板的热点呢?

image-20220209130127514

image-20220209130321928

image-20220209130427619

image-20220209130532601

image-20220209130635611

image-20220209131117958

image-20220209131411387

image-20220209131507427

image-20220209131619293

image-20220209131920299

image-20220209132248789

image-20220209132849214

下面箭头指着的两个是配置好的文件系统,打包了,到时候直接放到一个 nfs中,替换原来的文件系统就可以挂载这些文件系统了。

image-20220209140855492

1.2.6 使用WIFI网卡_仿手机写wifi操作程序

功能如下:

image-20220209141317210

image-20220209141531262

输入 wpa_cli ,直接回车的话,进入的是一个交互模式

image-20220209141728501

然后在里面可以运行各种命令

image-20220209141849445

image-20220209141903371

image-20220209142003507

image-20220209142139146

image-20220209142533165

image-20220209142520513

image-20220209142622731

核心:wpa_cli 通过 wpa_request函数 向 wpa_supplicant 发出命令,并得到结果

image-20220209143216237

函数(指令),可以看源码的 readme ,里面有提到

image-20220209143250795

image-20220209143505711

image-20220209143618106

image-20220209144122843

扫描出来的 wifi 热点的信息,在 while 循环里面定时打印出来,可以实现定时刷新 wifi热点信息的功能。

image-20220209144310227

image-20220209144447388

image-20220209145009172

image-20220209144643395

image-20220209144813923

image-20220209145344253

image-20220209151010385

image-20220209150252672

配凑字符串

注意点:

image-20220209151337114

image-20220209151716697

image-20220209152322108

image-20220209154410210

如果我们成功连接了某个wifi之后,这个 wifi号和密码就会保存到一个配置文件中。

image-20220209154943182

image-20220209155148306

这就完成了 模拟手机wifi的功能

1.3 3G上网卡

image-20220209155640821

1.3.1 3G模块选型

image-20220209155742821

image-20220209160308866

说明:

image-20220209160610288

image-20220209160902304

不知道这些含义是什么,可以全部 ppp 都选上。

之后我们得到的是 ttyUSB是吧,所以还需要把USB串口给配置了。

image-20220209161215232

image-20220209161359796

image-20220209161947872

image-20220209162119475

1.3.2 超好的参考文章

把下面的文章看完之后,对3G USB Modem就会了如指掌。

参考文章: 嵌入式Linux下3G USB Modem的使用 - 空之轨迹~约修亚 - 博客频道 - CSDN.NET.htm http://blog.csdn.net/ling1874/article/details/8148822 http://wenku.baidu.com/link?url=HLRk3U9Jbr2Zx35e5knamYeUKYs14bhV3F9-hzC6rWMwdxCu2gTtAR89VBAdpoAF4UC9LmxCPxGLbjAu_XoSXuy065ZbbvfwtWm9vLy5UWe

配置文件最全: HI3515海思开发板移植3G模块笔记 - 倔强的晓奇 - 博客频道 - CSDN.NET.htm http://blog.csdn.net/alangdangjia/article/details/9413009

好文章:ppp及usb_modeswitch等工具移植说明_百度文库.htm http://wenku.baidu.com/link?url=Y7gsW5izmXwzur3VS3hGYWV_k_glZwzmu7Prdh_F69LuFxcOGT1LwhtsmXA3TVhR6F0l8_ozspcQvO08nlHex2yss0EW7wWIzysw9cZn-wu

1.3.3 交叉编译 usb_modeswitch

image-20220209162729950

image-20220209163206519

image-20220209164041956

image-20220209164103177

image-20220209164140688

image-20220209164326948

image-20220209164452821

1.3.4 测试步骤

使用 lsusb 可以查看到 ID值为:12d11505

image-20220209165416804

找到之后,就把里面对应的配置信息拷贝出来,

image-20220209165934473

把配置文件另存为 eq10b.cfg

image-20220209170019338

image-20220209170136328

切换完成之后,其 ID就会发生变化

image-20220209170224941

华为的这个,有4个 USB串口

image-20220209170346217

image-20220209170647318

image-20220209171208682

1.3.5 3G上网卡自动模式切换

对于移动这款比较奇怪的上网卡,就不能实现自动的模式切换。

image-20220210144505301

image-20220210144627625

参考ubuntu上对3G上网卡的自动识别过程来学习

image-20220210145405877

PC使用的是 udev

image-20220210145456916

它并不使用配置文件,而是使用 -f 配置信息

image-20220210150021794

image-20220210150322261

image-20220210151458996

image-20220210151559279

image-20220210151655903

image-20220210151733238

然后我们可以仿照lsusb的源码来写这个功能

image-20220210152605020

image-20220210153013160

image-20220210153237060

image-20220210153452508

前面实现了热插拔自动切换3G上网卡的模式到modem,然后出现了 ttyUSB*

下面还要确定是哪个 ttyUSB* 作为拨号端口

1.4 mjpg-streamer_移植与效果演示

1.4.1 总体代码框图

四种接线方法

image-20220210155642016

image-20220210155829533

USB_Hub 的作用是可以将2440上的一个USB接口扩展为多个USB接口来使用。

这里开发板竟然是工作在 AP模式???这怎么实现远程传输呢?

image-20220210160309938

image-20220210160819185

mjpg-streamer分析源码可以知道其是通过 ioctl 的方式来获取摄像头数据的,而我们写的 CMOS摄像头的驱动中,只支持 read,write 两种方式的读取摄像头数据。

所以想实现这种方式,有两种方法:

image-20220210161003846

1.4.2 移植和演示mjpg-streamer

image-20220210163524226

image-20220210163612259

image-20220210163909307

image-20220210164128558

image-20220210164231177

image-20220210164343237

image-20220210164442571

image-20220210164809937

还有很多 .so 文件

image-20220210165010033

image-20220210165218028

image-20220210165328709

image-20220210165405857

image-20220210165514498

image-20220210165612733

image-20220210165635746

image-20220210165827061

​ 执行上面的指令,mjpg-streamer就运行起来了

image-20220210165844299

image-20220210170110091

image-20220210170124836

1.4.3 mjpg-streamer源码分析

mjpg-streamer是怎么实现采集数据和传输数据两个功能的,将在后面分析这个应用程序的源代码的时候深入了解。

image-20220210170944787

image-20220210171305202

image-20220210171705449

dlopen是打开一个动态链接库

这些输入输出动态链接库是实现了什么功能呢?里面有 .init .run .stop,通过这些函数来实现不同的功能。

image-20220210172027135

output_hppt.so就是使用 socket 编程,来模拟 http协议。

image-20220210173125449

image-20220210173620458

1.4.4 讲解mjpg-streamer 源码分析(上) 主进程

image-20220210173728396

image-20220210175254033

分析 getopt_long_only 的用法(用于解析命令行选项)

image-20220211105556412

mjpg-streamer.c函数的主流程

下面依次分析上面这4个函数

1.4.5 分析 input_init

我们输入的命令行是 "input_uvc.so -f 10 -r 320*240"

则这里我们也可以仿照 mian 函数的参数解析,自己构造好 argc 和 argv[],来实现调用 getopt_long_only

来解析出参数。

input_init 函数实现的功能

1.4.5 分析 input_run

这里面涉及到摄像头的操作,都是采用 V4L2的ioctl来实现的

input_run 函数实现的功能

给仓库buf 分配一段内存空间,分配1帧视频数据那么大

创建一个线程,线程函数是 cam_thread

1.4.6 分析 output_init

output_http.c

output_init 函数实现的功能

output_http.so -w www

1.4.7 分析 output_run

output_http.c

output_run 函数实现的功能

1.4.8 自己写客户端怎么写

image-20220211180406531

image-20220211180448876

image-20220211180553101

image-20220211180657678

image-20220211180730138