Saturday, July 11, 2009

用gsmmux 测试via cdma多路复用功能

现在杭州的威盛已实现了GSM协议07.10 multiplexer。
gsmmux 可以在 developer.berlios.de/projects/gsmmux/ 上获得.按照说明安装就可以了。
代码默认用的是AT+CMUX开启功能,而CMUX在CDMA另有别用,所以他们就用VMUX来替代,在代码里,把CMUX改为VMUX,重新编译。

运行 mux,得到两个虚拟逻辑串口 /dev/mux0 /dev/mux1,
开一个终端1 cat /dev/mux0 观察数据
再开一个终端2输入 echo -e "AT\r\n" > /dev/mux0
终端1有 "OK" 响应就行了。
同样的方法测试 mux1.

核心代码在 gsm0710.c

简单说明一下。
1190 行的 main函数,读取命令行参数, 
1272 行 daemonize(_debug) 设置为unix下经典后台程序,下来是设置信号中断机制。 

openDevicesAndMuxMode 函数 打开modem 初始化,发 "AT+VMUX=0" 进入mux模式。 

MUX启动过程 
主机发: AT+VMUX=0 
模块回复:OK /*进入MUX模式*/ 
主机发:  F9033F011CF9 /*建立DLC0*/ 
模块回复:F9037301D7F9 
主机发:  F9073F01DEF9 /*建立DLC1*/ 
模块回复:F907730115F9 
        F901EF09E305070D9AF9 /*DLC1 MSC 命令*/ 
主机发:  F90B3F0159F9 /*建立DLC2*/ 
模块回复:F90B730192F9
        F901EF09E3050B0D9AF9 /*DLC2 MSC 命令*/ 

 /*…开始进行MUX协议的数据传输…*/ 

在 1106行的openDevicesAndMuxMode,
三次(一般是三次,可以设置)打开 /dev/ptmx ,得到三对主从终端,通过符号链接,创建两个虚拟串口

/dev/mux0 /dev/mux1 这时就可以像正常访问串口一样访问它们,一般 /dev/mux0
用来专门发AT, /dev/mux1 用来发送数据业务,比如pppd 拨号上网。 

数据流大概是这样的 
/dev/ttyS0 <---> | /dev/pmux <----> /dev/mux0 | <----> at command 
/dev/ttyS0 <---> | /dev/pmux <----> /dev/mux1 | <----> cdma pppd


 下面
1162行 - 1166行 
 for (i = 1; i <= numOfPorts; i++) 
 { 
     sleep(1);
     write_frame(i, NULL, 0, SABM | PF); 
     syslog(LOG_INFO, "Connecting %s to virtual channel %d on %s\n", ptsname(mux_fd[i-1]), i, serportdev);
 } 

write_frame(i, NULL, 0, SABM | PF); 实现的就是发 
F9033F011CF9 /*建立DLC0*/ 
F9073F01DEF9 /*建立DLC1*/ 
F90B3F0159F9 /*建立DLC2*/ 

 然后进入 while循环,用selelct 实现 i/o 多路复用, 
(1)检查物理串口,如果有可读的数据,读取放到buffer,然后解析数据帧,并发送到虚拟逻辑串口 
(2)检查虚拟逻辑串口,如果有可读的数据,构造数据帧,写入物理串口。 

 就这样,基本原理是数据分组打包与解包。  

No comments: