SICK系列激光雷达单点测距仪DT80-311111+SIG200配置和通信

文章目录

  • 一、硬件连接与SOPAS连接测距仪
  • 二、从SOPAS读取数据
  • 三、通过JSON获取数据
    • 1. 使用Postman测试接口
    • 2. 通过代码实现


一、硬件连接与SOPAS连接测距仪

首先硬件设备连接如下:
电源厂家应该是不提供,需要自行解决。
在这里插入图片描述
安装完成后需要使用sick的SOPAS软件进行配置:
1、通过软件更改设备IP
2、从设备导入
3、读取数据
4、点击“离线”按钮,切换为在线状态

具体请按照这篇文章来连接

二、从SOPAS读取数据

连接成功后如下图:
在这里插入图片描述
双击设备进入设备页面,如下:
在这里插入图片描述
在这里插入图片描述
这两位就是十六进制的距离信息,可以自行转换为十进制数,与测距仪表面显示屏上的十进制数字进行对比。

三、通过JSON获取数据

分别使用Python和C++来实现了:

1. 使用Postman测试接口

在这里插入图片描述
其中:

{
    "header": {
        "portNumber": 0
        },
        

        "data": {
            "processData":
            "in"
        }
 }

获取到如下内容表示成功

{
    "header": {
        "status": 0,
        "message": "ok"
    },
    "data": {
        "processDataIn": [
            0,
            0,
            123,
            212,
            252,
            1
        ],
        "isValid": true
    }
}

2. 通过代码实现

1、C++代码如下:

#include <windows.h>
#include <winhttp.h>
#include <iostream>
#include <string>
#include <vector>
#include "nlohmann/json.hpp"

#pragma comment(lib, "winhttp.lib")

using json = nlohmann::json;

HINTERNET OpenSession(const wchar_t* userAgent) {
    HINTERNET hSession = WinHttpOpen(userAgent,
        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
        WINHTTP_NO_PROXY_NAME,
        WINHTTP_NO_PROXY_BYPASS, 0);

    if (!hSession) {
        std::cerr << "Failed to open WinHTTP session." << std::endl;
    }

    return hSession;
}

std::string SendPostRequest(HINTERNET hSession, const wchar_t* serverName, const wchar_t* path, const std::string& postData) {
    HINTERNET hConnect = WinHttpConnect(hSession, serverName, INTERNET_DEFAULT_HTTP_PORT, 0);

    if (!hConnect) {
        std::cerr << "Failed to connect to server." << std::endl;
        return "";
    }

    HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"POST", path, NULL, WINHTTP_NO_REFERER,
        WINHTTP_DEFAULT_ACCEPT_TYPES, 0);

    if (!hRequest) {
        std::cerr << "Failed to open request." << std::endl;
        WinHttpCloseHandle(hConnect);
        return "";
    }

    const wchar_t* headers = L"Content-Type: application/json";
    DWORD dwBytesSent = 0;

    if (!WinHttpSendRequest(hRequest, headers, -1L, (LPVOID)postData.c_str(), postData.size(), postData.size(), 0)) {
        std::cerr << "Failed to send request." << std::endl;
        WinHttpCloseHandle(hRequest);
        WinHttpCloseHandle(hConnect);
        return "";
    }

    if (!WinHttpReceiveResponse(hRequest, NULL)) {
        std::cerr << "Failed to receive response." << std::endl;
        WinHttpCloseHandle(hRequest);
        WinHttpCloseHandle(hConnect);
        return "";
    }

    std::string response;
    DWORD dwSize = 0;
    DWORD dwDownloaded = 0;
    LPSTR pszOutBuffer;

    do {
        dwSize = 0;
        if (!WinHttpQueryDataAvailable(hRequest, &dwSize)) {
            std::cerr << "Failed to query data available." << std::endl;
            break;
        }

        pszOutBuffer = new char[dwSize + 1];
        if (!pszOutBuffer) {
            std::cerr << "Memory allocation failed." << std::endl;
            break;
        }

        ZeroMemory(pszOutBuffer, dwSize + 1);

        if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded)) {
            std::cerr << "Failed to read data." << std::endl;
        }
        else {
            response.append(pszOutBuffer, dwDownloaded);
        }

        delete[] pszOutBuffer;
    } while (dwSize > 0);

    WinHttpCloseHandle(hRequest);
    WinHttpCloseHandle(hConnect);

    return response;
}

int main() {
    HINTERNET hSession = OpenSession(L"MyAppName/1.0");

    if (!hSession) {
        return 1;
    }

    const wchar_t* serverName = L"169.254.102.101";
    const wchar_t* path = L"/iolink/sickv1/readPort";

    json payload = {
        {"header", {{"portNumber", 0}}},
        {"data", {{"processData", "in"}}}
    };

    std::string postData = payload.dump();

    std::string response = SendPostRequest(hSession, serverName, path, postData);

    if (!response.empty()) {
        try {
            json data = json::parse(response);

            const json processDataIn = data.at("data").at("processDataIn");

            if (processDataIn.size() >= 4) {
                int thirdData = processDataIn[2].get<int>();
                int fourthData = processDataIn[3].get<int>();

                std::cout << "Third data: " << thirdData << std::endl;
                std::cout << "Fourth data: " << fourthData << std::endl;
            }
            else {
                std::cout << "Response does not contain enough data." << std::endl;
            }
        }
        catch (const std::exception& e) {
            std::cerr << "Failed to parse JSON response: " << e.what() << std::endl;
        }
    }
    else {
        std::cerr << "Request failed." << std::endl;
    }

    WinHttpCloseHandle(hSession);

    return 0;
}

注意,nlohmann/json.hpp需要自行去github上把nlohmann下载下来,然后去包含目录导入。

python比较简单:

import requests

# 定义请求的URL和请求体
url = "http://192.168.0.20/iolink/sickv1/readPort"
payload = {
    "header": {
        "portNumber": 0
    },
    "data": {
        "processData": "in"
    }
}

# 发送POST请求
response = requests.post(url, json=payload)

# 检查请求是否成功
if response.status_code == 200:
    # 解析返回的JSON数据
    data = response.json()

    # 获取processDataIn列表
    process_data_in = data.get('data', {}).get('processDataIn', [])

    # 检查列表长度是否足够
    if len(process_data_in) >= 4:
        # 获取第3和第4个数据(索引为2和3)
        third_data = process_data_in[2]
        fourth_data = process_data_in[3]

        print(f"Third data: {third_data}")
        print(f"Fourth data: {fourth_data}")
    else:
        print("Response does not contain enough data.")
else:
    print(f"Request failed with status code: {response.status_code}")

运行结果:
在这里插入图片描述
即为所求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892571.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

增量知识 (Incremental Knowledge, IK)

在语义通信系统中&#xff0c;增量知识&#xff08;IK, Incremental Knowledge&#xff09;是一种增强数据传输效率和可靠性的技术&#xff0c;特别是用于混合自动重传请求&#xff08;HARQ, Hybrid Automatic Repeat reQuest&#xff09;机制时。它的核心思想是在传输失败后&a…

图像中的融合

图像显示函数 def img_show(name, img):"""显示图片:param name: 窗口名字:param img: 图片对象:return: None"""cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()图像读取与处理 读取图片 cloud cv2.imread(bg.jpg) fish cv2.…

【uni-app】HBuilderX安装uni-ui组件

目录 1、官网找到入口 2、登录帐号 3、打开HuilderX 4、选择要应用的项目 5、查看是否安装完成 6、按需安装 7、安装完毕要重启 8、应用 前言&#xff1a;uniapp项目使用uni-ui组件方式很多&#xff0c;有npm安装等&#xff0c;或直接创建uni-ui项目&#xff0c;使用un…

threejs-光线投射实现3d场景交互事件

一、介绍 1.属性 // 创建射线 const raycaster new three.Raycaster() // 创建鼠标向量(保存鼠标点击位置) const mouse new three.Vector2() // 创建点击事件 window.addEventListener(click,(event)>{// 获取鼠标点击位置mouse.x (event.clientX / window.innerWidt…

HAL+M4学习记录_7

一、TIM 记录学习HAL配置TIM定时器 1.1 简介 TIM&#xff08;timer&#xff09;定时器&#xff0c;16位或32位&#xff08;TIM2和TIM5&#xff09;计数器、预分频器&#xff08;16位&#xff09;、自动重装寄存器的时基单元&#xff1b;可对输入时钟进行计数&#xff0c;在计数…

PyQt 入门教程(3)基础知识 | 3.1、使用QtDesigner创建.ui文件

文章目录 一、使用QtDesigner创建.ui文件1、创建.ui文件2、生成.py文件3、使用新生成的.py文件4、编辑新生成的.py文件 一、使用QtDesigner创建.ui文件 1、创建.ui文件 打开PyCharm&#xff0c;使用自定义外部工具QtDesigner创建mydialog.ui文件&#xff0c;如下&#xff1a; …

finalshell连接navicat数据库

一、安装mysql数据库 这个安装在另外一篇里 超详细的finalshell安装数据库以及数据库的基本操作-CSDN博客https://blog.csdn.net/cfjbcg/article/details/142990671 二、连接 说明root这个用户连接&#xff0c;是有权限的限制的----》修改权限 use mysql pdate user set hos…

测试教程分享

前几年在腾讯课堂上发布了不少课程&#xff0c;后来腾讯课堂改革&#xff0c;要收会员费&#xff0c;课程还要抽提程&#xff0c;这么下来就相当于白干了。就放弃了在上面发课程&#xff0c;再后来腾讯课堂就关闭了&#xff0c;以前发布的视频就没有地方发了&#xff0c;于是我…

Golang | Leetcode Golang题解之第485题最大连续1的个数

题目&#xff1a; 题解&#xff1a; func findMaxConsecutiveOnes(nums []int) (maxCnt int) {cnt : 0for _, v : range nums {if v 1 {cnt} else {maxCnt max(maxCnt, cnt)cnt 0}}maxCnt max(maxCnt, cnt)return }func max(a, b int) int {if a > b {return a}return …

QT--Qlabel学习、获取文本和设置文本、文本对齐方式、文本换行、显示图片

QLabel 是 Qt 中的标签类&#xff0c;通常用于显示提示性的文本&#xff0c;也可以显示图像 对齐方式 用于设置标签中的内容在水平和垂直两个方向上的对齐方式&#xff0c;比如左对齐、右对齐、上对齐、下对齐、水平居中、垂直居中等。 // 获取和设置文本的对齐方式 Qt::Ali…

第二代GPT-SoVITS V2:让声音克隆变得简单

随着人工智能技术的飞速发展&#xff0c;AI声音克隆已经成为一种趋势&#xff0c;广泛应用于各个领域。为了满足更多用户的需求&#xff0c;第二代GPT-SoVITS V2应运而生&#xff0c;它由RVC变声器创始人“花儿不哭”与AI音色转换技术Sovits开发者Rcell联合开发&#xff0c;是一…

有关 C#多表查询学习

导言 在后端多表查询这一块还是不太会&#xff0c;主要是在左连接和innerjoin这块&#xff0c;上课混的时间总是要还回来的...主要是举后端的几个案例来相应学习查询的知识。所用到的例子是自己搞的C#后端&#xff0c;数据库用的是若依的表&#xff0c;有些有些微改变。 多表查…

为什么SSH协议是安全的?

SSH的传输层协议&#xff08;Transport Layer Protocol&#xff09;和用户鉴权协议&#xff08;Authentication Protocol&#xff09;确保数据的传输安全&#xff0c;这里只介绍传输层协议&#xff0c;是SSH协议的基础。 本文针对SSH2协议。 1、客户端连接服务器 服务器默认…

相似扇形问题

甘肃临夏砖雕是一种历史悠久的古建筑装饰艺术&#xff0c;是第一批国家级非物质文化遗产,如图1是一块扇面形的临夏砖雕作品&#xff0c;它的部分设计图如图2&#xff0c;其中扇形OBC和扇形OAD有相同的圆心O&#xff0c;且圆心角O100度&#xff0c;若OA120cm, OB60cm &#xff0…

9.22前缀和

当我们计算n个数的和的时候&#xff0c;往往会采用循环操作&#xff0c;但是当我们要多次进行询问n个数之和时&#xff0c;如果采用多次循环&#xff0c;时间复杂度会升高&#xff0c;所以我们采用前缀和来解决多次询问时的求和 1.一维前缀和 提公因式&#xff0c;用分配律&am…

2024 kali系统2024版本,可视化界面汉化教程(需要命令行更改),英文版切换为中文版,基于Debian创建的kali虚拟机

我的界面如下所示 1. 安装 locales sudo apt install locales 2. 生成中文语言环境 sudo locale-gen zh_CN.UTF-8 如果你希望安装繁体中文&#xff0c;可以加入&#xff1a; sudo locale-gen zh_TW.UTF-8 3. 修改 /etc/default/locale 文件 确保有以下内容 LANGzh_CN.UT…

【优选算法】——双指针(下篇)!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~ &#x1f525;系列专栏&#xff1a;C刷题算法总结 &#x1f516;克心守己&#xff0c;律己则安 目录 1、有效三角形的个数 2、查找总价值为目标值的两个商品 3、三数之和 4、四数之和 5、完结散花 1、有…

react18中实现简易增删改查useReducer搭配useContext的高级用法

useReducer和useContext前面有单独介绍过&#xff0c;上手不难&#xff0c;现在我们把这两个api结合起来使用&#xff0c;该怎么用&#xff1f;还是结合之前的简易增删改查的demo&#xff0c;熟悉vue的应该可以看出&#xff0c;useReducer类似于vuex&#xff0c;useContext类似…

智慧供排水管网在线监测为城市安全保驾护航

一、方案背景 随着城市化进程的不断推进&#xff0c;城市供排水管网作为城市基础设施的关键组成部分&#xff0c;其安全稳定的运行对于确保城市居民的日常生活、工业生产活动以及整个生态环境的健康具有至关重要的作用。近年来&#xff0c;由于各种原因&#xff0c;城市供排水管…

Springboot整合knife4j生成文档

前言 在开发过程中&#xff0c;接口文档是很重要的内容&#xff0c;用于前端对接口的联调&#xff0c;也用于给其他方使用。但是手写相对比较麻烦。 当然也有swagger之类的&#xff0c;但是界面没有那么友好。 官网&#xff1a; 整合步骤 整合依赖 需要根据版本进行&…