远程视频监控
物联网已不知不觉融入我们的生活中给我们带来便捷,比如,智能门锁、ETC 电子自动收费系统等,一开始感觉还挺很新奇的,现在也习以为常了。
甚至可以说,物联网是互联网发展的必然趋势,尤其现在 5G 提供了必要的支持。而且国内很多大公司都已开始布局物联网了。比如众所周知的小米智能家居;还有云计算企业和互联网巨头:阿里云、腾讯云等,都已经纷纷投入大量的人力、资金布局物联网行业。
商机来了,自然对人才的需求也就多了,尤其近几年已经有不少大厂在招聘 Iot 的人才,对这个领域感兴趣的技术人可要把握住机会。
行业需求
校园视频监控
企业生产环境视频监控
小区视频监控
道路视频监控
1.效果演示
演示远程监控全过程
2.原理分析
通络通信 + 视频传输
要点:如果确定一帧数据传输完毕
系统框架
3.背景知识
网络通信
烽火台算不算?
土电话算不算?
网络通信
IP地址
最常用的IP地址:“192.168.1.1”
什么叫“同一个网段”?(是不是在同一个局域网)
这4个地址,是不是同一个“网段”?
如果子网掩码是 255.255.0.0, 那么以上4个地址都是同一个网段内
如果子网掩码是 255.255.255.0
IP地址分为:
网络地址 + 网络内的主机地址
166.111.3.26
255.255.255.0
11111111.11111111.11111111.00000000
为什么很多网络地址,都是192.168.xxx.xxx
子网掩码:
用来区分网络地址的长度、主机地址的长度
最常用的子网掩码:255.255.255.0
端口号
端口号,就是“在同一个地方,问需要什么服务”
最常用的端口号:
80端口 - WEB服务
www.baidu.com 就是 www.baidu.com:80
TCP/UDP
谁是TCP, 谁是UDP?
TCP:专属通道,高端定制,全程独享
UDP:各个数据,各自临时确定路线,发送顺序和到达顺序可能不一致,可能丢包
套接字
socket
【IP + 端口号】 组合成一个“插座” ,这个“插座”就是套接字
使用“套接字”,发送数据/接收数据
4.代码实现
监控端实现
1.项目准备
VS/VC++的任意版本
2.创建项目
创建空项目。
3.项目框架
#include <stdio.h>
#include <graphics.h> //easy图形库 qt
#define FILE_NAME "jian_kong.jpg"
void receiveImg(const char* fileName) {
}
bool cmdJianKong() {
return false;
}
bool init() {
return false;
}
void connect() {
}
int main(void) {
if (!init()) {
printf("网络初始化失败!\n");
return -1;
}
connect(); // 连接被监控端
while (1) {
if (!cmdJianKong()) { // 发送监控命令
break;
}
receiveImg(FILE_NAME);
loadimage(0, FILE_NAME);
Sleep(10);
}
return 0;
}
4.网络协议初始化
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib, "WS2_32.lib")
#include <graphics.h> //easy图形库 qt
bool init() {
WSADATA wsaData;
int err = WSAStartup(MAKEWORD(1, 1), &wsaData);
if (err != 0) {
return false;
}
return true;
}
特别注意:
#include <winsock2.h> 必须放在 #include <graphics.h> 之前!
5.网络套接字和网络地址的初始化
sockaddr_in sockAddr; //网络地址
SOCKET serverSocket; // 网络套接字
#define JIAN_KONG_IP "127.0.0.1"
#define JIAN_KONG_PORT 2021
bool init() {
WSADATA wsaData;
int err = WSAStartup(MAKEWORD(1, 1), &wsaData);
if (err != 0) {
return false;
}
serverSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
sockAddr.sin_family = PF_INET;
sockAddr.sin_addr.S_un.S_addr = inet_addr(JIAN_KONG_IP);
sockAddr.sin_port = htons(JIAN_KONG_PORT);
return true;
}
6.创建监控窗口
bool init() {
......
//创建监控窗口
initgraph(640, 480);
return true;
}
7.连接监控端
void connect() {
// 连接被监控端(发起网络连接)
connect(serverSocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr));
}
8.发送监控指令
#define CMD_JIAN_KONG "jian_kong"
bool cmdJianKong() {
// 发送监控指令
char buff[] = CMD_JIAN_KONG;
int ret = send(serverSocket, buff, strlen(buff) + 1, 0);
return ret > 0;
}
9.接收一帧数据
void receiveImg(const char* fileName) {
int len;
// 先接受照片的长度
recv(serverSocket, (char*)&len, 4, NULL);
char buff[4096];
FILE* file = fopen(fileName, "wb");
int count = 0;
while (1) {
int ret = recv(serverSocket, buff, sizeof(buff), NULL);
if (ret < 0) {
printf("接受失败!\n");
break;
}
else if (ret == 0) {
printf("对端关闭\n");
break;
}
else {
printf("接收到 %d 字节\n", ret);
// 把接收到的数据,保存到文件里!!!
fwrite(buff, ret, 1, file);
}
count = count + ret;
if (count == len) {
break;
}
}
fclose(file);
}
至此!监控端已经搭建完成啦,接下来我们一起来实现 “被监控端”
源码资料获取方式:
关注+转发后,私信关键词 【资料】即可获取!
注意:关注我之后才可以私信
关注+转发后,私信关键词 【资料】即可获取课件、代码、源码、视频、等等
重要的事情说三遍,转发、转发、转发后再发私信,才可以拿到!