精华内容
下载资源
问答
  • NB-IoT终端可以通过域名轻松找到业务服务器,定时上报业务数据, 但IoT终端没有域名,业务服务器如何主动找NB-IoT设备,实现反向控制指令及时下达,让很多IoT 开发者头疼不已。 NB-IoT 三大模式 在解决如何实时下行...

    2020年,电信、移动、联通三大运营商 NB-IoT 设备突破1亿大关,NB-IoT在水、电、煤表计场景应用广泛。NB-IoT终端可以通过域名轻松找到业务服务器,定时上报业务数据, 但IoT终端没有域名,业务服务器如何主动找NB-IoT设备实现反向控制指令及时下达,让很多IoT 开发者头疼不已。

      NB-IoT 三大模式  

    在解决如何实时下行前,我们首先需要了解 NB-IoT 支持三种省电模式:DRX(不连续接收模式)、eDRX(扩展不连续接收模式)、PSM (省电模式)。

    DRX虽然叫做“不连续接收”,但是对硬件产品来讲,是“连续接收”。随时都可以收到数据。相当于随时在监听,所以功耗最高。

    eDRX,就是把网络先开一会、再停一会。 开的时候能收到数据,停的时候收不到数据。停的时间从几十秒到几个小时,可以配置。

    PSM,相当于把eDRX开关网络的频率放的更低,低至几天打开一次网络。同样,打开网络的时候能收到数据,不打开网络的时候收不到数据。

      NB-IoT 反向控制  

    业务服务器要想随时随地找到IoT设备,就需要建立一个长连接通道。这个“长连接”,实际上是个虚拟的TCP/IP网络连接,中间经过了无数网络节点,每个节点都可能把这个长连接断掉。因此 IoT 设备需要定期(Keepalive)给服务器发送心跳包,告诉服务器“我还活着、我在这里,不要把我踢掉!”。

    但是,心跳包非常耗电。NB-IoT设备不能断开和基站之间的信号连接,信号一断,连接就断了。同时每次发送心跳包需要大功率发射信号,对于电池供电的IoT设备来说是不能承受之重。

    DRX模式下NB-IoT网络不需要通过心跳包来维持长连接,运营商会负责反向控制。这样业务系统无需再设计心跳包!提供运营商API来发送反向控制指令,下发到NB-IoT基站,基站能够随时向终端发数据。

      运营商 GRE 隧道  

    NB-IoT终端数据最终经过在P-GW后汇入公网并传输到上层应用服务器;由于IPv4资源限制,所有终端在通常情况下都不可能使用单独的公网IP。

    IPv4的NAT映射存在端口老化问题,对此我们可以通过专用网络的方式解决资源受限的问题,也就是传说中的GRE隧道方案。

    通过向运营商申请开通GRE隧道,将NB-IoT终端接入到了私网中进行传输,由于私网资源宽裕,所以在P-GW中可以绕过NAT映射,将一个IP+Port资源固定给一个业务上下行使用,从而规避心跳机制实现无需心跳维NB-IoT网络长连接功能。

    往期推荐

    1、39张传感器工作原理GIF图汇总

    2、智能手持测温枪开发实践

    3、IoT+TSDB+Quick BI 搭建楼宇环境监控

    4、JS全栈开发,构建智能家居小程序

    展开全文
  • 今天小编教你玩点新鲜的,那就是直接将安卓智能手机的屏幕通过无线WiFi网络实时投射到电脑上显示,同时电脑端也可以使用鼠标键盘操作手机(也就是反向控制),感觉碉堡狂拽了有木有?废话少说,说干就干!准备工作:①...

    天天抱着手机玩是不是早就腻了呢?今天小编教你玩点新鲜的,那就是直接将安卓智能手机的屏幕通过无线WiFi网络实时投射到电脑上显示,同时电脑端也可以使用鼠标键盘操作手机(也就是反向控制),感觉碉堡狂拽了有木有?废话少说,说干就干!

    准备工作:

    ①手机需要授予给相关应用root权限

    ②电脑和手机需要处于同一局域网内

    ③此工具分为PC客户端和手机端应用

    操作步骤

    1、安装MirrorOp Receiver至安卓手机:www./softs/113017.html

    下载PC手机多屏互动客户端:MirrorOp Receiverpc版 www./softs/113018.html

    2、双击运行电脑接收端程序(退出请按ALT+F4),再打开手机端装好的名为“Sender”的应用;

    3、手机会自动搜索到内网PC接收端的信息,请手动选择对应的IP进入,再按“播放”按钮;

    e141634a111c6b596f0a304b45695bef.png

    4、完成后电脑就会实时显示手机屏幕的镜像画面,按主页(小房子)键回到手机桌面,手机上所有的操作都会同步到电脑上显示,而且鼠标还可以在PC显示器上反向控制操作手机哦!

    温馨提示:

    首先不建议配置太低(如单核机)的机友使用,电脑接收客户端只要打开就行无需配置。再就是投射到电脑上的画面若不是竖屏,请上下翻转调整手机方向直到显示正常为止。还有部分机型使用后输入法可能失效请重启手机即可恢复。

    展开全文
  • 上传传感器数据到远端与远端反向控制终端功能硬件连接程序后续 功能 集上传传感器数据到远端与远端反向控制终端 本例采用TCP协议,通过WiFi透传模式进行远端控制与传输。采用读取DHT11温湿度采集模块采集到的数据...

    上传传感器数据到远端与远端反向控制终端

    功能

    集上传传感器数据到远端与远端反向控制终端
    本例采用TCP协议,通过WiFi透传模式进行远端控制与传输。采用读取DHT11温湿度采集模块采集到的数据发送到远端(平台)、远端控制LED灯和蜂鸣器演示远端控制

    功能说明:上电后,DHT11温湿度传感器不断获取周围的温湿度等状态值并把数据发送到物联网数据平台,在平台上通过反向控制的方式控制LED灯的亮灭和蜂鸣器的开闭,可在串口看到相关响应;

    硬件连接

    DHT11温湿度传感器–D4
    LED灯–D5
    有源蜂鸣器–D12

    程序

    #include <ESP8266WiFi.h>
    
    #define u8 unsigned char
    //IO方向设置
    #define DHT11_IO_IN()  pinMode(4, INPUT)
    #define DHT11_IO_OUT() pinMode(4, OUTPUT)
    IO操作函数
    #define DHT11_DQ_OUT 4 //数据端口 4
    #define DHT11_DQ_IN  4  //数据端口 4
    
    //LED
    #define led 5
    //Beep
    #define beep 12
    
    //所连接的WiFi热点账密
    const char* ssid     = "Doit";
    const char* password = "doit3305";
    
    //数据接收的网络平台
    const char* host = "iot.doit.am";//物联网平台
    //const char* host = "diot.doit.am";
    const int httpPort = 8810;
    //登录平台的 用户名 与 秘钥Key (随机数)
    const char* streamId   = "lin";
    const char* privateKey = "dee5d879314b54dca7813364ff94b79a";
    
    char str[512];//接收数据缓冲区
    WiFiClient client;// 使用WiFi客户端类创建TCP连接
    //反向控制:
    unsigned long MS_TIMER = 0;
    unsigned long lastMSTimer = 0;
    String comdata = "";
    char flag = false;
    
    /*******************************DHT11协议****************************************/
    u8 temperature;
    u8 humidity;
    u8 t = 0;
    //复位DHT11
    void DHT11_Rst(void)
    {
      DHT11_IO_OUT();   //SET OUTPUT
      digitalWrite(DHT11_DQ_OUT, LOW);   //拉低DQ
      delay(20);     //拉低至少18ms
      digitalWrite(DHT11_DQ_OUT, HIGH);   //DQ=1
      delayMicroseconds(30);       //主机拉高20~40us
    }
    //等待DHT11的回应
    //返回1:未检测到DHT11的存在
    //返回0:存在
    u8 DHT11_Check(void)
    {
      u8 retry = 0;
      DHT11_IO_IN();//SET INPUT
      while (digitalRead(DHT11_DQ_IN) && retry < 100) //DHT11会拉低40~80us
      {
        retry++;
        delayMicroseconds(1);
      };
      if (retry >= 100)return 1;
      else retry = 0;
      while (!digitalRead(DHT11_DQ_IN) && retry < 100) //DHT11拉低后会再次拉高40~80us
      {
        retry++;
        delayMicroseconds(1);
      };
      if (retry >= 100)return 1;
      return 0;
    }
    //从DHT11读取一个位
    //返回值:1/0
    u8 DHT11_Read_Bit(void)
    {
      u8 retry = 0;
      while (digitalRead(DHT11_DQ_IN) && retry < 100) //等待变为低电平
      {
        retry++;
        delayMicroseconds(1);
      }
      retry = 0;
      while (!digitalRead(DHT11_DQ_IN) && retry < 100) //等待变高电平
      {
        retry++;
        delayMicroseconds(1);
      }
      delayMicroseconds(40);//等待40us
      if (digitalRead(DHT11_DQ_IN))return 1;
      else return 0;
    }
    //从DHT11读取一个字节
    //返回值:读到的数据
    u8 DHT11_Read_Byte(void)
    {
      u8 i, dat;
      dat = 0;
      for (i = 0; i < 8; i++)
      {
        dat <<= 1;
        dat |= DHT11_Read_Bit();
      }
      return dat;
    }
    //从DHT11读取一次数据
    //temp:温度值(范围:0~50°)
    //humi:湿度值(范围:20%~90%)
    //返回值:0,正常;1,读取失败
    u8 DHT11_Read_Data(u8 *temp, u8 *humi)
    {
      u8 buf[5];
      u8 i;
      DHT11_Rst();
      if (DHT11_Check() == 0)
      {
        for (i = 0; i < 5; i++) //读取40位数据
        {
          buf[i] = DHT11_Read_Byte();
        }
        if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
        {
          *humi = buf[0];
          *temp = buf[2];
        }
      } else return 1;
      return 0;
    }
    //初始化DHT11的IO口 DQ 同时检测DHT11的存在
    //返回1:不存在
    //返回0:存在
    u8 DHT11_Init(void)
    {
      pinMode(4, OUTPUT);
      DHT11_Rst();
      return DHT11_Check();
    }
    /********************************************************************/
    
    //各种传感器的初始化
    void sensor_init()
    {
      //LED灯
      pinMode(led, OUTPUT);
      digitalWrite(led, LOW);
      //蜂鸣器
      pinMode(beep, OUTPUT);
      digitalWrite(beep, HIGH);
    }
    
    void setup()
    {
      Serial.begin(115200);
      sensor_init();
      MS_TIMER = millis();
      //DHT11
      delay(10);
      if (DHT11_Init()) //DHT11初始化
      {
        Serial.println("DHT11 Error");
        delay(200);
      }
      Serial.println("DHT11 OK");
    
      //  wifi_station_set_auto_connect(0);//关闭自动连接
      WiFi.disconnect();/
      // 首先,我们连接到WiFi网络
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED)
      {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      delay(50);
      Serial.print("connecting to ");
      Serial.println(host);
    
      // 使用WiFi客户端类创建TCP连接
      //  WiFiClient client;
      if (!client.connect(host, httpPort))
      {
        Serial.println("connection failed");
        return;
      }
    }
    unsigned long lastTick = 0;
    void loop()
    {
      if (flag == false)
      {
        if (millis() - MS_TIMER > 5000)
        {
          MS_TIMER = millis();
        }
      }
    
      //读传感器并发送
      //5s读一次
      if (millis() - lastTick > 5000)
      {
        lastTick = millis();
        static bool first_flag = true;
        if (first_flag)
        {
          first_flag = false;
          sprintf(str, "cmd=subscribe&topic=lin\r\n");//注册用户名,以让后面的反向控制得以是实现
          client.print(str);
          return;
        }
        //读传感器并发送
        DHT11_Read_Data(&temperature, &humidity); //读取温湿度值
        Serial.print("  Temp:");
        Serial.print(temperature);
        Serial.print("'C");
        Serial.print("  Humi:");
        Serial.print(humidity);
        Serial.println("%");
        sprintf(str, "cmd=upload&device_name=arduino1&data=%d&device_name=arduino&data=%d&uid=lin&key=%s\r\n", humidity, temperature, privateKey);
        client.print(str);
      }
    
      if (client.available())
      {
        //读并处理
        // R读取服务器的应答的所有行,并把它们打印到串口
        String recDataStr = client.readStringUntil('\n');
        Serial.println(recDataStr);
        //方向控制:注意LED灯是在设备arduino那里控制,蜂鸣器是在设备arduino1那里控制
        if (recDataStr.compareTo("cmd=publish&device_name=arduino&device_cmd=ledon\r") == 0)
        {
          digitalWrite(led, HIGH);
          Serial.println("LED is being open !");
        }
        else if (recDataStr.compareTo("cmd=publish&device_name=arduino&device_cmd=ledoff\r") == 0)
        {
          digitalWrite(led, LOW);
          Serial.println("LED has been closed !");
        }
        else if (recDataStr.compareTo("cmd=publish&device_name=arduino1&device_cmd=beepon\r") == 0)
        {
          digitalWrite(beep, HIGH);
          Serial.println("Beep is being open !");
        }
        else if (recDataStr.compareTo("cmd=publish&device_name=arduino1&device_cmd=beepoff\r") == 0)
        {
          digitalWrite(beep, LOW);
          Serial.println("Beep has been closed !");
        }
      }
    }
    
    

    后续

    如果想了解更多物联网、智能家居项目知识,可以关注我的项目实战专栏。
    欢迎关注公众号。
    在这里插入图片描述
    编写不易,感谢支持。

    展开全文
  • 所以这里是我的(不知何故个人的)所有这一切的解释:控制反转Inversion of control是一种设计原理,而非泛型,指的是行为的规范与实际执行时的行为的去耦。比较例,myDependency.doThis();与myDependency.onEventX +=...

    我理解你的困惑,我花了一些时间来理解这些概念是如何联系在一起的。所以这里是我的(不知何故个人的)所有这一切的解释:

    控制反转

    Inversion of control是一种设计原理,而非泛型,指的是行为的规范与实际执行时的行为的去耦。比较例,

    myDependency.doThis();

    myDependency.onEventX += doThis();

    在后者中,没有更灵活的直接调用。在其一般形式中,控制的反转涉及观察者模式,事件或回调。

    2.依赖性反演

    依赖性反转是另一种设计原则。粗略地说,它表示更高级的抽象不应该直接依赖于低级抽象;这实际上导致了在没有低级抽象的情况下不能重用更高级抽象的设计。

    class MyHighLevelClass {

    MyLowLevelClass dep = new MyLowLeverClass();

    }

    class App {

    void main() { new HighLevelClass().doStuff(); }

    }

    这里,MyHighLevelClass不能编译,而无法访问MyLowLevelClass。要打破这种耦合,我们需要使用接口抽象低级类,并删除直接实例化。

    class MyLowLevelClass implements MyUsefulAbstraction { ... }

    class MyHighLevelClass {

    MyUsefulAbstraction dep;

    MyHighLevelClass( MyUsefulAbstraction dep ) {

    this.dep = dep;

    }

    }

    class App {

    void main() { new HighLevelClass( new LowLevelClass() ).doStuff(); }

    }

    注意,你不需要任何特殊的像容器来强制执行依赖性反转,这是一个原则。好的阅读是鲍勃叔叔The Dependency Inversion Principle。

    依赖注入

    现在依赖注入。对我来说依赖注入= IoC依赖反转:

    >依赖性在外部提供,因此我们实施依赖性反转原理

    >容器设置依赖(而不是我们),所以我们说控制的反转

    在上面提供的示例中,如果使用容器实例化对象并自动注入构造函数中的依赖关系(我们经常说DI容器),则可以执行依赖注入:

    class App {

    void main() { DI.getHighLevelObject().doStuff(); }

    }

    注意,有各种form of injections.注意,在这个透视下,setter injection可以看作一种回调的形式 – DI容器创建对象,然后回调setter。控制的流动被有效地反转。

    4.AOP

    严格地说,AOP与前面3点没什么关系。 seminal paper on AOP是非常通用的,并提出了编织各种源(可能表示为不同的语言),以产生一个工作软件的想法。

    我不会扩大AOP。这里重要的是,依赖注入和AOP有效地在一起很好地发挥作用,因为它使得编织非常容易。如果使用IoC容器和依赖注入来抽象出对象的实例化,那么IoC容器可以轻松地用于在注入依赖项之前编织这些方面。否则这将需要特殊的编译或特殊的ClassLoader。

    希望这可以帮助。

    展开全文
  • DolphinDB智臾科技CEO周小华博士受邀参加本次会议,并在主会场做《从反向控制的终极目标谈时序数据库的架构设计》演讲。主会场其他演讲主题还包括网易副总裁汪源博士作的 《打造开放的云原生操作系统和系统软件架构...
  • 本帖最后由 jidesheng6 于 2020-10-24 16:21 编辑大概是去年,有看到CSDN上面几位大佬提到过,抓数据包来用极域去反控制其他机房的学生电脑,但是写的其实还是不是太详细,有代码,我当时也没看懂,最近无聊就重新...
  • 在 不管怎样,对于一个中等大小的文件,我怀疑在几乎任何实际的文件系统上,以正向顺序将整个文件读入内存,然后反向迭代列表,这实际上会更快。但是对于一个非常大的文件(尤其是一个你甚至无法放入内存的文件),...
  • 远程控制对运维人员和程序员都很重要,通常使用的是远程监控软件,比如teamviewer或者向日葵,这里说的两种方法都是需要自己动手并且需要一个公网服务器,从性价比上说应该是不如上面说的两种方式,但是满足了自己...
  • 这时候,控制权仍然掌握在测试类的手里,它决定派小二和尚还是小三和尚去执行老王的扫地命令。3)基于接口。实现特定接口以供外部容器注入所依赖类型的对象,这种做法比较构造函数和 set 方法更为复杂,这里就此略过...
  • 根据用户输入内容反向输出,整体思路首先获取用户输入内容的长度,根据获取的长度把内容从右到左进行输出。 neirong=input("请输入内容:") """第一种实现反向输出的方式""" #获取输入内容的长度 #i=len(neirong) ...
  • windows控制iPhone(不需要蓝牙)

    千次阅读 2021-05-27 18:53:13
    Veency是一款可以用电脑控制你的iPhone的插件,作者是大名鼎鼎的Cydia的创始人Jay Freeman,也就是Saurik。但是最高支持到IOS9,在IOS 10以上无法使用。 基于Veency,cosmosgenius开发了screendump,使其支持到iOS ...
  • “物联网开发实战”学习笔记-(二)手机控制智能电灯 如果搭建好硬件平台后,这一次我们的任务主要是调试好智能电灯,并且连接到腾讯云的物联网平台。 腾讯云物联网平台 腾讯物联网平台的优势: 腾讯云链接: link. ...
  • 如上图,这样的腿部旋转违反了人形骨骼腿部的规则,是不能记录在关键帧动画中的。很多人在做特殊怪物的腿部的时候就只能放弃人形biped骨骼,而选择bone骨骼。 但是其实biped骨骼提供了一个解除局部旋转锁定的按钮,...
  • https://www.bt.cn/http://宝塔控制面板官网 编辑配置文件 location / { proxy_pass http://localhost:8083; proxy_set_header Host $host; #解决 499 服务端超时客户端强制关闭 proxy_ignore_client_...
  • 文章目录一、理论基础1、樽海鞘群优化算法2、改进的樽海鞘群优化算法(1)折射反向学习机制(2)自适应控制因子(3)RCSSA算法二、仿真实验与结果分析三、参考文献四、Matlab仿真程序 一、理论基础 1、樽海鞘群优化...
  • 需要格外安装 three-orbitcontrols cnpm install three-orbitcontrols --save 引入 import OrbitControls from 'three-orbitcontrols' ... this.controls = new OrbitControls(this.camera, this.container);...
  • 原标题:大屏也能反控手机了,type-c...它主要解决了三个问题:大屏幕反向控制手机、平板功能和安卓手机音视频同步投屏,手机投屏到其他手机、平板、电脑上。大屏也能反控手机了 屏幕反控功能长期以来,我们手机、...
  • 今天在解决一个问题 《5710....map本身就是有序的,正向遍历可以得到从小到大的序列,而反向遍历就可以得到从大到小的序列,这个思路本身没有错,但是解题时卡在了反向遍历时如何删除元素的知识点上,特此记录一下...
  • Squid代理(传统代理、透明代理、反向代理)、日志分析、ACL访问控制一、Squid代理服务器1、代理的工作机制2、代理的类型二、安装Squid服务1、编译安装Squid2、修改Squid的配置文件3、 Squid 的运行控制4、创建 ...
  • 这就是我反向求二次贝塞尔曲线的方法; 用二次贝塞尔曲线绘制的线条,效果图 作者用以上方法写了一个uniapp的组件 组件地址:点击跳转 git地址:git地址 目标,实现带笔锋的签名板,目前还有点问题,就是写太快不...
  • 2.2.1 配置方法 内核sysctl中的rp_filter变量可以控制反向过滤。其取值如下(定义在Documentation/networking/ip-sysctl.txt): rp_filter - INTEGER 0 - No sourcevalidation. 1 - Strict mode as defined inRFC...
  • 一对多的反向一对多的反向就相当于,一个用户有多篇文章,但是在显示文章模型的时候你又想显示这个用户的用户名,但是你只有用户id,这时候就用到了一对多的反向,你用用户(User)模型里面定义了一对多来获取了用户的所有...
  • Nginx的四个主要组成部分: (1)Nginx二进制可执行文件:由各模块源码编译出一个文件 (2)Nginx.conf配置文件:控制Nginx行为 (3)acess.log访问日志:记录每一条HTTP请求信息 (4)error.log错误日志:定位问题 ...
  • 在没有公网ip的情况下,实现usb逆向设备共享怎么做,这个问题相信大家会有所涉及。今天小编来讲下如何利用网云穿内网穿透来实现逆向usb设备共享,将远程客户电脑上通过USB数据线连接的手机,共享到我们的电脑上,...
  • Python攻防-Socket通信建立TCP反向连接

    千次阅读 2021-08-17 13:55:48
    本文将记录学习基于 Socket 通信机制建立 TCP 反向连接,借助 Python 脚本实现主机远程控制的目的。 我们在传输数据时,可以只使用(传输层)TCP/IP 协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果...
  • 反向查找就是在这个区域里的记录可以依据IP地址来查找对应的记录名称。下面介绍如何在DNS中创建一个正向查找记录与反向查找记录,使用的环境是Windows Server 2012,但在Win 2008 与 Win 2008 R2中,都是一样的过程...
  • 反向压力

    2021-08-30 00:02:16
    大家好,我是鱼皮,今天分享一个实用的编程小知识 —— 反向压力。在介绍反向压力前,我们先聊聊什么是压力?什么是压力?我是一个打工人,日常工作就是听产品经理的话,写代码做需求。正常打工正常情...
  • 反向散射耦合RFID系统 1.反向散射 雷达技术为RFID的反向散射耦合方式提供了理论和应用基础。当电磁波遇到空间目标时,其能量的一部分被目标吸收,另一部分以不同的强度散射到各个方向。在散射的能量中,一小部分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 201,767
精华内容 80,706
关键字:

反向控制