由于jpg本来就是编码压缩后的格式,所有无需重复编码

传输子系统步骤:(1)初始化:a.socket(初始化tcp连接);b.将事件添加到epoll中

         (2)事件处理:接收到网络包、发送完网络包

struct tcp_srv* net_sys_init()
{
struct tcp_srv* s;
struct sockaddr_in addr;
struct sockaddr_in sin;
struct tcp_cli* c;
int len; s = calloc(, sizeof(struct tcp_srv));
c = calloc(, sizeof(struct tcp_cli)); //1. 初始化传输子系统(socket初始化)
//1.1 创建socket
s->sock = socket(AF_INET, SOCK_STREAM, ); //1.2 初始化地址
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_family = AF_INET;
addr.sin_port = htons(DEF_TCP_SRV_PORT); //1.3 bind地址
bind(s->sock, (struct sockaddr*)&addr, sizeof(struct sockaddr)); //1.4 listen
listen(s->sock, ); //1.5 accept
c->sock = accept(s->sock, (struct sockaddr*)&sin, &len);
memcpy(&(c->addr), &sin, len); //2. 将传输子系统中的事件加入epoll池
c->ev_rx = epoll_event_create(c->sock, EPOLLIN, rx_app_handler, c);
c->ev_tx = epoll_event_create(c->sock, EPOLLOUT, tx_app_handler, c); epoll_add_event(srv_main->epfd, c->ev_rx); return s;
}
void tx_app_handler(int sock, void* arg)
{ //发送事件
struct tcp_cli* c = arg;
send(sock, c->buf, c->len, ); epoll_del_event(srv_main->epfd, c->ev_tx);
epoll_add_event(srv_main->epfd, c->ev_rx);
} void rx_app_handler(int sock, void* arg)
{ //接收事件
unsigned char* pbuf;//保存读取的数据
struct tcp_cli* c = arg; pbuf = &(c->req[]);
read(c->sock, pbuf, FRAME_HDR_SZ);
process_incoming(c);//数据处理子函数
}
int process_incoming(struct tcp_cli* c)
{
//针对不同的命令做处理
__u8 id;
__u8 data[FRAME_DAT_MAX];//数据最大长度
struct cam* v = srv_main->cam;
__u8* req = c->req;
__u8* rsp = c->rsp;
__u8 status = ERR_SUCCESS;
__u32 pos, len, size; id = req[CMD1_POS];//请求的ID switch (id)
{
case REQUEST_ID(VID_GET_FMT)://VID_GET_FMT
//1. 获取图像格式
cam_get_fmt(v, data); //2. 构造返回数据
build_ack(rsp, (TYPE_SREQ << TYPE_BIT_POS) | SUBS_VID, id, , data); //3. 发送返回数据
net_send(c, rsp, FRAME_HDR_SZ + ); break;
case REQUEST_ID(VID_REQ_FRAME)://VID_REQ_FRAME
//1. 获取一帧图像
pos = FRAME_HDR_SZ + ;
size = cam_get_trans_frame(v, &rsp[pos]);//获取到图像的长度; //2. 构造返回数据,按照要求的格式数发送
build_ack(rsp, (TYPE_SREQ << TYPE_BIT_POS) | SUBS_VID, id, , (__u8*)&size); //3. 发送返回数据
net_send(c, rsp, FRAME_HDR_SZ + + size);
break;
default:
break;
}
return status;
}
int build_ack(unsigned char* rsp, unsigned char type, unsigned char id, unsigned char len, unsigned char* data)
{ //cam.c构造返回数据
rsp[LEN_POS] = len;
rsp[CMD0_POS] = type;
rsp[CMD1_POS] = id;
memcpy(&rsp[DAT_POS], data, len); return len + FRAME_HDR_SZ;
}
void net_send(struct tcp_cli* tc, void* buf, int len)
{ // 发送返回数据
struct tcp_cli* c = (struct tcp_cli*)tc;
struct tcp_srv* s = c->srv; epoll_del_event(s->epfd, c->ev_rx);
c->buf = buf;
c->len = len;
epoll_add_event(srv_main->epfd, c->ev_tx);
}

