Merge pull request #50 from virmaior/master

Create usb-direct.md
This commit is contained in:
gtxaspec 2022-05-23 18:42:13 -07:00 committed by GitHub
commit 5232be3167
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

236
documentation/usb-direct.md Normal file
View File

@ -0,0 +1,236 @@
# wz_mini_hacks -> USB Direct Implementation
There's a lot of confusing information about usb direct. There are several different standards and several different arrangements you can find information about:
This is *ethernet over usb* -- not *usb over ethernet* and not *an ethernet adapter over usb*.
## On the Device
set:
```
ENABLE_USB_DIRECT="true"
```
make sure that `ENABLE_USB_ETH="false"` and `ENABLE_USB_RNDIS="false"` as you can't use them all at once.
I also strongly recommend setting
```
USB_DIRECT_MAC_ADDR="02:FF:FF:FF:FF:01"
```
for each device both to avoid conflicts and to be able to assign ip addresses.
## The Cable
The cable supplied with the wyze v3 is a power-only cable. It will not work for USB DIRECT because it doesn't have the data lines
## On Your Host
I'm using Raspbian "Buster" but much of what I'm writing will apply to most modern linux distributions.
When you plug in a usb direct NCM device, it will create a **network.** Assuming you have no other usb-based networks, it will be usb0.
Since it is a **network**, the host will have a *host ip* and the wyze cam will be accessible via its *client ip*.
If you don't set any options beforehand, the *host ip* will be a private ip (169.254.xxx.xxx/16). **In other words, you won't be able to access the camera**.
### One-Camera Setup
To resolve this for *one camera*, you need to give the network interface:
1. a static *host ip* address
2. an ip range for the network
3. assign an ip address for the *client ip*.
#### One-Camera with /etc/network/interfaces
if you are using /etc/network/interfaces, this looks like:
```
allow-hotplug usb0
auto usb0
iface usb0 inet manual
address 192.168.9.1
netmask 255.255.255.0
```
and then for dnsmasq.conf:
```
interface=usb0
dhcp-range=usb0,192.168.5.2,192.168.5.255,255.255.255.0,24h
dhcp-host=usb0,02:FF:FF:FF:FF:01,192.168.5.101
```
#### One-Camera with dhcpcd.conf / dnsmasq.conf
if you are using /etc/dhcpcd.conf, this looks like:
```
interface usb0
static ip_address=192.168.5.1/24
nohook wpa_supplicant
```
in conjunction with /etc/dnsmasq.conf :
```
interface=usb0
dhcp-range=usb0,192.168.5.2,192.168.5.255,255.255.255.0,24h
dhcp-host=usb0,02:FF:FF:FF:FF:01,192.168.5.101
```
after that, restart dhcdpcd and dnsmasq and connect your wyze v3 and it should work.
#### One-camera with systemd-networkd
(Unfortunately I don't have a system with this configuration).
### Multiple-Camera Setup
Since each usb direct device will create its own **network interface**, if you use the above solution for multiple cameras, you're going to wind up with quite a few different networks that can't see each other.
WORSE: Depending on the order in which you turn on the usb direct devices, they will be assigned to different **network interfaces**. E.g.,
* On Monday: Camera 1 turns on first = usb0; Camera 2 turns on second = usb1 ...
* On Tuesday: Camera 2 turns on first = usb0; Camera 2 turns on second = usb2 ...
This will break the dhcp behavior above and make your cameras inaccessible. You could play whack-a-mole by setting up assignments for each camera in each subnet and then trying them all ...
The solution is to bridge together all of your usb direct devices so they appear as a single subnet. This will make it so that all *client ip* addresses are visible in the same subnet and can be assigned using the same dhcp-range.
#### Multiple Camera bridge setup systemd-networkd
I think this is also possible using systemd-networkd using for instance: https://forums.raspberrypi.com/viewtopic.php?t=298451
The systemd-networkd solution has the added bonus of being less lengthy since you can use wildcards
#### Multiple Camera bridge setup : dhcpcd.conf , dnsmasq.conf , /etc/network/interfaces
In my case, I was wary to switch to networkd since my pi is already running a few other network related items.
As far as I can tell, this cannot be done using *only* dhcpcd.conf because the usb direct interfaces hotplug.
First, Install bridging or make sure its installed
Second, start the bridge:
```
$ brctl addbr br0
$ ip link add name br0 type bridge
$ ip link set dev br0 up
```
Third, edit /etc/dhcpcd.conf:
```
denyinterfaces br0 usb0 usb1 usb2 usb3 usb4 usb5 usb6
interface br0
static ip_address=192.168.9.1/24
nohook wpa_supplicant
```
Deny interfaces tells dhcpcd not to control those items.
Fourth, add network interfaces to the /etc/network/interfaces system
In my case, I had to put them in a different file /etc/network/interfaces.d/10-bridge.conf to avoid a check that dhcpcd does:
```
auto br0
iface br0 inet static
address 192.168.9.1
netmask 255.255.255.0
bridge_ports usb0 usb1 usb2 usb3 usb4 usb5 usb6
allow-hotplug usb0
allow-hotplug usb1
allow-hotplug usb2
allow-hotplug usb3
allow-hotplug usb4
allow-hotplug usb5
allow-hotplug usb6
auto usb0
iface usb0 inet manual
address 192.168.9.10
netmask 255.255.255.0
up ifconfig usb0 up
up brctl addif br0 usb0
auto usb1
iface usb1 inet manual
address 192.168.9.11
netmask 255.255.255.0
up ifconfig usb1 up
up brctl addif br0 usb1
auto usb2
iface usb2 inet manual
address 192.168.9.12
netmask 255.255.255.0
up ifconfig usb2 up
up brctl addif br0 usb2
auto usb3
iface usb3 inet manual
address 192.168.9.13
netmask 255.255.255.0
up ifconfig usb3 up
up brctl addif br0 usb3
auto usb4
iface usb4 inet manual
address 192.168.9.14
netmask 255.255.255.0
up ifconfig usb4 up
up brctl addif br0 usb4
auto usb5
iface usb5 inet manual
address 192.168.9.15
netmask 255.255.255.0
up ifconfig usb5 up
up brctl addif br0 usb5
auto usb6
iface usb6 inet manual
address 192.168.9.16
netmask 255.255.255.0
up ifconfig usb6 up
up brctl addif br0 usb6
```
Fifth,
dnsmasq.conf:
```
interface=br0
dhcp-range=br0,192.168.9.2,192.168.9.255,255.255.255.0,24h
dhcp-host=br0,02:FF:FF:FF:FF:01,192.168.9.101
dhcp-host=br0,02:FF:FF:FF:FF:02,192.168.9.102
dhcp-host=br0,02:FF:FF:FF:FF:03,192.168.9.103
dhcp-host=br0,02:FF:FF:FF:FF:04,192.168.9.104
dhcp-host=br0,02:FF:FF:FF:FF:05,192.168.9.105
dhcp-host=br0,02:FF:FF:FF:FF:06,192.168.9.106
dhcp-host=br0,02:FF:FF:FF:FF:07,192.168.9.107
```
**interface** tells dnsmasq what network interface to monitor
**dhcp-range** tells it what range it assigns over
**dhcp-host** tells what interface / what mac address gets what ip address (apparently in *very* old version of dnsmasq you could not set the interface at the beginning)
Finally, restart dhcpcd and dnsmasq and turn on your usb direct device
You should be able to access the cameras at 192.168.9.101 - 192.168.9.107
(you would need to modify /etc/network/interfaces and dnsmasq.conf to expand past 7 cameras )