美文网首页
autojs时间同步

autojs时间同步

作者: 牙叔教程 | 来源:发表于2021-05-10 18:36 被阅读0次

    时间同步

    牙叔教程 简单易学

    autojs版本

    8.7.7-0

    目标

    手机和服务器时间尽可能一致

    各个时间的关系

    效果.jpg
    1. 手机发送请求的时刻a + 网络从手机到服务器的时长b = 服务器接收到请求的时刻c

    2. 服务器发送响应的时刻d + 网络从服务器到手机的时间e = 手机收到响应的时刻f

      a + b = c
      d + e = f
      
    3. 服务器处理速度较快, 可以认为 服务器接收到请求的时刻c===服务器发送响应的时刻d
      服务器处理速度较快, 可以认为 网络从手机到服务器的时长b===网络从服务器到手机的时间e

      c === d
      b === e
      
    4. 由 2和3 推导

      a + b = c
      d(c) + e(b) = f
      
      a + b = c
      c + b = f
      
      a + b + c + b = c + f
      a + 2b = f
      
      已知条件
      手机发送请求的时刻a
      手机收到响应的时刻f
      
      可以求出网络从手机到服务器的时长b
      
      网络从手机到服务器的时长b = (手机收到响应的时刻f - 手机发送请求的时刻a)/2
      b = (f - a) / 2
      
    5. 服务器时刻 = 手机时刻 + 网络从手机到服务器的时长b

    6. 手机时刻是知道的

      new Date().getTime()
      

      网络从手机到服务器的时长也是知道的

      第4步可以求解, 获取网络从手机到服务器的时长
      

      服务器时刻也就可以计算出来了

    1. 到这里就完了吗?
      图样图森破

    手机时间的误差

    手机一般默认设置 使用网络提供的时间

    这个时间和服务器的时间一定是有误差的

    我们还要把这个误差考虑进去

    那么, 这个误差怎么算呢

    当手机向服务器查询一次当前时间,

    会产生一个手机时刻A

    服务器会返回一个服务器时间

    服务器时间 - 网络从手机到服务器的时长 = 手机时刻B(以服务器为标准)

    手机时间误差 = 手机时刻B - 手机时刻A

    最终推导

    手机时间误差 = 手机时刻B - 手机时刻A
    服务器时刻 = 手机时刻 + 网络从手机到服务器的时长b
    
    服务器时刻 = 手机发送请求的时刻a + 手机时间误差 + 网络从手机到服务器的时长b
    服务器时刻 = 手机发送请求的时刻a + 手机时刻B - 手机时刻A + 网络从手机到服务器的时长b
    
    手机时刻A = 手机发送请求的时刻a
    手机时刻B = 服务器接收到请求的时刻c - 网络从手机到服务器的时长b
    
    服务器时刻x = 手机发送请求的时刻a + 服务器接收到请求的时刻c - 网络从手机到服务器的时长b - 手机发送请求的时刻a + 网络从手机到服务器的时长b
    x = a + c - b - a + b
    x = c
    
    推算出来的时候,
    连我自己都震惊到了, 
    简直太正确了
    

    再次推导

    手机时间误差 = 手机时刻B - 手机时刻A
    
    手机时刻A = 手机发送请求的时刻a
    手机时刻B = 服务器接收到请求的时刻c - 网络从手机到服务器的时长b
    
    手机时间误差 = 服务器接收到请求的时刻c - 网络从手机到服务器的时长b - 手机发送请求的时刻a
    
    发送一次请求以后, 服务器会返回服务器的时间,我们就可以求出手机时间误差, 然后我们把误差结果存起来
    
    继续推导
    
    服务器时刻 = 手机时刻 + 网络从手机到服务器的时长b
    服务器时刻 = 手机当前时间 + 手机时间误差 + 网络从手机到服务器的时长b
    
    这次推导就对了
    

    发送一次请求后, 我们可以推导出什么

    • 网络从手机到服务器的时长
    • 手机时间误差

    程序设计

    用脚本引擎启动一个单独的脚本, 每隔一定时间, 去校正一下两个值, 并且用本地存储存起来

    • 网络从手机到服务器的时长
    • 手机时间误差

    每当要获取服务器的时间, 我们就可以读取本地存储, 直接用公式计算出服务器的时间, 而不用去请求服务器

    服务器时刻 = 手机当前时间 + 手机时间误差 + 网络从手机到服务器的时长b
    

    代码

    "ui";
    const 一般文字大小 = "22sp";
    ui.layout(
      <vertical>
        <text text="牙叔教程 简单易学" textStyle="bold" textSize="30sp" w="*" gravity="center"></text>
        <vertical margin="6">
          <text text="服务器时间" textSize="{{一般文字大小}}"></text>
          <text id="服务器时间"></text>
        </vertical>
        <vertical margin="6">
          <text text="手机本地时间" textSize="{{一般文字大小}}"></text>
          <text id="手机本地时间"></text>
        </vertical>
        <vertical margin="6">
          <text text="服务器推导的手机时间" textSize="{{一般文字大小}}"></text>
          <text id="服务器推导的手机时间"></text>
        </vertical>
        <horizontal margin="6">
          <text text="手机时间误差(毫秒)" textSize="{{一般文字大小}}"></text>
          <text id="手机时间误差"></text>
        </horizontal>
        <horizontal margin="6">
          <text text="网络从手机到服务器的时长" textSize="{{一般文字大小}}"></text>
          <text id="网络从手机到服务器的时长"></text>
        </horizontal>
        <button id="校正时间">校正时间</button>
      </vertical>
    );
    
    ui.校正时间.click(function () {
      let url = "https://api.m.jd.com/client.action?functionId=queryMaterialProducts&client=wh5";
    
      // {"currentTime":"2021-05-10 11:26:41","currentTime2":"1620617201918","returnMsg":"empty parameter ids","code":"0","subCode":"1-3"}
    
      let 手机发送请求的时刻a = new Date().getTime();
      let r = http.get(url);
      let 手机收到响应的时刻f = new Date().getTime();
      let 网络从手机到服务器的时长b = (手机收到响应的时刻f - 手机发送请求的时刻a) / 2;
      r = r.body.json();
      let serverTime = r.currentTime2;
      let 服务器接收到请求的时刻c = parseInt(serverTime);
      let 手机时间误差 = 服务器接收到请求的时刻c - 网络从手机到服务器的时长b - 手机发送请求的时刻a;
    
      ui.服务器时间.setText(服务器接收到请求的时刻c + "");
      ui.手机本地时间.setText(手机发送请求的时刻a + "");
      ui.服务器推导的手机时间.setText(服务器接收到请求的时刻c - 网络从手机到服务器的时长b + "");
      ui.手机时间误差.setText(手机时间误差 + "");
      ui.网络从手机到服务器的时长.setText(网络从手机到服务器的时长b + "");
    });
    
    

    声明

    部分内容来自网络

    给我个面子小图.jpg

    相关文章

      网友评论

          本文标题:autojs时间同步

          本文链接:https://www.haomeiwen.com/subject/ornidltx.html