基于视频压缩的实时监控系统-sprint3采集端传输子系统设计的更多相关文章

  1. 基于视频压缩的实时监控系统-sprint2采集端图像采集子系统设计

    (1).初始化:a.初始化摄像头:b.注册事件到epoll (2).开始采集--->触发事件处理系统 (3).保存图像(方便测试) a.初始化摄像头 //初始化摄像头 1.获取驱动信息 2.设置 ...

  2. \阶段4-独挡一面\项目-基于视频压缩的实时监控系统\Sprint2-采集端图像采集子系统设计

    1.在编写程序前有一个流程,思维导图: 初始化:包括初始化摄像头:注册事件到epoll 然后是开始启动采集:一旦开始采集我们的摄像头就会有数据了,它会触发事件处理函数:我们在这里的处理是保存这个图像: ...

  3. 项目-基于视频压缩的实时监控系统--tiny6410

    项目-基于视频压缩的实时监控系统--tiny6410 @国嵌linux学习笔记. 1. 构造服务端结构体 server struct server { int epfd; //保存epoll指针 st ...

  4. 基于视频压缩的实时监控系统-sprint1基于epoll架构的采集端程序设计

    part1:产品功能 part2:epoll机制   select与epoll区别 1.select与epoll没有太大的区别.除了select有文件描述符限制(1024个),select每次调用都需 ...

  5. 阶段4-独挡一面\项目-基于视频压缩的实时监控系统\Sprint1-基于Epoll架构的采集端程序框架设计\第2课-基于Epoll的采集端程序框架设计

    回顾之前的整个程序架构 把epoll机制应用到这个架构上去 下面主要去分析我们的系统中有没有需要等待的事件,先看看采集子系统 在采集子系统当中,摄像头有数据,摄像头采集到图像数据可以作为一个等待事件. ...

  6. 嵌入式应用开发第四阶段-基于rk3399的视频监控系统

    一.需求分析 伴随着嵌入式技术.图像处理技术和无线网络传输技术的发展,传统模拟视频监控系统和基于PC的远程视频监控系统由于自身的不足,已经无法满足现代社会应用中不断涌现出来的新需求,于是基于嵌入式技术 ...

  7. 转: 透过CAT,来看分布式实时监控系统的设计与实现

    评注: 开源的分布式监控系统 转:http://www.infoq.com/cn/articles/distributed-real-time-monitoring-and-control-syste ...

  8. 透过CAT,来看分布式实时监控系统的设计与实现

    2011年底,我加入大众点评网,出于很偶然的机会,决定开发CAT,为各个业务线打造分布式实时监控系统,CAT的核心概念源自eBay闭源系统CAL----eBay的几大法宝之一. 在当今互联网时代,业务 ...

  9. [经验交流] 试用基于 influxdb+kapacitor 的监控系统

    2017年10月16日: 使用中发现kapacitor的ui过于简单,不能满足实际工作需要,现已切换到grafana --------- 两个月前试用了基于 elasticsearch + xpack ...

随机推荐

  1. Linux多任务编程之四:exit()函数及其基础实验(转)

    来源:CSDN  作者:王文松   转自Linux公社 exit()和_exit()函数 函数说明 创建进程使用fork()函数,执行进程使用exec函数族,终止进程则使用exit()和_exit() ...

  2. SQL字符串拼接FOR XML PATH

    在工作中难免会遇到数据库中数据要进行拼接的问题,字符串拼接可以是用SQL的拼接也可以使用C#的拼接,本次说的是使用SQL进行拼接. 首先插入测试语句: --测试语句,准备创建表的语句:如下 CREAT ...

  3. python 面向对象专题(十一):特殊方法 (四)__get__、__set__、__delete__ 描述符(四)描述符用法建议

    使用特性以保持简单 内置的 property 类创建的其实是覆盖型描述符,__set__ 方法和__get__ 方法都实现了,即便不定义设值方法也是如此. 特性的__set__ 方法默认抛出 Attr ...

  4. windows python的多进程

    最近打比赛,apply操作极慢,队友使用了线程池,用多核开辟多线程跑,加速. 在阿里平台上,都没问题. 我是win10系统+jupyter notebook 多线程那个模块运行,会显示一直运行,p.c ...

  5. IOS中input键盘事件keyup 的兼容解决办法

    用input监听键盘keyup事件,在安卓手机浏览器中是可以的,但是在ios手机浏览器中很慢,用输入法输入之后,并未立刻相应keyup事件. 解决办法: 在ios设备上可以用html5的input事件 ...

  6. selenium自动化测试实战——12306铁路官网范例

    一.Selenium介绍 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Se ...

  7. SpringBoot2.x入门教程:引入jdbc模块与JdbcTemplate简单使用

    这是公众号<Throwable文摘>发布的第23篇原创文章,收录于专辑<SpringBoot2.x入门>. 前提 这篇文章是<SpringBoot2.x入门>专辑的 ...

  8. echarts 实战 : 恼人的间隔问题

    使用 echarts 的时候,可能我们需要这个图表的间隔是固定的.比如 3个 4个 5个. (注意计算间隔数量的时候是不算 x轴 本身的.) 这个问题看似简单,其实有点麻烦. yAxis.splitN ...

  9. Elasticsearch7.X ILM索引生命周期管理(冷热分离)

    Elasticsearch7.X ILM索引生命周期管理(冷热分离) 一.“索引生命周期管理”概述 Elasticsearch索引生命周期管理指:Elasticsearch从设置.创建.打开.关闭.删 ...

  10. 题解 洛谷 P4695 【[PA2017]Banany】

    考虑用动态点分治来解决像本题这样带修的树上路径问题. 首先对原树进行点分治,建出点分树,在点分树每个节点上用动态开点线段树来维护以该节点为起点,到其点分树子树中每个节点的利润. 查询时只需在点分树上当 ...