-
-
Save Erol444/85d6ef7ae9c946f5688854b86c548dc7 to your computer and use it in GitHub Desktop.
OAK MxID to Mac address utility
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
g++ mxid2mac.cpp -o mxid2mac |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdio> | |
#include <array> | |
#include <cstdint> | |
#include <string> | |
uint32_t sbr_initial_checksum() { | |
return 5381; | |
} | |
uint32_t sbr_compute_checksum_prev(const void* buffer, uint32_t size, uint32_t prev_checksum) { | |
uint32_t checksum = prev_checksum; | |
uint8_t* p = (uint8_t*)buffer; | |
for(unsigned int i = 0; i < size; i++) { | |
checksum = ((checksum << 5) + checksum) + p[i]; /* hash * 33 + p[i] */ | |
} | |
return checksum; | |
} | |
uint32_t sbr_compute_checksum(const void* buffer, uint32_t size) { | |
return sbr_compute_checksum_prev(buffer, size, sbr_initial_checksum()); | |
} | |
// LUXONIS MAC base 44-A9-2C-3 | |
static std::array<uint8_t, 6> macAddressOverride = {}; | |
constexpr const uint8_t LUXONIS_MAC_ADDRESS_BASE[] = {0x44, 0xA9, 0x2C, 0x30, 0x00, 0x00}; | |
std::string mxid2mac(std::string mxid) { | |
uint8_t eaddr[] = {0x44, 0xA9, 0x2C, 0x30, 0x00, 0x00}; | |
int len = mxid.size(); | |
uint32_t checksum = sbr_compute_checksum(mxid.c_str(), len); | |
uint8_t deviceMacAddress[] = { | |
0x00, 0x00, 0x00, | |
static_cast<uint8_t>((checksum >> 16) & 0x0F), | |
static_cast<uint8_t>((checksum >> 8) & 0xFF), | |
static_cast<uint8_t>(checksum & 0xFF) | |
}; | |
for(int i = 0; i < 6; i++){ | |
eaddr[i] = LUXONIS_MAC_ADDRESS_BASE[i] | deviceMacAddress[i]; | |
} | |
std::string res = ""; | |
for(int i = 0; i < 6; i++){ | |
char buff[16] = {}; | |
if(i < 5){ | |
snprintf(buff, sizeof(buff), "%02X:", eaddr[i]); | |
// printf("%02X:", eaddr[i]); | |
} else { | |
snprintf(buff, sizeof(buff), "%02X", eaddr[i]); | |
// printf("%02X\n", eaddr[i]); | |
} | |
res += buff; | |
} | |
return res; | |
} | |
int main(int argc, char** argv) { | |
if(argc <= 1) { | |
printf("Usage: %s [mxid]\n", argv[0]); | |
return -1; | |
} | |
printf("%s\n", mxid2mac(argv[1]).c_str()); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment