Categories
CDMA

用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)检查虚拟逻辑串口,如果有可读的数据,构造数据帧,写入物理串口。

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

If you enjoyed this post, make sure you subscribe to my RSS feed!

5 replies on “用gsmmux 测试via cdma多路复用功能”

本人正在从事类似的开发,希望能指教!
我使用了 类似你的方法,但是下面的这个就是不行:

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

请问是什么原因呢?

是不是模组休眠了?如果用上面的方法不行,最保守的,到 /dev/ 目录下查看 具体的虚拟逻辑串口,然后可以用 minicom 查看,一般设置波特率,没有硬件流控即可。

模组休眠要怎么做才能打开??一般的命名是什么?
我查看了代码和协议文档,但是发现:
这是官方文档定义的基本模式特点

Flag Address Control Length Indicator Information FCS Flag
1B 1B 1B 1B/2B 长度不确定 1B 1B
图5:basic模式的帧的结构

而 代码中的函数:write_frame却不是这样的:
CRC 的结果放到第一个字节上了:
/* CRC checksum */
postfix[0] = make_fcs(prefix + 1, prefix_length – 1);

c = write(serial_fd, prefix, prefix_length);
请教,请教!!!

我用PPPD拨号已经的到IP和dns 了;但是无法ping通网络,ping的数据包有到物理串口,但是没返回。为什么要建立3对伪终端,另外一个用来做什么,是不是任意2对拿来用都可以呢?

Leave a Reply to deli Cancel reply

Your email address will not be published. Required fields are marked *