OpenStick折腾日记

项目起因 最近网上火起了用淘宝8.8购买随身WIFI,其处理器为msm8916,这是一款4核ARMV8架构的64位处理器,酷安 社区有大佬通过逆向工程为其编译了Debian、OpenWRT镜像,本次安装的是Debian11的镜像。 环境准备 一台Windows电脑 随身Wifi 安装过程 备份原系统 为了防止我们操作失误将Stick刷成砖,我们需要先备份Stick原系统。 备份工具下载地址 提取码:4w5h 安装9008驱动,按住随身WIFI上的按钮插入电脑USB口,在电脑设备管理器-端口设备里能看到 9008 的 COM 设备就说明连接上了。 安装miko,打开文件夹MiKo_Pro,双击安装miko并将 Loader 粘贴到安装的路径下面(默认在 C:\Program Files (x86)\miko_service_tool_pro\miko_service_tool_pro),打开 Loader 然后在 miko 里依次选择 Read – Partition Backup/Earese – 点击左下角 Load Partition Structure 看到右边有系统信息的输出就说明连上了。 然后点击 Read Full Image 选个路径,取个名字就开始全量备份救砖能用的 .bin 文件。过程会比较慢,可能要十几分钟。等到跑完进度条 100% 右边的输出显示 success 就备份好了,我们就能开始随意折腾。 进入fastboot模式,备份完后重新插拔(这次重启不需要按随身wifi上的按钮),然后打开搞机工具箱,(注意此处应该显示有一台设备)选择线刷专区,重启到 Fastboot,一般重启 fastboot 后随身 Wi-Fi 会亮红灯。 刷入新系统 下载base.zip 并解压;下载debian.zip 并解压 在base文件夹下双击执行flash.bat,注意期间可能需要几次回车,完成后关闭窗口。 在debian文件夹下双击执行flash.bat,同样注意需要几次回车,完成后关闭窗口即可。 刷机完成。 基本使用 Windows通过ssh连接Stick 大佬提供的系统镜像默认开启了ssh服务,但是我们需要通过NDIS来为Stick分配网络地址,此时我们可能会遇到驱动问题,此处我建议看看OpenStick Wiki 提供的解决方案,此处我做一点补充说明,安装上面的操作后,我们会在设备管理器中发现一个未知设备,为次设备添加NDIS驱动即可。 Stick默认的IP地址为192.168.68.1 默认用户为user 密码为1 ssh [email protected] 为Stick连接Wifi 虽然随身WIFI在购买时可能厂商提供了免费的流量套餐,但是,这种免费一般都是限额的,所以我们此处考虑使用nmcli工具在命令行为OpenStick连接我们的WIFI ...

July 11, 2022 · 1 min · laning

Python正则化

Python正则化 符号 解释 示例 说明 . 匹配任意字符 b.t 可以匹配bat / but / b#t / b1t等 \w 匹配字母/数字/下划线 b\wt 可以匹配bat / b1t / b_t等 但不能匹配b#t \s 匹配空白字符(包括\r、\n、\t等) love\syou 可以匹配love you \d 匹配数字 \d\d 可以匹配01 / 23 / 99等 \b 匹配单词的边界 \bThe\b ^ 匹配字符串的开始 ^The 可以匹配The开头的字符串 $ 匹配字符串的结束 .exe$ 可以匹配.exe结尾的字符串 \W 匹配非字母/数字/下划线 b\Wt 可以匹配b#t / b@t等 但不能匹配but / b1t / b_t等 \S 匹配非空白字符 love\Syou 可以匹配love#you等 但不能匹配love you \D 匹配非数字 \d\D 可以匹配9a / 3# / 0F等 \B 匹配非单词边界 \Bio\B [] 匹配来自字符集的任意单一字符 [aeiou] 可以匹配任一元音字母字符 [^] 匹配不在字符集中的任意单一字符 [^aeiou] 可以匹配任一非元音字母字符 * 匹配0次或多次 \w* + 匹配1次或多次 \w+ ? 匹配0次或1次 \w? {N} 匹配N次 \w{3} {M,} 匹配至少M次 \w{3,} {M,N} 匹配至少M次至多N次 \w{3,6} | 分支 foo|bar 可以匹配foo或者bar (?#) 注释 (exp) 匹配exp并捕获到自动命名的组中 (?<name>exp) 匹配exp并捕获到名为name的组中 (?:exp) 匹配exp但是不捕获匹配的文本 (?=exp) 匹配exp前面的位置 \b\w+(?=ing) 可以匹配I’m dancing中的danc (?<=exp) 匹配exp后面的位置 (?<=\bdanc)\w+\b 可以匹配I love dancing and reading中的第一个ing (?!exp) 匹配后面不是exp的位置 (?<!exp) 匹配前面不是exp的位置 *? 重复任意次,但尽可能少重复 a.b a.?b 将正则表达式应用于aabab,前者会匹配整个字符串aabab,后者会匹配aab和ab两个字符串 +? 重复1次或多次,但尽可能少重复 ?? 重复0次或1次,但尽可能少重复 {M,N}? 重复M到N次,但尽可能少重复 {M,}? 重复M次以上,但尽可能少重复 Python对正则表达式的支持 Python提供了re模块来支持正则表达式相关操作,下面是re模块中的核心函数。 ...

July 8, 2022 · 1 min · laning

华迪实习

6月24日 PC与嵌入式计算机 参考微处理器与嵌入式系统设计课程内容。介绍计算机的体系结构、组成等。 开发环境及配置 介绍了在VMware中安装Ubuntu20.04LTS的方法 介绍通过运维三大神器之一sed来实现CLI换源操作,对sudo apt update命令作用做了分析介绍 安装openssh服务端,通过xshell、secureCRT、CMD、powershell等工具来实现对linux的访问,此处也介绍了systemctl命令的常用用法status、enabled、start等 介绍cd ls mkdir rm 等文件操作命令及参数 介绍文件权限管理命令chmod以及文件类型判断、文件权限修改等 介绍环境变量的概念,以及影响环境变量的多个配置文件,有系统级和用户级配置文件 介绍tar的归档打包与解包 总结 第一天实习主要工作是配置Linux(Ubuntu)环境,学习并实践Linux常用命令(主要针对的是文件管理的命令)。因为有Linux基础,学习起来相对轻松。 6月25日 vi/vim的安装与使用 vim是Linux命令行最强大的编辑器之一,快捷键操作是它最大的特点。拥有Linux基础不再过多描述这一部分 交叉编译环境的搭建 交叉编译是指在x86的平台上从源代码开始编译适用于arm架构的程序,甚至是x86_64编译arm32的程序。 Ubuntu20.04最小安装缺少基本的C的编译环境,我们可以从apt包管理器下载安装基本的编译环境 #安装为64位的环境 sudo apt install build-essential #若需要32位的函数库支持 sudo apt-get install lib32stdc++6 #为gcc编译32位程序做准备 sudo dpkg --add-architecture i386 sudo apt update sudo apt install gcc-multilib g++-multilib 至此,我们搭建了Ubuntu上编译x86和x86_64位C程序的环境,接下来我们通过SecureFX、winSCP等软件上传开发板的arm下的C语言编译器,并进行如下操作 #此为归档文件,我们用tar命令解包,注意此为绿色软件(已经编译好的二进制文件),为了Linux的使用规范,我们将其解包到/usr/local下,而/usr/local是root用户的目录,普通用户需要sudo权限才能进行写的操作 sudo tar jxvf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linuxgnu.tar.bz2 -C /usr/local #检查是否安装完成 /usr/local/arm-2014.05/bin/arm-none-linux-gnueabi-gcc -V 至此,我们完成了检查编译环境的搭建,我们使用此环境简单编译hello world程序 /usr/local/arm-2014.05/bin/arm-none-linux-gnueabi-gcc hello.c -o hello 添加环境变量 sudo vim /etc/profile 添加以下内容 export PATH=/usr/local/arm-2014.05/bin:$PATH #使上面修改生效 source /etc/profile 6月24日 通过内核控制LDE亮灭 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h> int main() { int fd; int ret; fd = open("/dev/leds",O_RDWR); if (-1==fd) { printf("打开设备失败\n"); exit(1); } while(1) { ioctl(fd,0,0); ioctl(fd,1,1); sleep(1); ioctl(fd,1,0); ioctl(fd,0,1); sleep(1); } } #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h> int main() { int fd; int ret; fd = open("/dev/leds",O_RDWR); if (-1==fd) { printf("打开设备失败\n"); exit(1); } while(1) { ioctl(fd,0,0); ioctl(fd,0,1); sleep(1); ioctl(fd,1,0); ioctl(fd,1,1); sleep(1); } } Linux内核编译 Linux内核编译的重点是.config文件的修改,即自己需要选择适合自己机器(开发板)的套件,而我们为了简化难度,.config文件老师已经给出,我们执行下面的命令 ...

