3G上网卡3_编程自动确认拨号端口学习笔记
目的:当识别出/dev/ttyUSB...后, 它创建一个链接文件/dev/gsmmodem指向拨号时要用的/dev/ttyUSB
1、do_link函数
/*
* 创建/dev/gsmmodem链接, 指向某个/dev/ttyUSBX
* 3g_manager link ttyUSB0,1,2
*/
int do_link(int argc, char **argv)
{
char cmdBuf[1024];
int index;
int i;
/*
* 如果有多个/dev/ttyUSBX有中断类型端点,
* 则/dev/gsmmodem指向最小的/dev/ttyUSBX
*/
3g_manager link ttyUSB0,1,2
sscanf(argv[2]+6, "%d", &index);//读入数值存在index中
for (i = 0; i <= index; i++)
{
//如果有中断端点,把原来的链接文件删掉,再创建1个新的链接文件
if (hasInterruptEndpoint(i))
{
//利用ln创建链接文件,-s表示软连接,-d表示硬链接
//ln -s 源文件 目标文件
sprintf(cmdBuf, "ln -s /dev/ttyUSB%d /dev/gsmmodem", i);//打印信息
system("rm -f /dev/gsmmodem");//先删除文件, -f --force 强制删除
system(cmdBuf);//重新进行链接
return 0;
}
}
return -1;
}
2、判断中断类型端点函数
/*
* 判断/dev/ttyUSB'index'是否有中断类型的endpoint
查看 /usr/sbin/usb_modeswitch_dispatcher,搜索ttyUSB
*/
int hasInterruptEndpoint(int index)
{
/* 1. 对于每一个/dev/ttyUSBX
* 都有一个对应的/sys/class/tty/ttyUSBX
* 2. 它是一个链接文件, 指向: /sys/......../1-1:1.0/ttyUSB0/tty/ttyUSB0
* 3. 进入/sys/......../1-1:1.0/目录,
* 里面有多个"ep_"的子目录
* 4. 子目录里有名为type的文件
* 5. 如果这个文件的内容为Interrupt, 则返回1
*
*/
char tmpBuf[1024];
char tmpBuf2[1024];
int cnt;
char *ptr;
DIR *dir;
struct dirent *entry;
int fd;
sprintf(tmpBuf, "/sys/class/tty/ttyUSB%d", index);//打印目录
ssize_t readlink(const char *path, char *buf,size_t bufsiz);
readlink()会将参数path的符号链接内容存储到参数buf所指的内存空间
cnt = readlink(tmpBuf, tmpBuf2, 1024);//会把tmpBuf存的路径所指向的真实路径存在tmpBuf2里面
它是一个链接文件, 指向: /sys/......../1-1:1.0/ttyUSB0/tty/ttyUSB0
//如果错误返回
if (cnt == -1)
{
return 0;
}
else
{
tmpBuf2[cnt] = '\0';//成功后cnt是 tmpBuf2里存放的字节数
}
* 2. 它是一个链接文件, 指向: /sys/......../1-1:1.0/ttyUSB0/tty/ttyUSB0
/sys/class/tty/
sprintf(tmpBuf, "/sys/class/tty/%s", tmpBuf2);/* tmpBuf: /sys/devices/platform/s3c2410-ohci/usb1/1-1/1-1:1.3/ttyUSB2/tty/ttyUSB2 */
char * strstr(char * str1,char * str2);功能就是找出在字符串str1中第一次出现字符串str2的位置(也就是说字符串sr1中要包含有字符串str2),找到就返回该字符串位置的指针(也就是返回字符串str2在字符串str1中的地址的位置),找不到就返回空指针(就是 null)。
ptr = strstr(tmpBuf, "/ttyUSB");//搜到/ttyUSBif (!ptr)
{
return 0;
}
* 3. 进入/sys/......../1-1:1.0/目录,
里面有多个"ep_"的子目录
tmpBuf[ptr-tmpBuf] = '\0'; /* tmpBuf: /sys/......../1-1:1.0 */
//printf("Dir: %s\n", tmpBuf);
// 打开/sys/......../1-1:1.0/目录,
dir = opendir(tmpBuf);
if (!dir)
{
printf("can not open %s\n", tmpBuf);
return 0;
}
//读取目录里面的每1项
while((entry = readdir(dir)))
{
//匹配名字,匹配3个字符
if (strncasecmp(entry->d_name, "ep_", 3) == 0)
{
//tmpBuf2= tmpBuf(目录)+entry->d_name(名字)+type
sprintf(tmpBuf2, "%s/%s/type", tmpBuf, entry->d_name);
//printf("type: %s\n", tmpBuf2);
//打开文件
fd = open(tmpBuf2, O_RDONLY);
if (fd < 0)
{
printf("can not open %s\n", tmpBuf2);
return 0;
}
//读取里面的内容
read(fd, tmpBuf2, 1024);
//printf("endpoint: %s\n", tmpBuf2);
//内容判断(如果是interrupt代表的是中断类型端点)
if (!strncmp(tmpBuf2, "Interrupt", 9))
{
return 1;//找到要找的东西
}
close(fd);
}
}
return 0;
}
3、实验
(1)自动拨号功能
在/etc/mdev.conf里面
因为当出现ttyUSBx后调用3g_manager link $MDEV
(2)怎么判断ttyUSB有无中断类型的端点
查看 /usr/sbin/usb_modeswitch_dispatcher,搜索ttyUSB
/* 1. 对于每一个/dev/ttyUSBX
* 都有一个对应的/sys/class/tty/ttyUSBX
2. 它是一个链接文件, 指向: /sys/......../1-1:1.0/ttyUSB0/tty/ttyUSB0
* 3. 进入/sys/......../1-1:1.0/目录,
* 里面有多个"ep_"的子目录
* 4. 子目录里有名为type的文件
* 5. 如果这个文件的内容为Interrupt, 则返回1
接上3G上网卡到开发版上,会自动切换成USB串口
安装驱动程序
查看设备节点
对于每1个串口,是 1个链接文件,cd ../.. 就是回到上两级
进入目录下 1-1:1.0中第1个表示第1个USB HUB,第2个1表示hub里面的第1个端口,第3个1表示设备,第4个0表示接口;
查看里面有很多端点
type表示端点的类型,Bulk是批量端点
到别的接口
找到中断类型端点,拨号时使用ttyUSB2
(3)手动执行
查看设备节点
编译3g_manager并拷贝到文件系统
执行
拨号
把生成的文件拷贝到/etc/resolv.conf目录下
这里的/etc/resolv.conf是设置DNS服务器的IP地址及DNS域名
接上联通卡,自动切换成USB 串口,也会创建连接文件
进行拨号
拷贝生成的resolv文件,ping其他网址
修改/etc/init.d/rcS加入我们想自动装载的驱动程序