使用ESP8266实现摄像头定时巡航

2021年7月28日 20:03 阅读 1.23k 评论 0

前言

最近给老家又买了个摄像头。

由于有事所以摄像头到家后没有第一时间安装,十天后经过一番操作将摄像头安装好后,傻眼了,没有巡航功能。。。

当时购买的时候只记得老爹说的要有断电续航,忘了询问是否有巡航功能,这下完了,怎么办?

不死心的我,登录到摄像头的web管理端想确认下,一番查看之后,确实没有巡航功能,但是我发现这款摄像头可以设置预置点,并可以在web端调用,如下图:

摄像头web端

爬虫老手的我立刻看见了希望,当下掏出手机搜索目前可以连接的wifi的便宜mcu有哪些(别问,问就是穷),在简单的对比之后敲定了ESP8266这款开发版,10来块的价格,很合我心。

三天后,wtf!!!,板子是坏的,浪费了一天时间。

重新购买,又三天后,连接USB,烧录示例代码一气呵成,没有出现意外,成功了!

下面就是摄像头web端的分析了

摄像头web端分析

按下F12,在network中查看点击预置位调用时发送的请求,经过测试,预置位为url后面参数的number-1,也就是当设置预置位为1时,实际对应的number是0,这下就清楚了,只要我预先设置好预置点,然后定时调用这些预置点就可以。

预置位调用

单片机调用预置位

上面的需求已经很清楚了,但是怎么做到呢?以前用C语言都是写一些简单代码,现在要发送网络请求,我还真的毫无头绪,

没关系,Arduino中有很多示例代码,其中有着类似的,拿来改改不就完事了,开干!

首先,要发送网络请求,那么肯定得连接wifi,单片机代码由两部分构成,一部分是setup函数,这个函数用于单片机启动后的一些初始设置,在这里连接wifi再合适不过了,代码如下:

void setup(){ 
  Serial.begin(115200); 
  Serial.println(); 
  Serial.print("connecting to "); 
  Serial.println(ssid); 
  WiFi.mode(WIFI_STA); 
  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());     
} 

在这里不得不提一嘴,ESP8266有三种工作模式,第一种是WIFI STATION模式,此时ESP8266是client,通过router连接互联网;第二种是Wireless Access Point,也就是无线接入点,此时的ESP8266相当于一台router,由别人去连接它;第三种就是STA+AP,此时ESP8266既可以通过router连接互联网也可以作为热点由别人连接,个人理解相当于路由桥接。

上面的代码作用是循环判断wifi连接状态,若连接成功打印出单片机的IP地址。

当wifi连接成功后我们就可以开始调用预置点了,代码如下:

void loop() { 
    WiFiClient client; 
    if (!client.connect(host, httpPort)) { // test the connection 
    Serial.println("connection failed"); 
        return; 
    } 
    String url = "/web/cgi-bin/hi3510/param.cgi?cmd=preset&-act=goto&-status=1&-number="+Arr[currentPosIndex]; 
    Serial.println(url); 
    client.print(String("GET ") + url + " HTTP/1.1\r\n" + 
                "Host: " + host + "\r\n" + 
                "User-Agent: BuildFailureDetectorESP8266\r\n" + 
                "Authorization: Basic YWRtaW46YWRtaW4=\r\n" + 
                "Connection: close\r\n\r\n"); 
    Serial.println("request sent"); 
    String line = client.readStringUntil('\n'); 
    if (line.startsWith("[Succeed]")) { 
        Serial.println("set camera position successfully"); 
    } else { 
        // do sth. when error 
    } 
    Serial.println(line); 
    if(currentPosIndex==0){ 
        delay(1000*60*5); 
    }else{ 
        delay(1000*60); 
    } 
    currentPosIndex ++; 
    if(currentPosIndex == 3){ 
        currentPosIndex = 0; 
    } 
} 

上面的代码就是先连接一次网站,看是否返回200,若网站工作正常则发送请求,然后输出返回信息,在返回信息中用startwiths函数判断是否成功,不成功的部分我没有做任何处理,如果需要的话可以采取一些通知方式;来告知调用失败,比如Email之类的。

其实代码都很简单,难的就是分析摄像头web端发送请求这一块,没有写过爬虫或者做过web开发的同学可能会有点小懵,没事,分析多了就会了,哈哈。

下面是完整代码

#include <ESP8266WiFi.h> 
#include <WiFiClient.h> 
#ifndef STASSID 
#define STASSID "jiahegeshe" 
#define STAPSK  "y15109346885" 
#endif 
const char* ssid = STASSID; 
const char* password = STAPSK; 
const char* host = "192.168.1.225"; 
const int httpPort = 10000; 
int currentPosIndex = 0; // 当前预置点索引 
String Arr[3] = {"0","1","2"}; // 预置点数组 

void setup() { 
  Serial.begin(115200); 
  Serial.println(); 
  Serial.print("connecting to "); 
  Serial.println(ssid); 
  WiFi.mode(WIFI_STA); 
  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()); 
} 

void loop() { 
  WiFiClient client; 
  if (!client.connect(host, httpPort)) { // test the connection 
    Serial.println("connection failed"); 
    return; 
  } 
  String url = "/web/cgi-bin/hi3510/param.cgi?cmd=preset&-act=goto&-status=1&-number="+Arr[currentPosIndex]; 
  Serial.println(url); 
  client.print(String("GET ") + url + " HTTP/1.1\r\n" + 
               "Host: " + host + "\r\n" + 
               "User-Agent: BuildFailureDetectorESP8266\r\n" + 
               "Authorization: Basic YWRtaW46YWRtaW4=\r\n" + 
               "Connection: close\r\n\r\n"); 
  Serial.println("request sent"); 
  String line = client.readStringUntil('\n'); 
  if (line.startsWith("[Succeed]")) { 
    Serial.println("set camera position successfully"); 
  } else { 
    // do sth. when error 
  } 
  Serial.println(line); 
  if(currentPosIndex==0){ 
      delay(1000*60*5); 
  }else{ 
      delay(1000*60); 
  } 

  currentPosIndex ++; 
  if(currentPosIndex == 3){ 
      currentPosIndex = 0; 
  } 
} 

代码写好后,烧录到ESP8266开发版即可,下面是效果,还不错

最后修改于2021年7月30日 09:05
©允许规范转载

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.yangyingqi.com/49.html

单片机
微信
支付宝
登录后即可进行评论/回复