树莓派配置桥接网络,热点接入ETH0网络,支持SADP扫描

功能目标

在手机端安装海康的客户端软件“易调试”,通过树莓派上释放的热点wifi接入,能直接访问树莓派上的eth0网络,并支持SADP协议扫描eth0网络里的海康设备。

预研

SADP

海康威视(Hikvision)SADP(Search Active Device Protocol)是一款用于搜索和管理海康威视网络摄像头和其他设备的软件工具。它可以帮助用户快速发现网络中的海康设备,并进行配置和管理。

主要功能:

  1. 设备搜索:自动扫描网络,找到所有连接的海康威视设备。
  2. 设备管理:查看设备的状态、IP地址、序列号等信息。
  3. 批量配置:可以对多个设备进行批量设置,包括修改IP地址、重置密码等。
  4. 固件升级:支持对设备进行固件更新。
  5. 用户友好的界面:提供直观的图形用户界面,方便用户操作。

技术方面上,SADP工作在二层网络上,基于UDP实现。所以即使是没有配置或者没有获取IP,甚至配置错误IP的手机,也是可以扫描发现子网内的设备的。

常见做法

大致参考这里 https://blog.csdn.net/maizaozao/article/details/138666005 就可以配置完成支持热点接入。
通过修改iptables规则使eth0作为NAT协议的出口,就可以完成手机加入热点,并可以访问eth0内的IP设备。

1
sudo iptables -t nat -A  POSTROUTING -o eth0 -j MASQUERADE

但是当前的方案无法解决SADP扫描出设备的问题,在树莓派的eth0用tcpdump抓包后发现,使用wireshark分析后发现,手机上的易调试软件向239.255.255.250:37020发送基于ONVIF协议的udp组播,海康的设备默认会监听239.255.255.250:37020,收到指令,会向发送组播的机器,返回设备信息,也会向239.255.255.250:37020发送设备信息的组播。
所以在当前的配置下,eth0里的网络是能收到来自手机的组播消息,但是设备回复的组播消息手机却收不到,原因是NAT转发没办法把组播消息回复给手机。
所以这个方案尝试了几次发现基本走不通,那就只能尝试用桥接解决这个问题。

详细步骤

OS相关

操作是在Raspberry Pi OS lite 12 (bookworm)

安装软件

准备工作

更改APT源

1
2
3
4
5
6
7
8
9
# sudo vi /etc/apt/sources.list

deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm main contrib non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm-updates main contrib non-free-firmware

#sudo vi /etc/apt/sources.list.d/raspi.list

deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi bookworm main

安装hostapd,dnsmasq,bridge-utils

安装一个hostapd,并设置开机启动

1
2
3
sudo apt install hostapd
sudo apt-get install bridge-utils
sudo apt install dnsmasq

修改配置

