[附源码] 硬核

远程视频监控

物联网已不知不觉融入我们的生活中给我们带来便捷,比如,智能门锁、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  就是 www.baidu: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  2021bool 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);
}

至此!监控端已经搭建完成啦,接下来我们一起来实现  “被监控端”

 

源码资料获取方式:
关注+转发后,私信关键词 【资料】即可获取!
注意:关注我之后才可以私信
关注+转发后,私信关键词 【资料】即可获取课件、代码、源码、视频、等等
重要的事情说三遍,转发、转发、转发后再发私信,才可以拿到!