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

目录

一、问题概述

二、解决思路

三、代码实现

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) {}里面打断点,接收到了就会进入断点。

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

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

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

相关文章

allure_pytest:AttributeError: ‘str‘ object has no attribute ‘iter_parents‘

踩坑记录 问题描述&#xff1a; 接口自动化测试时出现报错&#xff0c;报错文件是allure_pytest库 问题分析&#xff1a; 自动化测试框架是比较成熟的代码&#xff0c;报错也不是自己写的文件&#xff0c;而是第三方库&#xff0c;首先推测是allure_pytest和某些库有版本不兼…

新手教学系列——简单的服务配置项集中管理

前言 在开发和运维过程中&#xff0c;配置管理是一个非常重要但经常被忽视的环节。常用的配置文件格式包括env、ini和yaml等&#xff0c;它们非常适合模块级别的系统配置&#xff0c;尤其是一些敏感信息的配置&#xff0c;例如数据库连接字符串和密码等。但是&#xff0c;对于…

【文心智能体】前几天百度热搜有一条非常有趣的话题《00后疯感工牌》,看看如何通过低代码工作流方式实现图片显示

00后疯感工牌体验&#xff1a;https://mbd.baidu.com/ma/s/6yA90qtM 目录 前言比赛推荐工作流创建工作流入口创建工作流界面工作流界面HTTP工具卡点地方 总结推荐文章 前言 前几天百度热搜有一条非常有有趣《00后疯感工牌》。 想着通过文心智能体去一键生成00后疯感工牌是不是…

大语言模型在病理AI领域的应用·1|24-07-17·文献速递

小罗碎碎念 今日文献主题&#xff1a;大语言模型技术在病理组学中的应用 这次从厦门开会回来以后&#xff0c;一直在思考大语言模型在病理AI中的一个应用场景&#xff0c;为了辅助自己得出一个科学的结论&#xff0c;我搜集了最新发表的30篇与之相关的文献&#xff0c;用6期推文…

【解决】多个网卡导致nacos注册的服务ip有误问题

解决办法 在本地idea中启动的时候添加启动配置&#xff1a; 方法一 -Dspring.cloud.inetutils.preferred-networks你自己网卡的ip 方法二 -Dspring.cloud.nacos.discovery.ip你自己网卡的ip

封装网络请求 鸿蒙APP HarmonyOS ArkTS

一、效果展示 通过在页面直接调用 userLogin(params) 方法&#xff0c;获取登录令牌 二、申请网络权限 访问网络时候首先需要申请网络权限&#xff0c;需要修改 src/main 目录下的 module.json5 文件&#xff0c;加入 requestPermissions 属性&#xff0c;详见官方文档 【声明权…

陪玩系统小程序模式APP小程序H5系统搭建开发

随着移动互联网的营及和游戏行业的蓬轨发展&#xff0c;陪玩服务应远而生并迅速唱起&#xff0c;陪玩系统小程序作为连接游戏玩家与陪玩师的桥梁&#xff0c;其模式系统的搭建与开发是得尤为重要&#xff0c;本文将洋细凰述陪玩系统小程宗模式系统的搭建开发流程&#xff0c;包…

PCIe驱动开发(3)— 驱动设备文件的创建与操作

PCIe驱动开发&#xff08;3&#xff09;— 驱动设备文件的创建与操作 一、前言 在 Linux 中一切皆为文件&#xff0c;驱动加载成功以后会在“/dev”目录下生成一个相应的文件&#xff0c;应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动文件名字)的文件进行相应的操作即…

C语言------指针讲解(2)

目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 一、数组名的理解 通过学习&#xff0c;我们知道&#xff1a;数组名和数组首元素的地址打印出来的结果一模一样&#xff0c;数组…

信息安全CISSP认证重点学什么?学习后能掌握哪些安全技能?

引言&#xff1a; 想要在信息安全领域取得突破&#xff1f;那么CISSP认证是您必不可少的一步&#xff01;本文将为您介绍CISSP认证的重点学习内容以及学习后可以掌握的安全技能&#xff0c;助您更好地了解并准备这一全球认可的信息安全证书。 随着信息安全领域的不断发展&…

