0%

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

$ hexo new "My New Post"
$ hexo new post

More info: Writing

Run server

$ hexo server

More info: Server

Generate static files

$ hexo generate

More info: Generating

Deploy to remote sites

$ hexo deploy

More info: Deployment

github 和 git的使用。

注册 github。

安装git。

设置ssh

  • 使用ssh 免密登陆github。 如果不用ssh,使用https,那么每次git push git pull,就需要输入github的账号和密码。 (不过现在github规定不能https提交了)

注意 github https 和 ssh 连接的不同使用。
git@github.com:
https://github.com/

如:
git@github.com:ruozhiertong/phpDemo.git
https://github.com/ruozhiertong/UULP.git

ssh要配置公钥和私钥。 配置之后提交不用密码了。
https要每次都输入github的账号和密码。

本地repository。
远程github repository。

  • 如果只有本地仓库,没有远程,那么需要在远程建立仓库后,将本地和远程关联,再同步。
  • 如果只有远程,没有本地,那么可以直接从远程clone。 或者本地创建后,将本地和远程关联,同步。

  1. 新建本地仓库
  • git init .
  1. 新建远程github仓库。

  2. 本地和远程进行连接

git remote add xxx url
git remote set-upstream-to xxxxxxx
git remote -v

具体信息 也可以查看仓库下的 .git/config.
如:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote “origin”]
url = git@github.com:ruozhiertong/phpDemo.git
fetch = +refs/heads/:refs/remotes/origin/
[branch “master”]
remote = origin
merge = refs/heads/master

git push oringin master //将master分支push到远程 origin 的master分支上。
git push origin HEAD:master //将当前分支push到远程的master分支上。
Push the current branch to the remote ref matching master in the
origin repository. This form is convenient to push the current
branch without thinking about its local name.

git status
git add
git commit -m
git push
git pull

git log
git diff xx xx

如果本地branch和远程不一致,不能直接用git push。
fatal: The upstream branch of your current branch does not match
the name of your current branch. To push to the upstream branch
on the remote, use

git push origin HEAD:main

To push to the branch of the same name on the remote, use

git push origin master

To choose either option permanently, see push.default in ‘git help config’.

其他操作

同一台多账号github。

https://blog.csdn.net/qq_43199318/article/details/103469792
https://blog.csdn.net/littleRpl/article/details/109801707

0.生成两套ssh私钥和公钥。 一般在~/.ssh目录下。
ssh-keygen -t rsa。
1.添加
ssh-add ~/.ssh/id_rsa_github1
ssh-add ~/.ssh/id_rsa_github2
2.a测试
ssh -T git@github.com
ssh -T git@two.github.com
2.b
git clone
git clone git@three.github.com:mswanghang/hello-world-javascript-action.git
3.修改 仓库下 .git/config 文件,将 对应的远程url改到对应的ssh配置。
如:
[remote “origin”]
url = git@two.github.com:fightingcoder2022/haxvps.git
fetch = +refs/heads/:refs/remotes/origin/

[remote “origin”]
url = git@github.com:ruozhiertong/phpDemo.git
fetch = +refs/heads/:refs/remotes/origin/

BIOS, EUFI。

MBR, GPT。 GUID(macos上的分区表)。

grub,LILO。 (bootloader)

系统:一般系统,winpe,老毛桃(基于winpe)。

winpe,老毛桃 等是放在u盘上的系统,选择U盘启动,从而运行winpe系统。 这些系统也有自己的bootloader,比如老毛桃引导程序界面,可以选择启动系统。

ventoy仅仅是引导程序 (bootloader),并没有做成一个系统,可以引导 其他系统镜像的安装 或 其他系统的。 ventoy是基于grub2.

winpe 是将系统安装在了内存上。
所以 ventoy中只要winpe的iso镜像文件就可以启动winpe。 因为启动的时候直接将iso安装在内存上,而不是像其他os的镜像文件要先安装在某个磁盘上再load到内存。
所以winpe很适合放在u盘上,选择u盘启动,启动的时候会安装在内存上。

grub, mac的引导程序, 引导程序 都是bootloader。

  • 虚拟机识别u盘。
  • 虚拟机开机启动项改为u盘。
    因为虚拟机启动项中没有u盘,所以曲线处理。创建一个虚拟硬盘vmdk,映射到u盘,然后添加该虚拟硬盘到虚拟机中,从而实现以U盘为启动。

macos vbox中设置u盘启动。
0.u盘在macos中的名称 /dev/diskXXX。 用diskutil list查看 各磁盘信息。
1.设置/dev/diskxxx的owner。因为后续会报没有权限操作磁盘。 macos下没有disk用户组,所以只能更改disk的owner。 sudo chown。
2.使用macos 自带的 磁盘工具.app, 对u盘进行卸载,不是eject。如果不卸载,那么会导致访问冲突。
3.进入vbox安装路径下,使用其工具,创建vmdk。 cd /Applications/VirtualBox.app/Contents/MacOS, 然后
VBoxManage internalcommands createrawvmdk -filename /Users/rzet/usb.vmdk -rawdisk /dev/disk2
4.打开vbox,某个虚拟机->设置->存储->SATA中添加虚拟硬盘->选择/Users/rzet/usb.vmdk。 确定。 (如果出现虚拟磁盘访问busy,那么可能是u盘被加载了,要进行2的操作)
5.启动虚拟机。按F12,选择启动的磁盘。 进而进入u盘启动。
注意,如果在4阶段发现虚拟磁盘的uuid冲突,可以在 管理->虚拟介质管理 删除相应相应的虚拟磁盘,然后再操作4。

如果已经设置好了,下次再用u盘时,只要执行1后 启动虚拟机就行。

安装系统在u盘上。

  • 1.直接iso文件放在u盘上,启动时直接将iso解压安装在内存上, 如WinPE。这个适合小系统。
  • 2.直接将原生系统安装在u盘上 (用系统文件镜像iso安装(不是直接将iso文件放在u盘上),安装时将系统安装在u盘上),将u盘看成是普通的硬盘,以u盘启动就行了。比如ubuntu安装在u盘上,wintogo安装在u盘上。 这个对u盘读写速度要求高,也要比较大的容量。
  • 3.将系统装在vhdx中,然后将vhdx直接放在u盘上,让引导程序可以读取到这个vhdx就行,进而以vhdx进行启动,从而实现u盘启动系统。(只要引导程序/bootloader 可以读取到vhdx,就可以启动这个虚拟硬盘。能识别到这个虚拟硬盘后,就能进入这个虚拟硬盘中的操作系统。其实也是虚拟机技术。这个虚拟硬盘就像相当于普通的磁盘,里面安装了操作系统。严格意义上也算事虚拟机,只是将全部都放在虚拟硬盘中。其实只要引导程序可以识别虚拟机的虚拟文件,也完全可以直接用物理机来启动u盘上的虚拟机,而不必都要在虚拟机程序中启动虚拟机,目前可以直接在u盘启动的好像就vhdx,对于vmware,vbox的虚拟机可以转换成vhdx,然后再放到硬盘下就可以u盘启动了。 ventoy可以直接识别任何虚拟机的虚拟硬盘,可以直接使用)https://ventoy.net/cn/plugin_vtoyboot.html

wintogo(可以安装win8 win10) 可以用第二种也可以用第三种。 如果要直接安装win10 可以用2 也可以3。 安装其他系统也是可以2或者3,即直接安装或虚拟硬盘形式。 2,3方式的安装对U盘容量,读写速度都有一定的要求。大容量,最好usb3以上。

wintogo 安装的win8 win10 和 正常的win8 win10 安装,优势在与驱动更简单,大小更小等。

vbox 中的虚拟机 和 主机 文件之间复制粘贴。拖拽文件等。
vbox 中的虚拟机 和 主机 进行共享文件夹。 虚拟机中的windows显示为 \VBoxSvr。https://blog.csdn.net/weixin_43321041/article/details/103611942
vbox 中的虚拟机 识别,访问 u盘。
vbox 中的虚拟机 使用串口,usb接口等。
vbox 中的虚拟机 使用u盘启动。
vbox功能很强大,强大到完全可以用虚拟机做物理机的任何事。因为虚拟机也可以用到物理机的物理接口,因此体验也完全和物理机差不多。轻度使用还是没问题的,不用专门跑到其他物理机上去使用windows。

centos minimal安装之后 网络设置 https://blog.csdn.net/yhblog/article/details/83112449

ventoy 折腾:
0.u盘制作ventoy。
1.u盘放入winpe的iso文件。
2.u盘放入vhd / vdi.vtoy 文件。
3.启动, F12, 选择u盘启动。

BIOS中 选择 机器的启动位置(某一个硬盘,某一个u盘,某一个光盘,某一个软驱,某一个网络位置)。-> 多启动位置的选择。
bootloader(如grub2等) 选择 操作系统的启动 / 选择分区。 选择的是 前面BIOS选中的硬盘中的某一个分区(该分区的操作系统)。 -> 多系统的选择/分区的选择。

开机启动: 选择某个硬盘 [bios],选择该硬盘某个分区(分区中的os) [bootloader]。
有两个设置界面,bios设置,bootloader设置。

测试

  • 手机安装termux
  • termux 中安装git , ssh. 克隆github项目
  • 使用markor 编辑md.

https://www.bilibili.com/video/av214888486/

小讯 随身wifi:
板子UFI1003_MB_V02
电信的esim 8986112126303924835H
运行 android 4
高通410 MSM8916
RAM512M+EMMC4G (亏了。有的是8G)
切卡密码 UFIadmin1234 (sim1是物理sim,sim2是esim)
移动电信联通4G卡。

查看硬件信息:1.直接看硬件。 2.使用软件(adb shell df du, Miko 等)。
https://www.jianshu.com/p/811741a2ad97

刷机。
工具:随身wifi助手。

玩法:1.安装openwrt。 2.安装debian。 3.直接在android上root 安装magisk。

中沃:
https://blog.csdn.net/m0_55216258/article/details/127052513
https://www.bilibili.com/read/cv21471637/
https://blog.csdn.net/qq_31539875/article/details/128200941
中兴微(中兴的全资子公司)的芯片。 MF782D OM+HS FW60
网络锁:az952#。 解锁后才能用实体sim。
解锁后,如果有插实体sim卡,用实体。没有实体,就会用esim。
移动联通电信4G卡。
后台有两个密码,一般用户的密码, 超级用户密码。

测试 移动卡 电信卡 的速率。
中兴微:电信 10~20 Mbps 移动5~12 Mbps
高通410:电信 10~20 Mbps 移动5~12 Mbps。 但是稳定性不足。
单独手机插卡测试4G:理论下行100~150Mbps,上行50Mbps。移动 电信20~60Mbps
单独手机插卡测试5G:理论下行数十Gbps, 上行。 移动80~120Mbps 电信 100~300Mbps
https://blog.csdn.net/mao834099514/article/details/79456881

4G网络的理论速率取决于使用的制式和网络配置,但通常可以达到以下速率:
LTE Cat4:下行速率最高可达150Mbps,上行速率最高可达50Mbps。
LTE Cat6:下行速率最高可达300Mbps,上行速率最高可达50Mbps。
LTE Cat9:下行速率最高可达450Mbps,上行速率最高可达50Mbps。
LTE Cat12:下行速率最高可达600Mbps,上行速率最高可达100Mbps。
LTE Cat16:下行速率最高可达1Gbps,上行速率最高可达150Mbps。
在中国,4G网络的实际速率受到多种因素的影响,例如地理位置、网络拥塞、设备性能、网络运营商等。不同地区、不同运营商的网络速率也会有所差异。根据第三方机构的测试数据和统计,目前中国4G网络的平均下载速率大约在30Mbps-40Mbps之间,上传速率平均在10Mbps左右。不过需要注意的是,实际速率还会受到网络运营商的限速和网络优化等因素的影响。

测试, 刷机前 ,刷机后的速率对比。

随身Wifi助手。 中兴微工具箱v1.3。
0.打开adb。
1.刷入全功能后台。
2.解除商家后台限制,比如禁止向云服务器传送数据,禁用远程定位,禁用ESIN云服务等等。

(有说解除后台限制后,速率会变快。 感觉不是很明显。)

http://remowireless.com/news/shownews.php?id=24&lang=cn
https://www.sohu.com/a/550910816_121192896

随身wifi :1.(将4G转wifi) MiFi(Mobile WIFI), uFi(usb wifi), CPE. (随身WIFI还具备两大功能:1、WIFI发射/ap。2、WIFI接收/sta。(实际上是无线网卡起的作用,当然速率不太行))
2.(转宽带信号为wifi,有modem,不就是无线路由器嘛)

无线网卡: pci接口的无线网卡, usb接口的无线网卡。

随身wifi 用法:1.常规用法,转换4G信号为wifi。 2.充当作为无线网卡。(2a.ufi连接其他wifi,然后无wifi的电脑插入ufi进行上网,通过usb进行联网. 2b.桥接有网的wifi,然后释放自己的wifi(ap+sta)。)

电脑连接随身Wi-Fi:1.使用电脑自身的wifi。 2.使用usb(这样无wifi的电脑也能通过usb连上ufi的网络)(理论上可以,充当无线网卡).

TODO
随身wifi刷机。

常见的无线投屏

隔空/无线投屏原理: wifi。

  • 方式1.设备在同一局域网下。 这种是 CS 模型。一个服务端,一个客户端。 优点简单,可以使用多种已有协议如http等。比如很多的投屏app。电脑上安装app,手机上安装app.
    再比如苹果的airplay两个设备也是要同一局域网下的,但并不是p2p原理,还是CS。两个设备的数据要经过第三方的路由器中转,不是直接p2p。
  • 方式2.两设备直接wifi direct,p2p传输,不需要路由器的参与。 (wifi direct 技术)。 真正的p2p,点对点,不需要第三方参与。实际上是两个wifi自己之间形成的局域网。两个设备的数据直接p2p。比如Miracast,airdrop。

投屏协议标准(GoogleCast,chrome cast,AirPlay,Miracast,DLNA)

  • 苹果:airplay协议。
  • android: google cast, Miracast, DLNA。
    主流的是Airplay, Miracast, DLNA。

Miracast是完全支持WifiDirect。设备可以直接p2p,不用经过第三方如路由器形成的局域网。 如果在同一个局域网也可以,连接更稳定。
android系统自带的投屏是Miracast。

投屏:有线投屏(复制模式/镜像 和 扩展模式)+无线投屏(流模式/推送模式,镜像模式,扩展模式)。

无线投屏原理:
https://www.zhihu.com/question/287361675
https://www.voycn.com/article/toupingjishuyuanli
https://github.com/xfangfang/Macast/wiki/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B

无线投屏:
投屏设备, 接收器设备。

两种模式:

  • 推送模式/流模式/投屏模式/媒体文件投屏 。 视频,音乐,图像等媒体文件的投屏。
    DLNA,airplay。(主要用于投屏视频和音乐,投屏之后手机可以关闭或聊微信,电视不会停止播放。玩手机看电视两不误。最常见是视频软件里的tv按钮。)
  • 同屏模式/镜像模式/录屏模式/屏幕镜像投屏。
    Miracast, airplay。

DLNA
全平台
条件:
1.投屏设备和接收设备要开启wifi,并且连接到同一个局域网。数据发送的要经过路由器中转的。
2.wifi网络能连接互联网。(否则接收端接收投屏 后无法从服务器获取视频流播放)
很多视频app中的投屏用的就是DLNA。
(在接收端接收发送端的视频信息之后,两个设备就没有什么关系了,各自独立了)

Miracast
pc linux 和 android
条件:
1.接收端和发送端都支持miracast。投屏设备和接收设备要开启wifi。
是的,只要设备wifi就行了,没有必须要求蓝牙,或者 连接第三方的路由器,也不要求能连上互联网。
直接进行wifi direct进行p2p连接。
android手机系统的的投屏 基本都是Miracast。 视频app中的投屏基本是 DLNA。

Miracast 只要有wifi就可以,不需要三方的路由器,也不需要蓝牙, 两个设备直接p2p连接。
走的是wifi p2p自己形成的局域网。 就算设备连接在同一个wifi网络下,走的还是设备间的wifip2p形成的局域网(也有自己的IP地址)。 数据不需要经过路由器中转。
走的是wifi网卡的p2p0接口。 Miracast并不走wlan0,即并不是走wifi的局域网,是走p2p的局域网。

airplay:
macos和iOS。
条件:
1.接收端和发送端连接同一个wifi,在同一个局域网。 不要求一定要连接互联网。
接收端 客户端组成cs模式。
maos、iOS不支持Miracast。

测试下 在同一个局域网下,miracast 走的是那个网络,是局域网,还是自己的p2p网络。 不管在什么网络下,miracast走的都是p2p0的接口的p2p网络。而airplay dlan走的是wlan0接口的局域网。
p2p网络可以直接通过两个设备wifi的p2p0接口直接发起连接,不需要经过第三方(比如路由器),可以点对点的发起连接。
这个特点决定了miracast不需要两个设备在同一个wifi局域网中,并不是CS模式,是p2p模式。 而airplay dlan需要在同一个wifi局域网中,是一种典型的CS模式。 投屏之前的关键是要找到设备,miracast是p2p直接找设备,不需要经过第三方的路由方式来查找设备,数据之间两者之间传输,不经过路由器。AirPlay dlan是局域网中发现查找设备(CS模式),是要经过路由器来查找局域网中的设备,查找、发送数据等数据啥的要经过路由器的路由、转发。

==

苹果的 隔空投送/airdrop 原理:
前提:要蓝牙和wifi。
苹果的“隔空投送”是通过蓝牙+Wi-Fi Direct实现的(直接两个wifi之间p2p,并不需要两个设备都在同一个局域网。两个wifi之间p2p自己形成局域网)。通过蓝牙识别,确定接收之后之后两台设备之间建立点对点的Wi-Fi(WLAN)链接。 利用蓝牙建立了wifi的p2p连接,然后使用wifi传送数据。
https://zhuanlan.zhihu.com/p/566055452
隔空投送的原理简单的概括起来就是:“蓝牙握手、WiFi传输”。首先,Apple设备间的蓝牙通过搜索相互配对,然后利用WiFi进行传输。整个过程当中并不需要网络参与,即使是设备处于网络离线状态,依旧可以通过隔空投送进行文件传输。