File /etc/network/interfaces

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
source /etc/network/interfaces.d/*


auto eth0
iface eth0 inet manual


auto eth1
iface eth1 inet static
address 168.168.168.168
netmask 255.255.255.0

auto wlan0
iface wlan0 inet manual

auto br0
iface br0 inet static
address 172.28.28.28
netmask 255.255.255.0
gateway 172.28.28.1
#address 192.168.10.210
#netmask 255.255.255.0
#gateway 192.168.10.1
bridge_ports eth0 wlan0
bridge_stp off # Disable Spanning Tree Protocol
bridge_fd 0 # No forwarding delay

配置br0后,eth0和wlan0均不再需要配置IP,br0上的IP在eth0和wlan0连个接口都可以被直接访问。

File /etc/hostapd/hostapd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
country_code=CN
interface=wlan0
bridge=br0
driver=nl80211
ssid=free-wifi
wpa_passphrase=free_pwd_333
wpa_key_mgmt=WPA-PSK
channel=8
auth_algs=1
wpa=2
ieee80211n=1
hw_mode=g
rsn_pairwise=CCMP TKIP
wpa_pairwise=TKIP CCMP
max_num_sta=20

这里的是最关键的配置,在调试过程中被ChatGPT误导了很多次,interface不应该是br0, 设置成br0会报错,应该指向释放热点的接口wlan0,同时在hostapd的官方文档中指出是可以指定桥接的,所以设置bridge=br0非常关键。hw_mode最好是设置成g, 如果设置成a,需要设备硬件支持。
正常到这一步,就可以在接入WiFi后,给手机配置一个静态IP就可以访问eth0的网络了。如果eth0里有DHCP,手机也会自动获取到,如果eth0网络里没有DHCP(大部分的海康设备网络里都是没有的),我们可以尝试给增加一个DHCP服务。

File /etc/dnsmasq.conf

1
2
3
4
5
#interface=wlan0 # Listening interface
interface=br0
#dhcp-range=192.168.10.100,192.168.10.200,255.255.255.0,24h
dhcp-range=172.28.28.100,172.28.28.200,255.255.255.0,24h
address=/abcd.com/172.28.28.28 # 这里是一个固定的域名配置,可以直接接入手机后访问

这里的interface一定要指向br0,可以理解为eth0和wlan0都已经被br0给替代了。这样当前的dnsmasq里就可以在两边的网络里同时提供DHCP服务。

启动

1
2
3
4
sudo systemctl enable dnsmasq
sudo systemctl enable hostapd
sudo systemctl start dnsmasq
sudo systemctl start hostapd

最好是系统直接reboot一下。

总结

到这里,应该正常的表现是,从手机连入wifi: free-wifi, 输入密码: free_pwd_333,手机能自动获取到172.28.28.x网段的IP,虽然不能访问网络,但是使用海康的SADP扫描软件就可以扫描到局域网内部的设备了。

后续工作

如果海康的实施人员使用手机接入后,如果需要再配置,那么就需要通过abcd.com域名访问预设的配置页面,输入真实的IP范围后,调用代码把上述的interfaces和dnsmasq.conf配置文件改动一下,直接重启一遍服务应该就可以了。

备注

如果功能出现问题,除了以上服务的日志外,可以考虑IP转发引起的问题。
编辑/etc/sysctl.conf,根据原有配置反向取消或者增加注释:net.ipv4.ip_forward=1,并sudo sysctl -p保存应用。

windows 11 激活

需要重装了个电脑,记录一个激活Windows 11的小方法

1
irm https://get.activated.win/ | iex

用powershell的管理员模式运行,在新弹出来的窗口选择 1, 等待一会就可以正常激活。

这种方法应该是远程调用了一个KMS激活的,看起来还挺好用。
如果不能访问网络,可以直接下载离线包

这里还有一个全是原版镜像的网站 https://next.itellyou.cn/ 刷系统必备。

近四个月的总结

5月出差安徽,认识前辈老王
6月准备啤酒节的工作,潇洒川藏之旅,值得好好记录一篇文章
7月成功保障啤酒节
8月继续保障,东北之行

活在当下

新年假期在连续两场的大雪后结束了,今天开始了新一周的正式的工作,今年特地为假期写了一个简略的手机笔记,以后需要把这个习惯好好保持下去,假期的每一天都记录下来。

假期中见到了许多人,聊到了许多事,每个场景的切换都一些唐突和无法适应,但是又合情合理。

老舅的话让我印象深刻,他说,人不能总是活在过去,过去的悔恨懊恼会让人抑郁,也不能总是活在未来,未来的彷徨未知让人焦虑,所以最好的选择是活在当下~

以前总是听到活在当下这句话,这次是真的有所理解了。

君不密则失臣,臣不密则失身,几事不密则害成。是以君子慎密而不出也。

密

Hexo保留链接隐藏文章

Hexo生成的一些文章,默认是全部被主页和标签索引的,那么有些文章不希望被索引,而且有希望通过链接直接分享给别人看,就可以利用hexo-hide-posts插件。

  1. 先安装hexo-hide-posts
    1
    npm install hexo-hide-posts --save
  2. 在想要隐藏的文章里添加hidden标记。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ---
    layout: post
    title: "Hexo保留链接隐藏文章"
    date: 2024-01-02 13:04:38 +0800
    hidden: true
    tags:
    - Hexo
    categories: Tech
    ---

只需简单这两部就可以了,虽然可以在_config.yml做一些更详细的配置,但是没必要。
重新生成文章,就可以看到隐藏的文章不在主页和标签页里了。但是可以通过链接访问,链接可以在生成文章的日志里找到。

在centos上安装immich

一直在研究怎么把自己的上万张照片找一个合适的地方放置,目前还没有定论,但是比较倾向于immich.app.

记录在centos上的安装过程。

安装docker-ce

  1. enable 阿里云里的docker-ce的repo

    1
    2
    yum install -y yum-utils
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  2. yum安装docker-ce

    1
    yum install -y docker-ce docker-ce-cli --nobest --skip-broken
  3. 启动docker-ce

    1
    2
    3
    systemctl enable docker
    systemctl start docker
    systemctl status docker # 检查是不是启动成功

通过docker compose安装immich.app

  1. 创建目录
    如果挂载了多个磁盘,建议选择一个合适的目录,immich启动后会挂载全部的所在目录。

    1
    2
    mkdir ./immich-app
    cd ./immich-app
  2. 准备 docker-compose.yml 和 example.env
    下载文件:

    1
    2
    wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
    wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

    下载后docker-compose.yml需要改动一下镜像的地址,换成国内的源。
    github的镜像源ghcr.io可以换成南京大学的ghcr.nju.edu.cn,默认dockerhub的源换成docker.nju.edu.cn,国内访问速度比较快。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    version: "3.8"

    services:
    immich-server:
    container_name: immich_server
    image: ghcr.nju.edu.cn/immich-app/immich-server:${IMMICH_VERSION:-release}
    command: [ "start.sh", "immich" ]
    volumes:
    - ${UPLOAD_LOCATION}:/usr/src/app/upload
    env_file:
    - .env
    depends_on:
    - redis
    - database
    - typesense
    restart: always

    immich-microservices:
    container_name: immich_microservices
    image: ghcr.nju.edu.cn/immich-app/immich-server:${IMMICH_VERSION:-release}
    # extends:
    # file: hwaccel.yml
    # service: hwaccel
    command: [ "start.sh", "microservices" ]
    volumes:
    - ${UPLOAD_LOCATION}:/usr/src/app/upload
    env_file:
    - .env
    depends_on:
    - redis
    - database
    - typesense
    restart: always

    immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.nju.edu.cn/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    volumes:
    - model-cache:/cache
    env_file:
    - .env
    restart: always

    immich-web:
    container_name: immich_web
    image: ghcr.nju.edu.cn/immich-app/immich-web:${IMMICH_VERSION:-release}
    env_file:
    - .env
    restart: always

    typesense:
    container_name: immich_typesense
    image: docker.nju.edu.cn/typesense/typesense:0.24.1@sha256:9bcff2b829f12074426ca044b56160ca9d777a0c488303469143dd9f8259d4dd
    environment:
    - TYPESENSE_API_KEY=${TYPESENSE_API_KEY}
    - TYPESENSE_DATA_DIR=/data
    # remove this to get debug messages
    - GLOG_minloglevel=1
    volumes:
    - tsdata:/data
    restart: always

    redis:
    container_name: immich_redis
    image: docker.nju.edu.cn/redis:6.2-alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3
    restart: always

    database:
    container_name: immich_postgres
    image: docker.nju.edu.cn/postgres:14-alpine@sha256:28407a9961e76f2d285dc6991e8e48893503cc3836a4755bbc2d40bcc272a441
    env_file:
    - .env
    environment:
    POSTGRES_PASSWORD: ${DB_PASSWORD}
    POSTGRES_USER: ${DB_USERNAME}
    POSTGRES_DB: ${DB_DATABASE_NAME}
    volumes:
    - pgdata:/var/lib/postgresql/data
    restart: always

    immich-proxy:
    container_name: immich_proxy
    image: ghcr.nju.edu.cn/immich-app/immich-proxy:${IMMICH_VERSION:-release}
    environment:
    # Make sure these values get passed through from the env file
    - IMMICH_SERVER_URL
    - IMMICH_WEB_URL
    ports:
    - 5003:8080
    depends_on:
    - immich-server
    - immich-web
    restart: always

    volumes:
    pgdata:
    model-cache:
    tsdata:

.env不需要改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables

# The location where your uploaded files are stored
UPLOAD_LOCATION=./library

# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release

# Connection secrets for postgres and typesense. You should change these to random passwords
TYPESENSE_API_KEY=some-random-text
DB_PASSWORD=postgres

# The values below this line do not need to be changed
###################################################################################
DB_HOSTNAME=immich_postgres
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

REDIS_HOSTNAME=immich_redis

  1. 确认docker-compose.yml文件中immich-proxy段落里的ports端口没有问题,启动immich。

    1
    docker compose up -d
  2. 访问 http://{ip}:{port}


Powered by Hexo and Hexo-theme-hiker

Copyright © 2012 - 2025 tiaobug.com All Rights Reserved.

鲁ICP备2024124237号-1