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(;;)
;
}
}
@Ivanh23, 👍-2
Обсуждение1 ответ
Символы-это байты. 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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
почему вы думаете, что вам нужно отправлять запрос в виде " байтов`?, @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