条件:打开蓝牙和wifi。

弱智儿童
苹果airdrop的工作原理
AirDrop 是苹果公司推出的一种文件传输技术,可以在苹果设备(如 iPhone、iPad 和 Mac)之间快速方便地进行文件传输。

AirDrop 使用 Wi-Fi 和 Bluetooth 技术进行文件传输。在使用 AirDrop 时,发送设备会向周围的设备广播该文件,而接收设备可以接收并保存该文件。AirDrop 在传输过程中使用加密技术保证数据的安全性。

总的来说,AirDrop 的工作原理是通过在两个苹果设备之间使用 Wi-Fi 和 Bluetooth 进行文件传输,提供了一种简便快捷的文件传输方式。在使用 AirDrop 时,发送和接收设备必须处于同一个本地网络中,以便进行通信。

弱智儿童
airdrop传输是靠蓝牙还是Wi-Fi
AirDrop 使用 Wi-Fi 和 Bluetooth 技术进行文件传输。在使用 AirDrop 时,发送设备会向周围的设备广播该文件,而接收设备可以通过搜索周围的设备并找到该文件进行接收。

实际上,AirDrop 会先使用 Bluetooth 发现周围的设备,然后使用 Wi-Fi 进行文件传输。在发送设备和接收设备靠近时,AirDrop 会使用 Bluetooth 技术识别设备;在设备之间的距离较远时,AirDrop 会使用 Wi-Fi 技术进行文件传输。

因此,AirDrop 使用两种技术:Wi-Fi 和 Bluetooth,实现了苹果设备之间的文件传输。

弱智儿童
airdrop wifi之间是如何传送数据的
AirDrop 使用 Wi-Fi Direct 技术来在两个苹果设备之间进行文件传输。Wi-Fi Direct 是一种无线技术,允许两个设备直接连接而不需要通过网络设备或路由器。

在使用 AirDrop 时,发送设备会创建一个 Wi-Fi Direct 会话,并向周围的设备广播该文件。接收设备可以搜索周围的设备,并通过 Wi-Fi Direct 连接到发送设备。一旦连接成功,接收设备就可以开始接收文件。

与传统的 Wi-Fi 连接不同,Wi-Fi Direct 连接不需要通过网络设备或路由器进行转发,因此它可以提供更快的传输速度和更好的文件传输体验。同时,Wi-Fi Direct 连接还具有更强的安全性,因为它使用了加密技术保护文件在传输过程中的安全。

弱智儿童
airdrop之间是使用蓝牙传输数据吗
AirDrop 在两个设备之间传输数据是通过 Wi-Fi 而不是蓝牙。AirDrop 利用 Wi-Fi Direct 技术,这是一种直接在两个设备之间进行通信的无线技术。使用 AirDrop 时,发送设备会创建一个 Wi-Fi Direct 会话,并向周围的设备广播该文件。接收设备可以搜索周围的设备,并通过 Wi-Fi Direct 连接到发送设备。一旦连接成功,接收设备就可以开始接收文件。

蓝牙在 AirDrop 中的作用是在设备发现阶段提供快速的预配置,并确保在发送设备和接收设备之间简单的配对。但是,真正的数据传输是通过 Wi-Fi 进行的。

==

苹果的 隔空投屏/隔空播放/airplay 原理:
前提:要wifi。 (不用蓝牙参与)。
苹果airplay还是要求要在同一个局域网下的才能连接.two devices cannot use AirPlay if they are not on the same local network. AirPlay requires a direct connection between the source device and the AirPlay receiver, typically over Wi-Fi. The devices must be connected to the same Wi-Fi network in order to use AirPlay.
(苹果这么做,实际上减弱了使用的场景,多了路由器的存在)
airdrop使用到了wifi-direct 技术, 而airplay没有。 有点奇怪,为什么不用呢。

do u know how the iOS Airplay works

Yes, I am familiar with how AirPlay works on iOS.

AirPlay is a technology developed by Apple that allows you to wirelessly stream audio, video, and photos from one Apple device to another. With AirPlay, you can stream content from an iPhone, iPad, or Mac to an Apple TV, AirPlay-enabled speakers, or other compatible devices. The streaming is done over Wi-Fi, which means that you can enjoy high-quality audio and video with no cords or cables.

To use AirPlay, you simply tap the AirPlay icon on your device and choose the destination device. The content is then instantly streamed to the chosen device, allowing you to enjoy it on a larger screen or better speakers. The technology is designed to be simple and seamless, allowing you to enjoy your content without any hassle.

弱智儿童
If two devices are not in the local network, can they use airplay
No, two devices cannot use AirPlay if they are not on the same local network. AirPlay requires a direct connection between the source device and the AirPlay receiver, typically over Wi-Fi. The devices must be connected to the same Wi-Fi network in order to use AirPlay.

If the devices are not on the same local network, it may be possible to use a third-party service or technology to extend the network and allow for AirPlay streaming, but this would require additional setup and configuration.

弱智儿童
and airdrop?
Like AirPlay, AirDrop also requires a direct connection between the source device and the receiving device. AirDrop uses Bluetooth to create a peer-to-peer Wi-Fi connection between the devices, which allows for the transfer of files, photos, videos, and other content.

For AirDrop to work, both the source and receiving devices must be within close proximity to each other and have Bluetooth and Wi-Fi turned on. Additionally, both devices must be running a compatible version of iOS or MacOS. If the devices are not in close proximity, or if they are not running compatible software, AirDrop will not work.

In summary, AirDrop requires a direct connection between the source and receiving devices, and both devices must be on the same local network (i.e., within close proximity) with Bluetooth and Wi-Fi turned on.

弱智儿童
if two devices are not in the same local network, can the airdrop work
No, AirDrop does not work between devices that are not on the same local network. AirDrop uses Bluetooth to create a peer-to-peer Wi-Fi connection between the devices, and both devices must be within close proximity to each other in order for the connection to be established.

If the devices are not on the same local network, they cannot use AirDrop to transfer files or other content. The devices must be close enough to each other that their Bluetooth signals can connect and establish a direct, peer-to-peer Wi-Fi connection.

In other words, AirDrop requires both devices to be in close physical proximity to each other in order to work properly.

==

Wifi 和 wifi p2p

wifi p2p 有使用ip吗? 当然,用的是p2p0接口下的局域网,也有ip地址的。 经过的网卡接口是p2p0.原理也是TCP/IP协议的。
sta是wlan0接口的局域网。 ap是wlan1/ap0 接口的局域网。 p2p是p2p0接口的局域网。
理论上,一个物理网卡,可以有多个网卡接口,每个网卡接口都可以有mac地址,每个接口可以有ip地址,每个接口都可以有对应的局域网。


wifi和基站。wifi和基站之间是广播。 发现接收端只有自己时才能接收,如果不是自己不接收,而且不是自己的接收了,没有破解也无法查看内容。

https://blog.csdn.net/honour2sword/article/details/40214171
wifi模式: https://www.cnblogs.com/killiancheung/p/4757047.html
有三种模式 station, ap, p2p.
每路wifi可以:其中sta+p2p, ap+p2p 可以共存。 sta+ap不能共存,需要双路wifi支持才行。
一般可以支持到两种。 (好像不能三种同时共同组合)。
sta + ap.
sta + p2p.
ap + p2p.(暂未看到)
目前设备基本都支持两种的共存。不过有的设备/系统还是只支持一种模式。理论上虽然可行,但还是要看具体系统是否支持。具体机器测试。
wifi支持三种模式,理论傻姑娘每路wifi应该可以同时使用三种,两种,一种,不过实际具体也是看系统是否支持。目前系统一般同时支持上面列出的两种。

这些都是只有一个物理wifi网卡。但是在驱动中会有三个网络接口虚拟出来。 (wlan0是网络接口名)。同时虚拟出三个mac地址的。 使用各自组成的局域网。
sta模式: wlan0.
ap模式:wlan1/ap0.
p2p模式:p2p0.

只使用wifi时是station用的是wlan0.。
使用热点时是ap 用的是wlan1/ap0。
使用wifidirect时是p2p 用的是p2p0
https://blog.csdn.net/dxpqxb/article/details/102547411

比如我的小米note3.
三个网络接口: (ip link)
wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 3000
link/ether 18:f0:e4:17:91:9e brd ff:ff:ff:ff:ff:ff
wlan1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 3000
link/ether 18:f0:e4:98:91:9e brd ff:ff:ff:ff:ff:ff
p2p0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 3000
link/ether 1a:f0:e4:99:91:9e brd ff:ff:ff:ff:ff:ff

当我使用Wi-Fi和热点时:
ip route show:
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.101
192.168.43.0/24 dev wlan1 proto kernel scope link src 192.168.43.1

cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.43.210 0x1 0x2 64:09:80:d2:12:39 * wlan1
192.168.1.105 0x1 0x2 6c:b7:49:91:fa:8a * wlan0
192.168.1.1 0x1 0x2 5c:de:34:27:14:09 * wlan0

当我使用wifip2p和wifi时:
ip route show:
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.101
192.168.49.0/24 dev p2p0 proto kernel scope link src 192.168.49.1

cat /proc/net/arp:
IP address HW type Flags HW address Mask Device
192.168.1.105 0x1 0x2 6c:b7:49:91:fa:8a * wlan0
192.168.1.1 0x1 0x2 5c:de:34:27:14:09 * wlan0
192.168.49.95 0x1 0x2 4e:ef:bf:c3:e2:a8 * p2p0

查看android所有的网络接口:
ip link

虽然物理网卡只有那么一两个,但是网络接口是可以虚拟出很多的,每个网络接口都有自己的mac地址和ip地址。而且每个都能在各自的局域网中使用。

关于wifi的一些东西:
SSID
BSSID
https://blog.csdn.net/weixin_42445727/article/details/94737103
https://blog.csdn.net/qq_38880380/article/details/79899852
https://zhuanlan.zhihu.com/p/337819729
https://zhuanlan.zhihu.com/p/112123189

同时使用wifi和热点,是使用了双路wifi技术(相当于全双工)。 虽然可以同时wifi和热点,但用的仍然是一个wifi网卡,即只有一个mac地址的,只是有两个天线,可以同时使用sta和ap模式。 (可通过代码验证的。 见项目 /Users/rzet/AndroidStudioProjects/HelloWorld/wifiipdemo)。
https://zhidao.baidu.com/question/1835690503744911340.html
https://blog.csdn.net/iningwei/article/details/100134783
有的手机不支持同时开启,可能是wifi网卡不支持双路(也就无法全双工),也有可能是系统限制了。

同时使用wifi(sta)和热点(ap)的方式,1.软件层面支持(不管是simo,还是mimo,都可以做到。但是这个方式比较少)。 2.硬件层面支持,网卡需要有两根天线,支持双路wifi(就能全双工)。
https://www.zhihu.com/question/361051612
https://www.zhihu.com/question/367187013

比如小米3就不支持同时开启wifi和热点。 小米note3支持。

双路wifi和双频wifi。
https://www.zhihu.com/question/61083142
双频wifi是指支持2.4G和5G。 双路wifi能组合成全双工功能的。

一般的wifi是都是半双工的。 一般的wifi都是一根天线,单通道,因此是某个时刻只能收或发,因此是半双工。 对于只有一根天线,只能是一种模式(要么station 要么ap 要么p2p)或两种模式(p2p+ap, p2p+sta, 不能ap+sta)。 而对于双路wifi,实际上两根天线,组合成类似全双工的功能(对于单根天线还是半双工),因此可以同时开启任意两种模式,一根用station模式,一根ap模式。

单工,双工(半双工,全双工)。

(单根wifi天线是半双工的。)

双频wifi,双路wifi(2x2MIMO)->(物理硬件上需要两根天线的)。

wifi的模式。

wifi如果要同时开启sta+ap两种模式,物理上需要两根天线及以上,同时系统要有MIMO技术。当然如果有两张物理网卡/wifi网卡,自然也能sta+ap,每张网卡各自用一种模式。
如果只有一根天线,只能同时开启三种模式中的一种或有两种共存。

物理网卡/wifi网卡。
一个wifi,就一张无线网卡。
一般一个手机就一张物理wifi网卡。 是否双路要看天线数量,并不是看网卡数量。
一张网卡可以有多个接口,即一张网卡(可以有一个或多个mac地址)。

小米note3的wifi就是2x2MIMO。 以前的都是单天线,SISO的, 现在的都是很多都是两天线,MIMO (也就是说可以同时开启多种wifi模式的).
小米3:
ip link:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT
link/ether ce:6c:ec:f8:0e:e4 brd ff:ff:ff:ff:ff:ff
3: rmnet0: <> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/[530]
4: rmnet1: <> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/[530]
5: rmnet2: <> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/[530]
6: rmnet3: <> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/[530]
7: rmnet4: <> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/[530]
8: rmnet5: <> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/[530]
9: rmnet6: <> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/[530]
10: rmnet7: <> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/[530]
11: rmnet_usb0: <BROADCAST,MULTICAST> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 86:e4:e7:3b:94:57 brd ff:ff:ff:ff:ff:ff
12: rev_rmnet0: <BROADCAST,MULTICAST> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 52:7e:81:13:f1:12 brd ff:ff:ff:ff:ff:ff
13: rev_rmnet1: <BROADCAST,MULTICAST> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 26:be:92:e0:ec:07 brd ff:ff:ff:ff:ff:ff
14: rev_rmnet2: <BROADCAST,MULTICAST> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 56:da:6c:73:74:7c brd ff:ff:ff:ff:ff:ff
15: rev_rmnet3: <BROADCAST,MULTICAST> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 2e:45:10:fc:3e:2e brd ff:ff:ff:ff:ff:ff
16: rev_rmnet4: <BROADCAST,MULTICAST> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 22:21:9b:47:19:a4 brd ff:ff:ff:ff:ff:ff
17: rev_rmnet5: <BROADCAST,MULTICAST> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 52:af:43:66:e7:eb brd ff:ff:ff:ff:ff:ff
18: rev_rmnet6: <BROADCAST,MULTICAST> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 72:c6:86:21:1a:cb brd ff:ff:ff:ff:ff:ff
19: rev_rmnet7: <BROADCAST,MULTICAST> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether fa:ee:ba:0d:92:c5 brd ff:ff:ff:ff:ff:ff
20: rev_rmnet8: <BROADCAST,MULTICAST> mtu 2000 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 66:12:7d:0a:00:ff brd ff:ff:ff:ff:ff:ff
21: sit0: mtu 1480 qdisc noop state DOWN mode DEFAULT
link/sit 0.0.0.0 brd 0.0.0.0
26: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT qlen 1000
link/ether 64:09:80:d2:12:39 brd ff:ff:ff:ff:ff:ff
27: p2p0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT qlen 1000
link/ether 66:09:80:d2:12:39 brd ff:ff:ff:ff:ff:ff
(小米3这里ap模式(开热点)和sta模式 用的都是wlan0网卡,用的是同一个mac地址的。)
(小米note3用的就是单独的wlan0 wlan1 p2p0)。
小米note3:
ip link:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether ea:97:a3:01:da:dc brd ff:ff:ff:ff:ff:ff
3: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 76:32:a4:54:22:03 brd ff:ff:ff:ff:ff:ff
4: sit0@NONE: mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1
link/sit 0.0.0.0 brd 0.0.0.0
5: rmnet_ipa0: <UP,LOWER_UP> mtu 2000 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
link/[530]
6: rmnet_data0: <UP,LOWER_UP> mtu 2000 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
link/[530]
7: rmnet_data1: <UP,LOWER_UP> mtu 1410 qdisc htb state UNKNOWN mode DEFAULT group default qlen 1000
link/[530]
8: rmnet_data2: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
9: rmnet_data3: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
10: rmnet_data4: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
11: rmnet_data5: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
12: rmnet_data6: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
13: rmnet_data7: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
14: r_rmnet_data0: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
15: r_rmnet_data1: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
16: r_rmnet_data2: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
17: r_rmnet_data3: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
18: r_rmnet_data4: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
19: r_rmnet_data5: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
20: r_rmnet_data6: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
21: r_rmnet_data7: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
22: r_rmnet_data8: <> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/[530]
23: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 3000
link/ether 18:f0:e4:17:91:9e brd ff:ff:ff:ff:ff:ff
24: wlan1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 3000
link/ether 18:f0:e4:98:91:9e brd ff:ff:ff:ff:ff:ff
25: p2p0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 3000
link/ether 1a:f0:e4:99:91:9e brd ff:ff:ff:ff:ff:ff

一个wifi网卡就只有一个物理硬件的。但是由于有三种模式,因此可以虚拟出三个网络接口,也即可以虚拟出三个mac地址的。 如果可以同时开启两个模式,那么就能同时使用两个mac地址的。如果只能一个模式,那么同一时刻,只能是用某一个mac地址的。

https://www.gkzhan.com/news/detail/129229.html

https://www.zhihu.com/question/33861607

https://www.zhihu.com/question/61083142

https://info.support.huawei.com/info-finder/encyclopedia/zh/MIMO.html

https://zhuanlan.zhihu.com/p/41520064

====
红米note11Tpro的实验:

  • 0.连接手机, ./adb devices , ./adb shell 进入shell。
  • 1.ip link //查看所有的网络接口

==
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 8e:e1:61:ad:fa:3e brd ff:ff:ff:ff:ff:ff
3: ifb0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 32
link/ether 0a:9b:a6:88:4a:f4 brd ff:ff:ff:ff:ff:ff
4: ifb1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 32
link/ether 72:f1:f0:27:78:35 brd ff:ff:ff:ff:ff:ff
5: tunl0@NONE: mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
6: gre0@NONE: mtu 1476 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/gre 0.0.0.0 brd 0.0.0.0
7: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
8: erspan0@NONE: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
9: ip_vti0@NONE: mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
10: ip6_vti0@NONE: mtu 1364 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/tunnel6 :: brd ::
11: sit0@NONE: mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
12: ip6tnl0@NONE: mtu 1452 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/tunnel6 :: brd ::
13: ip6gre0@NONE: mtu 1448 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/gre6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
14: ccmni0: <NOARP,UP,LOWER_UP> mtu 1400 qdisc mq state UNKNOWN mode DEFAULT group default qlen 1000
link/none
15: ccmni1: <NOARP,UP,LOWER_UP> mtu 1400 qdisc mq state UNKNOWN mode DEFAULT group default qlen 1000
link/none
16: ccmni2: mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/none
17: ccmni3: mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/none
18: ccmni4: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
19: ccmni5: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
20: ccmni6: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
21: ccmni7: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
22: ccmni8: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
23: ccmni9: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
24: ccmni10: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
25: ccmni11: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
26: ccmni12: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
27: ccmni13: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
28: ccmni14: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
29: ccmni15: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
30: ccmni16: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
31: ccmni17: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
32: ccmni18: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
33: ccmni19: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
34: ccmni20: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
35: ccmni-lan: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether
36: miw_oem0: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether d2:23:9e:dc:5d:02 brd ff:ff:ff:ff:ff:ff
38: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 3000
link/ether 82:09:54:a8:a4:40 brd ff:ff:ff:ff:ff:ff
39: wlan1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 3000
link/ether bc:61:93:b1:6a:de brd ff:ff:ff:ff:ff:ff
62: p2p0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether be:61:93:b3:6a:de brd ff:ff:ff:ff:ff:ff
63: ap0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether ba:61:93:b3:6a:de brd ff:ff:ff:ff:ff:ff

==

  • 仅连接wifi时:
    ip route show:

192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.115

cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.0.194 0x1 0x2 58:20:59:63:12:13 * wlan0
192.168.0.1 0x1 0x2 d0:76:e7:5e:26:71 * wlan0

  • 仅使用热点时:(电脑连接着热点)
    ip route show:

192.168.234.0/24 dev ap0 proto kernel scope link src 192.168.234.123

cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.234.93 0x1 0x2 20:c9:d0:cb:f2:e7 * ap0

  • 使用数据流量时:
    开着热点,电脑连接着热点。
    ip route show

10.0.0.0/8 dev ccmni3 proto kernel scope link src 10.75.159.228
192.168.234.0/24 dev ap0 proto kernel scope link src 192.168.234.123

cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.234.93 0x1 0x2 20:c9:d0:cb:f2:e7 * ap0

测试
开着p2p,

  • 开启p2p连接:
    ip route show

192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.114
192.168.49.0/24 dev p2p0 proto kernel scope link src 192.168.49.1

ip route show
192.168.10.0/24 dev wlan0 proto kernel scope link src 192.168.10.4
192.168.49.0/24 dev p2p0 proto kernel scope link src 192.168.49.1
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.49.107 0x1 0x2 d2:c0:bf:92:b7:d1 * p2p0
192.168.10.185 0x1 0x2 7c:d6:61:c6:d2:21 * wlan0
192.168.10.1 0x1 0x2 7c:6a:60:43:a6:85 * wlan0

两个mac设备接口(wlan0, p2p0)对应 着两个局域网。

ip route show 显示该主机下所有的mac设备,ip地址,以及所有该设备网段所经过的接口。
解释下:
192.168.10.0/24 dev wlan0 proto kernel scope link src 192.168.10.4
本机中所有经过192.168.10.0/24的网段 是要经过wlan0这个接口,这个接口的ip是192.168.10.4
cat /proc/net/arp 显示所有mac设备在该设备所在局域网 可能找到的ip和mac对应的记录,以及数据所经过的接口。
解释下:
192.168.49.107 0x1 0x2 d2:c0:bf:92:b7:d1 * p2p0
局域网中的IP 192.168.49.107 对于的mac地址是d2:c0:bf:92:b7:d1, 数据流经本机的p2p0接口。

rzet@MacBook-Pro-3 platform-tools$ ./adb devices
List of devices attached
8X8975NB4PZLEERS device

rzet@MacBook-Pro-3 platform-tools$ ./adb shell
xaga:/ $ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 8e:e1:61:ad:fa:3e brd ff:ff:ff:ff:ff:ff
3: ifb0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 32
link/ether 0a:9b:a6:88:4a:f4 brd ff:ff:ff:ff:ff:ff
4: ifb1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 32
link/ether 72:f1:f0:27:78:35 brd ff:ff:ff:ff:ff:ff
5: tunl0@NONE: mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
6: gre0@NONE: mtu 1476 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/gre 0.0.0.0 brd 0.0.0.0
7: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
8: erspan0@NONE: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
9: ip_vti0@NONE: mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
10: ip6_vti0@NONE: mtu 1364 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/tunnel6 :: brd ::
11: sit0@NONE: mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
12: ip6tnl0@NONE: mtu 1452 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/tunnel6 :: brd ::
13: ip6gre0@NONE: mtu 1448 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/gre6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
14: ccmni0: <NOARP,UP,LOWER_UP> mtu 1400 qdisc mq state UNKNOWN mode DEFAULT group default qlen 1000
link/none
15: ccmni1: <NOARP,UP,LOWER_UP> mtu 1400 qdisc mq state UNKNOWN mode DEFAULT group default qlen 1000
link/none
16: ccmni2: mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/none
17: ccmni3: mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/none
18: ccmni4: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
19: ccmni5: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
20: ccmni6: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
21: ccmni7: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
22: ccmni8: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
23: ccmni9: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
24: ccmni10: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
25: ccmni11: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
26: ccmni12: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
27: ccmni13: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
28: ccmni14: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
29: ccmni15: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
30: ccmni16: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
31: ccmni17: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
32: ccmni18: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
33: ccmni19: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
34: ccmni20: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/none
35: ccmni-lan: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether
36: miw_oem0: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether d2:23:9e:dc:5d:02 brd ff:ff:ff:ff:ff:ff
38: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 3000
link/ether 82:09:54:a8:a4:40 brd ff:ff:ff:ff:ff:ff
39: wlan1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 3000
link/ether bc:61:93:b1:6a:de brd ff:ff:ff:ff:ff:ff
62: p2p0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether be:61:93:b3:6a:de brd ff:ff:ff:ff:ff:ff
63: ap0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether ba:61:93:b3:6a:de brd ff:ff:ff:ff:ff:ff
xaga:/ $ ip route show
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.115
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.0.194 0x1 0x2 58:20:59:63:12:13 * wlan0
192.168.0.1 0x1 0x2 d0:76:e7:5e:26:71 * wlan0
xaga:/ $ ping 192.168.0.194
PING 192.168.0.194 (192.168.0.194) 56(84) bytes of data.
64 bytes from 192.168.0.194: icmp_seq=1 ttl=64 time=4.19 ms
64 bytes from 192.168.0.194: icmp_seq=2 ttl=64 time=150 ms
^C
— 192.168.0.194 ping statistics —
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 4.192/77.106/150.021/72.915 ms
xaga:/ $ ifconfig
lo Link encap:UNSPEC
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope: Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:28985 errors:0 dropped:0 overruns:0 frame:0
TX packets:28985 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:396983856 TX bytes:396983856

dummy0 Link encap:UNSPEC
inet6 addr: fe80::8ce1:61ff:fead:fa3e/64 Scope: Link
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:7217 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 TX bytes:1680653

ccmni0 Link encap:UNSPEC
inet6 addr: 240e:57c:3290:956c:1748:ca54:2733:5ff7/64 Scope: Global
inet6 addr: fe80::1748:ca54:2733:5ff7/64 Scope: Link
UP RUNNING NOARP MTU:1400 Metric:1
RX packets:9 errors:0 dropped:0 overruns:0 frame:0
TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:780 TX bytes:608

ccmni1 Link encap:UNSPEC
inet6 addr: 2409:815a:3298:c120:1748:ca54:7b01:3ea0/64 Scope: Global
inet6 addr: fe80::1748:ca54:7b01:3ea0/64 Scope: Link
UP RUNNING NOARP MTU:1400 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:324 TX bytes:48

wlan0 Link encap:UNSPEC Driver wlan
inet addr:192.168.0.115 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::8009:54ff:fea8:a440/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:29434 errors:0 dropped:0 overruns:0 frame:0
TX packets:30808 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3000
RX bytes:23114949 TX bytes:10115118

