- 首先项目分为几个部分,第一部分为在线聊天的部分,首先在服务器定义一个结构体,包含用户的姓名,性别,密码,文件描述符,是否在线的消息,然后约定消息的结构体为消息类型,用户名,密码,消息内容,发送给谁。
- 服务器的流程为,先使用三个epoll的操作符,一个主epoll,一个epollgirl和epollboy,看这名字也知道后面会根据发送者的性别将新建立的连接放入这个epoll中,实现的方式就是先建立两个线程,或者说建立两个反应堆,后续会将新建立连接的操作符分别放入这两个反应堆的。
- 在主epoll当中,会一直监听fd,当有新的连接发生的时候,就会判断消息的类型,如果是注册,就将该用户放入用户池中。如果是登录的话,就要把它放入不同的反应堆了。
- 这时候,咱们就聊聊反应堆,当主epoll把新的用户信息交给它时,就是自动调用广播函数,告诉所有的用户,它上线了。如果是反应堆里收到了新消息,那么程序就会判断是什么类型,是公开还是私人消息,然后再去调用相关的函数发送。
-
在客户端之中呢,首先进入程序先初始化各种参数,确定发送的消息类型是注册还是登录,利用select,如果时间长于两秒则断开连接,成功之后就会建立一个新的线程阻塞等待消息,在主线程里面就可以自由发送消息。
-
在windows QT中利用一个类 QTcpSocket 与服务器连接。其他的话,消息发送和接收都是一些数据的处理了。
-
该程序并没有添加好友,消息队列,发送心跳包连接,以及存储用户信息的功能。
• 首先服务器主程序会读取数据库的内容,初始化四个管理部分,该管理部分会将所有数据保存到本地。
下面是指管理的内容,也就是Info类,利用Manager管理Info类
• 然后创建4个线程,利用epoll的方式监听I/O,继续初始化线程池等待用户的连接。 • 服务器与客户端传输的消息都经由 protobuf 格式,以此来减少数据量的传输
• 当有客户端连接的时候,服务端会将该用户传来的数据缓存在本地后放入线程池,等待线程池的处理。线程池用来处理数据。 • worker会首先分析消息类型,然后做出对应的处理,再把数据经 protobuf 格式发回客户端 • 如果主程序检测到客户端断开连接,将会根据文件描述符找到对应的用户ID,自动调用其退出登录函数 • 主程序在最后将会根据 db_flag 做出相对应的数据库操作
首先会调用QCamera相关的类去使用windows的相机,有类似取景器的类QCameraViewfinder和图片捕捉QCameraImageCapture一直获取图片,利用QTimer定时,每5ms更新一次照片;另外会调用QNetworkAccessManager类通过百度API接口获得token。
按下开始游戏按钮之后,就会触发定时器,3秒倒计时后判断胜负,同时 QT会开启一个线程处理数据,将图片裁剪后进行base64编码,然后将编码通过特定的格式发给百度开放接口,直接识别手势,与电脑随机生成的剪刀石头布进行胜负判断。
系统整体架构设计 视频及图像的显示、识别种类的选择、识别结果的显示、按钮交互功能。
-
视频及图像的显示 :物体识别系统主要依据输入图像进行处理、识别,因此本项目调用V4l2驱动框架。设计图像显示窗口,便于确认选择的目标物体,以及同输出识别信息比对 ;此外,该窗口在拍照时还可以显示相机画面,方便抓拍目标物体。对此,本文采用 QLabel 组件用于显示图像。
-
识别种类的选择 :百度 AI 图像识别 API 提供了多种类型的图像识别接口,对此需要设计功能选择按钮,本项目采用下拉菜单形式选择识别的功能。
-
识别结果的显示 :识别系统将输出识别多个可能结果,及本系统也会给出一个最可能的结果。
-
按钮交互功能 :本系统设置了 5 个功能按钮键,分别是 :采集图像、关闭采集、拍照、导入图片、图像识别。“采集\关闭采集”按钮显示内容将随相机的状态相应切换 “拍照”按钮,是在打开相机后,进行拍照拾取目标画面功能的按钮 ; “导入图片”按钮用于打开文件浏览器,选择本地 jpg、png 图像文件,采用 QFileDialog.getOpenFileName() 静态函数来获取选择的文件地址及名称 ;“图像识别”用于图像识别功能的开启,其对应的函数需要传入图像文件地址和名称、以及对应的识别种类的参数 。
使用和风天气开发服务,填写天气数据应用名称后选择 WebAPI,自定义天气数据应用名称。 我们将 key 填写到URL 里面,使用 get 方法就能从 API 爬虫下JOSN 数据来了,location:城市,type:类型。 //get 方法获取信息 void LifeWidget::sendQuest(QString cityStr); 解析 JOSN 数据,只需要解析 key 为 daily的值即可。其中 daily 的值是一个数组类型的数据,只需要取出我们需要的即可。
void RecorderStart(QString fileName);//开始录音
// 录音设备信息,QAudioDeviceInfo
// 录音的编码格式,QAudioFormat
// 创建录音对象,QAudioInput
// 录音保存的文件,QFile
void RecorderEnd();//结束录音并转换格式
项目功能: 1)批量从本地导入歌曲到歌曲列表中; 2)清空歌曲列表; 3)删除歌曲列表中选中的歌曲; 4)用进度条显示歌曲播放的进度,并显示时间; 5)用“播放/暂停”、“停止”、“上一曲”、“下一曲”四个按钮对歌曲进行控制; 6)用滑动器对歌曲音量进行控制;
使用三个 pushbutton 来添加歌曲、删除歌曲和清空歌曲列表。使用四个 toolbutton 来控制歌曲的播放、停止、上一曲、下一曲。使用 ListWidget 控 件来存放歌曲列表。使用 slider 来控制音量和歌曲进度。
使用 QMediaPlayer 类实例化 player 对象。通过 QStringList 类实例化对象 songsList,获取要添加的歌曲的路径和文件名。遍历 songsList,将列表里的每一首歌曲依次添加到ui 界面的 listwidget 控件里。
addSongs(); // 添加歌曲 playPause(); // 播放和暂停
playNext(); // index =playList->currentIndex()
durChanged(); // 设置进度条显示范围,并计算歌曲总时间,显示出来。
UI设计,使用QGroupBox 内嵌 QScrollArea 包含多个QRadioButton 显示搜索得到的wifi。 通过WiFi连接的shell命令,使 QRadioButton 显示的名称改变,点击刷新,重新来一次。 点击连接网络,就会调用另一个含界面的类。 需要输入密码。当输入密码后,调用shell命令,尝试建立连接。
获取网络传输速度函数 使用QProcess类进行命令行读取,读取文件/ proc/net/dev并使用正则表达式解析,获取网络收发包数量,再除取样时间得到网络速度。
获取CPU利用率函数 使用QProcess类进行命令行读取,读取文件/proc/stat并使用正则表达式解析,获取cpu总量和cpu使用量,用cpu使用量除以cpu总量得到利用率。
获取ip地址函数 使用awk文本分析工具的命令组合从命令行得到ip地址存到ipAddr. txt中,再读ipAddr. txt文件获取数据。
获取内核版本 uname -a
获取读取硬盘速度 iostat -k -d
connect(password_edit,SIGNAL(send_show(QString)),this,SLOT(keyboardshow(QString)));
connect(syszuxpinyin,SIGNAL(sendPinyin(QString)),this,SLOT(confirmString(QString)));
确定好订阅和发布的topic,初始化传感器节点,初始化节点的回调参数,把节点加入链表中。回调函数会根据接收的命令改变节点的状态。 配置mqtt相关参数,订阅初始化,发布初始化。发布温湿度,风扇,LED的状态,数码管显示温度。