分类目录归档:未分类

adb offline

/dev/usb-ffs/adb
ep0
ep1
ep2

配置目录
/sys/kernel/config/usb_gadget/g1
/sys/kernel/config/usb_gadget/g1/configs/c.1
/sys/kernel/config/usb_gadget/g1/functions/ffs.adb

在 Linux-3.8 以后,Android 的内核分支,便去掉了 f_adb,改使用 USB function FS,在用户空间实现 USB adb 功能。

configfs on /sys/kernel/config type configfs (rw,relatime)
mount none cfg -t configfs


adb on /dev/usb-ffs/adb type functionfs (rw,relatime)
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb

在adbd的初始化流程中,我们在adbd_main()函数中看到有调用usb_init()函数,usb_init()函数就是usb初始化的入口。我们先看看usb_init()函数是如何被调用的:

bool is_usb = false;
if (access(USB_FFS_ADB_EP0, F_OK) == 0) {
    // Listen on USB.
    usb_init();
    is_usb = true;
}


void usb_init() {
    dummy_fd = adb_open("/dev/null", O_WRONLY);
    CHECK_NE(dummy_fd, -1);
    usb_ffs_init();
}

FDN(Fixed Dialling Numbers)

在 EF_UST (USIM Service Table, 6F38) 文件中, 2号服务代表是否支持FDN

当 2号(FDN) 和/或 89号 (eCall Data) 服务启用时,

EF_FND(Fixed Dialling Numnber, 6F3B) 文件必须存在。

0008140001000000000010
12 : Short Message Service Parameters (SMSP) : available
19 : Service Provider Name : available
21 : MSISDN : available
33 : shall be set to ‘1’ : available
85 : EPS Mobility Management Information : available

02000800030000000000
2 : Fixed Dialling Numbers (FDN) : available
20 : User controlled PLMN selector with Access Technology : available
33 : shall be set to ‘1’ : available
34 : Enabled Services Table : available

======================
EF_FDN (Fixed Dialling Numbers)

6F3B
文件条目的内容是 Fixed Dialling Numbers (FDN) 和/或 Supplementary Service Control strings (SSC)

另外EF_FND还 包含 关联网络/承载能力的标识符和 USIM ADF 级 扩展记录的标识符。 它还可能包含相关的 alpha 标记。

如果 USIM 中存在此文件,则EST文件也应存在(用来启用和关闭相关的功能)

1-x Alpha Identifier 可选,一个名字,我们可以用这个更好地分辨一个记录
x+1 BCD number/SSC contents的长度,
x+2 TON 和 NPI
x+3到x+12 Dialling Number/SSC String 共10个字节
x+13 Capability/Configuration2 Record Identifier
x+14 Extension2 Record Identifier

有关所有数据项的内容和编码,请参见 EF_ADN 的相应数据项,但有个例外,就是 扩展记录存储在 EF_EXT2 中。
===================================================================
EF_EST (Enabled Services Table)
6F56

00

==============================
EF_FDNURI (Fixed Dialling Numbers URI)
6FED

mbim

查询sim卡信息

mbimcli -d /dev/cdc-wdm0  -p  --query-subscriber-ready-status
[/dev/cdc-wdm0] Subscriber ready status retrieved:
	      Ready state: 'initialized'
	    Subscriber ID: '4600120896123456'
	        SIM ICCID: '89860112345678'
	       Ready info: 'none'
	Telephone numbers: (1) '+86166'


查询无线电状态

 mbimcli -d /dev/cdc-wdm0 -p  --query-radio-state
[/dev/cdc-wdm0] Radio state retrieved:
	     Hardware radio state: 'on'
	     Software radio state: 'on'

查询信号强度

# mbimcli -d /dev/cdc-wdm0 -p  --query-signal-state 
[/dev/cdc-wdm0] Signal state:
	          RSSI [0-31,99]: '14'
	     Error rate [0-7,99]: '99'
	Signal strength interval: '5'
	          RSSI threshold: '2'
	    Error rate threshold: 'unspecified'

查询注册状态

 mbimcli -d /dev/cdc-wdm0 -p   --query-registration-state
[/dev/cdc-wdm0] Registration status:
	         Network error: 'unknown'
	        Register state: 'home'
	         Register mode: 'automatic'
	Available data classes: 'custom'
	Current cellular class: 'gsm'
	           Provider ID: '46001'
	         Provider name: 'CHN-UNICOM'
	          Roaming text: 'unknown'
	    Registration flags: 'packet-service-automatic-attach'

查询当前分配的IP信息

 mbimcli -d /dev/cdc-wdm0  -p --query-ip-configuration

[/dev/cdc-wdm0] IPv4 configuration available: 'address, gateway, dns, mtu'
     IP [0]: '10.2.72.180/29'
    Gateway: '10.2.72.181'
    DNS [0]: '218.104.111.122'
    DNS [1]: '218.106.127.114'
        MTU: '1400'

[/dev/cdc-wdm0] IPv6 configuration available: 'address, gateway, dns, mtu'
     IP [0]: '2408:843f:ba26:5ab:312a:3c4c:b513:c98e/64'
    Gateway: '2408:843f:ba26:5ab:3dbc:7e6e:c2b7:3019'
    DNS [0]: '2408:8888::8'
    DNS [1]: '2408:8899::8'
        MTU: '1432'

查询包服务状态

 mbimcli -d /dev/cdc-wdm0  -p  --query-packet-service-state
[/dev/cdc-wdm0] Packet service status:
	         Network error: 'unknown'
	  Packet service state: 'attached'
	Available data classes: 'custom'
	          Uplink speed: '1200000000 bps'
	        Downlink speed: '3200000000 bps'

–attach-packet-service Attach to the packet service
–detach-packet-service Detach from the packet service
–connect=

–set-radio-state=on/off

查询连接状态

mbimcli -d /dev/cdc-wdm0  -p   --query-connection-state

[/dev/cdc-wdm0] Connection status:
	      Session ID: '0'
	Activation state: 'activated'
	Voice call state: 'none'
	         IP type: 'ipv4v6'
	    Context type: 'internet'
	   Network error: 'unknown'

流量统计

mbimcli -d /dev/cdc-wdm0  -p  --query-packet-statistics 
[/dev/cdc-wdm0] Packet statistics:
	   Octets (in): '131250057'
	  Packets (in): '184155'
	 Discards (in): '0'
	   Errors (in): '0'
	  Octets (out): '11459167'
	 Packets (out): '111663'
	Discards (out): '0'
	  Errors (out): '0'

手动开启上网

mbim-network /dev/cdc-wdm0 start
mbimcli --device=/dev/cdc-wdm0 --device-open-proxy --set-radio-state=on

ip addr flush dev wwan0
ip -6 addr flush dev wwan0
ip link set wwan0 up

ip addr add 10.2.72.180/29 dev wwan0 broadcast +
ip route add default via 10.2.72.181 dev wwan0
ip link set mtu 1400 dev wwan0

断开连接
mmcli -m 0 –simple-disconnect

列出收到的短信
mmcli -m 0 –messaging-list-sms

导出短信
mmcli -s 0 –create-file-with-data=/tmp/sms0.txt

mmcli -m 0 –enable
mmcli -m 0 –simple-disconnect

QMI UTILS也能用

qmicli --device=/dev/cdc-wdm0 --device-open-proxy --dms-get-ids
也就是 qmicli -d /dev/cdc-wdm0 -p   --dms-get-ids


qmicli --device=/dev/cdc-wdm0 --device-open-proxy --dms-get-manufacturer

qmicli --device=/dev/cdc-wdm0 --device-open-proxy --dms-get-model

 qmicli --device=/dev/cdc-wdm0 --device-open-proxy   --wds-get-packet-service-status

qmicli --device=/dev/cdc-wdm0 --device-open-proxy --uim-get-card-status





OpenWRT中的GPIO

GPIO 通常用于路由器设备中的按钮或 LED。 它们只能安全地提供(supply)或吸收(sink, 拉到GND)大约 4mA 的最大电流,激活时电压通常为 3.3V。 只有两种状态是可能的:高或低。 根据 GPIO 激活设备的方式,定义低电平有效或高电平有效。

高电平有效:GPIO 为高电平时设备被激活
低电平有效:GPIO 为低电平时设备被激活

在Linux中, GPIO可以通过SysFS接口访问 ( /sys/class/gpio/)

首先,需要得到 gpio的base

cat /sys/class/gpio/gpiochip*/base | head -n1

我的设备上,这个值是0

如果你的设备上,这个值是100, 你设置 GPIO 时,要加上这个base
比如gpio 10 , 就应该设置 100+10=110


将GPIO 51设置为高电平输出

echo "51" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio51/direction
echo "1" > /sys/class/gpio/gpio51/value

用uci控制

uci show system | grep "system.led"

定义在 /etc/config/system

config led 'led_wlan5g'
	option name 'WLAN5G'
	option sysfs 'z6001:wlan5g'
	option trigger 'netdev'
	option mode 'link tx rx'
	option dev 'wlan0'

sysfs中的位置

/sys/class/leds/

查看某个led的触发情况

cat /sys/class/leds/z6001ax:nr_power/trigger
[none] nand-disk timer default-on netdev phy0rx phy0tx phy0assoc phy0radio phy1rx phy1tx phy1assoc phy1radio

发现 none是被选中的,也就是没有触发

临时触发它

echo "default-on" > /sys/class/leds/z6001ax:nr_power/trigger

https://openwrt.org/docs/guide-user/base-system/led_configuration

python接受路由器curl命令put过来的文件

路由器需要备份一些分区文件和radiao校正信息,但是厂家固件的ssh server不支持sftp协议
需要用curl命令将 相关文件上传到 电脑

python3 -m http.server --directory /dev/shm

python自带的http server模块,可以让 路由器很方便地从 电脑中获取文件
但是上传就不行了
Receiving files over HTTP with Python
这篇文章介绍了一段代码,可以很方便地实现我想要的功能

#!/usr/bin/env python

"""Extend Python's built in HTTP server to save files

curl or wget can be used to send files with options similar to the following

  curl -X PUT --upload-file somefile.txt http://localhost:8000
  wget -O- --method=PUT --body-file=somefile.txt http://localhost:8000/somefile.txt

__Note__: curl automatically appends the filename onto the end of the URL so
the path can be omitted.

"""
import os
try:
    import http.server as server
except ImportError:
    # Handle Python 2.x
    import SimpleHTTPServer as server

class HTTPRequestHandler(server.SimpleHTTPRequestHandler):
    """Extend SimpleHTTPRequestHandler to handle PUT requests"""
    def do_PUT(self):
        """Save a file following a HTTP PUT request"""
        filename = os.path.basename(self.path)

        # Don't overwrite files
        if os.path.exists(filename):
            self.send_response(409, 'Conflict')
            self.end_headers()
            reply_body = '"%s" already exists\n' % filename
            self.wfile.write(reply_body.encode('utf-8'))
            return

        file_length = int(self.headers['Content-Length'])
        with open(filename, 'wb') as output_file:
            output_file.write(self.rfile.read(file_length))
        self.send_response(201, 'Created')
        self.end_headers()
        reply_body = 'Saved "%s"\n' % filename
        self.wfile.write(reply_body.encode('utf-8'))

if __name__ == '__main__':
    server.test(HandlerClass=HTTPRequestHandler)

保存为 http_put_server.py

python3 http_put_server.py

在路由器上运行

 curl -X PUT --upload-file mtd0  http://192.168.168.167:8000

另外一些改进版本
https://gist.github.com/darkr4y/761d7536100d2124f5d0db36d4890109
https://gist.github.com/touilleMan/eb02ea40b93e52604938

ModemManager

https://www.freedesktop.org/software/ModemManager/man/latest/mmcli.1.html

-L, –list-modems 列出所有可用的模块

mmcli -L
    /org/freedesktop/ModemManager1/Modem/0 [QUALCOMM INCORPORATED] QUECTEL Mobile Broadband Module

查看4G/5G模块信息

mmcli -m /org/freedesktop/ModemManager1/Modem/0
  -----------------------------------
  General  |                    path: /org/freedesktop/ModemManager1/Modem/0
           |               device id: 176df711bb462.......9f0c
  -----------------------------------
  Hardware |            manufacturer: QUALCOMM INCORPORATED
           |                   model: QUECTEL Mobile Broadband Module
           |       firmware revision: EC20CEFAGR06A10M4G
           |          carrier config: OpenMkt-Commercial-CU
           | carrier config revision: 05011510
           |            h/w revision: 10000
           |               supported: gsm-umts, lte
           |                          cdma-evdo, lte
           |                          lte
           |                          cdma-evdo, gsm-umts, lte
           |                 current: lte
           |            equipment id: 352...818
  -----------------------------------
  System   |                  device: /sys/devices/pci0000:00/0000:00:14.0/usb1/1-4
           |                 drivers: qmi_wwan, option
           |                  plugin: quectel
           |            primary port: cdc-wdm3
           |                   ports: cdc-wdm3 (qmi), ttyUSB0 (qcdm), ttyUSB1 (gps), 
           |                          ttyUSB2 (at), ttyUSB3 (at), wwan0 (net)
  -----------------------------------
  Status   |                    lock: sim-pin2
           |          unlock retries: sim-pin (3), sim-puk (10), sim-pin2 (3), sim-puk2 (10)
           |                   state: registered
           |             power state: on
           |             access tech: lte
           |          signal quality: 81% (cached)
 -----------------------------------
  Modes    |               supported: allowed: 4g; preferred: none
           |                 current: allowed: 4g; preferred: none
  -----------------------------------
  Bands    |               supported: egsm, dcs, utran-1, utran-8, eutran-1, eutran-3, eutran-5, 
           |                          eutran-8, eutran-34, eutran-38, eutran-39, eutran-40, eutran-41, 
           |                          cdma-bc0
           |                 current: egsm, dcs, utran-1, utran-8, eutran-1, eutran-3, eutran-5, 
           |                          eutran-8, eutran-34, eutran-38, eutran-39, eutran-40, eutran-41, 
           |                          cdma-bc0

https://ten64doc.traverse.com.au/applications/cellular/

中国大陆5G频谱划分

中国移动 广电移动 共建共享
700M 60M带宽
上行 703~733
下行 758~788
落在 n28频段 (703 – 748 上行 758 – 803 下行)


2.5G频段 100M带宽 2515~2615MHz 另外 2615~2675 暂时用于4g
落在 n41频段 (2496 – 2690 )


4.9G频段
中国移动 100M带宽 4800-4900MHz
中国广电 60M带宽 4900~4960MMHz
落在 n79 频段 (4400 – 5000)

==========================

中国联通 中国电信 共建共享

中国电信 3400M~3500M
中国联通 3500M~3600M
落在 n78 频段 (3300 – 3800)

ICMPv6

参考资料:
https://enupal.com/blog/como-funciona-icmpv6
https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml
http://wiki.webperfect.ch/images/4/49/IPv6_Cheatsheet.pdf

第一条消息: Multicast Listener Report Message v2
类型: 143
RFC: 3810

这些消息被发送到所有节点, 用来向相邻路由器报告 多播侦听器的当前状态或更改多播侦听器或其接口的状态。

MAC层的目标地址是 33:33:00:00:00:16 (IPv6mcast_16)
IP层的目标地址是 FF02::16 (All MLDv2-capable routers)
MLD (Multicast Listener Discovery)


第二条消息: Neighbor Solicitation
类型: 135
RFC: 2461

MAC层目标地址: 33:33:ff:20:70:45
IP层目标地址: ff02::1:ff20:7045 ( 上一个消息中登记的Multicast Address Record Changed to exclude)

声明自己的 本地链路IPV6地址

对邻居发现协议最重要的补充 可能是 形式化参数交换的功能和确定邻居主机存在的方法。 这些任务包括 IPv6 中的新地址解析方法,以及下一跳确定和邻居不可访问检测过程。 它们需要使用两个 ICMPv6 消息:Neighbor Solicitation 和 Neighbor Advertisement 。

邻居请求(Neighbor Solicitation)消息允许设备验证邻居是否存在且可访问,并启动地址解析。 邻居通告(Neighbor Advertisement) 消息确认主机或路由器的存在,并在必要时提供地址信息层。 如您所见,这两条消息类似于路由器通告(router advertisements)和路由器请求(router request )消息,但用途不同,包含不同的参数。


第3条消息: 以自己 fe80::bad0: 的本地链路IPV6地址, 再发 Multicast Listener Report Message v2


第4条消息:Router Solicitation
类型: 133
RFC: 2461

源头 本地链路 FE80::
目标 FF02::2

主机发送此类消息以要求路由器快速生成路由器通告(Router Advertisements )或路由器警告(Router Warnings)。


第4条消息:Router Solicitation
类型: 134
RFC:

源地址 路由器的本地IPV6地址 fe80::b4d2:f3ff:fe22:47a2
目标 主机的本地IPV6 fe80::bad0:b04:e320:7045

通告的选项有
源链路层地址:路由器的MAC地址
MTU: 1400
Prefix information 前缀信息 2408:811f:51cb:2d::
Recursive DNS Server 2408:844f:cb51:2d::c9


第5条: 再发 Multicast Listener Report Message v2
加入新的 exclude地址 ,新生成的接口地址 ff02::1:ff4d:aba8


第6条:再发 Neighbor Solicitation

声明自己的全局IPV6地址:

第7条: 收到路由器发来的 Neighbor Solicitation

第8条: 主机发出 Neighbor Adversisement
类型: 136

目标地址 fe80::b4d2:f3ff:fe22:47a2

告诉读 自己占有 的本地IPV6地址, 以后你们可以用这个地址联系我

第9条: 主机发出 Neighbor Solicitation
这次的源地址是 全局IPV6地址
目的地址: ff02::1:ff00:c9
声明的 target 是自己新的 非隐私IPV6地址

第10条: 主机发出 Neighbor Adversisement
源地址: 新的非隐私IPv6地址