前言
最近给老家又买了个摄像头。
由于有事所以摄像头到家后没有第一时间安装,十天后经过一番操作将摄像头安装好后,傻眼了,没有巡航功能。。。
当时购买的时候只记得老爹说的要有断电续航,忘了询问是否有巡航功能,这下完了,怎么办?
不死心的我,登录到摄像头的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开发版即可,下面是效果,还不错
单片机版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:https://www.yangyingqi.com/49.html