您的位置:首页 > 理论基础 > 计算机网络

网络相机上位机软件驱动分析

2015-05-14 12:52 155 查看
1、功能描述

网络相机上位机软件主要用于获取并解析下位机发送上来的IP数据包,并能将上位机的命令打包给下位机执行。

由于程序采用 socket 编程,因此需要添加ws2_32.lib库:

#pragma comment(lib,"ws2_32.lib")

包含必要头文件:

#include <Winsock2.h>

整个相机驱动需要提供以下几个函数接口和数据结构:

1)打开相机函数:

OpenWebCamera(WebCamera *pWebCamera, 

char *ip, 

int ImagePort, 

int CommandPort,

int (WINAPI *WebCameraCallback)(void *pWebCamera));

int (WINAPI *WebCommandCallback)(void *pWebCamera));

2)关闭相机函数:

CloseWebCamera(WebCamera *pWebCamera);

3)接收图像线程函数:

DWORD ReceiveImage(LPVOID pWebCamera);

4)接收命令线程函数:

ReceiveCommand(LPVOIDpWebCamera);

5)相机结构体:

WebCamera *pWebCamera

接下来,依次分析这几个函数和数据结构。

2、打开相机函数

1)函数原型:

OpenWebCamera(WebCamera *pWebCamera, 

char *ip, 

int ImagePort, 

int CommandPort,

int (WINAPI *WebCameraCallback)(void *pWebCamera));

int (WINAPI *WebCommandCallback)(void *pWebCamera));

2)参数说明:

WebCamera *pWebCamera 相机结构体

char *ip 相机IP

int ImagePort 图像传输端口号

int CommandPort 命令传输端口号

int (WINAPI *WebCameraCallback)(void *pWebCamera)); 图像传输线程函数指针
int (WINAPI *WebCommandCallback)(void *pWebCamera));命令传输线程函数指针

3)函数功能说明
填充相机结构体,建立socket 连接。
socket连接的部分代码:
SOCKET *Socket = socket( AF_INET, SOCK_DGRAM, 0) ;

int error = bind(*Socket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

setsockopt(*Socket, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int));

if(ioctlsocket(*Socket,FIONBIO, &flag)!=0)

{

closesocket(*Socket);

}

3、关闭相机函数

CloseWebCamera(WebCamera *pWebCamera);

函数功能说明:

需要关闭两个socket 连接,建立两个关闭两个。

closesocket(pWebCamera->SocketForData);

closesocket(pWebCamera->SocketForCommand);

4、接收图像线程函数

DWORD ReceiveImage(LPVOID pWebCamera);
函数功能说明:

1)获取IP数据包

recv(s_pWebCamera->SocketForData, recvbuffer, WIDTH*HEIGHT*2,0);

2)数据包解析

unsigned char CommandID = *(unsigned char*)(&(recvbuffer[1280]));

图像传输格式:图像大小640*480,每两行一传640*2=1280,因此一次

收到图像数据大小为1280字节。

CommandID用来存放第一个字节,表示行号。

CommandID ==0x00,表示第1行,初始状态开始传输数据;

CommandID < 0xef,表示中间行,继续传输图像数据;

CommandID = 0xef,即十进制239,表示结束行,一帧数据传输完成;

当一副图像传完,使用回调函数:

s_pWebCamera->WebCameraCallback(pWebCamera);

将控制权交给上层做处理,即驱动调用函数层。

5、接收命令线程函数

ReceiveCommand(LPVOID pWebCamera);

函数功能与图像线程函数类似,只不过传送的数据是命令代号。

6、相机结构体

WebCamera *pWebCamera;

主要数据成员:

1)状态标志

bool Exit;

bool Stop;

2)数据帧

typedef struct frames

{

int UserID;

bool NoEmpty;

unsigned char IntactLines;

char DataBuffer[WIDTH*HEIGHT+1024];//图像数据部分

unsigned char nLines[240];

unsigned short FrameID[240];

}Frame;

3)回调函数

int (WINAPI *WebCameraCallback)(void *pWebCamera);

int (WINAPI *WebCommandCallback)(void *pWebCamera);

7、回调函数

回调函数定义:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,

当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是

在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

实例分析:OpenWebCamera(&m_WebCamera,"192.168.1.6",10000,10001,ImageProcess,CommandProcess);

将函数指针ImageProcess传递给函数OpenWebCamera,函数指针ImageProcess所指向的函数

int ImageProcess(void *pWebCamera)被调用。但是,ImageProcess函数不是有OpenWebCamera所调用的。

而是由另外一方上面提到的s_pWebCamera->WebCameraCallback(pWebCamera);调用。

这样做可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。也就是说,我在ImageProcess中处理图像时,

并不需要去关心图像是如何通过IP数据包获取到的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: