做一个windos服务和api搭配,获取电脑的mac地址
创建webapi项目,只是搭配服务用,什么三层mvc都不弄了,默认的模板直接用就好。
简单分析下,采用signalr通信来传递mac地址,所以先安装个signalr的包(如果简单操作的话可以不装最新的,微软自带一个,不过好像是弃用的)
using Microsoft.AspNetCore.SignalR;
创建一个继承HUB的辅助类,主要功能就是服务端和客户端通信
补充一下HUB类怎么写

public class SignalRHub : Hub
{
private readonly IHubContext<SignalRHub> _hubContext;
private readonly List<string> connectionIDs;
private readonly IMemoryCache _memoryCache;
private int num; public SignalRHub(IHubContext<SignalRHub> hubContext, IMemoryCache memoryCache)
{
connectionIDs = new List<string>();
_hubContext = hubContext;
_memoryCache = memoryCache;
} #region 收
public void Mac1(string macMsg)
{
num++;
if (!string.IsNullOrEmpty(macMsg) || num == connectionIDs.Count)
{
num = 0;
_memoryCache.Set("mac", macMsg); // 存储mac值到内存缓存中
}
}
#endregion #region 传
/// <summary>
/// 客户端连接之后立马执行
/// </summary>
/// <returns></returns>
public override async Task OnConnectedAsync()
{
// 保存连接的客户端到上下文中
connectionIDs.Add(Context.ConnectionId);
await Clients.Caller.SendAsync("Connected", Context.ConnectionId);
//添加到组
await Groups.AddToGroupAsync(Context.ConnectionId, "Mac");
await base.OnConnectedAsync();
} public async Task<string> SendIP(string ip)
{
//await Clients.All.SendAsync("匹配IP", ip);//给所有的客户端发送IP进行匹配
await _hubContext.Clients.Group("Mac").SendAsync("匹配IP", ip);
await Task.Delay(2000);
string mac = _memoryCache.Get<string>("mac"); // 从内存缓存中读取mac值
return mac;
}
#endregion
}

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR; namespace MacService.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class MacSignalRController : ControllerBase
{
/// <summary>
/// 辅助类注入进来
/// </summary>
private readonly SignalRHub _signalRHub;
/// <summary>
/// 构造函数注入
/// </summary>
/// <param name="SignalRHub"></param>
public MacSignalRController(SignalRHub SignalRHub)
{
_signalRHub = SignalRHub;
}
/// <summary>
/// POST请求,传入ip比对客户端ip拿到mac地址
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
[HttpPost]
public async Task<string> SendMessage([FromBody] string ip)
{
return await _signalRHub.SendIP(ip);
}
}
}
写一个接口,给前端浏览器用,传入ip和安装了服务的电脑的ip对比,拿到对应的mac地址

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR; namespace MacService.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class MacSignalRController : ControllerBase
{
/// <summary>
/// 辅助类注入进来
/// </summary>
private readonly SignalRHub _signalRHub;
/// <summary>
/// 构造函数注入
/// </summary>
/// <param name="SignalRHub"></param>
public MacSignalRController(SignalRHub SignalRHub)
{
_signalRHub = SignalRHub;
}
/// <summary>
/// POST请求,传入ip比对客户端ip拿到mac地址
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
[HttpPost]
public async Task<string> SendMessage([FromBody] string ip)
{
return await _signalRHub.SendIP(ip);
}
}
}
因为有用到依赖注入,所以要在Program.cs文件进行注册
1.signalr 2.SignalRHub辅助类 3.MemoryCache
builder.Services.AddSignalR();
builder.Services.AddScoped<SignalRHub>();
builder.Services.AddMemoryCache();
还有要给signalr暴露出来让客户端可以连接,好像是这样解释吧,不知道怎么解释
app.MapHub<SignalRHub>("/signalrhub");
然后你的ip+端口+signalrhub 类似与:https://123.321.456.567:1234/signalrhub 这样,如下图则为成功

