Dzisiaj przedstawię fragment kodu odpowiedzialnego za wyświetlenie jakiejkolwiek zmiennej tekstowej na obrazie z kamery HIKVISION np. temperatury, wykorzystując protokół ISAPI.
Protokół ISAPI nie działa z każdym rejestratorem / kamerą, z moich testów na kilku modelach rejestratorów i kamer i z opisu protokołu wynika że mimo prawidłowo zredagowanej komendy, rejestrator / kamera ją zrozumie, odpowie na otrzymaną komendę "OK" ale nie wyświetli nic na obrazie, tak więc chybił trafił czy zadziała. U mnie ostatecznie zadziałało na 3 kamerach IP. Zmienną tekstową sugerują wysyłać do rejestratora / kamery nie częściej niż co parę sekund.
Code: Select all
#define IP_Kamera1 "192.168.X.X"
#define Port_Kamera1 80
#define Haslo_Kamera1 "XXXXXXXXXXXXXXXX" //Hasło zapisane w BASE64, w kamerze musi być włączono opcja bezpieczeństwa DIGITEST/BASIC
String ID;
String enabled;
String posX;
String posY;
String channel_num;
String ip_kamera;
int port_kamera;
String Autoryzacja;
String message;
void setup(){
//Połaczenie z WIFI
}
void loop() {
channel_num = "1"; //W przypadku kamery "1", w przypadku rejetratora liczba z numerem kanału.
ip_kamera = IP_Kamera1;
port_kamera = Port_Kamera1;
Autoryzacja = Haslo_Kamera1;
ID = String("1"); //Numer pola do którego wpisujemy teskt z reguły wartości od 1 do 4, ale są kamery gdzie jest tylko 1.
enabled = "true"; //Włączenie OSD kamery, "false" = wyłączenie
posX = "1"; //Pozycja X OSD
posY = "480"; //Pozycja Y OSD
message = "Jakis tekst"; //Tutaj wprowadzamy jakiś tekst do wyświetlenia
Wyslij_do_Hikvision();
delay(10000);
}
void Wyslij_do_Hikvision() {
WiFiClient client;
if (client.connect(ip_kamera, port_kamera)) {
client.println("PUT /Video/inputs/channels/" + channel_num + "/overlays/text/1 HTTP/1.1");
client.println("Host: " + ip_kamera + ":" + String(port_kamera));
client.print("Authorization: ");
client.println("Basic " + Autoryzacja);
client.println("User-Agent: arduino");
client.println("Accept: */*");
word Length = 152 + ID.length() + enabled.length() + posX.length() + posY.length() + message.length();
client.println("Content-Length: " + String(Length));
client.println("Expect: 100-continue");
client.println("");
client.println("<?xml version='1.0' encoding='UTF-8'?>");
client.println("<TextOverlay>");
client.println("<id>" + ID + "</id>");
client.println("<enabled>" + enabled + "</enabled>");
client.println("<posX>" + posX + "</posX>");
client.println("<posY>" + posY + "</posY>");
client.println("<message>" + message + "</message>");
client.println("</TextOverlay>");
client.stop();
Serial.print(" ");
Serial.println(message);
Serial.println("Wysłano do HIKVISION");
} else {
Serial.print(" ");
Serial.println("Blad połączenia z HIKVISION");
}
}
Może ktoś dorzuci to do Gui-Generic?