Ril分析三——客户端请求和响应处理与modem交互
Ril与modem的交互
一 客户端的请求处理
客户端请求从EventLoop通过dispatch传递到reference-ril.c中调用onRequest接口。
处理客户端请求:
static void onRequest (int request, void *data, size_t datalen, RIL_Token t) {switch (request) {case RIL_REQUEST_DIAL:requestDial(data, datalen, t);break;……} }
二 AT Command发送
将客户端请求转化成AT命令:
static void requestDial(void *data, size_t datalen, RIL_Token t) {RIL_Dial *p_dial;char *cmd;//转化成AT命令p_dial = (RIL_Dial *)data;asprintf(&cmd, "ATD%s%s;", p_dial->address, clir);//发送AT命令ret = at_send_command(cmd, NULL);//请求处理完成回调RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0); }
发送AT Command:
static int at_send_command_full_nolock (const char *command, ATCommandType type,……) {//将数据写入到mdoem设备文件节点中err = writeline (command);//休眠等待写入的数据被读取while (sp_response->finalResponse == NULL && s_readerClosed == 0) {err = pthread_cond_wait(&s_commandcond, &s_commandmutex);}return err; }
将数据写入modem设备节点中:
static int writeline (const char *s) {//写入数据到设备文件描述符s_fdwhile (cur < len) {do {written = write (s_fd, s + cur, len - cur);} while (written < 0 && errno == EINTR);cur += written;}//返回行首do {written = write (s_fd, "\r" , 1);} while ((written < 0 && errno == EINTR) || (written == 0));return 0; }
这样就将数据写入到设备文件描述符s_fd,将AT Command传递给Modem了;
在数据被读取之前处于休眠状态。数据写入被读取之后,方才返回。
那么s_fd代表的的设备是如何设置的,读数据又是怎么进行的呢。
三 Modem响应请求处理
通过AT Command将命令发给了Modem,等待Modem处理此请求,然后将结果返回来,
读取之后进行处理,然后表示此请求Complete,并且通知 Client。
过程如下:
这个Serial Prot是什么,Reader Loop是什么呢。回到rild进程main函数中看看。
在rild进程的main函数中:
int main(int argc, char **argv) { //处理客户端请求的模块reference-ril.c 调用RIL_Initfuncs_inst[0] = rilInit(&s_rilEnv, argc, s_argv);…… }
reference-ril初始化函数:
RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv) {//交互的接口s_rilenv = env;//提取modem设备端口或者路径 //此处是d 根据前面属性系统获取参数:rild.libargs=-d /dev/ttyS0// getopt的使用 提取选项while ( -1 != (opt = getopt(argc, argv, "p:d:s:c:"))) {switch (opt) {case 'd':s_device_path = optarg;break;}}//创建线程s_tid_mainloopret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);//返回请求交互的接口return &s_callbacks; }
s_tid_mainloop线程的执行体:
static void *mainLoop(void *param) {at_set_on_reader_closed(onATReaderClosed);at_set_on_timeout(onATTimeout);for (;;) {fd = open (s_device_path, O_RDWR);s_closed = 0;ret = at_open(fd, onUnsolicited);RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);// Give initializeCallback a chance to dispatched, since// we don't presently have a cancellation mechanismsleep(1);waitForClose();} }
这里打开了modem的设备文件描述符fd,传递给了at_open():
int at_open(int fd, ATUnsolHandler h) {//与modem设备通信文件描述符s_fd = fd;//网络端传来事件请求处理onUnsoliciteds_unsolHandler = h;s_readerClosed = 0;//创建线程s_tid_readerret = pthread_create(&s_tid_reader, &attr, readerLoop, &attr);return 0; }
线程执行体readerLoop():
static void *readerLoop(void *arg) {for (;;) {//从与modem通信设备端口读取数据line = readline();if (line == NULL) {break;}//处理数据 processLine(line);}onReaderClosed();return NULL; }
来自Modem端数据处理:
static void processLine(const char *line) {if (sp_response == NULL) {//来自网络端事件 handleUnsolicited(line);} else if (isFinalResponseSuccess(line)) {//客户端请求处理返回sp_response->success = 1;handleFinalResponse(line);} …… }
来自网络端事件:
static void handleUnsolicited(const char *line) {// 回调接口onUnsolicitedif (s_unsolHandler != NULL) {s_unsolHandler(line, NULL);} }
客户端请求处理返回:
static void handleFinalResponse(const char *line) {//保存modem端响应请求所传递的数据sp_response->finalResponse = strdup(line);//发送signal 唤醒等待s_commandcond的线程——Event Looppthread_cond_signal(&s_commandcond); }
整个数据流程图如下:
图片来自:http://blog.csdn.net/maxleng/article/details/5576637
Ril分析三——客户端请求和响应处理与modem交互相关推荐
- Web服务器对客户端请求的响应信息是,图解HTTP权威指南(三)| Web服务器对HTTP请求的处理和响应...
一.问题 解释Web服务器是如何处理HTTP事务的 二.Web服务器 Web服务器会对HTTP请求进行处理并提供响应.Web服务器请求的七大步骤: 1)接受客户端连接 2)接收请求报文 3)处理请求 ...
- 深入操作系统底层分析nginx网络请求及响应过程
0. 网络传输阶段 比如说主机A是家里windows的一台笔记本电脑,主机B是linux服务器上的一个nginx,其监听80或443等web端口. 在笔记本的浏览器发送了一个http get请求,其数 ...
- wireshark Fiddler抓包分析与解密https Fiddler修改https请求和响应
Https理论 在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议.HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全.为 ...
- Wireshark 抓包分析 HTTP 请求、响应报文格式
文章目录 报文结构 HTTP 请求报文的请求行 请求方法 GET/HEAD POST/PUT 其他方法 URI URI 的格式 URI 的编码 HTTP 响应报文的状态行 状态码 HTTP 请求.响应 ...
- log nginx 客户端请求大小_Nginx日志分析和参数详解
本文档主要介绍Nginx设置日志参数的作用,以及Nginx日志常用分析命令 基本大纲: 1.Nginx日志记录格式的介绍 2.Nginx日志参数详解 3.Web服务流量名词介绍 4.Nginx日志常用 ...
- 所给服务器端程序改写为能够同时响应多个客户端连接请求的服务器程序_一文读懂客户端请求是如何到达服务器的...
点击上方"蓝色字体",选择 "设为星标" 关键讯息,D1时间送达! 互联网是人类历史上最伟大的发明创造之一,而构成互联网架构的核心在于TCP/IP协议.那么TC ...
- oracle连接长时间未响应,Oracle的pl/sql客户端请求超时未响应的解决方法及装置与流程...
本发明涉及计算机技术领域,具体提供一种Oracle的pl/sql客户端请求超时未响应的解决方法及装置. 背景技术: 随着信息技术的发展,Oracle数据库技术越来越广泛地推广应用到各个领域.当pl/s ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- listen()和accept()函数:让套接字进入监听状态并响应客户端请求
对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了. listen() 函数 ...
最新文章
- c 读取mysql中表中数据_c#读取MySQL数据表中的内容
- 《高性能Linux服务器构建实战》笔记
- 改变进程的优先级,nice,getpriority,setpriority
- Nginx模块开发中使用PCRE正则表达式匹配
- android的ui怎么做到流畅,android提高UI的流畅度
- 如何查询Oracle性能监控
- python开发酷q插件gui_酷Q机器人插件开发笔记
- 如何通过企业微信做精细化社群运营
- 产品开发之小步快跑,快速迭代
- Rope3d数据集分析
- Flask入门教程——小白的艰难抗争史
- Vue 自定义消息通知组件
- 2021年度IT吃瓜指南
- php webcam,如何使用Dynamic Web TWAIN附加组件构建PHP Webcam App
- 网站都变成灰色的了,代码是怎么实现的呢?
- 2021-10-27 孤尽训练营D2
- Qt图例类QLegend详解
- AI说人“画” | Heart Broken, 游戏中被AI碾压的我们都中了哪些套路?
- IPV6 IPV4 java 转换为数字
- asp.net(c#)如何把字符串转换成数组
热门文章
- 福田车载无线充电器方案开发设计_过年自驾回家,带上优胜仕车载无线充电器,一放即充导航无忧...
- tcp的无延时发送_腾讯网红程序员,详解带宽、延时、吞吐率、PPS 这些都是啥?...
- python2.7 pip安装htmlreport报错_pytest十五:pytest-html 生成 html 报告
- Hadoop详解(八):MapReduce深度分析
- yshon对讲机如何调频率_99%的人都不知道对讲机的这些功能.....
- 我的爱好html子页模板,我的爱好
- python按行求和_Python第一篇:对3个Excel文件进行整合
- Redis自带压测工具(redis-benchmark.exe)
- python 第三方库 工具
- jQuery 下拉框应用 拓展