C# 实时监控双门双向门禁控制板源码

news2024/11/28 13:38:58

本示例使用设备:实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
using System.Collections;
using System.Collections.Specialized;
using System.Runtime.InteropServices;
using System.Management;

namespace UdpPostReaderDemoCSharp
{
    public partial class Form1 : Form
    {
        Form3 f3;
        Form5 f5;
        Form6 f6;

        int PortNumber;
        public string localIp;
        string machinnos;

        Boolean  ready = false ;  //线程运行标志
        Socket ListenerSock;      //Socket
        Thread ListenerThre;      //端口侦听线程
        public IPEndPoint RemoteIPoint;  //这里指向发送数据包的目的Ip及端口,EndPoint是IPEndPoint的基类,IPEndPoint可以强转为EndPoint。EndPoint ep = (EndPoint)iep,主要目的是IPEndPoint可以自己写入IP地址和端口
        
        string BeepCode;
        string VoiceCode;

        public string sendcode;   //批量下传注册号的指针、缓冲、重发标志
        public bool SendCount;
        public int SendAgain;
        public int SendPoin;
        public int SendPoinMax;
        public string[] SendBufStr=new string[7950];

        delegate void Update1(string text1,string text2);   //线程内更新UI委拖

        [DllImport("Iphlpapi.dll")]
        private static extern int SendARP(Int32 dest, Int32 host, ref   Int64 mac, ref   Int32 length);
        [DllImport("Ws2_32.dll")]
        private static extern Int32 inet_addr(string ip);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ready = false;
            GetIp();            
            StartListener();
        }