xaga:/ $ ifconfig | grep 194
1|xaga:/ $ ip route show
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.115
192.168.234.0/24 dev ap0 proto kernel scope link src 192.168.234.123
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.0.194 0x1 0x2 58:20:59:63:12:13 * wlan0
192.168.0.132 0x1 0x2 f2:4b:7d:27:0d:d2 * wlan0
192.168.0.1 0x1 0x2 d0:76:e7:5e:26:71 * wlan0
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.0.194 0x1 0x2 58:20:59:63:12:13 * wlan0
192.168.0.132 0x1 0x2 f2:4b:7d:27:0d:d2 * wlan0
192.168.0.1 0x1 0x2 d0:76:e7:5e:26:71 * wlan0
xaga:/ $ ip route show
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.115
192.168.234.0/24 dev ap0 proto kernel scope link src 192.168.234.123
xaga:/ $ ip route show
192.168.234.0/24 dev ap0 proto kernel scope link src 192.168.234.123
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
xaga:/ $ ip route show
10.0.0.0/8 dev ccmni3 proto kernel scope link src 10.75.159.228
192.168.234.0/24 dev ap0 proto kernel scope link src 192.168.234.123
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
xaga:/ $ ip route show
10.0.0.0/8 dev ccmni3 proto kernel scope link src 10.75.159.228
192.168.234.0/24 dev ap0 proto kernel scope link src 192.168.234.123
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.234.93 0x1 0x2 20:c9:d0:cb:f2:e7 * ap0
xaga:/ $ ip route show
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.114
192.168.49.0/24 dev p2p0 proto kernel scope link src 192.168.49.1
xaga:/ $ ip route show
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
xaga:/ $ rzet@MacBook-Pro-3 platform-tools$ ./adb shell
xaga:/ $ ip router show
Object “router” is unknown, try “ip help”.
1|xaga:/ $ ip route show
192.168.10.0/24 dev wlan0 proto kernel scope link src 192.168.10.4
192.168.49.0/24 dev p2p0 proto kernel scope link src 192.168.49.1
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.49.107 0x1 0x2 d2:c0:bf:92:b7:d1 * p2p0
192.168.10.185 0x1 0x2 7c:d6:61:c6:d2:21 * wlan0
192.168.10.1 0x1 0x2 7c:6a:60:43:a6:85 * wlan0
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.10.185 0x1 0x2 7c:d6:61:c6:d2:21 * wlan0
192.168.10.1 0x1 0x2 7c:6a:60:43:a6:85 * wlan0
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.10.185 0x1 0x2 7c:d6:61:c6:d2:21 * wlan0
192.168.10.1 0x1 0x2 7c:6a:60:43:a6:85 * wlan0
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.10.185 0x1 0x2 7c:d6:61:c6:d2:21 * wlan0
192.168.10.213 0x1 0x2 d0:c0:bf:92:b7:d1 * wlan0
192.168.10.1 0x1 0x2 7c:6a:60:43:a6:85 * wlan0
xaga:/ $ ip route show
192.168.10.0/24 dev wlan0 proto kernel scope link src 192.168.10.4
xaga:/ $ ip route show
192.168.10.0/24 dev wlan0 proto kernel scope link src 192.168.10.4
192.168.49.0/24 dev p2p0 proto kernel scope link src 192.168.49.1
xaga:/ $ ip route show
192.168.203.0/24 dev wlan0 proto kernel scope link src 192.168.203.20
xaga:/ $ ip route show
192.168.203.0/24 dev wlan0 proto kernel scope link src 192.168.203.20
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.203.1 0x1 0x2 d2:c0:bf:92:b7:d1 * wlan0
xaga:/ $ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.49.105 0x1 0x2 d0:c0:bf:92:b7:d1 * p2p0
192.168.10.1 0x1 0x2 7c:6a:60:43:a6:85 * wlan0
xaga:/ $ ip route show
192.168.10.0/24 dev wlan0 proto kernel scope link src 192.168.10.4
192.168.49.0/24 dev p2p0 proto kernel scope link src 192.168.49.1
xaga:/ $ ip route show
192.168.10.0/24 dev wlan0 proto kernel scope link src 192.168.10.4
192.168.49.0/24 dev p2p0 proto kernel scope link src 192.168.49.1
xaga:/ $ ip route show
192.168.49.0/24 dev p2p0 proto kernel scope link src 192.168.49.1
xaga:/ $ ip route show
192.168.49.0/24 dev p2p0 proto kernel scope link src 192.168.49.1
xaga:/ $ rzet@MacBook-Pro-3 platform-tools$

===

手机的IMEI类似与mac地址。 他们都是二层设备。

网络层:IP地址。

数据链路层: 以太网 802.3 mac地址。 wifi 802.11 mac地址。 蜂窝网络 3GPP协议 IMEI(类似于mac地址)。 蓝牙 蓝牙协议 mac地址。

wifi 网线 数据流量 都走 TCP/IP协议栈。 只不过在数据链层有不一样的实现罢了。

imei跟着设备走的,设备唯一标识。跟着卡走的叫imsi吧。 一般一卡一个imsi, 而一卡也对应着一个IMEI。 双卡手机也是有两个imei的。
https://www.jianshu.com/p/d6c57dcefb06

IMEI 对应移动/联通制式。 MEID对应电信制式(CDMA).
手机上一个卡槽对应一个IMEI或MEID。 由于现在手机双卡,所以都有两个IMEI,而且由于双卡都支持移动或联通,所以两个卡槽可以对应两个IMEI,而双卡只能用一个电信的,因此虽然两个卡槽,但是只有一个MEID。 所以,比如电信手机,有两个IMEI,一个MEID。
卡槽1 卡槽2 对应的IMEI是固定的,而卡槽1 2对应的IMSI会随着卡放置的位置不同而不同。
如果支持移动/联通的手机,是没有MEID的。

手机: SN码, IMEI, MEID, IMSI(电话卡)。
https://www.cnblogs.com/aeolian/p/10234447.html
https://blog.csdn.net/lfcoolhappy/article/details/19608381

https://blog.csdn.net/whbk101/article/details/103089390
https://blog.csdn.net/MirkoWug/article/details/106860832

android 系统版本 和 android sdk版本/API等级 对应关系:
https://www.jianshu.com/p/dc7e5399be32
https://baike.baidu.com/item/Android%E5%8E%86%E5%8F%B2%E7%89%88%E6%9C%AC/1578450

android 动态权限步骤:
1.在manifest中写入相应权限。
2.代码中动态申请权限。 a.检查是否有权限。 2.如果有 完成后续操作。 b如果没有,那么提示为什么需要权限,然后申请权限。
https://www.jianshu.com/p/a51593817825
https://www.jianshu.com/p/ccea3c2f9cfa

android 获取本地 IP mac, 路由器的mac地址等, https://www.jianshu.com/p/de7cbcb4fd3e
https://blog.csdn.net/qq_23025319/article/details/119214937
https://blog.csdn.net/ddxxii/article/details/76468349

android 在wifi下 获取本地ip mac, 获取网关/路由器 ip mac.
在蜂窝网络下 获取本地ip imei/meid, 获取网关/基站 ip mac (可以使用命令行进行获取然后解析)(好像读取网关mac有点坑,因为走的是蜂窝网络,arp表中没有信息,不像wifi下,arp表中有信息的。好像基站也不一定是mac地址啥,也可能是其他形式的).
https://blog.csdn.net/h784707460/article/details/87779494
https://blog.csdn.net/github_30662571/article/details/75088644

./adb devices -l

./adb -s deviceName shell //进入某个设备的shell。

关于 异步 的理解。

1

迭代器模式/原理:利用迭代器 迭代/循环遍历 可迭代对象中的数据集合。 原理上是利用迭代器的。
而且不是一次性将全部读取到内存中,而是一个一个读取,用过的内存再被覆盖,这样明显不会占用太多内存。迭代器并不是一次性读出所有数据,而是一次一次读出.
迭代器模式提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

一般意义上/广义上的:
可迭代对象:1.本身中拥有集合。2一般 拥有或可以得到迭代器的对象(因为要通过迭代器去访问数据集合) 3.可通过迭代器访问可迭代对象中的数据集合 或 可对对象本身直接进行for的对象(实际上也是通过获取可迭代对象的迭代器去迭代其中的集合,一种语法糖罢了)。 <==> 可迭代/循环 (其中的数据集合)的对象 <==> 可for/while 的对象(使用for while 或 直接在for foreach 中使用的)

迭代器: 一般指,可以对可迭代对象/数据集合 进行迭代(循环)处理的对象。通过迭代器 可以迭代(循环)遍历可迭代对象中的数据集合。所以 一般迭代器中是拥有或可访问到可迭代对象中的数据集合或者本身也是可迭代对象(自然就能访问到可迭代对象中的数据集合),而且会维护一个index和集合个数。
迭代器对象本身不能用于for中(不一定,有的具体语言语法是迭代器本身也是可迭代对象,因此也可以直接用于for)。 但是可以通过迭代器去迭代访问集合中的数据。

我们编程中直接对外的接口为可迭代对象(因为最直接的表现拥有数据集合,因此直接与我们接触的就是可迭代对象)。 通过可迭代对象 可以获得 迭代器。 通过迭代器 可以迭代访问可迭代对象中的数据集合。

迭代访问可迭代对象中的数据集合: 1.通过获取迭代器,从而迭代访问可迭代对象中的数据集合。 2.通过for直接使用可迭代对象(原理也是1,实际上一种语法糖)。

[广义的,狭义的 可迭代对象 迭代器。 广义上一般 不是某种具体的语法。 狭义的 一般是语言中特指的类,符合广义的含义 的类对象。一般在某个语言中说 可迭代对象 迭代器是狭义的指该语言中狭义上的迭代器 可迭代对象,一般是符合特殊要求的类]

注意,具体语言中的可迭代对象和迭代器,如果有语法所谓的可迭代对象 迭代器, 那么这个可迭代对象和迭代器一般是指 狭义上的迭代器 可迭代对象,是某种特殊要求的类。

通过demo来体会下迭代器模式,可迭代对象, 迭代器。
关键:
1.类的设计
可迭代对象设计:a.可迭代对象本身拥有数据集合。b.通过可迭代对象可以获取到迭代器(因此可迭代对象应该能获取到或持有迭代器)。
迭代器设计:a.通过迭代器可以访问到可迭代对象(因此可迭代器要能访问可迭代对象的能力) b.迭代的访问,持有idx指针或其他能表明数据集合状态的值。维持状态、进度,也即用到索引。
2.对外接口使用(通过可迭代对象,获取迭代器,通过迭代器访问可迭代对象(中的数据集合)或直接在for中使用可迭代对象本身)。
demo:
C
Java
Python

https://cloud.tencent.com/developer/article/1805426

https://www.jianshu.com/p/a40d5a42d643

https://blog.csdn.net/jxqingge/article/details/81296465

2

package cn.bjsxt.interator;
/**
 * 简化迭代器原理
 * hasNext
 * next
 * @author Administrator
 *
 */
public class MyArrayList {
    private String[] elem = {"a","b","c","d","e","f","g"};
    private int size = elem.length;
    private int curror = -1;
    
    /**
     * 判断是否存在下一个元素
     * @return
     */
    public boolean hasNext() {
        return curror+1 < size; //指向下一个元素 
    }
    
    /**
     * 获取下一个元素
     */
    public String next() {
        curror++;         //移动一次
        return elem[curror];
    }
    
    
    public static void main(String[] args) {
        MyArrayList list = new MyArrayList();
        while(list.hasNext()) {
            System.out.println(list.next());
        }
    }
    
}

严格意义上来将,MyArrayList 这个只是用到了迭代器模式,MyArrayList并不是定义上的可迭代对象。

可迭代对象在不同语言中的实现有不同的要求(语法要求)。
Java中是指 要必须实现 Iterable 接口。python中是实现继承Iterable类或实现__iter__ 方法 。才能称之为可迭代对象。 可迭代对象 特征: 对象本身可以直接用于 for ,增强的foreach 的语法中。(通常本身也可以获取到迭代器,或 持有迭代器引用)

迭代器在不同语言中的实现有不同的要求。
Java中是指要必须实现Iterator接口(该接口有两个方法 hasnext() next()). Python中是继承Iterator类或实现__iter__和__next__。 迭代器特征: 对象本身不能用于for中。 但是可以通过迭代器去迭代访问集合中的数据。

ps:java中仅仅自己实现hasnext next的类 并不能称之为迭代器 或 可迭代对象,那仅仅能称之为可迭代模式。

public interface Iterator<E> {
    /**
     * Returns {@code true} if the iteration has more elements.
     * (In other words, returns {@code true} if {@link #next} would
     * return an element rather than throwing an exception.)
     *
     * @return {@code true} if the iteration has more elements
     */
    boolean hasNext();


    /**
     * Returns the next element in the iteration.
     *
     * @return the next element in the iteration
     * @throws NoSuchElementException if the iteration has no more elements
     */
    E next();
    ...
}
public interface Iterable<T> {
    /**
     * Returns an iterator over elements of type {@code T}.
     *
     * @return an Iterator.
     */
    Iterator<T> iterator();


    /**
     * Performs the given action for each element of the {@code Iterable}
     * until all elements have been processed or the action throws an
     * exception.  Unless otherwise specified by the implementing class,
     * actions are performed in the order of iteration (if an iteration order
     * is specified).  Exceptions thrown by the action are relayed to the
     * caller.
     *
     * @implSpec
     * <p>The default implementation behaves as if:
     * <pre>{@code
     *     for (T t : this)
     *         action.accept(t);
     * }</pre>
     *
     * @param action The action to be performed for each element
     * @throws NullPointerException if the specified action is null
     * @since 1.8
     */
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }


    /**
     * Creates a {@link Spliterator} over the elements described by this
     * {@code Iterable}.
     *
     * @implSpec
     * The default implementation creates an
     * <em><a href="Spliterator.html#binding">early-binding</a></em>
     * spliterator from the iterable's {@code Iterator}.  The spliterator
     * inherits the <em>fail-fast</em> properties of the iterable's iterator.
     *
     * @implNote
     * The default implementation should usually be overridden.  The
     * spliterator returned by the default implementation has poor splitting
     * capabilities, is unsized, and does not report any spliterator
     * characteristics. Implementing classes can nearly always provide a
     * better implementation.
     *
     * @return a {@code Spliterator} over the elements described by this
     * {@code Iterable}.
     * @since 1.8
     */
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

python中 迭代器:1.实现__iter__和__next__(iter__返回迭代器本身)。 或者 2. 继承Iterator类(该类也是有__iter__和__next)。
python中 可迭代对象:1.实现__iter__ 方法 (返回一个迭代器). 或者 2.继承Iteratble类(该类也是有__iter__)。
从python 中定义来看,python中的迭代器也是可迭代对象。 可迭代对象不一定是迭代器。 所以python中迭代器本身也可以直接用于for。
iter方法:
https://blog.csdn.net/sunjintaoxxx/article/details/122060513

from collections import Iterator, Iterable
@runtime_checkable
class Iterable(Protocol[_T_co]):

@abstractmethod
def __iter__(self) -> Iterator[_T_co]: ...



@runtime_checkable
class Iterator(Iterable[_T_co], Protocol[_T_co]):

@abstractmethod
def __next__(self) -> _T_co: ...

def __iter__(self) -> Iterator[_T_co]: ...

Java,pyhton 中的可迭代对象 都可以得到 迭代器。(有的方式是直接持有迭代器对象)。

由于在C中没有相应的语法要求,迭代器 可迭代对象(由于没有语法支持,无法让对象本身用于for), 不能在语法层面得到支持。 但是C也可以像java那样自定义构造一个迭代器,然后可迭代对象中持有迭代器(虽然这个可迭代器对象无法直接用于for,但是基本思想 框架是如此的,也是迭代器模式).

unix/linux/macos 中关于软件的使用方法。学习方法。
安装软件后,注意以下关键:
1.安装的可执行文件/命令 的具体路径 以及 命令名。 (可用which查看)
2.安装之后是否修改环境变量。
3.配置文件位置 以及 配置方法。
4.重要的路径,如web服务器的 根目录 , log文件路径 等 重要文件的路径。
5.软件 命令的 常用使用方法。 比如 开启, 关闭, 重启 等等。 善用 xxx -h, xxx –helps

比如,以nginx 为例。
1.安装后的软件/命令路径为 /usr/local/bin/nginx. 一般使用which都可以查出来。 它的命令名就是nginx。
2.nginx没有修改环境变量。 查看 ~/.bashrc 或 ~/.bash_profile. 如果需要,那么可以在该文件中修改。
3.nginx 具体配置文件位置 /usr/local/etc/nginx/nginx.conf。 具体路径以及配置方法 可直接百度或者官网查看。
4.nginx的重要路径除了配置文件外,还有服务器 的文件根目录, /usr/local/Cellar/nginx/1.19.5/
5.nginx 安装之后 命令为 nginx. 常用的命令有:
nginx 启动服务器。
nginx -s stop
nginx -s reload

apache使用。

1.apachectl 是可执行的脚步文件。 调用httpd 程序/命令的。
httpd 是apache web服务器的核心程序。
/usr/sbin/apachectl
/usr/sbin/httpd
https://blog.csdn.net/u013368932/article/details/54881324

2.配置文件在 /etc/apache2/httpd.conf。

3.web服务器的根目录在httpd.conf 中定义了。DocumentRoot “/Users/rzet/ApacheDocRoot”

  1. httpd
    httpd -k start/restart/stop

tomcat本身也是一个web服务器。 同时也是servlet容器。
apache是一个web服务器。性能比tomcat好。 所以一般可以将apcahe 和 tomcat整合使用, apache作为web服务器,tomcat只作为servlet容器。

音频、视频、多媒体、流媒体

(单)媒体, 多媒体:

https://zhuanlan.zhihu.com/p/144495523
https://zhuanlan.zhihu.com/p/52311894
https://baike.baidu.com/item/%E5%A4%9A%E5%AA%92%E4%BD%93/140486

多媒体(duō méi tǐ) 的英文单词是Multimedia,它由media和multi两部分组成。一般理解为多种媒体的综合。多媒体是计算机和视频技术的结合,实际上它是两个媒体;声音和图像,或者用现在的术语:音响和电视。多媒体技术是当今信息技术领域发展最快、最活跃的技术,本文通过对多媒体技术的应用现状和发展趋势的分析,使我们展望到,随着日益普及的高速信息网,它正被广泛应用在咨询服务、图书、教育、通信、军事、金融、医疗等诸多行业。多媒体技术更一步地促进了我国的科技发展。

口语中的媒体 实际上包括所有,比如 报纸 杂志 新闻等。

关于 音频, 视频。

  • 音频 编码格式。
  • 视频 编码格式。
  • 音频封装格式(含音频 元数据 歌词等),视频封装格式 (含音频 视频 元数据 字幕等)。 是容器。

一般容器格式/封装格式/文件格式 决定了 文件的后缀名。 当然很多的 封装格式 也有 其名字相应的编码格式,所以很多比如 mp3, 既是编码格式也是封装格式。
https://www.lifewire.com/what-is-an-ogg-file-2622795
https://cloud.tencent.com/developer/article/1924790

https://www.jianshu.com/p/def926938398
音频编码格式有如下:
AAC
AMR
PCM
ogg(ogg vorbis音频)
AC3(DVD 专用音频编码)
DTS(DVD 专用音频编码)
APE(monkey’s 音频)
AU(sun 格式)
WMA
音频编码方案之间音质比较(AAC,MP3,WMA等)结果: AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3

视频编码标准有两大系统: MPEG 和ITU-T,国际上制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有H.261、H.263、H.263+、H.264等,另一个是“国际标准化组织(ISO)”它制定的标准有MPEG-1、MPEG-2、MPEG-4等。

常见编码格式有:
Xvid(MPEG4)
H264 (目前最常用编码格式)
H263
MPEG1,MPEG2
AC-1
RM,RMVB
H.265(目前用的不够多)
目前最常见的视频编码方式的大致性能排序基本是: MPEG-1/-2 < WMV/7/8 < RM/RMVB < Xvid/Divx < AVC/H.264(由低到高,可能不完全准确)。
在H.265出来之前,H264是压缩率最高的视频压缩格式。

存储封装格式
目前市面常见的存储封装格式有如下:

AVI (.avi)
ASF(.asf)
WMV (.wmv)
QuickTime ( .mov)
MPEG (.mpg / .mpeg)
MP4 (.mp4)
m2ts (.m2ts / .mts )
Matroska (.mkv / .mks / .mka )
RM ( .rm / .rmvb)
TS/PS

AVI : 可用MPEG-2, DIVX, XVID, WMV3, WMV4, AC-1, H.264
WMV : 可用WMV3, WMV4, AC-1
RM/RMVB : 可用RV40, RV50, RV60, RM8, RM9, RM10
MOV : 可用MPEG-2, MPEG4-ASP(XVID), H.264
MKV : 所有

流媒体学习:

流媒体 并不是一种新的媒体格式,只是传输方式是流式的。而这里的传统媒体是指以前播放媒体的方式都是下载后才能看。
从传输方式上大致可以分为传统文件下载、HTTP渐进式下载、HTTP流式传输、实时流媒体传输四大类。 前一个就是以往传统看视频的方式。后三种都能算流媒体方式。
流媒体中 点播 录播 直播。 上面的后三种都可以点播 录播, 只有第四种直播,第一种只能下载完成后才能观看。

https://blog.csdn.net/flqbestboy/article/details/78123910

一般的http服务器上也有 mp4文件, 此时客户端也是不用全部下载完后再看的, 这个也是和流媒体有关系吗? 这个是http传输的,分段, 如果是分段,部分的数据在网页上的播放器可以解析吗? 这种从定义上来讲也算是流式,其实介于传统下载和流媒体之间。
流媒体(streaming media)技术,是指将一连串的多媒体数据压缩后,经过互联网分段发送数据,在互联网上即时传输影音,以供用户观赏的一种技术。
在流媒体技术出现之前,人们必须要先下载多媒体内容到本地计算机,等待完整的多媒体内容下载完成之后,才能够欣赏多媒体的内容。流媒体技术的出现,使人们只需经过几秒或十几秒的启动延时即可欣赏媒体内容,而无需再等待媒体内容完全下载完成了
从这个定义上来说,渐进式也算是流媒体的一种,只是不够完全 彻底。

  • 20220523 泽泽打A群疫苗。不知不觉 泽泽快十个月了。泽泽是一个勇敢 安静的男孩子。陪泽泽三次打疫苗,泽泽都没哭。他妈妈说 小时候打的会哭,现在只是哭啼两小就安静了。真实勇敢的孩子。

  • 20220524 孩子妈妈和我第一次带泽泽去试听早教课。 泽泽第一次和那么多小朋友一起玩耍。有点腼腆,再游戏过程中还会有点怕,样子好搞笑。如果家长有能力的话,这样的玩耍 活动确实是有意思的。心疼泽泽。爸爸妈妈目前没有办法提供好的生活条件。

  • 20220525 泽泽今天睡的舒服,很晚才起来。他妈妈上班的时候说好想他,不舍得他。这个小伙子越来越让人怜爱了。他的四颗牙齿长得更长了,笑起来更可爱了。 早上起来的时候,精神最好。小伙子慢慢长开了,变好看了。唯一让他妈妈忧愁的就是不怎么吃奶粉,很长时间不长个 不长重。他妈妈说要让他饿一段时间,真是两难的选择。不舍却又无可奈何。

  • 20220714 泽泽周年照。泽泽最近非常有自己的想法了。出门给他带口罩,非常的不愿意,会坚决的撤掉,并且生气的扔掉它。有点脾气了。 今天去拍周年照,到达工作室,泽泽有点不愿意配合,是因为困了。 后来给他哄了睡,睡醒了才进入状态。 泽泽三套衣服,三个场景,都好看。 拍照过程也很快速,都没怎么感觉,就结束了。拍摄过程泽泽笑起来起来都显得是苦笑,也是没谁了。 不知道排出的效果会怎样。

  • 20220722 泽泽最近站的比较多了,也更愿意粘人了。早上吃饭的时候,总是爬到椅子边,扶着椅子脚慢慢站起,然后就抓着大腿,怔怔地看着我。 走到哪,他也会爬到哪。 奶奶还说,最近会懂得保护自己了。坐小推车时,差点要掉下去,要不是他双手紧紧抓着车上的扶手,就可能掉下去了。 吃鱼,也会懂得将刺满满吐出来,真是厉害了。

  • 202208xx 泽泽第一次发烧。 在做事情的时候,接到妈妈电话说泽泽有点发烧,心里就很不安。 急急赶回家。 妈妈和奶奶已经从医院回来了。 泽泽因为有点发烧,精神蔫蔫的,不像往日那般活泼。 抱起来可以感受到气息的温热。 不过,好在并不是很严重,应该是白天流汗 风吹导致的着凉。 晚上好好休息一晚上就正常了,医院开的药也没怎么吃。 小孩子有点不舒服都会让父母变得紧张,只能说孩子就是父母的软肋。

  • 20221123 泽泽要回老家吃舅舅的喜酒了。一直担心泽泽在动车上哭闹,不过担心是多余的。只要有妈妈在,泽泽就能非常的放松自在,所以在动车上泽泽也非常的乖巧。妈妈带着泽泽看看窗外,玩玩东西,吃吃东西,车上的时间也很快过去了。

  • 20221124—1130 泽泽回老家看到那么多人,刚开始的时候有点怕生和不自在,不过经过一个晚上,就完全融入了老家。 外公 外婆 舅舅 刚开始都是拒绝抱抱的,第二天就能很好的接受了。很大的原因应该是看到爸爸妈妈跟家里人不一样的关系,是亲近的,自然也就接纳了。 到了老家之后,泽泽突然间感觉理解了很多事情,能够与他进行简单的沟通交流了。能够主动要东西。知道怎么听指令做动作。知道自己吃饭要坐在自己椅子上,知道谁能够给他什么东西。 比如 外公能够给他糖吃,那么每次拿到糖的时候,都会拿到外公面前让外公剥给他吃,而不是拿到爸爸妈妈面前,因为他知道爸爸妈妈不会让他吃糖。可以拿着扫把畚斗有模有样的扫地。 知道要和哥哥好好玩耍。 感觉泽泽就是在突然间进入了可以玩耍的小孩子的状态,而不是婴儿状态。我想,还是环境的因素,家里人多,泽泽接触的人多,自然就更活泼开朗了,知道要和其他人打交道。 总之,这次回家之旅,泽泽的大变化让我们看的非常惊喜。

  • 20221208 泽泽开始呀呀学语。爸爸妈妈奶奶哥哥舅舅都说的很好。尤其鸡蛋说的最有意思,虽然没有特别的清晰,但是反而增加一丝萌意。对吃的特别感兴趣,为了吃的,能做很多动作,说很多话, 鸡蛋就是为了吃鸡蛋而说。 那种急迫的样子特别搞笑。 泽泽也变得越来越有模有样。 最令他妈妈欣慰的是,身高和体重慢慢在回归平均水平。也慢慢展现出泽泽的学习欲来, 似乎要给他进行简单的智力开发,而不是没有目的陪伴。

Here's something encrypted, password is required to continue reading.
阅读全文 »