1.1 Ubuntu18.04 ROS tcp/ip Server通信实现

2023-05-16

Ubuntu18.04 ROS tcp/ip Server通信实现

此小节介绍tcp/ip Server收发数据,并将截取到底信息通过话题方式发布出去。下一节介绍Ubuntu18.04 ROS tcp/ip client通信实现。 后续介绍Android与Ubuntu的网络通信,通过Android与工控机配合实现车辆遥控操作。

测试过程和效果

测试平台为Ubuntu18.04 与Windows系统上的网络调试助手进行通信测试,调试助手采用的有人科技的USR-TCP232-Test-V1.3。
测试过程为:
1.保证两台电脑在同一个网络下,并查看Ubuntu的本机IP,在设置->wifi->中可查看,如下图,192.168.x.xxx,为本机IP。
在这里插入图片描述

  1. 相互ping另外一台电脑的ip,通则说明两台电脑在同一网络下连接成功。windows打开网络串口助手可自动获取本机IP。如下图。如果ping失败请查看防护墙是否关闭。
    在这里插入图片描述
    ping成功的图片如下
    Windows
    在这里插入图片描述
    Ubuntu
    在这里插入图片描述
    3 通信效果测试,首先Ubuntu运行roscore,然后启动服务器节点,然后打开网络调试助手,输入服务器IP,通信成功的截图如下:
    在这里插入图片描述
    在这里插入图片描述

ROS工作区间和功能包的创建

ROS工作区间和功能包的创建网上资料比较多,这里简单说明。其中使用RoboWare Studio,这个过程变的更简单。

#创建工作空间
mkdir catkin_ws #区间名称
cd catkin_ws 
mkdir src #创建代码空间
cd src
catkin_init_workspace #初始化位ROS工作空间
cd ..
catkin_make
source ~/catkin_ws/devel/setup.bash
#创建功能包
cd ~/catkin_ws/src
catkin_create_pkg ros_socket std_msgs rospy roscpp
#创建通信节点
#在src目录下打开终端
touch server_node.cpp
#在CMakeLists.txt中添加以下
add_executable(server_node
  srcrver_node.cpp
)
add_dependencies(server_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(server_node
  ${catkin_LIBRARIES}
)

``

ROS tcp/ip Server的实现代码

包括以下步骤
1.创建一个socket
2.准备通讯地址(必须是服务器的)也就算是本机的IP
3.bind()绑定
4.监听客户端listen()函数
5.等待客户端的连接accept(),返回用于交互的socket描述符
程序注释的比较清楚,不在多说了。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<iostream>
#include <ros/ros.h>
#include "navgation_pack/androidyaokong.h"

using namespace std;

navgation_pack::androidyaokong wangluo;

int main(int argc, char** argv)
{
    ros::init(argc, argv, "server_port");
    //创建句柄(虽然后面没用到这个句柄,但如果不创建,运行时进程会出错)
    ros::NodeHandle n;

    ros::Publisher tcp_jie =n.advertise<navgation_pack::androidyaokong>("/android_para", 100);

    //1.创建一个socket
    int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (socket_fd == -1)
    {
        cout << "socket 创建失败: "<< endl;
        exit(1);
    }
    //2.准备通讯地址(必须是服务器的)192.168.181.22是本机的IP
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(1024);//将一个无符号短整型的主机数值转换为网络字节顺序,即大尾顺序(big-endian)
    addr.sin_addr.s_addr = inet_addr("192.168.1.113");//net_addr方法可以转化字符串,主要用来将一个十进制的数转化为二进制的数,用途多于ipv4的IP转化。
    //3.bind()绑定
    //参数一:0的返回值(socket_fd)
    //参数二:(struct sockaddr*)&addr 前面结构体,即地址
    //参数三: addr结构体的长度
    int res = bind(socket_fd,(struct sockaddr*)&addr,sizeof(addr));
    if (res == -1)
    {
        cout << "bind创建失败: " << endl;
        exit(-1);
    }
    cout << "bind ok 等待客户端的连接" << endl;
    //4.监听客户端listen()函数
    //参数二:进程上限,一般小于30
    listen(socket_fd,30);
    //5.等待客户端的连接accept(),返回用于交互的socket描述符
    struct sockaddr_in client;
    socklen_t len = sizeof(client);
    int fd = accept(socket_fd,(struct sockaddr*)&client,&len);
    if (fd == -1)
    {
        cout << "accept错误\n" << endl;
        exit(-1);
    }
    //6.使用第5步返回socket描述符,进行读写通信。
    char *ip = inet_ntoa(client.sin_addr);
    cout << "客户: 【" << ip << "】连接成功" << endl;
  
    write(fd, " Welcome to visit ", 17);
    char buffer[255]={};

    ros::Rate loop_rate(50);
   while (ros::ok()) 
   {
       int size = read(fd, buffer, sizeof(buffer));//通过fd与客户端联系在一起,返回接收到的字节数
    //第一个参数:accept 返回的文件描述符
    //第二个参数:存放读取的内容
    //第三个参数:内容的大小
        if (size>=1) //接受到数据进行处理
        {
        //   cout << "接收到字节数为: " << size << endl;
        //    cout << "内容: " << buffer << endl;
            string jieshou = buffer;
            string jieshou_chuli = jieshou.substr(0,3);

            string qia = "qia";
            string hou = "hou";
            string zuo = "zuo";
            string you = "you";
            string tin = "tin";

            //   cout << jieshou_chuli << endl;
             cout << jieshou << endl;
            if (strcmp(jieshou_chuli.c_str(),qia.c_str())==0)//判断接受到的字符串是否相同
            {
                string jieshou_p = jieshou.substr(7,1);//截取字符串
                int q = atoi(jieshou_p.c_str());
                wangluo.qianjin = q ;
                cout << jieshou_p<<"qian    "<< q << endl;
            }

            if (strcmp(jieshou_chuli.c_str(),hou.c_str())==0)
            {
                string jieshou_p = jieshou.substr(6,1);
                int q = atoi(jieshou_p.c_str());
                wangluo.houtui = q ;
                wangluo.qianjin = 0 ;
                cout << jieshou_p<<"hou    "<< q << endl;
            }

                if (strcmp(jieshou_chuli.c_str(),zuo.c_str())==0)
            {
                string jieshou_p = jieshou.substr(8,1);
                int q = atoi(jieshou_p.c_str());
                wangluo.zuozhuan = q ;
                wangluo.youzhang = 0;
                cout << jieshou_p<<" zuo   "<< q << endl;
            }

                if (strcmp(jieshou_chuli.c_str(),you.c_str())==0)
            {
                string jieshou_p = jieshou.substr(8,1);
                int q = atoi(jieshou_p.c_str());
                wangluo.youzhang = q ;
                wangluo.zuozhuan = 0;
                cout << jieshou_p<<"you    "<< q << endl;
            }

                if (strcmp(jieshou_chuli.c_str(),tin.c_str())==0)
            {
                string jieshou_p = jieshou.substr(7,1);
                int q = atoi(jieshou_p.c_str());
            //     wangluo.qianjin = 0 ;
                wangluo.houtui = 0 ;
                wangluo.zuozhuan = 0 ;                  
                wangluo.tingzhi = 0 ;
                wangluo.youzhang = 0 ;
                cout << jieshou_p<<"tin    "<< q << endl;
            }

                 tcp_jie.publish(wangluo);

        }
                ros::spinOnce(); 
                loop_rate.sleep(); 
     }
        
    //7.关闭sockfd
    close(fd);
    close(socket_fd);
    return 0;
}


功能包程序。

1.5 章节重新修改了一下服务器程序,删除了自定义消息类型,编译不报错。

欢迎大家批评指正!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1.1 Ubuntu18.04 ROS tcp/ip Server通信实现 的相关文章

  • 如何在NodeJS中测试socket.setKeepAlive

    我尝试在NodeJS中测试setKeepAlive 的功能 我在同一本地网络中的不同计算机上运行 Server js 和 client js 然后 我关闭了客户端计算机上的 WiFi 连接 断开互联网连接 15分钟后 仍然没有消息抛出 这是
  • Web 服务器可以处理多少个套接字连接?

    假设我要获得共享 虚拟或专用托管 我在某处读到服务器 计算机一次只能处理 64 000 个 TCP 连接 这是真的吗 无论带宽如何 任何类型的托管可以处理多少个 我假设 HTTP 通过 TCP 工作 这是否意味着只有 64 000 个用户可
  • 如何模拟 TCP/IP 错误?

    在多层应用程序上 我需要模拟各种 TCP IP 错误来测试一些重新连接代码 有谁知道我可以使用什么工具 基于 Windows 来实现此目的 谢谢 Scapy http secdev org projects scapy 允许您控制数据包的各
  • 为什么我们可以将 sockaddr 转换为 sockaddr_in

    我明白为什么强制转换很有用sockaddr to sockaddr in 但我不明白这怎么可能 据我所知 它们的大小相同sockaddr in添加了sin zero使其大小相同 我想知道编译器如何知道从哪里获取信息sockaddr in如果
  • 错误:在 Google 应用引擎上部署节点 js 时找不到模块“/workspace/server.js”

    经过一周的搜索 我无法找到适用于我的 Node js 应用程序的应用程序引擎部署问题的解决方案 我已经用这个替换了原来的代码Express 的 hello world 示例 https expressjs com en starter he
  • 通过PHP从网站上传文件到Amazon EC2服务器

    我有一个网站 bedatify com 我想创建一个页面 人们可以在其中将图像上传到我的亚马逊 EC2 服务器 我检查了类似的问题 例如无法在 Amazon EC2 上上传文件 php https stackoverflow com que
  • 两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

    昨天我做了一些关于 NodeJS 的演讲 有人问我以下问题 我们知道nodeJS是一个单线程服务器 多个请求是 到达服务器并将所有请求推送到事件循环 如果什么 两个请求同时到达服务器 服务器将如何处理 处理这种情况 我猜到了一个想法并回复如
  • 如何在Linux中打开端口[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经安装了 Web 应用程序 该应用程序在 RHEL centOS 上的端口 8080 上运行 我只能通过命令行访问该机器 我尝试从我的
  • 在云服务器中运行 python 脚本的最简单方法是什么?

    我有一个网络爬行 python 脚本 需要几个小时才能完成 并且无法在我的本地计算机上完整运行 有没有一种方便的方法可以将其部署到简单的 Web 服务器 该脚本基本上将网页下载到文本文件中 如何最好地实现这一点 谢谢 既然你说性能是一个问题
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 保存到服务器后,隐藏字符“\u0”添加到文件中

    我正在使用 Apache 服务器为 Web 开发网站提供服务 这样我就可以不断保存和编辑文件 我使用 Gulp for Sass 来连接和丑化 css 和 js 文件 一个月前 我的 js 和 css 文件遇到问题 似乎在文件下面添加了随机
  • 数据包无序。得到:80 预期:0 node.js

    这是我的 非常简单 代码 var connection mysql createConnection infosDB connection connect connection query SELECT FROM action functi
  • 为什么 TCP 段中的 SYN 或 FIN 位会占用序列号空间中​​的一个字节?

    我试图理解这种设计背后的基本原理 我浏览了一些 RFC 但没有发现任何明显的东西 这并不是特别微妙 这样 SYN 和 FIN 位本身就可以被确认 因此如果丢失则可以重新发送 例如 如果连接关闭而没有发送更多数据 那么如果 FIN 没有发送任
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • 让 WSO2 IOT 服务器作为 Windows 服务运行

    我在Server 2012R2上安装了WSO2 IOT Server 我安装了 YAJSW 包装器并按照 WSO2 说明进行配置 当我启动 runConsole bat 来配置 Windows 服务时 出现以下错误 我设置了 JAVA HO
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 触发“对等方重置连接”

    我想测试当发生 对等方重置连接 错误时我们的应用程序 嵌入式 ftp 服务器 中发生的日志记录 这个帖子 https stackoverflow com questions 1434451 connection reset by peer很
  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程
  • 当 TCP 序列号到达而不是预期时会发生什么情况?

    我正在编写一个程序 使用 libpcap 捕获数据包并重新组装 TCP 流 我的程序只是监视流量 因此我无法控制数据包的接收和发送 我的程序忽略所有非 TCP IP 流量 我根据 ISN 计算下一个预期序列号 然后计算连续的 SEQ 号 我
  • 将 C++ TCP/IP 应用程序从 IPv4 转换为 IPv6。难的?值得这么麻烦吗?

    多年来 我使用 WinSock 为 Windows 开发了少量 C 服务器 客户端应用程序 路由器 Web 邮件 FTP 服务器等 等等 我开始越来越多地考虑创建这些应用程序的 IPv6 版本 当然 同时也保留原始的 IPv4 版本 问题

随机推荐

  • 大学老师告诉我:20年内程序员会被取代,未来不需要程序员...

    今天收到一个同学的邮件 xff0c 他告诉我 xff0c 他们的大学计算机老师告诉他 xff0c 以后机器人可以自动生成代码 xff0c 估计20年 xff0c 程序员就会被取代 所以他现在感觉很苦恼 xff0c 既然会被淘汰 xff0c
  • MySQL 主从复制

    新建主服务器容器实例3307 span class token function docker span run p span class token number 3307 span 3306 name mysql master span
  • 盘点strlen()、sizeof()、length()、size()的区别

    目录 序言 1 总览 2 用法 2 1 sizeof 2 2 strlen 3 length 和size 序言 项目中经常用到这些用于计算大小的函数 或运算符 xff0c 网上也有许多关于其间区别的文章介绍 xff0c 在此按自己的思路整理
  • Android:知识体系结构

    刚开始接触android xff0c 学习之初 xff0c 各种迷茫阿 xff0c 网上看到了这个知识结构体系的图 xff0c 觉得很有用 xff0c 在此备份一下 xff0c 或许以后的某一天我成了android大神 xff08 PS x
  • android studio导入一个已存在的项目

    在使用android studio导入一个已经存在的项目之前 xff08 xff01 xff01 xff01 记住是导入之前 xff09 xff0c 需要做三件事 xff1a 1 xff0c 查看项目的gradle wrapper grad
  • 从内部类中访问本地变量temp; 需要被声明为最终类型

    class Outer 定义外部类 private String info 61 34 hello world 34 定义外部类的私有属性 public void fun final int temp 定义外部类的方法 class Inne
  • Android学习笔记 ---- 四大组件之 Activity

    1 Activity的概念与Activity的生命周期图 xff1a Activity是一个应用程序的组件 xff0c 他在屏幕上提供了一个区域 xff0c 允许用户在上面做一些交互性的操作 xff0c 比如打电话 xff0c 照相 xff
  • Docker ubuntn 使用apt-get update报错

    在docker 容器中执行apt get update有时候会报错 xff0c 当然造成错误的原因有很多情况 xff0c 具体情况具体分析 xff0c APT Hash sum mismatch错误的常见解决方法总结这篇博客写的不错 xff
  • npm安装报错 rollbackFailedOptional verb npm-session 解决办法

    该问题一般情况是因为代理问题 xff0c npm代理和git代理都要设置 首先确认网络是否需要设置代理 如果是公司网络需要设置代理 xff0c 则设置npm代理和git代理 1 设置npm代理 1npm config set proxy a
  • Docker 安装C#编译环境

    Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中 xff0c 然后发布到任何流行的 Linux或Windows操作系统的机器上 xff0c 也可以实现虚拟化 本文主要介绍Docke
  • 关于句柄中带命名空间对实际程序运行中的影响

    ROS头文件 include lt ros ros h gt 自定义msg产生的头文件 include lt topic demo gps h gt int main int argc char argv 用于解析ROS参数 xff0c 第
  • 部署Redis集群

    部署Redis集群 span class token comment 创建网卡 span span class token function docker span network create redis subnet span clas
  • ROS编译出现generate_messages() must be called after add_message_files()错误

    新人小白 xff0c 刚刚开始学ROS 编译出现这个错误 xff0c 搞了好久也没找到这个问题 xff0c 后来偶然发现了问题所在 CMake Error at opt ros kinetic share genmsg cmake genm
  • SLAM因子图构建笔记

    因子图简介 最近在读了Joan Sola所写的Course on SLAM中有关因子图部分的介绍后 xff0c 发现其中有关于因子图构建的思路觉得很有意思 xff0c 因此在这里记录一下 DBN网络 首先简单地介绍一下如何将一个SLAM问题
  • xmanager关闭linux命令,Linux下xmanager passive功能无法使用的解决技巧

    xmanager Passive可以在仅登陆ssh字符界面的情况下传输图形 xff0c 为很多开发者所喜爱 有一用户因需要调整了防火墙 xff0c xmanger passive功能便无法正常使用了 xff0c 我们该如何处理这个问题呢 到
  • liteos内核驱动和linux,移植RTOS必备基础知识

    1 基础知识 移植内核对技术的要求比较高 比较细 1 1 单片机相关的知识 栈的作用 加载地址 链接地址 重定位 几个简单的硬件知识 串口 定时器 中断的概念 1 2 Linux操作相关的知识 Linux常用命令 简单的脚本 xff1a 脚
  • matlab subs什么意思,什么是matlab subs函数?

    matlab中subs 是符号计算函数 xff0c 详细用法可以在Matlab的Command Windows输入 xff1a help subs subs 函数表示将符号表达式中的某些符号变量替换为指定的新的变量 xff0c 常用调用方式
  • 虚拟机linux装无线网卡驱动,linux无线网卡驱动安装

    环境 在笔记本里的虚拟机10 0版本 xff0c centos 6 5 无线网卡fast fw300um 第一步要查看芯片 lsusb 当你得到芯片之后接下来查看内核 xff0c 如果内核已经有芯片模块就不用再装了 xff0c 如果不支持的
  • 使用Altium Designer 20绘制双层板以及四层板

    直接入正题 1 按照正常的绘制双层板的方式新建工程文件 xff0c 加入原理图和PCB文件 xff08 如果会绘制双层板请直接看第二步 xff09 xff08 1 xff09 新建工程文件 xff08 2 xff09 选择工程类型 xff0
  • 1.1 Ubuntu18.04 ROS tcp/ip Server通信实现

    Ubuntu18 04 ROS tcp ip Server通信实现 此小节介绍tcp ip Server收发数据 xff0c 并将截取到底信息通过话题方式发布出去 下一节介绍Ubuntu18 04 ROS tcp ip client通信实现