[附源码] 硬核 | 带你开发一个远程视频监控项目

远程视频监控

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

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

 

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

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C语言小火车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值