我在ROS環境中寫了一個客戶端,無法連接Windows平臺上服務端,請教下ROS與非ROS系統是否需要某種特定的網路連接方式,代碼如下:
#include <ros/ros.h>
//#include <wifi_get/wifi_nice.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <geometry_msgs/Twist.h>
#include <geometry_msgs/TwistStamped.h>
#include <nav_msgs/Odometry.h>
#include "tf/LinearMath/Matrix3x3.h"
#include "geometry_msgs/Quaternion.h"
#define BACKLOG 10
#define MAXSIZE 1024
#define SERVPORT 8000
#define MAXDATASIZE 100
#define SERVER_IP_1 "123.206.94.11"
#define SERVER_IP_2 "127.0.0.1"
#define SERVER_IP_3 "192.168.1.104"
#define vel_angle_max 5
#define BUFSIZ1 1000
using namespace std;
int main(int argc, char **argv)
{
int client_sockfd;
int rec_len,send_len;
int Angle,Angle_flag;
double vel_angle_,vel_speed;
struct sockaddr_in remote_addr; //服務器端網路地址結構體
char buf[BUFSIZ1]; //資料傳送的緩沖區
char buf_send[BUFSIZ1]; //資料傳送的緩沖區
char str[BUFSIZ1];
char buf_rec[BUFSIZ1]; //資料傳送的緩沖區
string str_angule,str_speed;
string rebackmsg;
string recivemsg;
printf("test/n");
//memset(&remote_addr,0,sizeof(remote_addr)); //資料初始化--清零
bzero(&remote_addr, sizeof(remote_addr));
remote_addr.sin_family=AF_INET; //設定為IP通信
remote_addr.sin_addr.s_addr=inet_addr(SERVER_IP_2);//服務器IP地址
remote_addr.sin_port=htons(SERVPORT); //服務器埠號
//remote_addr.sin_addr.s_addr=inet_addr("123.206.94.11");//服務器IP地址
//remote_addr.sin_port=htons(8443); //服務器埠號
printf("test1/n");
/*創建客戶端套接字--IPv4協議,面向連接通信,TCP協議*/
if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
//if((client_sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return 1;
}
printf("creat socket ok!/n");
/*將套接字系結到服務器的網路地址上*/
if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
{
printf("cannot connect sever!/n");
perror("connect");
return 1;
}
//write(sockfd_1, DATA, sizeof(DATA));
printf("connected to server/n");
rec_len=recv(client_sockfd,buf,BUFSIZ1,0);//接收服務器端資訊
buf[rec_len]='\0';
printf("%s",buf); //列印服務器端資訊
//用于決議ROS引數,第三個引數為本節點名
ros::init(argc, argv, "APP_Client");
ros::NodeHandle handle_;
ros::Publisher vel_pub_ ;
geometry_msgs::Twist controlVel_;
vel_pub_ = handle_.advertise<geometry_msgs::Twist>("/cmd_vel",1);
ros::Rate loop_rate(2);
controlVel_.angular.z = 0;
controlVel_.linear.x = 0;
controlVel_.linear.y = 0;
controlVel_.linear.z = 0;
vel_speed = 1.5;
rebackmsg = "";
Angle_flag = 0;
while (1)
{
printf("connected to server/n");
if(rebackmsg != "")
{
strcpy(buf_send, rebackmsg.c_str());
send_len=send(client_sockfd,buf_send,strlen(buf_send),0);
rebackmsg = "";
}
rec_len=recv(client_sockfd,buf_send,BUFSIZ1,0);
recivemsg = buf_send;
if(recivemsg != "")
{
printf("%s",buf_send);
}
if(recivemsg.find("SetAngle") != -1)
{
strcpy(str, recivemsg.c_str());
char *p = strstr(str, "SetAngle_");
sscanf(p+strlen("SetAngle_"),"%d",&Angle);
Angle_flag = 1;
}
if(recivemsg.find("SetSpeedHIGH") != -1)
{
vel_speed = 1.5;
rebackmsg = "RESPABBSETAGVSPEED#FBYAAH2WV7V4VNPGUHY1,SetSpeedHIGHOK*";
}
else if(recivemsg.find("SetSpeedMEDIUM") != -1)
{
vel_speed = 2.5;
rebackmsg = "RESPABBSETAGVSPEED#FBYAAH2WV7V4VNPGUHY1,SetSpeedHIGHOK*";
}
else if(recivemsg.find("SetSpeedLOW") != -1)
{
vel_speed = 3.5;
rebackmsg = "RESPABBSETAGVSPEED#FBYAAH2WV7V4VNPGUHY1,SetSpeedHIGHOK*";
}
if(recivemsg != "")
{
recivemsg = "";
}
if(Angle_flag)
{
if(Angle > 180)
{
int angle_change;
angle_change =Angle-360;
Angle = angle_change;
}
vel_angle_ = vel_angle_max*(Angle/180);
controlVel_.angular.z = vel_angle_;
controlVel_.linear.x = vel_speed;
controlVel_.linear.y = 0;
controlVel_.linear.z = 0;
vel_pub_.publish(controlVel_);
Angle = 0;
Angle_flag = 0;
}
//根據前面定義的頻率, sleep 1s
loop_rate.sleep();
}
return 0;
}
uj5u.com熱心網友回復:
windows沒關防火墻吧uj5u.com熱心網友回復:
描述清楚有什么問題,你這個只是簡單的TCP協議連接, 具體用的是http或者其他自定義的協議我們不清楚,
沒有辦法分析問題
uj5u.com熱心網友回復:
編譯不通過,我找不到 sys/socket.h 這個頭檔案,請問你知道是怎么回事嗎?uj5u.com熱心網友回復:
ROS內部的node通信也是用tcp/udp實作的,所以對其他非ros系統來說,通信方式仍然是tcp、udp協議。轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/138315.html
標籤:應用程序開發區
