如何通过网络快速搜寻到自己的STM32设备

news2024/9/20 20:46:42

目录

一、问题概述

二、解决思路

三、代码实现

1.创建任务

2.UDP广播接收


一、问题概述

以前一直用RS232串口修改设备配置信息,但是现场施工人员的232线太细,经常容易断掉,这次准备用网口去修改,遇到了一个问题,那就是网口还需要TCP传输数据,网口的ip是根据现场分配的,所以你可能修改了网口ip以后,如果下一次去维护却忘了设置的这个ip是什么,这就很尴尬了。所以,如何通过网络搜寻到自己的STM32设备,就非常重要了。

二、解决思路

起初,琢磨的是用扫描ip的软件来扫到自己的设备,后来发现这个方法不太可行,因为扫一次费的时间太长了,而且只能扫到指定的网段,我要知道设备的ip还用扫吗,所以,这个方案pass掉了。

后来,在网上搜寻到的答案是用arp-a命令,这个命令可以查询看本地局域网中的所有与本机通信的监控设备IP地址、mac地址等,我们stm32设备的mac地址是自己设置的,能看出来哪个是自己的设备,但是这个功能不是很有实时性,有时候设备关了很久还在这显示,所以这个方法也不太靠谱

最后,感觉最近用有人的小软件,搜索他们自己的设备嘎嘎快,几乎就是秒搜到,然后根据他们的说明文档和交互信息,了解到了一个新思路,UDP广播,什么是UDP广播呢,我认为就是主机像0.0.0.0到255.255.255.255所有的设备同时发送一个UDP,咱们自己的设备接收到UDP指令以后,可以顺便将自己的ip地址以及mac地址等基本信息一并传回来,这样就可以快速找到自己的设备了,因为第一次获取到了设备的mac地址,所以后面再发送UDP广播的时候只要带上mac地址就知道我们要修改哪个设备,哪个设备就进行相应的调整。

UDP广播可以用Packet Sender这个软件去发送,注意发送UDP广播的电脑如果装着虚拟机呢,需要在设备管理器里面禁用对应的网络适配器,否则UDP广播很有可能发送不出来。

三、代码实现

代码方面这里只写UDP广播接收这一部分,如果再想跑一个TCP,可以再另跑一个任务就行了,一个设备可以同时跑多个TCP或者UDP任务

1.创建任务

#define UDP_PRIO		6
//任务堆栈大小
#define UDP_STK_SIZE	300
//任务控制块
OS_TCB	UdpTaskTCB;
//任务堆栈
CPU_STK UDP_TASK_STK[UDP_STK_SIZE];



#define RCV_BUFFER_LEN       1024           

unsigned char rec_buffer[RCV_BUFFER_LEN]={"\n"};  
unsigned char rec_buffer1[RCV_BUFFER_LEN]={"0X00,0x14,0x97,0x0F,0x1D,0xEA\n"};                        
#define IP_addr_serv  (192,168,1,255) 
#define ADD_TO_INT(d ,c ,b , a)   (((unsigned    long)((a) & 0xff) << 24) | ((unsigned    long)((b) & 0xff) << 16) | ((unsigned    long)((c) & 0xff) << 8) | (unsigned    long)((d) & 0xff))


//创建UDP线程
//返回值:0 UDP创建成功
//		其他 UDP创建失败
u8 udp_demo_init(void)
{
	OS_ERR err;
	CPU_SR_ALLOC();
	
	OS_CRITICAL_ENTER();//进入临界区
	//创建UDP任务
	OSTaskCreate((OS_TCB 	* )&UdpTaskTCB,		
				 (CPU_CHAR	* )"udp task", 		
                 (OS_TASK_PTR )udp_thread, 			
                 (void		* )0,					
                 (OS_PRIO	  )UDP_PRIO,     
                 (CPU_STK   * )&UDP_TASK_STK[0],	
                 (CPU_STK_SIZE)UDP_STK_SIZE/10,	
                 (CPU_STK_SIZE)UDP_STK_SIZE,		
                 (OS_MSG_QTY  )0,					
                 (OS_TICK	  )0,					
                 (void   	* )0,					
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR 	* )&err);
	OS_CRITICAL_EXIT();	//退出临界区
	return err;
}

2.UDP广播接收