【教学类-67-02】20240716毛毛虫ABB排序

背景需求&#xff1a; 【教学类-67-01】20240715毛毛虫AB排序-CSDN博客文章浏览阅读584次&#xff0c;点赞16次&#xff0c;收藏6次。【教学类-67-01】20240715毛毛虫AB排序https://blog.csdn.net/reasonsummer/article/details/140443310 在AB排序基础上&#xff0c;继续制作…

2024年带你轻松掌握最火10款项目管理软件:解决企业项目管理难题的利器

本文向您推荐10款卓越非凡的项目管理软件&#xff01;它们能有效地助您梳理思绪&#xff0c;极大提高工作效率&#xff0c;使您即使身处繁忙之中仍能保持井然有序。这十款工具各具特色&#xff0c;从简洁明了的任务清单到复杂精密的项目追踪需求&#xff0c;满足各类用户群体的…

Python中的数据结构:五彩斑斓的糖果盒

在Python编程的世界里&#xff0c;数据结构就像是一个个五彩斑斓的糖果盒&#xff0c;每一种糖果都有其独特的味道和形状。这些多姿多彩&#xff0c;形状和味道各异的糖果盒子包括了&#xff1a;List&#xff08;列表&#xff09;、Tuple&#xff08;元组&#xff09;、Diction…

【Java开发实训】day05——数组常见算法

目录 一、数组翻转 1.1示例代码 1.2适用场景 二、冒泡排序 2.1示例代码 2.2适用场景 三、二分查找 3.1示例代码 3.2适用场景 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo…

【软件建模与设计】-04-软件设计和体系结构概念

目录 1、类与对象 2、信息隐藏 2.1、示例 3、继承和泛化/特化 4、并发处理 4.1、并发对象间的协作 5、设计模式 6、软件体系结构和构件 7、软件质量属性 1、类与对象 一个对象是现实世界中物理的或概念的实体。 一个对象盖了数据(data)以及作用于数据之上的过程(pro…

Sentinel规则持久化Push模式两种实现方式

文章目录 sentinel持久化push推模式微服务端的实现具体实现源码分析读数据源写数据源的实现 微服务端解析读数据源流程 修改源码的实现官方demo修改源码实现配置类flowauthoritydegreadparamsystemgateway修改源码 测试补充 前置知识 pull模式 sentinel持久化push推模式 pull拉…

liunx面试题目

如何看当前Linux系统有几颗物理CPU和每颗CPU的核数&#xff1f; 查看物理cup&#xff1a; cat /proc/cpuinfo|grep -c ‘physical id’ 查看每颗cup核数 cat /proc/cpuinfo|grep -c ‘processor’ 若希望自动实现软件包的更新&#xff0c;可以使用yum-cron并启动该服务 yum -y …

解决一下git clone失败的问题

1&#xff09;.不开梯子&#xff0c;我们用https克隆 git clone https://github.com 报错&#xff1a; Failed to connect to github.com port 443 after 2091 ms: Couldnt connect to server 解决办法&#xff1a; 开梯子&#xff0c;然后# 注意修改成自己的IP和端口号 gi…

[HDCTF2019]MFC

[HDCTF2019]MFC-CSDN博客 不会写 完全画瓢 我还以为win32什么系统逆向 原来是小瘪三! VM保护 下载xspy(看雪上有) 打开32位的 再打开 这个窗口 把这个放大镜托到这个大窗口(里面有个小窗口,不要托错了) 下面这个 onmeg 就她不正常,是什么0464 #include <stdio.h&g…

简易ELK搭建

ELK搭建 1. elasticsearch1.1 下载1.2 ES配置1.3 启动ES1.4 开启权限认证1.5 IK分词器配置&#xff08;非必须&#xff09; 2. kibana2.1 下载2.2 配置2.3 启动kibana 3. logstash3.1 下载3.2 配置3.3 启动logstash 4. springboot推送数据 ELK包括elasticsearch、logstash、kib…