现在弄windows服务,这个博客园有大佬写了,我也是看的那个,这里贴个链接
使用.NET Core创建Windows服务详细步骤 - willingtolove - 博客园 (cnblogs.com)
安装和卸载的命令发一下
@echo off
chcp 65001
@title 安装windows服务
@echo off
echo= 安装服务!
@echo off
@sc create MacClientAssist binPath= "%~dp0MacClientAssist.exe"
echo= 启动服务!
@echo off
@sc start MacClientAssist
@echo off
echo= 配置服务!
@echo off
@sc config MacClientAssist start= AUTO
@echo off
echo= 成功安装、启动、配置服务!
@pause
@echo off
chcp 65001
@title 卸载Windows服务
@echo off
echo 正在停止服务...
@echo off
@sc stop MacClientAssist
echo 正在卸载服务...
@echo off
@sc delete MacClientAssist
echo 服务已成功卸载。
@pause
做一个windos服务和api搭配,获取电脑的mac地址的更多相关文章
- java工具类,在Windows,Linux系统获取电脑的MAC地址、本地IP、电脑名
package com.cloudssaas.util; import java.io.BufferedReader; import java.io.IOException; import java. ...
- 【C++】【纯代码】获取电脑的mac地址
bool GetMacAddress(CString &LanMAC) { #define MAX_ADAPTER_NAME_LENGTH 256 #define MAX_ADAPTER_DE ...
- Unity网络通讯(一)获取计算机的MAC地址
1 string GetMac() { string mac = ""; mac = GetMacAddressBySendARP(); return mac; } [DllImp ...
- C#开发BIMFACE系列8 服务端API之获取文件上传状态信息
系列目录 [已更新最新开发文章,点击查看详细] 在BIMFACE控制台上传文件,上传过程及结束后它会自动告诉你文件的上传状态,目前有三种状态:uploading,success,failure ...
- C#开发BIMFACE系列10 服务端API之获取文件下载链接
系列目录 [已更新最新开发文章,点击查看详细] 通过BIMFACE控制台或者调用服务接口上传文件成功后,默认场景下需要下载该源文件,下载文件一般需要知道文件的下载链接即可.BIMACE平台提供 ...
- C#开发BIMFACE系列3 服务端API之获取应用访问凭证AccessToken
系列目录 [已更新最新开发文章,点击查看详细] BIMFACE 平台为开发者提供了大量的服务器端 API 与 JavaScript API,用于二次开发 BIM 的相关应用. BIMFACE ...
- C#开发BIMFACE系列7 服务端API之获取文件信息列表
系列目录 [已更新最新开发文章,点击查看详细] 本文详细介绍如何获取BIMFACE平台中所有上传过的文件信息列表. 请求地址:GET https://file.bimface.com/file ...
- C#开发BIMFACE系列9 服务端API之获取应用支持的文件类型
系列目录 [已更新最新开发文章,点击查看详细] BIMFACE最核心能力之一是工程文件格式转换.无需安装插件,支持数十种工程文件格式在云端转换,完整保留原始文件信息.开发者将告别原始文件解析烦 ...
- C#开发BIMFACE系列19 服务端API之获取模型数据4:获取多个构件的共同属性
系列目录 [已更新最新开发文章,点击查看详细] 在前几篇博客中介绍了一个三维文件/模型包含多个构建,每个构建又是由多种材质组成,每个构建都有很多属性.不同的构建也有可能包含相同的属性. 上图中 ...
- C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模型的楼层信息
系列目录 [已更新最新开发文章,点击查看详细] 一个文件/模型中可能包含多个楼层信息,获取楼层信息对于前端页面的动态展示非常有帮助.本篇介绍获取一个文件/模型中可能包含多个楼层信息的详细方法. ...
随机推荐
- day14-Scanner
Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入.Java.util.Scanner是Java5的新特征,我们可以 ...
- Go语言基础07 _interface _1
Go语言基础07 _interface _1 与其他主要编程语⾔的差异 接⼝为⾮⼊侵性,实现不依赖于借⼝定义 所以接⼝的定义可以包含在接⼝使⽤者包内 package interface_test im ...
- 通过duxapp提供的基础方法、UI组件、全局样式,快速编写项目
使用duxapp,我是如何实现快速完成项目开发的? 像下面这个例子,这个项目有140多个页面,但是真实的开发时间,在熟练使用duxapp的情况下,不会超过两周,并且可以将它兼容APP.小程序.H5 这 ...
- 采用线性回归实现训练和预测(Python)
已知测得某块地,当温度处于15至40度之间时,数得某块草地上小花朵的数量和温度值的数据如下表所示.现在要来找出这些数据中蕴含的规律,用来预测其它未测温度时的小花朵的数量. 测得数据如下图所示: imp ...
- 在线激活win
目前DragonKMS神龙版能激活win11.win10.win8/8.1.win7以及server2008/2012/2016/2019/2022等系统版本,其中包括:专业工作站版.企业版.专业版. ...
- 14.Kubernetes核心技术Helm
Kubernetes核心技术Helm Helm就是一个包管理工具[类似于npm] 为什么引入Helm 首先在原来项目中都是基于yaml文件来进行部署发布的,而目前项目大部分微服务化或者模块化,会分成很 ...
- 【一步步开发AI运动小程序】十七、如何识别用户上传视频中的人体、运动、动作、姿态?
[云智AI运动识别小程序插件],可以为您的小程序,赋于人体检测识别.运动检测识别.姿态识别检测AI能力.本地原生识别引擎,内置10余个运动,无需依赖任何后台或第三方服务,有着识别速度快.体验佳.扩展性 ...
- 使用MySQL Shell 8.4.1-LTS 直接将数据复制到 MySQL实例
在之前的文章中,我谈到了如何使用 MySQL Shell 通过多线程过程来转储和加载数据,以及如何以不同格式导出表数据,然后可以将这些数据导入到新的 MySQL 实例中.这篇文章将讨论我们如何直接将数 ...
- tcp全连接满了怎么处理
cat /proc/sys/net/ipv4/tcp_max_syn_backlog #syn队列最大长度 netstat -ntl | grep SYN_RECV | wc -l #syn队列当前长 ...
- Vue.js 其他指令
1.ref标识 通过给HTML标签或者组件标签设定ref属性,根据他的属性值来访问这个HTML元素或者组件 语法:this.$refs.属性值 //为p标签设置ref属性 <div id=&qu ...