找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

树莓派3+ATS之服务器插件

admin 2019-2-11 07:30 138人围观 嵌入式相关

作者:爱板网



▌ 原理分析

ATS是做服务器最好的选择,服务器最重要的两件事就是接收处理用户的请求并发送反馈的信息给用户。这个帖子的目的在于介绍几个接收、发送数据的处理函数的使用。

先来看下,整体的结构

装逼的功能:我希望在ATS的基础上,开发一个插件,这个插件能够接收用户的连接请求,同时能发送数据给用户。

实际的功能:这不就是个Socket的发送、接收功能吗。。。

socket归socket,不同的是ATS如何利用Socket+Event+Continuations这三种机制实现这一最基本的功能。



▌主要函数

ATS中插件是运行在continuations(协程)的机制上的,可以说一个插件就是一个或多个continuations组成的,所以先介绍的两个函数是continuations的创建与销毁。

TSCont TSContCreate(TSEventFunc funcp, TSMutex mutexp);

###funcp是指continuations用来处理事件的主要函数,创建函数是用来创建并绑定事件处理函数

void TSContDestroy(TSCont contp);
数据会随着continuations的挂起而保存,有点像中断,接下来的这个函数能将要保存的数据与协程绑定起来

void TSContDataSet(TSCont contp, void *data);
###void *data即要保存的数据,可以是类、结构体等等。

void *TSContDataGet(TSCont contp);
###获取dataset所保存的数据

TSAction TSNetAccept(TSCont contp, int port, int domain, int accept_threads);
###绑定并监听端口,第3个参数domain的值可参考socket的值,一般是设置AF_INET,最后一个是回调函数的线程ID,可设置回调可不设置

int TSContCall(TSCont contp, TSEvent event, void *edata);
###回调与cont绑定的eventhandler函数,第二个参数为事件的代号

接收有关数据的读、写操作的函数



当请求接入后,TSNetAccept的data是一个TSVconn的类,也就是通过这个类在两者之间建立联系

数据的读取(写入)需要通过IObuffer、IOBufferReader、TSIOBufferBlock相互配合才能将数据从buffer中读取(写入)出来。

主要的几个函数(以读取函数为例)

TSVIO TSVConnRead(TSVConn connp, TSCont contp, TSIOBuffer bufp, int64_t nbytes);
###将连接发送给协程数据关联至IOBuffer中,同时nbytes设置IObuffer的空间大小,当有数据写入时,触发该协程的回调事件函数。

const char *TSIOBufferBlockReadStart(TSIOBufferBlock blockp, TSIOBufferReader readerp, int64_t *avail);
###将数据读出,avail表示用于存放读书数据字节数的地址

TSIOBufferBlock TSIOBufferBlockNext(TSIOBufferBlock blockp);
###每次读取的数据有限,通过block的方式多次读取,这里的block相当于指针一样,随着读取不断向后移动

▌代码实现

最后,是通过C++编写一个小插件。

首先,我们需要将这个插件挂载到ATS上,因此需要声明TSPluginInit函数,由于是在CPP的文件里写的,因此需要声明用gcc来编译这个入口函数就有如下代码,同时我们再此将插件功能进行初始化

具体代码请点击“阅读原文”查看

在初始化函数中,需要做的有四件事:创建continuations、绑定数据存放、绑定事件处理的主函数、绑定端口并监听。在这之前,先创建一用于保存数据的机构体(或者类)

此处代码请点击“阅读原文”查看

于是,helloinit、以及主事件处理函数的代码为

此处代码请点击“阅读原文”查看

接下来,需要等待连接接入,为此我们需要写个客户端的脚本,方便采用python编写

此处代码请点击“阅读原文”查看

当客户端连接服务器后,ATS会触发事件函数202表接受了请求,建立连接,这个时候就绑定IOBuffer并声明buffer的空间,同时我直接发送给对端一个链接的信号,代码如下:

此处代码请点击“阅读原文”查看

当IOBuffer中有数据的时候就会触发事件102或者103,102表示发送过来的数据尚未填满buffer,103表示buffer已经满了。那么将数据读出的代码如下:

此处代码请点击“阅读原文”查看


▌测试过程

为了测试这个插件的过程,编写一个脚本,自动编译、自动重启、自动删除日志、自动启动测试客户端、自动关闭ATS,命令如下

此处代码请点击“阅读原文”查看

可以看到,客户端启动后,接收到了ATS发送过来的数据



同时查看ATS的日志,可以看到对应事件回调的过程



点击“阅读原文”可获得以下资源


相关代码、与原作者交流


END








欢迎加入微信群

加入与非社群,找到同道,一起切磋技艺、化解难题。当然还有不定期的红包雨等着你哦!



添加小编微信后,回复对应关键词+公司+岗位,方可被拉入社群,否则一律禁止入群,每人只可申请一个技术群。

关键词:嵌入式、模拟、人工智能、RF、传感器、汽车电子、物联网、IC设计、EDA、PCB、开源硬件、树莓派。





-------------------------------------------------------------------------
我们尊重原创,也注重分享,如若侵权请联系qter@qter.org。
-------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......