功能目标
在手机端安装海康的客户端软件“易调试”,通过树莓派上释放的热点wifi接入,能直接访问树莓派上的eth0网络,并支持SADP协议扫描eth0网络里的海康设备。
预研
SADP
海康威视(Hikvision)SADP(Search Active Device Protocol)是一款用于搜索和管理海康威视网络摄像头和其他设备的软件工具。它可以帮助用户快速发现网络中的海康设备,并进行配置和管理。
主要功能:
- 设备搜索:自动扫描网络,找到所有连接的海康威视设备。
- 设备管理:查看设备的状态、IP地址、序列号等信息。
- 批量配置:可以对多个设备进行批量设置,包括修改IP地址、重置密码等。
- 固件升级:支持对设备进行固件更新。
- 用户友好的界面:提供直观的图形用户界面,方便用户操作。
技术方面上,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 | # sudo vi /etc/apt/sources.list |
安装hostapd,dnsmasq,bridge-utils
安装一个hostapd,并设置开机启动
1 | sudo apt install hostapd |
修改配置
File /etc/network/interfaces
1 | source /etc/network/interfaces.d/* |
配置br0后,eth0和wlan0均不再需要配置IP,br0上的IP在eth0和wlan0连个接口都可以被直接访问。
File /etc/hostapd/hostapd.conf
1 | country_code=CN |
这里的是最关键的配置,在调试过程中被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 | #interface=wlan0 # Listening interface |
这里的interface一定要指向br0
,可以理解为eth0和wlan0都已经被br0给替代了。这样当前的dnsmasq里就可以在两边的网络里同时提供DHCP服务。
启动
1 | sudo systemctl enable dnsmasq |
最好是系统直接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
保存应用。