4438无线网络组网代码解析

2023-05-16

device_bind_process是怎么实现绑定的?

enum

{

    NOSTATE,

    UBIND,              //等待接收 握手一次1

    WAIT_FOR_TOUCH,     //

    WAIT_FOR_CONFIRM,   //点击按键后 回复一次2

    BIND_SUCCESS,       //等待接收 握手3次

};

此段代码是在void touch_scan(void)

//绑定状态的切换   按2、3按键进入网状态 怎么表现的2、3键

if (device_bind_process==WAIT_FOR_TOUCH)        

{

if (i==3)             

{

       device_bind_process = WAIT_FOR_CONFIRM; //点击按键后 回复一次2

       enter_vlps_xms(50);//进入第功率状态

       return;

     }

 }

//检测到有新设备的时候,状态为WAIT_FOR_TOUCH,按了3键紧接着进入了WAIT_FOR_CONFIRM,进入WAIT_FOR_CONFIRM以后干吗用呢????

 

 

void task_25ms(void *args)

{

   

  if (!is_task_set(EV_REPS))//如果没有启动wireless_response就启动wireless_check_irq

  {

       notify(EV_WIRQ);   //75MS Per.time  启动wirless_check_irq

  }

 // if ((silicon_status&SILLICON_ALL_SET)||is_task_set(EV_REPS)||is_task_set(EV_WIRQ)||cap_pad[0].led_on||cap_pad[1].led_on||cap_pad[2].led_on||cap_pad[3].led_on) return;  //sleep or not

   //    enter_vlps_xms(15); //wake up for EV_WIRQ  75ms

  if (bind_state_cnt!=0)

  {

      if(0==--bind_state_cnt)

      {

          device_bind_process=UBIND;//入网的时候会把bind_state_cnt赋值0x28,,在282内没有完成就是没有绑定成功。

在规定的时间内没有完成绑定的工作

      }

  }

}

 

 

 

 

device_bind_process初始化为NOSTATE

uint8 device_bind_process=NOSTATE; //绑定状态切换

 

void bind_listen_send()

