[附源码] 硬核
远程视频监控
物联网已不知不觉融入我们的生活中给我们带来便捷,比如,智能门锁、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);
}
至此!监控端已经搭建完成啦,接下来我们一起来实现 “被监控端”
源码资料获取方式:
关注+转发后,私信关键词 【资料】即可获取!
注意:关注我之后才可以私信
关注+转发后,私信关键词 【资料】即可获取课件、代码、源码、视频、等等
重要的事情说三遍,转发、转发、转发后再发私信,才可以拿到!
发布评论