POE set IP¶
This script allows you to set static or dynamic IP, or clear bootloader config on your OAK-POE device.
Warning
Make sure to set mask and gateway correctly! If they are set incorrectly you will soft-brick your device (you won’t be able to access it), and will have to factory reset your OAK PoE.
Note
We suggest using Device Manager, a GUI tool for interfacing with the bootloader and its configurations.
Demo¶
Example script output:
Found device with name: 192.168.1.136
-------------------------------------
"1" to set a static IPv4 address
"2" to set a dynamic IPv4 address
"3" to clear the config
1
-------------------------------------
Enter IPv4: 192.168.1.200
Enter IPv4 Mask: 255.255.255.0
Enter IPv4 Gateway: 192.168.1.1
Flashing static IPv4 192.168.1.200, mask 255.255.255.0, gateway 192.168.1.1 to the POE device. Enter 'y' to confirm. y
Flashing successful.
If you run the same example again after 10 seconds, you will see that IP changed to 192.168.1.200:
Found device with name: 192.168.1.200
-------------------------------------
"1" to set a static IPv4 address
"2" to set a dynamic IPv4 address
"3" to clear the config
You can now also use the Manually specify device IP
script and change the IP to 192.168.1.200
.
Setup¶
Please run the install script to download all required dependencies. Please note that this script must be ran from git context, so you have to download the depthai-python repository first and then run the script
git clone https://github.com/luxonis/depthai-python.git
cd depthai-python/examples
python3 install_requirements.py
For additional information, please follow installation guide
Source code¶
Also available on GitHub
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 | import depthai as dai
(found, info) = dai.DeviceBootloader.getFirstAvailableDevice()
def check_str(s: str):
spl = s.split(".")
if len(spl) != 4:
raise ValueError(f"Entered value {s} doesn't contain 3 dots. Value has to be in the following format: '255.255.255.255'")
for num in spl:
if 255 < int(num):
raise ValueError("Entered values can't be above 255!")
return s
if found:
print(f'Found device with name: {info.name}')
print('-------------------------------------')
print('"1" to set a static IPv4 address')
print('"2" to set a dynamic IPv4 address')
print('"3" to clear the config')
key = input('Enter the number: ').strip()
print('-------------------------------------')
if int(key) < 1 or 3 < int(key):
raise ValueError("Entered value should either be '1', '2' or '3'!")
with dai.DeviceBootloader(info) as bl:
if key in ['1', '2']:
ipv4 = check_str(input("Enter IPv4: ").strip())
mask = check_str(input("Enter IPv4 Mask: ").strip())
gateway = check_str(input("Enter IPv4 Gateway: ").strip())
mode = 'static' if key == '1' else 'dynamic'
val = input(f"Flashing {mode} IPv4 {ipv4}, mask {mask}, gateway {gateway} to the POE device. Enter 'y' to confirm. ").strip()
if val != 'y':
raise Exception("Flashing aborted.")
conf = dai.DeviceBootloader.Config()
if key == '1': conf.setStaticIPv4(ipv4, mask, gateway)
elif key == '2': conf.setDynamicIPv4(ipv4, mask, gateway)
(success, error) = bl.flashConfig(conf)
elif key == '3':
(success, error) = bl.flashConfigClear()
if not success:
print(f"Flashing failed: {error}")
else:
print(f"Flashing successful.")
|
Also available on GitHub
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 99 100 101 | #include <chrono>
#include <iostream>
#include <string>
#include "depthai/depthai.hpp"
#include "depthai/xlink/XLinkConnection.hpp"
// for string delimiter
std::vector<int> split(std::string s, std::string delimiter) {
size_t pos_start = 0, pos_end, delim_len = delimiter.length();
std::string token;
std::vector<int> res;
while((pos_end = s.find(delimiter, pos_start)) != std::string::npos) {
token = s.substr(pos_start, pos_end - pos_start);
pos_start = pos_end + delim_len;
res.push_back(stoi(token));
}
res.push_back(stoi(s.substr(pos_start)));
return res;
}
std::string checkStr(std::string str) {
std::vector<int> v = split(str, ".");
if(v.size() != 4) {
std::cout << "Entered value " << str << " doesn't contain 3 dots. Value has to be in the following format: '255.255.255.255'" << std::endl;
exit(0);
}
for(auto i : v) {
if(i < 0 || 255 < i) {
std::cout << "Entered values can't be above 255!" << std::endl;
exit(0);
}
}
return str;
}
int main(int argc, char** argv) {
bool found = false;
dai::DeviceInfo info;
std::tie(found, info) = dai::DeviceBootloader::getFirstAvailableDevice();
if(!found) {
std::cout << "No device found to flash. Exiting." << std::endl;
return -1;
}
std::cout << "Found device with name: " << info.getMxId() << std::endl;
std::cout << "-------------------------------------" << std::endl;
std::cout << "\"1\" to set a static IPv4 address" << std::endl;
std::cout << "\"2\" to set a dynamic IPv4 address" << std::endl;
std::cout << "\"3\" to clear the config" << std::endl;
auto key = std::cin.get();
std::cout << "-------------------------------------" << std::endl;
bool success = false;
std::string error;
dai::DeviceBootloader bl(info, true);
if(key == '1' || key == '2') {
std::string ip, mask, gateway, in;
std::cout << "Enter IPv4: ";
std::cin >> ip;
checkStr(ip);
std::cout << "Enter IPv4 Mask: ";
std::cin >> mask;
checkStr(mask);
std::cout << "Enter IPv4 Gateway: ";
std::cin >> gateway;
checkStr(gateway);
std::string mode = "static";
if(key == '2') mode = "dynamic";
std::cout << "Flashing " << mode << " IPv4 " << ip << ", mask " << mask << ", gateway " << gateway << " to the POE device. Enter 'y' to confirm. ";
std::cin >> in;
if(in != "y") {
std::cout << "Flashing aborted.";
return 0;
}
auto conf = dai::DeviceBootloader::Config();
if(key == '1') {
conf.setStaticIPv4(ip, mask, gateway);
} else {
conf.setDynamicIPv4(ip, mask, gateway);
}
std::tie(success, error) = bl.flashConfig(conf);
} else if(key == '3') {
std::tie(success, error) = bl.flashConfigClear();
} else {
std::cout << "Entered value should either be '1', '2' or '3'!";
return 0;
}
if(success) {
std::cout << "Flashing successful." << std::endl;
} else {
std::cout << "Flashing failed: " << error << std::endl;
}
}
|