随身WIFI折腾日记(四)---拓展USB接口读取U盘内容
五、USB行为控制
随身WIFI对外交互的接口只有WIFI和USB接口。如果要想接入其他硬件设备,拓展USB接口至关重要,对于USB接口的控制,参考如下链接:
-
openstick项目官方教程:控制usb行为
-
HandsomeMod/gc: A Simple Tool To Control Usb Gadget (github.com)
USB OTG是USB协议规范中的一部分,它支持从设备和主设备之间的双向通信。所以说USB 接口有主从2个模式,刷完openstick系统,USB默认处于 Gadget(从)模式,openstick作者开发了一个gc工具管理USB的Gadget 模式。
5.1 Gadget 模式
USB Gadget支持模拟多种设备的复合设备。虚拟复合设备可以在一个USB插槽中模拟多个USB设备,并允许以不同功能的与USB主机进行通信。
USB Gadget默认配置了2种设备,设备类型是ffs和rndis,名称分别为adb和rndis.1。adb可以让我们调试或烧录镜像, rndis.1让我们可以通过USB 与随身WIFI进行网络通讯。原作者开发的gc工具用法如下:
# 列出当前usb活动的devicegc -l# 加入一个串口设备# 有效的关键字为 serial ffs hid midi printer uvc mass rndis ecm acmgc -a serial# 删除指定串口设备 (X 为列表中的对应的config名称)gc -r serial.X# 清除所有的gadgetgc -c# 关闭gadgetgc -d# 开启gadgetgc -e
USB 作为从设备的玩法我并没有深入太久,到此为止。
5.2 配置为主模式
如果想要真正把随身WIFI搞成一台电脑,肯定是要把USB配置为主模式。
OpenStick没有usb-id脚,只能手动将usb切换为主模式来插入u盘等设备,你可以将以下语句加入 /usr/sbin/mobian-usb-gadget setup()的最开头来实现开机切换,所有usb device功能将会失效。意味着无法通过USB进行SSH连接,所以要保证随身WIFI可以连接外部网络,可以无线SSH访问。我个人采用的方案就是随身WIFI连接WIFI网络,将22端口反向代理到我的云服务器。通过我的云服务器ip地址(域名)SSH访问。
echo host > /sys/kernel/debug/usb/ci_hdrc.0/role #gadget
除此之外,我们还需要在硬件上简单拓展一下:
USB拓展坞需要买支持5V供电的,我在淘宝买的。如果动手能力较强,也可以选择使用Zy143L画的定制随身WIFI-USB拓展坞,已经开源。
5.3 插入U盘
- 插入U盘后,输入
lsblk
命令查看已有的块文件设备。可以看到刚插入的U盘的设备名称为sda,仅有一个分区sda1。
-
创建一个目录来挂载新分区。使用
mkdir /mnt/data
命令在/mnt目录下创建一个名为data的目录。 -
将新分区挂载到指定的目录中。使用如下命令将/dev/sda1分区挂载到/mnt/data目录:
mount /dev/sda1 /mnt/data
-
使用
df -Th
命令将列出所有的挂载点以及文件系统的类型。可以看到我们刚刚挂载好的文件系统,文件系统的类型是ntfs。
-
为了使每次U盘插入的时候都可以自动挂载,我们需要修改配置文件。
nano /etc/fstab
来编辑/etc/fstab
文件。(也可以使用其他编辑器,如vi或vim)在文件的最后添加一个新的行,/dev/sda1 /mnt/data ntfs defaults 0 2
解释一下这个示例行:
/dev/sda1
是新设备文件的分区。/mnt/data
是之前创建的目录。ntfs
是文件系统类型(如果您使用其他文件系统,请相应更改此项)。defaults
是挂载选项。默认选项包含了一般的挂载参数,如果您需要其他参数,可以在此处添加。0
是用于备份分区的标志,默认为0即可。2
是“在开机时自动挂载”选项,将其设置为2。
-
ls /mnt/data
就可以查看U盘的内容啦
5.4 USB主模式自启动脚本
开机启动时自动将USB接口切换为主模式是相对危险的,因为随身WIFI需要通过网络或者USB接口与外界通信。我刷的随身WIFI modem不可用,只可以通过WIFI连接网络。当遇到以下情形时,随身WIFI就砖了,就需要重新9008刷备份包了。(砖了一次)
- USB为主模式、modem不可用、WIFI意外连接失败
所以通过其他方式触发USB切换到主模式会更安全一点,我想到了3个方式:
-
手动启动:缺点是很麻烦
-
按键启动:随身WIFI上有一个按键,但是我没有在sysfs找到按键的设备节点,无法访问
-
网络状态变化时启动:当随身WIFI连接上网络时启动
个人认为第三个方式最合适。随身WIFI默认的网络管理工具NetworkManager,我们可以使用它来在 Linux 连接 WiFi 网络后自动执行特定的脚本。以下是具体步骤:
- 在
/etc/NetworkManager/dispatcher.d/
目录下创建脚本,命名为USBctl.sh
。
#!/bin/sh
echo "wlan change with:" $1 $2
case "$2" inup)echo "WiFi Connected" # 绿灯亮echovim default-on > /sys/class/leds/green:internet/trigger# 切换为主模式echo host > /sys/kernel/debug/usb/ci_hdrc.0/role;;down)echo "WiFi Closed" # 绿灯灭echo none > /sys/class/leds/green:internet/trigger# 关闭主模式echo gadget > /sys/kernel/debug/usb/ci_hdrc.0/role;;
esac
- 修改文件执行权限。
chmod +x /etc/NetworkManager/dispatcher.d/USBctl.sh
- 编辑 NetworkManager 的配置文件
/etc/NetworkManager/NetworkManager.conf
,在[main]
段中添加以下内容,用于启用dispatcher.d
目录中的脚本。
[main]
dispatcher=dispatcher.d
- 重新启动 NetworkManager 服务。
systemctl restart NetworkManager
# systemctl status NetworkManager-dispatcher.service # 打印日志用于调试
现在,当随身WIFI连接 WiFi 网络时,脚本 /etc/NetworkManager/dispatcher.d/ifup-post-wifi.sh
中的命令将自动执行。即绿灯亮起,USB设置为主模式。
NetworkManager-dispatcher(8) — Arch manual pages (archlinux.org)
用 NM-dispatcher 实现 WiFi 开关的自动控制 - sbw Blog
相关文章:

随身WIFI折腾日记(四)---拓展USB接口读取U盘内容
五、USB行为控制 随身WIFI对外交互的接口只有WIFI和USB接口。如果要想接入其他硬件设备,拓展USB接口至关重要,对于USB接口的控制,参考如下链接: openstick项目官方教程:控制usb行为 HandsomeMod/gc: A Simple Tool To Control Usb Gadget …...

【C++初阶】类与对象(中)之取地址及const取地址操作符重载(了解即可)
👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞…...
代驾公司如何管理司机
在这个几乎人人都能学车,人人都能开车的时代,代驾职业也越来越专业化和正规化。因此,想要成为一名优秀的代驾司机,一定得有过人之处,对于代驾公司来说,如何管理司机也是尤为的重要。 对于代驾公司来说&…...

面了一个5年经验的测试工程师,自动化都不会也敢喊了16k,我也是醉了····
在深圳这家金融公司也待了几年,被别人面试过也面试过别人,大大小小的事情也见识不少,今天又是团面的一天, 一百多个人都聚集在一起,因为公司最近在谈项目出来面试就2个人,无奈又被叫到面试房间。 整个过程…...

ChatGPT:你真的了解网络安全吗?浅谈攻击防御进行时之网络安全新定义
ChatGPT:你真的了解网络安全吗?浅谈网络安全攻击防御进行时 网络安全新定义总结 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序,是人工智能技术驱动…...

LeetCode_DFS_困难_1377.T 秒后青蛙的位置
目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一棵由 n 个顶点组成的无向树,顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下: 在一秒内,青蛙从它所在的当前顶点跳到另一个未访问过的顶点(如果它…...

第四十九天学习记录:C语言进阶:结构体
结构体 结构体的声明 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量 struct tag {member-list; }variable-list;问:C的new和C语言的结构体有什么异同? ChatAI答: C中的new是一个运算符ÿ…...
LeeCode [N字形变换]算法解析
关键字:数学归纳法 一、题目 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P A H N A P L S I I G Y I R …...
CPU性能提升:流水线
一条指令的执行一般要经过取指令,翻译指令,执行指令3个基本流程。CPU内部的电路分为不同的单元,取指但愿,译码单元,执行单元等。指令的执行也是按照流水线工序一步步执行的。如图2-34所示,我们假设每一个步…...

C语言指针初级
目录 一、什么是指针 二、指针和指针类型 三、野指针 1.野指针的成因: 2.如何规避野指针 四、指针运算 1.指针-整数 2. 指针之间的加减 五、二级指针 六、指针数组 一个男人,到底要走多少的路,才能成为一个真正的男人 本专栏适用于…...
C++的历史
C是一种广泛使用的编程语言。C于1983年由丹尼斯里奇(Dennis Ritchie)在贝尔实验室创造,它是C语言的扩展。C的设计初衷是为了提高代码的可重用性和可维护性。它允许开发人员使用面向对象编程(OOP)范例,这使得…...

保姆级别!!!--全网绝对教你会!!教你如何使用MQTTFX连接阿里云平台中的设备----下期告诉你如何创建!
本期需要下载的软件 MQttfx安装包,本人打包的-嵌入式文档类资源-CSDN文库 目录 第一步:建造阿里云设备 这个可以先忽略建造步骤,下期将提供步骤。 第二步:下载mqttfx软件 第三步:填写密钥信息进行连接 查看三元…...
Unexpected token ‘‘‘, “‘{“type“:““... is not valid JSON
尝试低代码schema解析JSON时报错,奇怪的是控制台解析正常,项目js执行JSON.parse()报错,简直无语了,,, 只能挨个检查了,首先温习了下JSON 的标准格式: JSON的合法符号:{(左大括号) }(右大括号) "(双引号) :(冒号) ,(逗号) [(左中括号) ](右中括号) JSON字符串:…...

关于C语言的杂记5
文章目录 引入正文内部函数与外部函数相关数组的知识点数组的初始化测试一维数组在内存中存储的地址:遍历二维数组的值测试二维数组的地址(观察内存情况)数组下标为0开始的由来 两个数交换位置的三种方法 引入 写在前面:关于C语言这部分内容,…...
YOLOv5 vs YOLOv6 vs YOLOv7目标检测模型速度和准确度的性能比较——深入研究
如果您正在进行目标检测项目,您很可能会选择众多 YOLO 模型中的一种。从现有的 YOLO 对象检测模型的数量来看,如何选择最佳模型是一个艰难的选择。 您可能会发现自己正在考虑: 选择哪种 YOLO 模型以获得最佳 FPS? CPU 与 GPU 的推理速度如何?选择哪种 GPU?微型、小型、…...

如何增加网站权重?有效提高网站权重的技巧方法
权重对于网站优化来说非常的重要,那什么是网站权重呢?网站权重是指搜索引擎给网站(包括网页)赋予一定的权威值,对网站(含网页)权威的评估评价。一个网站权重越高,在搜索引擎所占的份…...
路径规划 | 图解快速随机扩展树RRT算法(附ROS C++/Python/Matlab仿真)
目录 0 专栏介绍1 什么是RRT算法?2 图解RRT算法原理3 算法仿真与实现3.1 ROS C++实现3.2 Python实现3.3 Matlab实现0 专栏介绍 🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);…...

【Stable Diffusion WebUI】一篇文章教你如何安装和使用Stable Diffusion WebUI
文章目录 Stable Diffusion WebUI1. 安装1.1 下载 stable-diffusion-webui1.2 运行 webui.sh 2. 安装插件2.1 命令行安装2.2 extensions 安装2.3 常用插件 3. 使用教程3.1 页面布局3.3 快捷栏设置3.3.1 PNG Info3.3.2 Tagger Stable Diffusion WebUI 1. 安装 1.1 下载 stable…...

Python篇——数据结构与算法(第二部分)
目录 二、排序算法(承接第一部分) 1、堆排序算法——树的基础知识补充 2、树的基本概念 3、二叉树基础知识 (1)满二叉树 (2)完全二叉树 (3)二叉树的存储方式(表示方式…...

人工智能之读懂CNN卷积神经网络
通过往期文章的分享,我们了解了神经网络的结构,一般分为输入层,隐藏层,输出层 TensorFlow神经网络 那什么是卷积神经网络那,这就要我们追溯一下人类识别图像的原理 人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...