void udp_thread(void *arg)
{
 OS_ERR err;
 int s, ei, temp;
 struct sockaddr_in serv, cli;
 int len; 
 unsigned char optval = 1;
socklen_t client_addr_len=sizeof(struct sockaddr);//必须初始化,否则无法接收
       
 memset(&serv, 0, sizeof(struct sockaddr_in));
 serv.sin_family = AF_INET;
 serv.sin_port = htons(1500); //本地端口
 serv.sin_addr.s_addr = 0;

     
 s = socket(AF_INET, SOCK_DGRAM , 0);
 setsockopt(s,SOL_SOCKET,SO_BROADCAST,( void *)&optval,sizeof(optval));
 ei = bind(s, (struct sockaddr*)&serv, sizeof(struct sockaddr_in));

    while (1)
    {
/*      */
      len = recvfrom( s, rec_buffer, RCV_BUFFER_LEN , 0,(struct sockaddr *) & cli, &client_addr_len );
             
      if(len > 0) 
      {
      len = sendto(s , rec_buffer1 , strlen(rec_buffer1) , 0 ,
                (struct sockaddr*)&cli , sizeof(cli));
      }

      OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_HMSM_STRICT,&err);
    }
 }

指定接收UDP广播端口为1500,可以在 if(len > 0) {}里面打断点,接收到了就会进入断点。

希望这篇文章对您扫到自己的物联网设备有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WINUI或WPF灵活使用样式、控件模板、自定义控件、用户控件

在WINUI与WPF 中&#xff0c;控件模板&#xff08;ControlTemplate&#xff09;、样式&#xff08;Style&#xff09;、自定义控件&#xff08;CustomControl&#xff09;和用户控件&#xff08;UserControl&#xff09;都是构建复杂和灵活用户界面的重要工具&#xff0c;但它们…

vue3 中 lottie-web 封装组件

用到的JSON文件在“我的资源”里&#xff0c;下面这个链接直达 下面的代码中用到的JSON数据源 Lottie.vue <script setup> import { ref, onMounted } from vue import lottie from lottie-web// 设置组件参数 const props defineProps({renderer: {type: String,def…

手把手带你白嫖10年服务器

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 手把手带你白嫖10年服务器 如何获取如何使用成果个人网站 个人邮箱服务 重要的话重要说&#xff…

Ubuntu部署K8S集群-图文并茂(超详细)

Ubuntu部署K8S集群 1. 模版机系统环境准备1.1 安装Ubuntu1.2 设置静态IP地址 2. 主机准备2.1 使用模板机创建主机2.2 主机配置2.2.1 修改静态IP2.2.2 修改主机名2.2.3 主机名-IP地址解析2.2.4 时间同步2.2.5 内核转发、网桥过滤配置2.2.6 安装ipset和ipvsadm2.2.7 关闭SWAP分区…

【射频器件供应】Flann Microwave

国家 United Kingdom 地址 Flann Microwave Ltd Dunmere Road Bodmin, Cornwall PL31 2QL United Kingdom Flann Microwave于1956年成立于泰晤士河畔金斯顿萨里。在过去的四十年里&#xff0c;Flann Microwave一直是市场领先的天线设计公司&#xff0c;其精密微波器件和测试频…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【获取密钥属性(ArkTS)】

获取密钥属性(ArkTS) HUKS提供了接口供业务获取指定密钥的相关属性。在获取指定密钥属性前&#xff0c;需要确保已在HUKS中生成或导入持久化存储的密钥。 开发步骤 指定待查询的密钥别名keyAlias&#xff0c;密钥别名最大长度为64字节。调用接口[getKeyItemProperties]&…

Qt类 | QAbstractButton类详解

文章目录 一、QAbstractButton类介绍二、Properties&#xff08;属性&#xff09;三、Public Functions&#xff08;公共函数&#xff09;1.构造函数2.autoExclusive与setAutoExclusive函数--获取/设置自动互斥状态3.autoRepeat与setAutoRepeat函数--获取/设置自动重复状态4.au…

Magic Insert的奇特功能

当然可以&#xff01;让我为你详细介绍一下 Magic Insert 这个有趣的项目。 Magic Insert 是一个基于 AI 技术的创意工具&#xff0c;它允许我们从一张图像中提取一个主题&#xff0c;并将其以不同风格插入到另一张图像中&#xff0c;使得插入效果既符合目标图像的风格&#x…

Arduino呼吸灯

本次学习的内容 1、信号的输入与输出以及信号的分类。 2、理解数字信号与模拟信号以及它们的区别。 3、学会通过模拟输出的方式完成灯的呼吸效果。 Arduino中信号的分类 模拟信号|数字信号 模拟信号&#xff1a;是指用连续变化的物理量所表达的信息&#xff0c;如温度、湿…