        private void GetIp()
        {
            ArrayList AllIp = new ArrayList();
            string name = Dns.GetHostName();
            IPAddress[] ipadrlist = Dns.GetHostAddresses(name);
            foreach (IPAddress ipa in ipadrlist)
            {
                if (ipa.AddressFamily == AddressFamily.InterNetwork)
                    localIp = ipa.ToString();
                if (checkip(localIp))
                {
                    AllIp.Add(localIp);
                    ComboBox1.Items.Add(localIp);
                }
            }
            if (ComboBox1.Items.Count > 0)
            {
                ComboBox1.SelectedIndex = 0;
                localIp = ComboBox1.Text; 
            }
            else {
                MessageBox.Show("未能查找到本台电脑安装的网卡,暂不能启动本软件。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                System.Environment.Exit(0);              //这是最彻底的退出方式,不管什么线程都被强制退出,把程序结束的很干净。
            }
        }

        private void StartListener()
        {
            IPEndPoint LocalPoint;
            PortNumber = Convert.ToInt32(TextBox6.Text) ;
            while (!ready)
            {
                try
                {
                    LocalPoint = new IPEndPoint(IPAddress.Parse(localIp), PortNumber);
                    ListenerSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                    ListenerSock.Bind(LocalPoint);
                    
                    ListenerThre = new Thread(new ThreadStart(ThrListener));
                    ListenerThre.Start();
                    ready = true;
                }
                catch 
                {
                    ListenerSock.Close();
                    ready = false;
                    MessageBox.Show("有其它应用程序占用了 " + PortNumber.ToString() + " ,请检查并关闭此应用后再打开本程序", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    System.Environment.Exit(0);                      //这是最彻底的退出方式,不管什么线程都被强制退出,把程序结束的很干净。
                }
            }
        }

        public  void ThrListener()
        {
            while (ready)
            {
                try
                {
                    EndPoint RemotePoint = new IPEndPoint(System.Net.IPAddress.Any, 0);
                    byte[] bytes = new byte[1024];
                    int NumGet = ListenerSock.ReceiveFrom(bytes, ref RemotePoint);

                    string Msg = Encoding.GetEncoding(936).GetString(bytes, 0, NumGet);
                    //string Msg = Encoding.UTF8.GetString(bytes, 0, NumGet);             //读wifi参数时,要用utf8编码

                    string dispstr = DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") + (" FromIP:" + Convert.ToString(RemotePoint) + "          ").Substring(0, 30) + "Data:";
                    RemoteIPoint =(IPEndPoint)RemotePoint;                      //获取数据包来源IP及端口,原路回应
                    this.BeginInvoke(new Update1(EditUi), dispstr, Msg);        //显示接收到的数据包,并根据情况回应设备            
                }
                catch(Exception ex )
                {
                    this.BeginInvoke(new Update1(EditUi), DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss")+" ",ex.Message  );
                }
            }
        }

private void EditUi(string text1, string Msg)     //解析显示接收到的数据包,并对设备进行回应
        {
            if (ListBox1.Items.Count > 50) { ListBox1.Items.Clear();}
            ListBox1.Items.Add(text1 + Msg);
            ListBox1.SelectedIndex = ListBox1.Items.Count - 1;

            string DevRecFramesStr;
            string DevBufferIpAddrStr;
            string DevBufferMachinStr;
            string DevBufferCardidStr;
            string DevBufferDatetimeStr;
            string DevBufferUseMoneryStr;
            string DevBufferUseTimeStr;
            string DevBufferMaskStr;
            string DevBufferGatewayStr;
            string DevBufferRemoteAddrStr;
            string DevBufferPort;
            string DevBufferNumberDecStr;
            string DevBufferGatewayStrMAC;
            string DevBufferRemoteAddrMACStr;
            string DevBufferMACSearchStr;
            string DevBufferSerialNumStr;
            string DevBufferStaryStr;
            string DevBufferRecordAddStr;
            string DevBufferAllNoStr;
            string DevBufferInputKeyStr;
            string DevBufferCommandStr;
            string DevBufferFunctionStr1;
            string DevBufferFunctionStr2;
            string DevBufferQrcodeInfStr;
            string DevBufferReaderStr;
            string DevBufferDoorNoStr;
            string DevBufferDelayStr;
            string DevBufferPasswPropStr;
            string DevBufferPassWStr;
            string DevBufferStateStr;
            string DevBufferRandomCode;
            string DevBufferScanStr;

            string MACSTC;
            string MACCH;
            string iswifi;
            string wifidhcp;
            string Sendinf;
            int poi;

            ListViewItem plist;
 
            string[] dataArray = Msg.Split(new char[2] { ',', ',' });
            
            switch (dataArray[0])
            {
                case "101":             //接收到 1、终端开机时向电脑发送的开机信息,         2、电脑发送002查询设备时间所返回的信息
                    DevRecFramesStr = dataArray[1];            //包序列号
                    DevBufferIpAddrStr = dataArray[2];         //终端IP
                    DevBufferRemoteAddrStr = dataArray[3];     //远程电脑指机IP
                    DevBufferMachinStr = dataArray[4];         //机号
                    DevBufferDatetimeStr = dataArray[5];       //日期时间*/
                    if (dataArray.Length  > 6)
                    {               //2018年以后的设备有唯一硬件序号*/
                            DevBufferSerialNumStr = dataArray[6];
                    }
                    Response("001," + DevRecFramesStr);       //向设备回应001+包序列号,表示已收到信息,否则设备会连续发三次

                    string SystemTimeStr = DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss");
                    if( DevBufferDatetimeStr.Substring(0, 16) != SystemTimeStr.Substring(0, 16) )  //判断设备时间是否正确,不正确就更正时间
                    {
                        Response("003," + DevBufferMachinStr+","+SystemTimeStr);//更新设备时钟
                    }
                    TextBox3.Text = DevBufferDatetimeStr;
                    break;
                case "150":                                    //接收到实时考勤门禁机刷卡数据
                    DevRecFramesStr = dataArray[1];            //包序列号
                    DevBufferIpAddrStr = dataArray[2];         //终端IP
                    DevBufferRemoteAddrStr = dataArray[3];     //远程电脑指机IP
                    DevBufferMachinStr = dataArray[4];         //机号
                    DevBufferCardidStr = dataArray[5];         //十位物理卡号
                    DevBufferReaderStr= dataArray[6];          //读头号
                    DevBufferDoorNoStr = dataArray[7];         //门或继电器号*/
                    DevBufferDelayStr = dataArray[8];          //门磁未关秒数,0表示已关*/
                    DevBufferPasswPropStr = dataArray[9];      //密码属性(0密码无效,1刷卡后按密码,2补签密码,3开门密码,4防迫胁密码)*/
                    DevBufferPassWStr = dataArray[10];         //密码(最多8位数字)*/
                    DevBufferUseTimeStr = dataArray[11];       //刷卡时间                        
                    if(dataArray.Length > 12){
                            DevBufferSerialNumStr = dataArray[12];  //2018年以后的设备有唯一硬件序号
                    }
                    Response("001," + DevRecFramesStr);       //向设备回应001+包序列号,表示已收到信息,否则设备会连续发三次

                    //此处加入业务对数据库的查、增、删、减操作
                    //用050指令返回开门成功,051指令返回开门失败,正式系统开发时要有重发机制

                    switch(  VoiceCode)
                    {
                        case "0":
                        case "1":
                        case "2":
                        case "3":
                        case "4":
                        case "5":
                        case "6":
                        case "7":
                        case "8":
                        case "9":
                        case "10":
                        case "11":
                        case "12":
                        case "13":
                        case "14":
                        case "15":  //提示警告不开门
                            Sendinf = "051," + DevBufferMachinStr + "," + DevBufferCardidStr + "," + TextBox5.Text.Trim() + "," + NumericUpDown2.Value.ToString() + "," + BeepCode + "," + VoiceCode;   
                            break;
                        default :   //显示并开门
                            Sendinf = "050," + DevBufferMachinStr + "," + DevBufferCardidStr + "," + TextBox5.Text.Trim() + "," + NumericUpDown2.Value.ToString() + "," + BeepCode + "," + VoiceCode + "," + DevBufferReaderStr + "," + DevBufferDoorNoStr + "," + NumericUpDown1.Value.ToString() + "," + NumericUpDown2.Value.ToString(); 
                            break;
                    }
                    Response(Sendinf);
                    break;

                case "151":                                    //接收到实时考勤门禁机按钮开门申请信息
                    DevRecFramesStr = dataArray[1];            //包序列号
                    DevBufferIpAddrStr = dataArray[2];         //终端IP
                    DevBufferRemoteAddrStr = dataArray[3];     //远程电脑指机IP
                    DevBufferMachinStr = dataArray[4];         //机号
                    DevBufferInputKeyStr = dataArray[5];       //按钮号
                    DevBufferReaderStr = dataArray[6];         //对应的门或继电器号
                    DevBufferDelayStr = dataArray[7];          //门磁未关秒数(0门已关)
                    DevBufferUseTimeStr = dataArray[8];        //按键时间                        
                    if (dataArray.Length > 9)
                    {
                        DevBufferSerialNumStr = dataArray[9];  //2018年以后的设备有唯一硬件序号
                    }
                    Response("001," + DevRecFramesStr);       //向设备回应001+包序列号,表示已收到信息,否则设备会连续发三次

                    //此处加入业务对数据库的查、增、删、减操作
                    //用050指令返回开门成功,051指令返回开门失败,正式系统开发时要有重发机制

                    switch (VoiceCode)
                    {
                        case "0":
                        case "1":
                        case "2":
                        case "3":
                        case "4":
                        case "5":
                        case "6":
                        case "7":
                        case "8":
                        case "9":
                        case "10":
                        case "11":
                        case "12":
                        case "13":
                        case "14":
                        case "15":  //提示警告不开门
                            Sendinf = "051," + DevBufferMachinStr + "," + DevBufferInputKeyStr + "," + TextBox5.Text.Trim() + "," + NumericUpDown2.Value.ToString() + "," + BeepCode + "," + VoiceCode;
                            break;
                        default:   //显示并开门
                            Sendinf = "050," + DevBufferMachinStr + "," + DevBufferInputKeyStr + "," + TextBox5.Text.Trim() + "," + NumericUpDown2.Value.ToString() + "," + BeepCode + "," + VoiceCode + "," + DevBufferReaderStr + "," +  NumericUpDown1.Value.ToString() + "," + NumericUpDown2.Value.ToString();
                            break;
                    }
                    Response(Sendinf);
                    break;

                case "152":                                    //接收到实时考勤门禁机门磁报警信息
                    DevRecFramesStr = dataArray[1];            //包序列号
                    DevBufferIpAddrStr = dataArray[2];         //终端IP
                    DevBufferRemoteAddrStr = dataArray[3];     //远程电脑指机IP
                    DevBufferMachinStr = dataArray[4];         //机号
                    DevBufferInputKeyStr = dataArray[5];       //门磁号
                    DevBufferReaderStr = dataArray[6];         //对应的门或继电器号
                    DevBufferDelayStr = dataArray[7];          //门磁未关秒数(0门已关)
                    DevBufferUseTimeStr = dataArray[8];        //设备时间                        
                    if (dataArray.Length > 9)
                    {
                        DevBufferSerialNumStr = dataArray[9];  //2018年以后的设备有唯一硬件序号
                    }
                    Response("001," + DevRecFramesStr);       //向设备回应001+包序列号,表示已收到信息,否则设备会连续发三次
                    break;

                case "153":                                    //接收到实时考勤门禁机查询设备状态的053指令反馈
                    DevRecFramesStr = dataArray[1];            //包序列号
                    DevBufferIpAddrStr = dataArray[2];         //终端IP
                    DevBufferRemoteAddrStr = dataArray[3];     //远程电脑指机IP
                    DevBufferMachinStr = dataArray[4];         //机号
                    DevBufferInputKeyStr = dataArray[5];       //门及继电器号
                    DevBufferReaderStr = dataArray[6];         //继电器状态
                    DevBufferDelayStr = dataArray[7];          //门磁未关秒数(0门已关)
                    DevBufferStateStr = dataArray[8];          //门磁报警状态                        
                    if (dataArray.Length > 9)
                    {
                        DevBufferSerialNumStr = dataArray[9];  //2018年以后的设备有唯一硬件序号
                    }
                    Response("001," + DevRecFramesStr);       //向设备回应001+包序列号,表示已收到信息,否则设备会连续发三次

                    f6.TextBox3.Text = "继电器号:" + DevBufferInputKeyStr + ",继电器状态:" + DevBufferReaderStr + ",门磁未关秒数:" + DevBufferDelayStr + ",门磁报警状态:" + DevBufferStateStr;
                    break;

                case "154":                                    //接收到实时考勤门禁机卡离开感应区
                    DevRecFramesStr = dataArray[1];            //包序列号
                    DevBufferIpAddrStr = dataArray[2];         //终端IP
                    DevBufferRemoteAddrStr = dataArray[3];     //远程电脑指机IP
                    DevBufferMachinStr = dataArray[4];         //机号
                    DevBufferCardidStr = dataArray[5];         //十位物理卡号
                    DevBufferSerialNumStr = dataArray[6];      //设备有唯一硬件序号

                    break;

                case "155":                                    //接收到实时考勤门禁机脱网记录
                    DevRecFramesStr = dataArray[1];            //包序列号
                    DevBufferIpAddrStr = dataArray[2];         //终端IP
                    DevBufferRemoteAddrStr = dataArray[3];     //远程电脑指机IP
                    DevBufferMachinStr = dataArray[4];         //机号
                    DevBufferCardidStr = dataArray[5];         //十位物理卡号
                    DevBufferReaderStr = dataArray[6];         //读头号
                    DevBufferDoorNoStr = dataArray[7];         //门或继电器号*/
                    DevBufferPasswPropStr = dataArray[8];      //密码属性(0密码无效,1刷卡后按密码,2补签密码,3开门密码,4防迫胁密码)*/
                    DevBufferUseTimeStr = dataArray[9];        //刷卡时间    
                    DevBufferStaryStr = dataArray[10];         //消费方式  0扣费 1计次*/
                    DevBufferRecordAddStr = dataArray[11];     //记录地址标识*/
                    DevBufferAllNoStr = dataArray[12];         //总计录数*/
                    DevBufferSerialNumStr = "";
                    if (dataArray.Length > 12)
                    {
                        DevBufferSerialNumStr = dataArray[13];  //2018年以后的设备有唯一硬件序号
                    }
                    Response("001," + DevRecFramesStr);         //向设备回应001+包序列号,表示已收到信息,否则设备会连续发三次

                    if (!checkDateTime(DevBufferUseTimeStr)) { DevBufferUseTimeStr = "9999-99-99 99:99:99"; } //如果接收到非法的消费时间,将消费时间改为"9999-99-99 99:99:99"才能清除。

                    //此处加入这里对脱网记录进行处理,对数据库的查、增、删、减操作

                    if (CheckBox3.Checked)  //清除设备内当前这条已上传的记录,驱动设备继续上传剩下的记录
                    {
                        Sendinf = "055," + DevBufferMachinStr + "," + DevBufferCardidStr + ","  + DevBufferUseTimeStr + "," + DevBufferRecordAddStr;
                        Response(Sendinf);
                    }
                    break;

                case "158":                                    //接收到实时考勤门禁机远程开门058指令的反馈
                    DevRecFramesStr = dataArray[1];            //包序列号
                    DevBufferIpAddrStr = dataArray[2];         //终端IP
                    DevBufferRemoteAddrStr = dataArray[3];     //远程电脑指机IP
                    DevBufferMachinStr = dataArray[4];         //机号
                    DevBufferStaryStr = dataArray[5];          //0开门成功,1开门密码认证失败,2开门密码认证失败超过6次,需等待一段时间后再能再次接收058指令(防暴力破解),3 不允许此时间段开门
                    DevBufferRandomCode = dataArray[6];        //动态随机码(8位十六进制)

                    switch (DevBufferStaryStr)
                    {
                        case "0":
                            f6.TextBox3.Text = "IP:" + DevBufferIpAddrStr + " 开门成功";
                            f6.TextBox2.Text = DevBufferRandomCode;
                            break;
                        case "1":
                            f6.TextBox3.Text = "IP:" + DevBufferIpAddrStr + " 开门密码认证失败!";
                            f6.TextBox2.Text = DevBufferRandomCode;
                            break;
                        case "2":
                            f6.TextBox3.Text = "IP:" + DevBufferIpAddrStr + " 开门密码认证失败超过6次,需等待一段时间后再能再次接收058指令(防暴力破解)";
                            f6.TextBox2.Text = DevBufferRandomCode;
                            break;
                        case "3":
                            f6.TextBox3.Text = "IP:" + DevBufferIpAddrStr + " 不允许此时间段开门";
                            f6.TextBox2.Text = DevBufferRandomCode;
                            break;
                    }
                    break;

                case "159":                                    //接收到实时考勤门禁机心跳信息
                    DevRecFramesStr = dataArray[1];            //包序列号
                    DevBufferIpAddrStr = dataArray[2];         //终端IP
                    DevBufferRemoteAddrStr = dataArray[3];     //远程电脑指机IP
                    DevBufferMachinStr = dataArray[4];         //机号
                    DevBufferQrcodeInfStr = dataArray[5];      //信息类型
                    DevBufferFunctionStr1 = dataArray[6];      //继电器状态(bit0为第1门bit1为第2门)
                    DevBufferFunctionStr2 = dataArray[7];      //消防输入状态
                    DevBufferRandomCode = dataArray[8];        //&动态随机码(8位十六进制)
                    DevBufferDatetimeStr = dataArray[9];       //日期时间
                    DevBufferSerialNumStr = dataArray[10];     //设备硬件号

                    try
                    {
                        f6.TextBox2.Text = DevBufferRandomCode;
                    }
                    catch { }
                    break;

                case "170":                                    //接收门禁外接双USB扫描枪模块
                    DevRecFramesStr = dataArray[1];            //包序列号
                    DevBufferIpAddrStr = dataArray[2];         //终端IP
                    DevBufferRemoteAddrStr = dataArray[3];     //远程电脑指机IP
                    DevBufferMachinStr = dataArray[4];         //机号
                    DevBufferScanStr = dataArray[5];           //扫码信息
                    DevBufferReaderStr= dataArray[6];          //对应门的扫描枪号
                    DevBufferDoorNoStr = dataArray[7];         //门或继电器号*/
                    DevBufferDelayStr = dataArray[8];          //门磁未关秒数,0表示已关*/
                    DevBufferUseTimeStr = dataArray[9];        //扫码时间                        
                    DevBufferSerialNumStr = dataArray[10];     //设备有唯一硬件序号

                    Response("001," + DevRecFramesStr);         //向设备回应001+包序列号,表示已收到信息,否则设备会连续发三次

                    switch(  VoiceCode)
                    {
                        case "0":
                        case "1":
                        case "2":
                        case "3":
                        case "4":
                        case "5":
                        case "6":
                        case "7":
                        case "8":
                        case "9":
                        case "10":
                        case "11":
                        case "12":
                        case "13":
                        case "14":
                        case "15":  //提示警告不开门
                            Sendinf = "051," + DevBufferMachinStr + "," + DevBufferReaderStr + "," + TextBox5.Text.Trim() + "," + NumericUpDown2.Value.ToString() + "," + BeepCode + "," + VoiceCode;   
                            break;
                        default :   //显示并开门
                            Sendinf = "050," + DevBufferMachinStr + ",0," + TextBox5.Text.Trim() + "," + NumericUpDown2.Value.ToString() + "," + BeepCode + "," + VoiceCode + "," + DevBufferReaderStr + "," + DevBufferDoorNoStr + "," + NumericUpDown1.Value.ToString() + "," + NumericUpDown2.Value.ToString(); 
                            break;
                    }
                    Response(Sendinf);
                    break;

            }

 

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

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

相关文章

通信原理板块——脉冲编码调制(PCM)

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、脉冲编码调制PCM原理 将模拟信号…

[Jenkins] Docker 安装Jenkins及迁移流程

系统要求 最低推荐配置: 256MB可用内存1GB可用磁盘空间(作为一个Docker容器运行jenkins的话推荐10GB) 为小团队推荐的硬件配置: 1GB可用内存50 GB 可用磁盘空间 软件配置: Java 8—无论是Java运行时环境(JRE)还是Java开发工具包(JDK&#xff…

算法-链表-简单-相交、反转、回文、环形、合并

记录一下算法题的学习5 在写关于链表的题目之前,我们应该熟悉回忆一下链表的具体内容 什么是链表: 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据&#xff0c…

力扣第695题 岛屿的最大面积 C++ DFS BFS 附Java代码

题目 695. 岛屿的最大面积 中等 相关标签 深度优先搜索 广度优先搜索 并查集 数组 矩阵 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你…

系列四、JVM的内存结构【本地接口(Native Interface)】

一、组成 本地接口由本地方法栈(Native Method Stack)、本地方法接口(Native Interface)、本地方法库组成。 二、本地接口的作用 本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C程序,Jav…

CTFhub-RCE-过滤运算符

检查网页源代码发现如果用户输入 || (逻辑或操作符) 或者是 & (按位与操作符),就不会执行。直接进行测试,在 URL 后输入本地 IP 进行 ping 命令测试,发现可以正常回显。检查网页源代码发现如…

C++基础从0到1入门编程(一)

系统学习C 方便自己日后复习,错误的地方希望积极指正 参考视频:黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难 1 第一个C程序-HelloWorld 编写一个C程序分为四个步骤: (1)创建项目 (2&#xff…

Android开发APP显示头部Bar

Android开发显示头部Bar 需求&#xff1a; 显示如下图&#xff1a; 显示头部Bar&#xff0c;颜色也能自定义。 解决方案 这个修改是在如下三个文件里进行修改&#xff1a; 按顺序修改&#xff1a; themes.xml(night): <resources xmlns:tools"http://schemas.andr…

LeetCode(22)N 字形变换【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; N 字形变换 1.题目 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A …

3.6 Windows驱动开发:内核进程汇编与反汇编

在笔者上一篇文章《内核MDL读写进程内存》简单介绍了如何通过MDL映射的方式实现进程读写操作&#xff0c;本章将通过如上案例实现远程进程反汇编功能&#xff0c;此类功能也是ARK工具中最常见的功能之一&#xff0c;通常此类功能的实现分为两部分&#xff0c;内核部分只负责读写…

滚雪球学Java(09-2):Java中的关系运算符,你真的掌握了吗?

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

java“贪吃蛇”小游戏

基于java实现贪吃蛇小游戏&#xff0c;主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。 我是在javaSwing项目下创建了一个包 名字叫做&#xff1a;Snakes包 包下有一个启动类和一个设置代码的主界面两个类 代码主界面&#xff1a; 代码主界面主要讲解的是 …

2023年中国冲击波治疗仪市场发展趋势分析:未来市场增长空间更大[图]

冲击波在临床医学领域最早应用于体外冲击波碎石&#xff0c;在二十世纪八十年代末期&#xff0c;体外冲击波碎石技术开始被运用到骨科及康复理疗领域&#xff0c;经过十余年的临床研究&#xff0c;冲击波疗法日益完善&#xff0c;应用范围也日益扩大。冲击波作为一种介于保守疗…

【Linux】Linux进程间通信(二)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

【开源】基于Vue和SpringBoot的固始鹅块销售系统

项目编号&#xff1a; S 060 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S060&#xff0c;文末获取源码。} 项目编号&#xff1a;S060&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固…

Elasticsearch:运用向量搜索通过图像搜索找到你的小狗

作者&#xff1a;ALEX SALGADO 你是否曾经遇到过这样的情况&#xff1a;你在街上发现了一只丢失的小狗&#xff0c;但不知道它是否有主人&#xff1f; 了解如何使用向量搜索或图像搜索来做到这一点。 通过图像搜索找到你的小狗 您是否曾经遇到过这样的情况&#xff1a;你在街…

【自留地】前端 - uniapp - Vue - React - Flutter

uniapp uniapp自用速查表 - 我的常用组件 uniapp自用速查表 - 我的常用组件_uniapp static/customicons.css-CSDN博客文章浏览阅读1.8k次。uniapp项目登录退出、全局变量与状态、本地存储、Tabbar标签栏、顶部导航栏、下拉刷新、触底刷新、Ajax交互、内置组件样式修改、自定义…

2018年五一杯数学建模C题江苏省本科教育质量综合评价解题全过程文档及程序

2019年五一杯数学建模 C题 江苏省本科教育质量综合评价 原题再现 随着中国的改革开放&#xff0c;国家的综合实力不断增强&#xff0c;中国高等教育发展整体已进入世界中上水平。作为一个教育大省&#xff0c;江苏省的本科教育发展在全国名列前茅&#xff0c;而江苏省13个地级…

Linux:进程替换和知识整合

文章目录 进程程序替换替换原理进程替换的理解 环境变量与进程替换命令行解释器实现逻辑 进程程序替换 前面已经学习了子进程的创建&#xff0c;但是子进程的创建不管怎么说&#xff0c;都是父进程代码的一部分&#xff0c;那么实际上如果想要子进程执行新的程序呢&#xff1f…

2023年中国脑电仿生电刺激仪发展趋势分析:智能化、精准化、使用感不断提高[图]

脑电仿生电刺激仪是一种通过直接数字频率合成技术合成脑电仿真低频生物电流&#xff0c;通过粘贴于两耳侧乳突、太阳穴或风池穴部位表皮的电极&#xff0c;用仿生物电自颅外无创伤地穿透颅骨屏障刺激小脑顶核区的电疗设备。此电流刺激可启动颅脑固有神经保护机制&#xff0c;改…