HTTP-запрос в байтах

Мне нужно отправить эту строку HTTP - запроса в байтах. Каков правильный путь?

client.write(byte(" <? xml version: '1.0' encoding='utf-8'?><VideoOverlay><normalizedScreenSize><normalizedScreenWidth>704</normalizedScreenWidth><normalizedScreenHeight>576</normalizedScreenHeight></normalizedScreenSize><attribute><transparent>false</transparent><flashing>false</flashing></attribute><fontSize>adaptive</fontSize><frontColorMode>auto</frontColorMode><alignment>customize</alignment><TextOverlayList><TextOverlay><id>1</id><enabled>true</enabled><displayText>dsadasdasdas</displayText><positionX>0</positionX><positionY>480</positionY></TextOverlay></TextOverlayList><DateTimeOverlay><enabled>true</enabled><positionY>544</positionY><positionX>0</positionX><dateStyle>MM-DD-YYYY</dateStyle><timeStyle>24hour</timeStyle><displayWeek>true</displayWeek></DateTimeOverlay><channelNameOverlay><enabled>true</enabled><positionY>64</positionY><positionX>16</positionX></channelNameOverlay></VideoOverlay>"));

Чтобы быть более ясным, это мой код на C# для запроса

byte[] data = encoder.GetBytes(" <? xml version: '1.0' encoding='utf-8'?><VideoOverlay><normalizedScreenSize><normalizedScreenWidth>704</normalizedScreenWidth><normalizedScreenHeight>576</normalizedScreenHeight></normalizedScreenSize><attribute><transparent>false</transparent><flashing>false</flashing></attribute><fontSize>adaptive</fontSize><frontColorMode>auto</frontColorMode><alignment>customize</alignment><TextOverlayList><TextOverlay><id>1</id><enabled>true</enabled><displayText>" + textBox1.Text + "</displayText><positionX>0</positionX><positionY>480</positionY></TextOverlay></TextOverlayList><DateTimeOverlay><enabled>true</enabled><positionY>544</positionY><positionX>0</positionX><dateStyle>MM-DD-YYYY</dateStyle><timeStyle>24hour</timeStyle><displayWeek>true</displayWeek></DateTimeOverlay><channelNameOverlay><enabled>true</enabled><positionY>64</positionY><positionX>16</positionX></channelNameOverlay></VideoOverlay>");

Это мой полный рабочий код на C#

 ServicePointManager.Expect100Continue = false;
        ASCIIEncoding encoder = new ASCIIEncoding();
        byte[] data = encoder.GetBytes(" <? xml version: '1.0' encoding='utf-8'?><VideoOverlay><normalizedScreenSize><normalizedScreenWidth>704</normalizedScreenWidth><normalizedScreenHeight>576</normalizedScreenHeight></normalizedScreenSize><attribute><transparent>false</transparent><flashing>false</flashing></attribute><fontSize>adaptive</fontSize><frontColorMode>auto</frontColorMode><alignment>customize</alignment><TextOverlayList><TextOverlay><id>1</id><enabled>true</enabled><displayText>" + textBox1.Text + "</displayText><positionX>0</positionX><positionY>480</positionY></TextOverlay></TextOverlayList><DateTimeOverlay><enabled>true</enabled><positionY>544</positionY><positionX>0</positionX><dateStyle>MM-DD-YYYY</dateStyle><timeStyle>24hour</timeStyle><displayWeek>true</displayWeek></DateTimeOverlay><channelNameOverlay><enabled>true</enabled><positionY>64</positionY><positionX>16</positionX></channelNameOverlay></VideoOverlay>");
        Uri a = new Uri("http://192.168.0.64");
        HttpWebRequest request = WebRequest.Create("http://192.168.0.64/ISAPI/System/Video/inputs/channels/1/overlays") as HttpWebRequest;
        request.Method = "PUT";
        request.Credentials = new NetworkCredential("admin", "12345qwerty");
        request.ContentLength = 888;
        request.ContentType = "application / x - www - form - urlencoded; charset = UTF - 8";
        request.ContentLength = data.Length;
        request.GetRequestStream().Write(data, 0, data.Length);
        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        response.Close();

Это версия для Arduino

#include <Ethernet.h>
#include <SPI.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 177 };
byte server[] = { 192,168, 0, 64}; // Google
String big_string="<?xml versiding='rlay>";
EthernetClient client;

void setup()
{
  Ethernet.begin(ip);
  Serial.begin(9600);

  delay(1000);

  Serial.println("connecting...");

  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.println("POST /ISAPI/System/Video/inputs/channels/1/overlays HTTP/1.0");
    client.println("Host: 192.168.0.64");
    client.println("User-Agent: arduino-ethernet");
    client.println("Authorization: Basic YWRtaW46MTIzNDVxd2VydHk=");
   client.println("Content-Type: application / x - www - form - urlencoded; charset = UTF - 8");

    client.println("content-length:888");
    // client.println();
    //client.println(big_string.length());
    client.write(" <? xml version: '1.0' encoding='utf-8'?><VideoOverlay><normalizedScreenSize><normalizedScreenWidth>704</normalizedScreenWidth><normalizedScreenHeight>576</normalizedScreenHeight></normalizedScreenSize><attribute><transparent>false</transparent><flashing>false</flashing></attribute><fontSize>adaptive</fontSize><frontColorMode>auto</frontColorMode><alignment>customize</alignment><TextOverlayList><TextOverlay><id>1</id><enabled>true</enabled><displayText>dsadasdasdas</displayText><positionX>0</positionX><positionY>480</positionY></TextOverlay></TextOverlayList><DateTimeOverlay><enabled>true</enabled><positionY>544</positionY><positionX>0</positionX><dateStyle>MM-DD-YYYY</dateStyle><timeStyle>24hour</timeStyle><displayWeek>true</displayWeek></DateTimeOverlay><channelNameOverlay><enabled>true</enabled><positionY>64</positionY><positionX>16</positionX></channelNameOverlay></VideoOverlay>");

     //client.println();
    //client.print(big_string);
    // client.println();






  } else {
    Serial.println("connection failed");
  }
}

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {

    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }
}

, 👍-2

Обсуждение

почему вы думаете, что вам нужно отправлять запрос в виде " байтов`?, @jsotola

Потому что у меня есть приложение на c#, которое работает с отправкой запроса в виде байтов , чтобы ip-камера могла их прочитать, и теперь мне нужно сделать то же самое для arduino, @Ivanh23

почему вы думаете, что строковый символ, такой как "x", не является байтом?, @jsotola

это, по-видимому, пример проблемы X-Y..... вы просите о помощи в том, что вы считаете решением своей проблемы, но скрываете детали исходной проблемы, @jsotola

сначала сократите код на C#. удалите строки с запросом.Длина содержимого = 888 и запрос.Тип содержимого. они ошибаются, поэтому их можно игнорировать. Uri a = новый Uri("http://192.168.0.64"); не используется. снимите его, @Juraj

опубликуйте также свою версию Arduino, @Juraj

Я опубликовал свою версию Arduino, @Ivanh23

удалите завершающий пробел из " , @Juraj

Я изменил его , но все равно ничего, @Ivanh23

Для одного это <?xml version='1.0' encoding='utf-8'?>и"Тип содержимого: приложение/x-www-форма-url-кодированный; кодировка=UTF-8". Во-вторых, вы указываете длину содержимого 888, в то время как строка выше содержит 895 символов. В-третьих, данные, которые вы отправляете, на самом деле не являются "application/x-www-form-urlencoded", но, скорее всего, серверу это безразлично. Наконец, вы не сказали нам, в чем заключается реальная проблема. Что не работает? Где здесь вступает в игру код C#?, @Gerben

Моя проблема в том , что на камеру ничего не отправляется, мне нужен arduino для отправки текста на дисплей ip-камеры, @Ivanh23


1 ответ


0

Символы-это байты. ASCII-коды символов-это значения. Нет никакой разницы между client.print(str) и client.write(str, strlen(str)). И client.write(str) тоже одно и то же.

В C# или Java постоянная строка имеет тип String. Это объект. Вы должны вызвать метод объекта, чтобы получить массив необработанных символов/байтов. В Arduino постоянная строка имеет тип const char* он же const char [], который на низком уровне совпадает с const byte* или const byte [].

Эквивалент C#

байт[] данных = кодер.getBytes("некоторая строка");

для символов ASCII (не UTF) в C это

байтовые данные[] = "некоторая строка";

,

Я прочитал , что (client.write) отправляет байты и (client.pritnln) Отправляет строки и символы и т. Д., Я понимаю ваш ответ. но я думаю, что это должно быть похоже на мой код на c#, который я отредактировал в своем вопросе, @Ivanh23

в C# постоянная строка имеет тип String. это объект. Вы должны вызвать функцию, чтобы получить массив символов/байтов. в Arduino постоянная строка имеет тип "const char*`, он же" const char []", который на низком уровне совпадает с "const byte*" или " const byte []"., @Juraj

И как бы это можно было сделать ? извините, я не так хорош в программировании, и у меня немного проблемы с массивом байтов, @Ivanh23

без byte(. это неправильно, @Juraj

Еще один вопрос, как насчет библиотеки Json ? можно ли его использовать для решения этой проблемы ?, @Ivanh23

это xml, а не json, @Juraj

у вас есть рабочий код на C#, и вы не можете переписать его на Arduino?, @Juraj

Да, у меня есть полный рабочий код на c#, но я не могу переписать его на Arduino, @Ivanh23

Я опубликовал это в своем вопросе, @Ivanh23