July 6, 2022 · 12 min · laning

Markdown学习笔记

什么是Markdown? Markdown是一种轻量标记语言,可以转换为HTML文本,Github的README.md一般遵循Markdown语法规范。 Typora编辑器 Typora支持跨平台,支持Windows、MacOS、Linux Typora支持多种导出模式,可导出为多种PDF、Latex等 Markdown基本语法 标题 # 标题名 #个数表示不同层级标题 文字 *内容*或_内容_表示斜体文字 **内容**或__内容__表示加粗字体 ***内容***或__内容___表示斜体加粗字体 ~~内容~~表示删除线 <u>内容</u>表示下划线 ***或---或___表示分割线 ==内容==表示高亮 H~2~O 下标表示 面积 m^2^ 上标表示 表情 :smile :china 列表 *或+或-创建无序列表 1.+空格创建有序列表 表格 name | price :--- | :---: chicken | 5 coco | 3 ‘:—表示左对齐:—:表示居中对齐’ 引用 > 表示引用 支持嵌套引用如>>表示二级引用 代码 `内容`表示行内代码 ```语言类型 表示代码块 跳转 [link text](link)为外部跳转 [link text](#目的名称)为内部跳转 <url>表示超链接 图片 ![link text](link)

May 28, 2022 · 1 min · laning

多平台挂载Webdav

webdav有什么用? 在日常工作应用中,我们常常有下面的需求场景:在公司没有完成的工作,可能需要在家继续办公,而我们需要同步在公司的工作进度,最朴素的解决方法就是用U盘进行拷贝,但如果你有webdav等文件传输工具,我们可以完全省去这个繁琐的过程。webdav通过挂载云盘服务到本地,在不同设备都开启webdav,即可实现资源共享;webdav是基于http的文本传输协议,这意味着如果你能接入互联网,就能实现文本共享;同时webdav可以跨平台挂载在本地使用,这意味着你不需要考虑从Linux到Windows对于中文编码方式而出现乱码不同的尴尬;同时,例如阿里云盘、群晖NAS、Google云盘等都提供了webdav服务,这意味着你可以像使用本地硬盘一样访问你的云盘资源。 声明:本人拥有群晖NAS,所以下文的配置等可能会以群晖NAS配置作为示例,但配置方法与其他云盘区别不大,有需求的可以作为参考。 Windows: Windows平台一直以其丰富的图像化软件,在这里我推荐一款好用的webdav客户端软件: RaiDrive 下载地址:https://www.raidrive.com/download RaiDrive提供可视化操作和中文界面,具体配置可自行摸索。 Linux: 图像化操作: 如果你是将Linux作为主力机的用户,并且安装了KDE、GNOME这类桌面环境,我们可以使用桌面环境的文档管理器在网络、其他位置这些地方选择挂载Webdav。 关于GNOME桌面,我的系统环境为ArchLinux+GNOME桌面,在挂载基于https的davs服务失败,但是挂载http的dav服务成功,出于安全考虑,我舍去了这种挂载方法。 命令行操作: 命令行需要安装davfs2工具: 安装: Ubuntu/Debian: sudo apt install davfs2 Arch/Manjaro:(pacman不提供这个工具,我们需要AUR来下载) yay -S davfs2 配置: /etc/davfs2/davfs2.conf 删掉前面的注释符号并修改为: use_locks 0 ignore_dav_header 1 /etc/davfs2/secrets 在文件末尾添加: https://damain:port/path username userpassword 说明:需要指定域名、端口、群晖NAS文件路径、用户名、密码 配置开机自动挂载: /etc/fstab 在文件末尾添加: https://damain:port/path /mnt/webdav davfs rw,user,uid=username,noauto 0 0 说明: username为系统用户名