{

    test_buff[8]={0x8E,0x24,0x8B,0x00,0x65,0x3,0xF0,0x95};

    if (si4438_statue == SI4438_SLEEP) 

    {

         vRadio_StartRX(SI4438_CHANL, SI4438_DATALETH);       //4MS 所有READCTS带自动复位功能

         si4438_statue = SI4438_RX;

         clr_detc();

    }

  //注意 清旧设备和这里会出现连续保持RX

    if (si4438_statue == SI4438_RX)

    { 

        clr_detc();

        if(0==read_4438_irq_port())  

       // if (1) 

        { 

          

           if(SI446X_CMD_GET_INT_STATUS_REP_PACKET_RX_PEND_BIT!=bRadio_Check_Tx_RX(g_frame_buffer))

               return; // test by lgt

           //如果是新设备会进入第一次入网的申请  木

           if(BIND_MESSGE == frame_ctl(&g_frame_buffer[0],Si446xCmd.FIFO_INFO.RX_FIFO_COUNT))  // test by lgt

           //if(BIND_MESSGE == frame_ctl(test_buff,8))

           {

               //adapter_infor_add(); //置旧设备标志位,写FLASH

            device_bind_process=WAIT_FOR_TOUCH;

             这里就就解释了WAIT_FOR_TOUCH的由来

           }

           else         //非绑定报文

           {

               if (!(silicon_status&0x58)) 

               {

                   si446x_change_state(1);

                   return; //保证关灯时电够用

               }

               //notify(EV_BIND);

           }

           si446x_change_state(1); //先休眠无线在切低功耗 记得和上面的changestate合一起

         //  enter_vlps_100ms(); 

           

        }

        set_detc();

       

    }

    else

    {

       

          //code finished ,no test

 

             //clr_selc();

             if(cap_pad[0].led_on||cap_pad[1].led_on||cap_pad[2].led_on||cap_pad[3].led_on)

                 return;

             si446x_get_int_status(0u, 0u, 0u); //一定清标志位

            // enter_vlps_100ms(); //先电容充电再发送报文

            // enter_vlps_100ms(); 

             

             if (device_bind_process==WAIT_FOR_CONFIRM)//如果处于设置状态的话,就会填充握手报文。8e 24 8b 00 65 aa bb cc 04 77 00

             {

                 Device_broadcast_mess.ctrl=4;

                 Device_broadcast_mess.handle=1;

                 Device_broadcast_mess.data=RELAY_4_CHAN;// enter_vlps_xms(200);

                 Device_broadcast_mess.sum=sum((unsigned char *)&Device_broadcast_mess,10);                

             }

             if (device_bind_process == NOSTATE

             {

                 memset_my(Device_broadcast_mess.dev_id, 0XFF, ADAPTER_ADDRESS_LEN);

                 memset_my(Device_broadcast_mess.my_id, 0, SLAVE_ADDRESS_LEN); 

                 Device_broadcast_mess.ctrl=3;

                 Device_broadcast_mess.data=RELAY_4_CHAN;

             }

               Device_broadcast_mess.sum=sum((unsigned char *)&Device_broadcast_mess,10);

             vRadio_StartTx_Variable_Packet(0, &Device_broadcast_mess.head, 11); //  重传/100ms+20ms/次

             while(read_4438_irq_port()!=0);

             

             si4438_delay--;

             //set_selc();

    }

}

 

 

 

u8 wirless_state_analyse()

{

     if (device_bind_process==WAIT_FOR_TOUCH) //TOUCH状态在触摸按键检测中切换

        {

            change_led_select();//等待触摸,不断闪灯

            notify(EV_BIND);

            return 0xff;

        }

            

        if (device_bind_process==BIND_SUCCESS)       //TOUCH状态在触摸按键检测中切换

        {

            si446x_change_state(1);  //先关闭无线 写FLASH需要时间

            adapter_infor_add();//把新设备置成老设备  木

            memset_my(g_frame_buffer, 0, 20);

           // enter_vlps_xms(50); //防止绑定结束后复位

            ctrl_set_all();

            led_clr_all();

            bind_state_cnt=0;//绑定成功了,就会把bind_state_cnt置0.。

            si4438_statue = SI4438_SLEEP;//SI4438_SLEEP状态出现在3中情况下,BIND_SUCCESS,UBIND,初始化的时候三种状态

            si4438_delay = WIRELESS_DELAY; 

            device_bind_process=NOSTATE;//无状态的三种情况是绑定成功,绑定失败,初始化为无状态

            enter_my_sleep(5); //此处有重大BUG 成功后复位

            

            return 0xff;

        }

        if(device_bind_process==UBIND)

        {

            si446x_change_state(1);

            ctrl_set_all();

            led_clr_all();

            si4438_statue = SI4438_SLEEP;

            si4438_delay = WIRELESS_DELAY; 

            device_bind_process=NOSTATE;

            enter_vlps_xms(500);

            return 0xff;

        }

        return 0;

}

 

 

 

uint8 SI4438_bind_message_handle(struct SI4438_Frame * pframe)

{

    switch (pframe->ctrl)

    {

    case ADAPTER_BIND_FLAG: 

        mymemcpy(device_id, pframe->dev_id, ADAPTER_ADDRESS_LEN); 

        mymemcpy(slave_device_id,pframe->my_id,SLAVE_ADDRESS_LEN);

        mymemcpy(Device_broadcast_mess.dev_id,pframe->dev_id,ADAPTER_ADDRESS_LEN); //填入广播报文

        mymemcpy(Device_broadcast_mess.my_id,pframe->my_id,SLAVE_ADDRESS_LEN);//填入广播报文

        Device_broadcast_mess.handle=pframe->handle;

        bind_state_cnt = BIND_WAIT_TIME;//等待成功的时间

        return BIND_MESSGE;

    case BIND_ACK_FLAG:

        if(device_bind_process != WAIT_FOR_CONFIRM)return 0xFF;

        device_bind_process=BIND_SUCCESS; 

        return BIND_ACK_FLAG;

        default:return 0xff;

    }

 

}

 

 

uint8 SI4438_bind_message_handle(struct SI4438_Frame * pframe)问题来了谁来调用SI4438_bind_message_handle

 

uint8 frame_ctl(uint8 rxframe[], uint8 rxlen)

{

    uint8  i = 0,framelenth;

    struct SI4438_Frame *pframe;

    if (rxlen<10) return 0xFF;//做的容错,因为协议都是11位的 木

    while(i < rxlen)

{

        if(HW_HEAD == rxframe[i]||STC == rxframe[i])//判断起始符,0X8E 木

            break;

i++;

}

    if(i >= rxlen)

    {

        return(0xFF);

    }

    framelenth=rxlen-i;//除起始符外的长度

    if (framelenth<10) return 0XFF;

//if (STC==rxframe[i])return(frame_handle(0,rxframe + i)); //选择兼容载波协议

    pframe = (struct SI4438_Frame *)(rxframe + i); 

    if (pframe->sum!=sum(rxframe+i,10)) return 0xFF;//判断校验码

    if (DEVICE_IS_NEW==new_device_flag) //新设备发送入网申请命令 木

    {

        return(SI4438_bind_message_handle(pframe));

    }

    return (SI4438_remote_handle(pframe)); //选择支持自定义短协议

 

    //return(remote_handle(pframe));    //选择支持遥控器

}

 

 

 

void wirless_check_irq(void *args)

{

    clr_wdog();

  //  uint8_t lenth=0;

    if (DEVICE_IS_NEW==new_device_flag) //新设备将不执行正常检测中断  added in 2015-3-4 no test

    {

        return;//如果是新设备就不用检测无线的中断了。

    }

    

    if (si4438_statue == SI4438_SLEEP) //绑定成功就读,那么不成功也是读呀????因为绑定成功和不成功设备都要是SI4438_SLEEP

    {

         vRadio_StartRX(SI4438_CHANL, SI4438_DATALETH);       //4MS 所有READCTS带自动复位功能,  读的东西放在哪里了????

         si4438_statue = SI4438_RX;//为什么要把它置于读的状态????木  表示已经读过4438了吗???

         //GPIOA_PCOR |= GPIO_PCOR_PTCO(CTRL2_PIN); //无线监听动作开始计量

    }

    

   

    if(0==read_4438_irq_port())//用来检测中断木  为0表示中断发生

    {

       if (si4438_statue==SI4438_TX)goto finish_rcv;     //finish the tx//vRadio_StartRX只是开始读,把数据读出来只是bRadio_Check_Tx_RX这个函数

       if(SI446X_CMD_GET_INT_STATUS_REP_PACKET_RX_PEND_BIT!=bRadio_Check_Tx_RX(g_frame_buffer))return;//从433里面读出了数据  木

        si446x_change_state(1);//猜测是清除的状态

       // clr_detc();

       // GPIOA_PCOR |= GPIO_PCOR_PTCO(CTRL1_PIN); //无线接收发送动作开始计量

        frame_ctl(&g_frame_buffer[0],Si446xCmd.FIFO_INFO.RX_FIFO_COUNT);//用读出来的数据改变灯的状态,把读出来的数据付诸于动作

       // set_detc();

        enter_vlps_xms(100);  //进入低功率状态

  

        si4438_delay = WIRELESS_DELAY; 

        goto finish_rcv;

    }

 

    if (si4438_delay)  //如果不为0就不断的启动 无线检测                        //CAL IN 1ms_TASK

    {

        notify(EV_WIRQ);//启动自己的无线检测

    }

    else

    {

        finish_rcv:;

        si4438_delay=WIRELESS_DELAY;  //   WIRELESS_DELAY 0x28      

        si446x_get_int_status(0u, 0u, 0u);//猜测清零操作

        si446x_change_state(1); //猜测是清除的状态

        si4438_statue=SI4438_SLEEP;             //sleep   

       // GPIOA_PSOR |= GPIO_PSOR_PTSO(CTRL2_PIN); //无线监听动作开始计量       

        if ((silicon_status&SILLICON_ALL_SET)||cap_pad[0].led_on

            ||cap_pad[1].led_on||cap_pad[2].led_on

            ||cap_pad[3].led_on) return;  //sleep or not

             enter_vlps_xms(100); //低功耗的作用

    }   

}

 

 

 

const struct task tasks[] =

{

    

    {EV_1MS,    0,            NULL,  task_1ms},//主要用来操作si4438_delay

    {EV_25MS,   0,            NULL,  task_25ms},//启动无线中断

    {EV_TICK,   ALWAYS_ALIVE, NULL,  sys_tick},//系统时间驱动EV_1MS、EV_25MS、EV_5S

    {EV_TOUCH_SCAN, ALWAYS_ALIVE, NULL, task_touch_scan},//LED等的亮度变化,和按键的扫描

    {EV_BIND,   0,            NULL, adapter_bind},//

    {EV_WIRQ,   0,            NULL, wirless_check_irq},//无线的监测是通过中断吗????,接收无线

    {EV_CLRDOG, ALWAYS_ALIVE, NULL,  clr_watchdog},

    {EV_REPS,   0,            NULL, wirless_reponse},//对无线进行回应

{EV_5S,     0,            NULL, touch_seq_check},//主要用来启动绑定,首先查询开关是否触发。检查触摸屏的变化并且,如有变化与适配器通信告知

是谁启动的EV_WIRQ

    

 

 

};

启动EV_WIRQ在两种函数里进行启动,其中有一个是自启动

自启动的条件是 

if (si4438_delay)  //如果不为0就不断的启动 无线检测                            {

     notify(EV_WIRQ);//启动自己的无线检测

 }

 

void task_25ms(void *args)

{

   

  if (!is_task_set(EV_REPS))//如果没有启动wireless_response就启动wireless_check_irq

  {

       notify(EV_WIRQ);   //75MS Per.time  启动wirless_check_irq

  }

 // if ((silicon_status&SILLICON_ALL_SET)||is_task_set(EV_REPS)||is_task_set(EV_WIRQ)||cap_pad[0].led_on||cap_pad[1].led_on||cap_pad[2].led_on||cap_pad[3].led_on) return;  //sleep or not

   //    enter_vlps_xms(15); //wake up for EV_WIRQ  75ms

  if (bind_state_cnt!=0)

  {

      if(0==--bind_state_cnt)

      {

          device_bind_process=UBIND;//入网的时候会把bind_state_cnt赋值0x28,,在282内没有完成就是没有绑定成功。

      }

  }

}

 

void wirless_check_irq(void *args)

{

    clr_wdog();

  //  uint8_t lenth=0;

    if (DEVICE_IS_NEW==new_device_flag) //新设备将不执行正常检测中断  added in 2015-3-4 no test

    {

        return;//如果是新设备就不用检测无线的中断了。

    }

    

    if (si4438_statue == SI4438_SLEEP) //绑定成功就读,那么不成功也是读呀????因为绑定成功和不成功设备都要是SI4438_SLEEP

    {

         vRadio_StartRX(SI4438_CHANL, SI4438_DATALETH);       //4MS 所有READCTS带自动复位功能,  读的东西放在哪里了????

         si4438_statue = SI4438_RX;//为什么要把它置于读的状态????木  表示已经读过4438了吗???

         //GPIOA_PCOR |= GPIO_PCOR_PTCO(CTRL2_PIN); //无线监听动作开始计量

    }

    

   

    if(0==read_4438_irq_port())//用来检测中断木  为0表示中断发生

    {

       if (si4438_statue==SI4438_TX)goto finish_rcv;     //finish the tx//vRadio_StartRX只是开始读,把数据读出来只是bRadio_Check_Tx_RX这个函数

       if(SI446X_CMD_GET_INT_STATUS_REP_PACKET_RX_PEND_BIT!=bRadio_Check_Tx_RX(g_frame_buffer))return;//从433里面读出了数据  木

        si446x_change_state(1);//猜测是清除的状态

       // clr_detc();

       // GPIOA_PCOR |= GPIO_PCOR_PTCO(CTRL1_PIN); //无线接收发送动作开始计量

        frame_ctl(&g_frame_buffer[0],Si446xCmd.FIFO_INFO.RX_FIFO_COUNT);//用读出来的数据改变灯的状态,把读出来的数据付诸于动作

       // set_detc();

        enter_vlps_xms(100);  //进入低功率状态

  

        si4438_delay = WIRELESS_DELAY; 

        goto finish_rcv;

    }

 

    if (si4438_delay)  //如果不为0就不断的启动 无线检测                        //CAL IN 1ms_TASK

    {

        notify(EV_WIRQ);//启动自己的无线检测

    }

    else

    {

        finish_rcv:;

        si4438_delay=WIRELESS_DELAY;  //   WIRELESS_DELAY 0x28      

        si446x_get_int_status(0u, 0u, 0u);//猜测清零操作

        si446x_change_state(1); //猜测是清除的状态

        si4438_statue=SI4438_SLEEP;             //sleep   

       // GPIOA_PSOR |= GPIO_PSOR_PTSO(CTRL2_PIN); //无线监听动作开始计量       

        if ((silicon_status&SILLICON_ALL_SET)||cap_pad[0].led_on

            ||cap_pad[1].led_on||cap_pad[2].led_on

            ||cap_pad[3].led_on) return;  //sleep or not

             enter_vlps_xms(100); //低功耗的作用

    }   

}

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

