网络相机上位机软件驱动分析
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数据包获取到的。
网络相机上位机软件主要用于获取并解析下位机发送上来的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数据包获取到的。
相关文章推荐
- MT7688双摄像头+驱动双电机(5)上位机测试软件
- OK6410之蜂鸣器驱动软件分析---PWM定时器
- 机器人技术—基于DELPHI的数据采集与分析类上位机软件的编写
- MT7688双摄像头+驱动双电机(5)上位机测试软件
- OK6410之ADC驱动软件分析---阻塞与非阻塞IO
- "约束驱动的软件分析&设计新技术"开篇
- "约束驱动的软件分析&设计新技术"开篇
- 使用LabVIEW开发STM32 USB HID驱动和上位机软件成功
- 使用LabVIEW开发STM32 USB HID驱动和上位机软件成功
- "约束驱动的软件分析&设计新技术"开篇
- 流氓软件及反流氓软件的技术分析(转自驱动开发网)
- wpa_supplicant软件架构分析 (与驱动通信的接口)
- 基于Android Tiny4412平台---敦泰I2C接口FT5X06电容屏驱动原理及软件架构分析
- 软件测试之黑盒测试(等价类划分,边界值分析,判定表驱动)
- 无驱动上位机软件开发途径
- IIC 时序分析,stm32软件模拟驱动编写
- linux下IIC驱动开发分析(2)
- Linux ALSA及ASOC驱动框架分析
- wifi wpa_supplicant软件架构分析