基于springboot和mybatis的RealWorld后端项目实战一之hello-springboot

新建Maven项目 注意archetype选择quickstart pom.xml 修改App.java App.java同级目录新增controller包 HelloController.java package org.example.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotatio…

VScode终端和外部终端中文乱码问题

VScode终端和外部终端中文乱码问题 前言VScode终端VScode的第二大特点方法一方法二外部终端&#xff08;命令为ctrlf5&#xff09; 总结实现VScode终端和外部终端都能运行可执行文件 心得 前言 如果只想要看解决方案可直接跳转到总结部分&#xff0c;其余的章节只是用来说明原…

解决多源异构数据整合难题“良策“,助企业高效管理数据资产

大数据的兴起&#xff0c;为各行各业的数字化转型注入了新动力&#xff0c;数据量的激增已成为不争的事实。在过去的十年中&#xff0c;我们见证了数据总量的近十倍增长&#xff0c;不同类型、格式和结构的数据不断涌现&#xff0c;数据的来源也变得极为广泛&#xff0c;涵盖了…

Logback日志异步打印接入指南,输出自定义业务数据

背景 随着应用的请求量上升&#xff0c;日志输出量也会成线性比例的上升&#xff0c;给磁盘IO带来压力与性能瓶颈。应用也遇到了线程池满&#xff0c;是因为大量线程卡在输出日志。为了缓解日志同步打印&#xff0c;会采取异步打印日志。这样会引起日志中的追踪id丢失&#xf…

记录些MySQL题集(9)

MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析 一、MySQL中的死锁现象 所谓的并发事务&#xff0c;本质上就是MySQL内部多条工作线程并行执行的情况&#xff0c;也正由于MySQL是多线程应用&#xff0c;所以需要具备完善的锁机制来避免线程不安全问题的问题产生&#…

leetcode简单题26 N.118 杨辉三角 rust描述

// 动态规划 pub fn generate(num_rows: i32) -> Vec<Vec<i32>> {let mut triangle: Vec<Vec<i32>> vec![];for i in 0..num_rows {let mut row vec![1; (i 1) as usize];for j in 1..i as usize {row[j] triangle[(i - 1) as usize][(j - 1)]…

代理高并发如何去解决?

代理高并发问题的解决方法涉及多个层面&#xff0c;包括架构设计、资源优化、技术选型等方面。以下是一些具体的解决方案&#xff1a; 1. 架构设计 分布式架构&#xff1a; 微服务架构&#xff1a;将大型应用拆分为多个小型服务&#xff0c;每个服务独立部署、扩展和升级&…

【python虚拟环境管理】【mac m3】 使用pipx安装poetry

文章目录 一. 安装 pipx二. 安装Poetry1. 安装2. advanced 操作 官网文档&#xff1a;https://python-poetry.org/docs/ pipx介绍文档&#xff1a;https://blog.51cto.com/u_15064632/2570626 一. 安装 pipx pipx 用于全局安装 Python 命令行应用程序&#xff0c;同时在虚拟环…

Qt纯代码绘制一个等待提示Ui控件

等待样式控件是我们在做UI时出场率还挺高的控件之一&#xff0c;通常情况下有如下的几种实现方式&#xff1a;1、自定义绘图&#xff0c;然后重写paintEvent函数&#xff0c;在paintEvent中绘制等待图标&#xff0c;通过QTimer更新绘制达到转圈圈的效果。2、 获取一张gif的资源…

GD32 MCU上电跌落导致启动异常如何解决

大家是否碰到过MCU上电过程中存在电源波动或者电压跌落导致MCU启动异常的问题&#xff1f;本视频将会为大家讲解可能的原因以及解决方法&#xff1a; GD32 MCU上下电复位波形如下图所示&#xff0c;上电过程中如果存在吃电的模块&#xff0c;比如wifi模块/4G模块/开启某块电路…

【Python实战因果推断】37_双重差分8

目录 Diff-in-Diff with Covariates Diff-in-Diff with Covariates 您需要学习的 DID 的另一个变量是如何在模型中包含干预前协变量。这在您怀疑平行趋势不成立&#xff0c;但条件平行趋势成立的情况下非常有用&#xff1a; 考虑这种情况&#xff1a;您拥有与之前相同的营销数…