4438无线网络组网代码解析 的相关文章

  • 基于R的Bilibili视频数据建模及分析——聚类分析篇

    基于R的Bilibili视频数据建模及分析 聚类分析篇 文章目录 基于R的Bilibili视频数据建模及分析 聚类分析篇 0 写在前面 1 数据分析 1 1 聚类分析 1 2 聚类统计 1 3 系统聚类 1 4 Kmeans与主成分分析 2
  • 基于R的Bilibili视频数据建模及分析——建模-因子分析篇

    基于R的Bilibili视频数据建模及分析 建模 因子分析篇 文章目录 基于R的Bilibili视频数据建模及分析 建模 因子分析篇 0 写在前面 1 数据分析 1 1 建模 因子分析 1 2 对数线性模型 1 3 主成分分析 1 4 因子
  • 大数据技术之Maxwell基础知识

    大数据技术之Maxwell基础知识 文章目录 大数据技术之Maxwell基础知识0 写在前面1 Maxwell 概述1 1 Maxwell 定义1 2 Maxwell 工作原理1 2 1 MySQL 主从复制过程1 2 2 Maxwell
  • 大数据技术之Maxwell入门案例学习

    大数据技术之Maxwell入门案例学习 文章目录 大数据技术之Maxwell入门案例学习1 写在前面2 Maxwell 使用2 1 Maxwell 安装部署2 2 Maxwell 入门案例2 2 1 监控 Mysql 数据并在控制台打印2
  • Canal实时监控案例

    Canal实时监控案例 文章目录 Canal实时监控案例0 写在前面1 TCP 模式测试1 1 IDEA创建项目canal module 1 2 通用监视类 CanalClient1 2 1 Canal 封装的数据结构1 2 2 在 can
  • unity笔记--Transform.SetSibling

    transform SetAsLastSibling 将变换移动到本地变换列表的末尾 即设置为同级索引中的最后一项 transform SetAsFirstSibling 将变换移动到本地变换列表的开头 即设置为同级索引中的第一项 tran
  • 大数据技术之Canal入门篇

    大数据技术之Canal入门篇 文章目录 大数据技术之Canal入门篇写在前面第 1 章 Canal 入门1 1 什么是 Canal1 2 MySQL 的Binlog1 2 1 什么是 Binlog1 2 2 Binlog 的分类 1 3 C
  • Doris集成Spark读写的简单示例

    Doris集成Spark读写的简单示例 文章目录 Doris集成Spark读写的简单示例0 写在前面1 Spark Doris Connector介绍2 基本示例2 1 提前准备表和数据2 2 新建项目2 3 使用SQL方式进行读写2 3
  • Linux用户与用户组介绍

    Linux用户与用户组介绍 文章目录 Linux用户与用户组介绍0 写在前面1 group1 1 什么是组 xff1f 1 2 groupadd1 2 groupmod1 3 groupdel1 4 gpasswd1 5 相关文件说明 2
  • Linux安装Oracle数据库

    Linux安装Oracle数据库 文章目录 Linux安装Oracle数据库0 写在前面1 Oracle 数据库1 1 简介1 2 Oracle 与 MySQL 的SQL 区别 2 前置准备2 1 安装依赖包2 2 配置用户组2 3 上传安
  • DataX与DB2导入导出案例

    DataX与DB2导入导出案例 文章目录 DataX与DB2导入导出案例0 写在前面1 DB2介绍2 DB2数据库对象关系3 安装前的准备3 1 安装依赖3 2 修改配置文件 sysctl conf3 3 修改配置文件 limits con
  • Doris集成其他系统——ODBC外部表

    Doris集成其他系统 ODBC外部表 文章目录 Doris集成其他系统 ODBC外部表0 写在前面1 正文1 1 ODBC外部表介绍1 2 使用方式 2 使用 ODBC 的 MySQL 外表2 1 前置芝士2 2 安装 unixODBC2
  • Linux安装ElasticSearch

    Linux安装ElasticSearch 文章目录 Linux安装ElasticSearch0 写在前面1 环境准备2 ES安装2 1ES解压2 2 新增普通用户2 3 给新创建的普通用户授权2 4 给新创建的普通用户设置sudo权限2 5
  • Hadoop入门学习——简介篇

    Hadoop入门学习 简介篇 文章目录 Hadoop入门学习 简介篇1 大数据概论1 1 分布式 并行 1 2 大数据特点 xff08 4V xff09 1 2 1 Volume xff08 大量 xff09 1 2 2 Velocity
  • Hadoop之分布式技术

    Hadoop之分布式技术 文章目录 Hadoop之分布式技术1 我们为什么需要分布式1 1 计算问题1 2 存储问题 2 分布式系统概述3 分布式实现方案4 分布式系统5 集群6 负载均衡7 弹性8 故障转移 1 我们为什么需要分布式 1
  • 认识DataX及简单入门

    认识DataX及简单入门 文章目录 认识DataX及简单入门1 DataX的概述1 1 什么是DataX1 2 DataX 的设计1 3 支持的数据源1 3 支持的数据源1 4 框架设计1 5 运行原理1 6 DataX和Sqoop的对比
  • Nginx 反向代理及https配置

    参考代码 在server中添加 location api proxy set header Host host proxy set header X Real IP remote addr proxy set header X Forwar
  • DataX使用之基础案例

    DataX使用之基础案例 文章目录 DataX使用之基础案例0 写在前面1 从stream 流读取数据并打印到控制台2 读取 MySQL 中的数据存放到 HDFS2 1 查看官方模板2 1 1 mysqlreader 参数解析 xff1a
  • DataX和Oracle使用案例

    DataX和Oracle使用案例 文章目录 DataX和Oracle使用案例0 写在前面1 从 Oracle 中读取数据存到 MySQL1 1 MySQL 中创建表1 2 编写 Datax 配置文件1 3 执行命令 2 读取 Oracle