May 20, 2022 · 1 min · laning

local

pip换源 配置文件地址: ~/.config/pip/pip.conf 文件内容: [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple 命令行操作: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 附清华大学开源镜像站pypi帮助: https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ .vimrc Github项目地址: https://github.com/amix/vimrc git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime sh ~/.vim_runtime/install_awesome_vimrc.sh ~/.vim_runtime/vimrcs/extended.vim中 可以禁用主题和背景色,搭配终端配置透明终端 .zshrc # Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc. # Initialization code that may require console input (password prompts, [y/n] # confirmations, etc.) must go above this block; everything else may go below. if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" fi if [[ ! -f $HOME/.zi/bin/zi.zsh ]]; then print -P "%F{33}▓▒░ %F{160}Installing (%F{33}z-shell/zi%F{160})…%f" command mkdir -p "$HOME/.zi" && command chmod g-rwX "$HOME/.zi" command git clone -q --depth=1 --branch "main" https://github.com/z-shell/zi "$HOME/.zi/bin" && \ print -P "%F{33}▓▒░ %F{34}Installation successful.%f%b" || \ print -P "%F{160}▓▒░ The clone has failed.%f%b" fi source "$HOME/.zi/bin/zi.zsh" autoload -Uz _zi (( ${+_comps} )) && _comps[zi]=_zi # examples here -> https://z-shell.pages.dev/docs/gallery/collection zicompinit # <- https://z-shell.pages.dev/docs/gallery/collection#minimal zi light-mode for \ z-shell/z-a-meta-plugins \ @annexes @molovo zi light romkatv/powerlevel10k zi light zsh-users/zsh-syntax-highlighting zi load zsh-users/zsh-completions # To customize prompt, run `p10k configure` or edit ~/.p10k.zsh. [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh alias ls="ls --color" alias ll="ls -al" eval $(thefuck --alias) alias proxy='http_proxy="127.0.0.1:10809" https_proxy="127.0.0.1:10809"' alias vi=vim # >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/usr/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/usr/etc/profile.d/conda.sh" ]; then . "/usr/etc/profile.d/conda.sh" else export PATH="/usr/bin:$PATH" fi fi unset __conda_setup # <<< conda initialize <<< alias s=sudo alias sv="sudo vim" alias spm="sudo pacman" alias sc="sudo cat" Debian/Ubuntu/Raspbian/Armbian换源 软件源配置文件地址: ...

April 22, 2022 · 3 min · laning

WireGuard配置

什么是WireGuard? WireGuard是由Jason Donenfeld等人用C语言编写的开源VPN解决方案,代码只有4000多行,Linux之父Linus Torvalds评价它是Work of art。截止2020年1月,WireGuard已经合并到Linux5.6内核中,大多数Linux版本可以做到开箱即用。 为什么是WireGuard? 就个人使用体验来说,Wireguard具有低延迟、强加密、低系统占用的特点。 需求分析? 家庭电信宽带申请到了公网IP地址,但如果在外地想访问家庭网络,或者多个无公网的计算机需要互相访问,可以考虑使用WireGuard组网。 需要什么? 一台有公网IP的服务器 其他需要组网(互相访问,但没有公网)的机器 如何开始? 关于WireGuard的配置一般的宣传都声称WireGuard具有配置简单,但就个人体验来说,WireGuard的配置过程,对新手来说并不友好,其中涉及到Linux基本操作、iptables防火墙规则、计算机网络相关等知识,这对于一些小白来说并不友好。 所以我推荐在公网服务器端用Github上的一键安装脚本: https://github.com/angristan/wireguard-install 脚本下载完成后,(root权限)首次执行需要自己配置公网的网络接口(一般为eth0)、公网IP地址(或域名)、VPN网段(默认为:10.66.66.0/24)等配置,其他配置可以保持默认即可,服务端的配置文件在/etc/wireguard/wg0.conf 再次执行脚本可以进行添加用户、移除用户、移除WireGuard等操作。添加用户操作,指定用户名和IP地址(VPN网段地址)后,会在脚本目录生成对应端的配置文件,命令行执行ls,会有名为wg0-client-username.conf配置文件,在下一步我们需要用到这个文件的内容。 在非公网端,根据操作系统的不同,可能需要安装的包不同,例如Debian系可能需要检查是否有这几个包:wireguard-tools 对于内核版本低于5.6的Linux可能还需要wireguard-dkms这个包,包依赖安装好后,使用root权限在/etc/wireguard下创建wg0.conf文件,将公网端脚本目录下的配置文件内容(wg0-client-username.conf)写入此文件。 如何进一步配置? 假设有PeerA,PeerB、PeerC三台服务器,其中PeerA为公网,B、C无公网 PeerA的/etc/wireguard/wg0.conf配置内容一般如下:(上面的脚本会自动生成,一般不需要修改!!!) [Interface] Address = 10.66.66.1/24,fd42:42:42::1/64 ListenPort = 10086 PrivateKey = PeerA私钥,脚本会自动生成 PostUp = iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ###启动wg0,防火墙操作,由脚本自动生成 PostDown = iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE ###关闭wg0时,防火墙的操作,由脚本自动生成 ### Client PeerB [Peer] PublicKey = PeerB公钥,脚本自动生成 PresharedKey = PeerB预共享密钥,脚本自动生成 AllowedIPs = 10.66.66.2/32,fd42:42:42::2/128 ### Client PeerC [Peer] PublicKey =PeerC公钥,脚本自动生成 PresharedKey = PeerC预共享密钥,脚本自动生成 AllowedIPs = 10.66.66.3/32,fd42:42:42::3/128 PeerB的/etc/wireguard/wg0.conf配置内容一般如下:(可以在PeerA脚本的目录下wg0-client-PeerBname.conf复制过来) ...

April 19, 2022 · 2 min · laning

通信协议原理实验

Github代码地址:https://github.com/laningya/UESTC-WORK/tree/master/Computer_Network/Experiment_1 一、实验室名称: 骨干传输系统实验室 二、实验项目名称: 通信协议原理实验 三、实验原理: 。利用实验所提供的通信软件,在局域网下建立全双工的通信信道用来传输比特流,通信双方可以将要传信息编码成比特流,通过软件传输,在对端进行解码。 四、 实验目的: 1、设计将汉字、英文字符等编/解码方法,并实验 2、设计在bit流基础上成帧的方法,并实验 3、 设计帧校验方法,并在有能力的情况下实现数据校验的算法 4、掌握和设计差错控制协议,在通信双方实现无差错传输 5、掌握和设计流量控制协议,避免浪费和尽量提高效率 五、实验内容: 在误码率为0时,进行信息传输,主要考验帧的定界、信息编码问题、ARQ问题 在误码率为千分之20时,进行信息传输,在上一次基础上要考虑差错控制问题 六、实验器材(设备、元器件): 1、分组实验,每组4~6人。 2、设备:计算机2台。 3、软件:通信模拟实验软件(comexpm.exe) 七、实验步骤: 1、组织实验小组成员进行实验分工。将小组成员及其分工记录在“实验报告”中。 2、根据通信模拟软件提供的传输服务,设计一个带差错控制功能的通信协议,并在“实验报告”中简要描述该协议内容,包括数据的表示方法、传送格式和通信的时序交互图。 3、使用通信模拟软件,设置误码率在0‰和20‰,实现通信过程:采用所设计的通信协议,发送方将一段文字发送给接收方,并解决这个过程中出现差错,尝试利用停等协议提高效率。在“实验记录”中记录本次通信过程:  发送方:将实验文字表示成在发送窗口要发送的文字内容;点击“发送数据”的次数;点击发送前软件发送窗口中的二进制比特数据;  接收方:点击“接收数据”的次数;每次点击接收时接收窗口中的二进制比特数据;根据接收内容还原后的文字内容。 4、根据“实验记录”中的记录信息分析所设计的通信协议的正确性、不足及其改进方法或建议,并在“实验报告”中阐述分析的结果以及自己对计算机通信设计问题和设计方法的体会。 1. 实验小组 小组名称 Spender 2. 通信协议的设计内容:  通信信息的表示方法; 要传送的信息分为两类,一类为字符,另外一类为汉字。字符由ASCII编码,故可用8Bit来进行编码;汉字使用GBK编码,GBK码用两个字节来表示一个汉字;GBK码对汉字进行了分区,用高字节(首字节)代表区号,用低字节代表该汉字在本区内的位置,例如【啊】这个汉字,它的GBK码是0XB0A1,高字节是0XB0表示它的区号,低字节0XA1表示他在0XB0区内的第0XA1个  通信信息的传送格式; 帧头:10001 标志位:0 或者 1 主要指示这是字符帧还是汉字帧 信息位:编码软件对要传输信息进行编码,并将其中出现的1000自动变换为10000,0111自动变化为01111 校验位:CRC-8循环冗余码 尾部:01110  通信双方的时序交互图。 停-等协议时序交互 3. 通信过程记录 (1)信道无差错误码时,发送的文字内容: 发送:Home agent 管理在外地的本地用户 点击“发送数据”的次数 2 。 第1次点击时发送窗口中的二进制比特数据: 10001001001000001101111101101101011001010010000000110000010110011110110010101101111001111010000010000000001101101110 第2次点击时发送窗口中的二进制比特数据: 10001111011110010111100111110110111100000001101101011010100111100001011001101111011000010110101111000010010110101101111110101100001111011000010110101111000001111101001111010011111011110110101110001110 接收:将因特网中的 AS 分为 area. 点击“接收数据”的次数 4 。 第1次点击时接收窗口中的二进制比特数据: 0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011000111010101111011111011111100101101001011011000011001100111111000011001101111010000011010110110000100101101010100000001110010101010101 CRC检验正确 1010101110111101 –将 1111001011010010 –因 1101100011001100 –特 1111100011001101 –网 1101000011010110 –中 1100010010110101 –的 第2次点击时接收窗口中的二进制比特数据: 010101010101010101010101010101010101010101010101010101010101010101010101011000100010000000100000010101001100100000000000011011100101010101010101010101 00100000 –‘空格’ 01000001 –A 01010011 –S 00100000 –‘空格’ 第3次点击时接收窗口中的二进制比特数据: 0101010101010101010101010101100011110101101011011111010101011001111000110000011101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 1101011010110111 –分 1010101011001110 –为 第4次点击时接收窗口中的二进制比特数据: 0101010101010001000100000001100000101111001001100101011000001001011110010110000111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 00100000 –‘空格’ 01100001 –a 01110010 –r 01100101 –e 01100001 –a 00101110 –. (2)信道有差错误码时,发送/接收的文字内容: 发送:Shared Tree 的形成仅基于多播组 点击“发送”的次数 5 。 第1次点击时发送窗口中的二进制比特数据: 100010010100110110100000110000010111100100110010101100100000100000001010100001111001001100101011001010010000001100101001110 第2次点击时发送窗口中的二进制比特数据: 100010010100110110100000110000010111100100110010101100100000100000001010100001111001001100101011001010010000001100101001110 ...

April 3, 2022 · 2 min · laning

树莓派自编译opencv

项目介绍 OpenCV是一个基于BSD许可发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。而树莓派作为一款非常流行的开发学习平台,很多开发者的人工智能项目都基于opencv,然而,树莓派的软件源一般提供的都是opencv3.4.0这种老版本,这个项目将分享如何在树莓派上源码编译并安装指定版本的opencv。 说在前面 即便是最新的树莓派4B代(4G)版本,在一切顺利的情况下,编译安装完成本项目也大概需要5个小时以上,所以如果没有特殊要求可以考虑用清华源(其他软件源不太清楚是否有对应的软件包)直接安装opencv,关于如何换清华源不多赘述,请自行百度。换源之后,命令行依次执行 sudo apt update sudo apt install python3-opencv 1.环境配置 (建议SSH远程连接树莓派操作,省去自己输入命令的烦恼) 现在你假设已经正确更换软件源,包括apt和pip,不换源在环境配置这一步可能会花费很多没必要花费的时间 对于一些博主进行扩容的操作思路,本人并没有进行所谓的扩容,且没有出现卡死的现象,所以本教程没有扩容这一步 安装opencv环境依赖,依次执行下面命令 sudo apt update && sudo apt install -y cmake g++ wget unzip sudo apt-get install build-essential git cmake pkg-config -y sudo apt-get install libjpeg8-dev -y sudo apt-get install libtiff5-dev -y sudo apt-get install libjasper-dev -y sudo apt-get install libpng12-dev -y sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev -y sudo apt-get install libgtk2.0-dev -y sudo apt-get install libatlas-base-dev gfortran -y 2.下载源码并解压 (建议SSH远程连接树莓派操作,省去自己输入命令的烦恼) ...

December 3, 2021 · 1 min · laning

树莓派远程访问——向日葵解决方案

项目介绍 树莓派是一款口袋型电脑,拥有丰富的外设接口,同时不错的计算能力,完善的生态(可安装多种Linux操作系统),吸引了一大批技术爱好者加入树莓派社区。要想实现远程访问树莓派GUI界面,除了常用的VNC解决方案,在这里我推荐一个工具——向日葵,它很好地解决了在无公网IP的情况下,树莓派GUI访问的问题。 1.环境要求 Raspbain_bullseye_arm64镜像,下载链接:https://mirrors.tuna.tsinghua.edu.cn/raspberry-pi-os-images/raspios_arm64/images/raspios_arm64-2021-11-08/2021-10-30-raspios-bullseye-arm64.zip 更换Debian的软件源(注意此处必须是对应系统版本Debian的软件源,而非Raspbian的软件源),更换方法如下:(参考清华大学开源软件镜像站使用帮助) 命令行执行 sudo nano /etc/apt/sources.list 注释掉原有的软件源,即在未注释行前面加#号,并复制粘贴以下内容`` deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free 依次 ctrl+o 回车 ctrl+x 如果细心观察你会发现我们这里使用了Debian11(bullseye)的系统但是使用的是Debian10(buster)的软件源,因为树莓派向日葵客户端的.deb包依赖只有buster能解决(截止2022年5月9日),如果后续需要使用可以在安装完向日葵客户端后再次换源Debian11(bullseye) 换源方法在文尾,此处可继续执行后续步骤。 接下来命令行执行下面的命令使上述变更生效 sudo apt update 2.下载并安装向日葵客户端 通过git命令克隆.deb文件地址,命令行依次执行 ...

December 3, 2021 · 1 min · laning