我想向我的传感器发送http POST请求和XML内容:
对于计数数据:
http://{SensorIP}:5211/1.0-PAI/PassengerCountingService/SubscribeAllData
XML数据:
<SubscribeRequest>
<Client-IP-Address>
<Value>{HostIP}</Value>
</Client-IP-Address>
<ReplyPort>
<Value>{YourReplyPort}</Value>
</ReplyPort>
<ReplyPath>
<Value>{YourReplyPath}</Value>
</ReplyPath>
</SubscribeRequest>
我有一个用于连接传感器的套接字TCP,但我不知道如何通过POST操作发送此XML格式。
您有个主意吗? 编辑:
char buffer[1024] = "";
int nOctetsRecus = 0;
int nOctetsEnvoyes = 0;
int tailleBuffer = 0;
int boucle = 1;
char * URL;
char * xml_data;
nOctetsRecus = 0;
nOctetsEnvoyes = 0;
tailleBuffer = 0;
boucle = 1;
//STEP1: Initialisation Winsock
iwsaStartup = WSAStartup(MAKEWORD(2,2), &winSockData);
if (iwsaStartup != 0)
{
printf("APICP: open_socket(): WSAStratup Failed\r\n");
}
//LOG_INFO("APICP: opensocket(): WSAStarup Success\r\n");
//STEP3: Socket UDPSocketClient Creation
UDPSocketClient = socket(AF_INET, SOCK_DGRAM, 0);
if (UDPSocketClient == INVALID_SOCKET)
{
printf("Socket creation failed with error: %d\r\n", WSAGetLastError());
WSACleanup();
return 1;
}
printf("La socket %d est ouverte en TCP/IP.\n", UDPSocketClient);
// on configure l'interface de connexion
IRMAServer.sin_addr.s_addr = inet_addr(Addr_TCP_IRMA); // adresse IP du serveur IRMA
IRMAServer.sin_family = AF_INET;
IRMAServer.sin_port = htons(Port_TCP_IRMA); // sin_port et sin_addr doivent être en Network Byte Order // htons() convertit
//un entier court depuis l'ordre des octets de l'hôte vers celuidu réseau (host to network short)
//printf("Connexion a %s sur le port %d\n", inet_ntoa(IRMAServer.sin_addr), htons(IRMAServer.sin_port));
if(connect(UDPSocketClient, (SOCKADDR*)&IRMAServer, iIRMAServerLen) != SOCKET_ERROR) // si le client réussit à se connecter au serveur
printf("Connexion a %s sur le port %d\n", inet_ntoa(IRMAServer.sin_addr), htons(IRMAServer.sin_port));
else
printf("Erreur de connexion.");
// on reçoit les données envoyées par le serveur
/*nOctetsRecus = recv(UDPSocketClient, buffer, 1024, 0);
if(nOctetsRecus != SOCKET_ERROR)
{
printf("%d octets ont ete recus\n", nOctetsRecus);
printf("texte recu : %s", buffer);
}
else
printf("Les donnees n'ont pas ete recues");*/
// le client envoie des données au serveur
URL="/1.0-PAI/PassengerCountingService/SubscribeAllData";
xml_data="<SubscribeRequest> <Client-IP-Address> <Value>192.168.X.X</Value> </Client-IP-Address> <ReplyPort></Value> </ReplyPort> <ReplyPath> <Value>C:\</Value> </ReplyPath> </SubscribeRequest>";
tailleBuffer = sprintf(buffer, " POST %s HTTP/1.1\r\nHost:192.168.0.168:5211\r\nAccept:text/xml\r\nContent-Type:text-xml\r\nContent-Length:1024\r\n\r\n%s"
,URL, xml_data);
nOctetsEnvoyes = send(UDPSocketClient, buffer, tailleBuffer, 0);
if(nOctetsEnvoyes != SOCKET_ERROR)
{
printf("%d octets envoyes au serveur\n", nOctetsEnvoyes);
printf("texte envoye : %s", buffer);
}
else
printf("Erreur : donnees non envoyees au serveur");
// on reçoit les données envoyées par le serveur
nOctetsRecus = recv(UDPSocketClient, buffer, 1024, 0);
if(nOctetsRecus != SOCKET_ERROR)
{
printf("%d octets ont ete recus\n", nOctetsRecus);
printf("texte recu : %s", buffer);
}
else
printf("Les donnees n'ont pas ete recues");
// on ferme la connexion
closesocket(UDPSocketClient);
WSACleanup(); // libère les ressources allouées par la fonction WSAStartup()
getchar();
return 0;
您知道我为什么收到此ICMP消息吗?
答案 0 :(得分:0)
只需通过端口5211的tcp套接字发送此字符串:
POST /1.0-PAI/PassengerCountingService/SubscribeAllData HTTP/1.1
Host: SensorIP
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0
Accept: */*
Content-Type: text-xml
Content-Length: {strlen(THIS)}
<SubscribeRequest>
<Client-IP-Address>
<Value>{HostIP}</Value>
</Client-IP-Address>
<ReplyPort>
<Value>{YourReplyPort}</Value>
</ReplyPort>
<ReplyPath>
<Value>{YourReplyPath}</Value>
</ReplyPath>
</SubscribeRequest>
标题和内容之间是一条自由行,因此:\r\n\r\n
。
请记住关于Content-Length
。
有关HTTP的基本信息:https://www.ntu.edu.sg/home/ehchua/programming/webprogramming/HTTP_Basics.html