随机推荐

  • MongoDB初认识

    MongoDB初认识 文章目录 MongoDB初认识0 写在前面1 MongoDB是什么2 MongoDB的优缺点3 基础概念解析4 安装4 1 下载地址4 2 安装MongoDB4 3 pgrep使用4 4 进入 shell 交互页面 0
  • DataX和MongoDB之间的数据导入导出案例

    DataX和MongoDB之间的数据导入导出案例 文章目录 DataX和MongoDB之间的数据导入导出案例0 写在前面1 MongoDB前置知识1 1 基础概念详解1 1 1 数据库1 1 2 集合1 1 3 文档 xff08 Docum
  • TI Cotex M3/4单片机关于寄存器操作详解

    TI Cotex M3 4单片机关于寄存器操作详解 前备知识寄存器与偏移量位带操作 位带区 TI单片机寄存器操作详解快速在TI的手册里面确认某外设某寄存器的确切地址寄存器操作介绍本文参考 前备知识 当前单片机的开发方式多种多样 xff0c
  • Cannot currently show the desktop

    问题解决办法篇 用VNC打开树莓派桌面时 xff0c 显示 Cannot currently show the desktop 意为当前无法显示桌面 xff0c 其实调整一下分辨率重新打开桌面就好了 法一 xff1a 有显示屏 将树莓派与显
  • 相机标定 >> 坐标系转换@内参、外参

    相机标定 gt gt 坐标系转换 64 内参 外参 1 坐标系介绍1 1 像素坐标系1 2 图像坐标系1 3 相机坐标系1 4 世界坐标系 2 相机标定2 1 内参2 1 1 内参的意义 xff08 透视映射 xff09 2 1 2 内参的
  • 2022年最新前端面试题

    js面试题 1 js数据类型 基本数据类型 Number String Boolean Null Undefined Symbol bigInt引用数据类型 object Array Date Function RegExp 2 js变量和
  • ruoyi(若依)框架使用说明(前后端分离)

    ruoyi 28 E8 8B A5 E4 BE 9D 29 E6 A1 86 E6 9E B6 E4 BD BF E7 94 A8 E8 AF B4 E6 98 8E 28 E5 89 8D E5 90 8E E7 AB AF E5 88
  • 1130 - Host XXX is not allowed to connect to this MySQL server。

    1 在用Navicat配置远程连接Mysql数据库时遇到如下报错信息 xff0c 这是由于Mysql配置了不支持远程连接引起的 2 在安装Mysql数据库的主机上登录root用户 xff1a mysql u root p 3 依次执行如下命
  • 阿里云Ubentu rsync同步文件到多台服务器

    cd usr local wget https rsync samba org ftp rsync src rsync 3 1 1 tar gz tar zxvf rsync 3 1 1 tar gz cd rsync 3 1 1 conf
  • java获取字符串最后一个字符

    第一种 String str 61 34 daipogfhjoripa1 34 char c 61 str charAt str length 1 第二种 str substring str length 1
  • 解决idea中maven依赖unknown的问题

    解决idea中maven依赖unknown的问题 1 出现问题原因 xff1a 最简单的原因是 xff0c 包名之间的横线 中英文切换问题 xff0c 改正就好 xff0c 或者忘记写版本号 从其他地方copy过来的 xff0c 仓库下载失
  • mySql中count带条件查询

    方法一 xff1a SELECT count t command name 61 39 UNLOCK 39 OR NULL unlockFrequency FROM 表 t 方法二 xff1a select count t command
  • tomcat下载安装步骤(超详细)

    下载安装 首先进入tomcat官网 https tomcat apache org 在圈住的位置点击下载自己想要的版本 我选择tomcat9 根据自己电脑下载64位或32位zip版本 下载完毕后解压到自己想放的位置 配置环境变量 在系统变量
  • 关于springboot访问tomcat,线程http-nio-8080-exec的来源问题

    最近在看并发操作时候 xff0c 例如jmeter进行接口压测 xff08 本地自己的springboot2的环境 xff09 xff0c 发现一个有趣的现象 xff0c 就是关于线程http nio 8080 exec 1 xff0c h
  • Docker容器的创建、启动、和停止及删除

    前言 xff1a 名词解释 这里有两个不同的单词 xff0c images和container 其中images很好理解 xff0c 跟平常使用的虚拟机的镜像一个意思 xff0c 相当于一个模版 xff0c 而container则是imag
  • Redis修改密码

    Redis修改密码 一开始自己使用redis一直没有使用密码 xff0c 后来在项目中要求配置密码 xff0c 每次都是在命令中修改 xff0c 单重启后悔失效 后来通过配置文件 xff0c 但重启后总是不生效 xff0c 试了好几种方法都
  • @ApiModel 和 @ApiModelProperty

    64 ApiModel 使用场景 xff1a 在实体类上边使用 xff0c 标记类时swagger的解析类 1 什么是Swagger OpenAPI规范 xff08 OpenAPI Specification 简称OAS xff09 是Li
  • MySQL_基本的SELECT语句

    目录 SQL概念 xff1a SQL分类 xff1a SQL语言的规则与规范 xff1a SELECT的基本语句 我是ZGB xff0c Java领域新星创作者 xff0c 阿里云专家博主 xff0c 华为云 云享专家博主 xff0c 热衷
  • springcloud之gateway服务网关

    目录 微服务中网关的作用 gateway 与 zuul springcloud gateway 简介 相关概念 工作流程 特征 快速上手 Maven 依赖 application properties 配置文件 启动类 eureka cli
  • 4438无线网络组网代码解析

    device bind process 是怎么实现绑定的 xff1f enum NOSTATE UBIND 等待接收 握手一次1 WAIT FOR TOUCH WAIT FOR CONFIRM 点击按键后 回复一次2 BIND SUCCES