日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Ril分析三——客户端请求和响应处理与modem交互

發布時間:2025/4/16 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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交互的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。