Linux将4G模组挂载为网卡,利用socket进行网络通讯
Posted 菜老越
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux将4G模组挂载为网卡,利用socket进行网络通讯相关的知识,希望对你有一定的参考价值。
文章目录
在使用4g模组时,传统单片机的做法是mcu通过串口连接模组,通过AT指令结合串口收发实现对4g模组的操作,最终目的是实现tcp、udp等网络通信。而在linux中编程中,通常以建立socket套接字的形式进行网络通讯,在linux-arm开发板上,若要实现4g通讯,且还想保留socket的通讯方式,则需要将4g模组通过usb连接arm板,挂载为linux的一张网卡,从而通过这张网卡进行socket通讯。这很像早年的usb无线上网卡,设备里要插一张SIM卡,然后用usb连接电脑,电脑就可以用它上网了。
要实现这一功能,首先需要一个支持ECM拨号的4g模组,现在市面上较新的基本都有这个功能。模组方会提供相应的linux下ECM拨号上网的使用指南,按步骤操作一般问题不大,但还是要注意几个小坑。下面大致介绍一下挂载、通讯的整个流程。
一、添加ECM驱动
同上一篇博文【传送门】中所说的一样,我目前不太想因为需要添加一点点功能而重新编译、烧写整个内核。所以这里还是通过make module的方式将需要添加的模块生成.ko驱动,拷到linux-arm板中进行挂载。
1.生成驱动文件
到开发板内核源码目录下,make menuconfig进入内核配置页面,依次进入
在CDC Ethernet support (smart devices such as cable modems) 前置标志M
完成后选择save保存,到内核源码目录下进行make moudle
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- modules -j 20
之后便在内核源码下的/driver/net/usb/目录下生成了usbnet.ko、cdc_ether.ko两个驱动。
2.移植驱动到linux-arm板
复制以上两个驱动文件到开发板上,依次挂载usbnet.ko、cdc_ether.ko,挂载成功后,通过usb接口将模组插入开发板,系统提示发现新的网卡,输入ifconfig,发现出现新的网卡。
/user/MonitorTerminal # ifconfig
eth0 Link encap:Ethernet HWaddr F6:EA:2D:FA:AF:0B
inet addr:172.21.25.220 Bcast:172.21.25.255 Mask:255.255.255.0
inet6 addr: fe80::f4ea:2dff:fefa:af0b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:359837 errors:0 dropped:17810 overruns:0 frame:0
TX packets:11198 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:48829841 (46.5 MiB) TX bytes:40183945 (38.3 MiB)
Interrupt:27
eth1 Link encap:Ethernet HWaddr AC:8C:23:9E:D0:EA
inet addr:192.168.100.100 Bcast:192.168.100.255 Mask:255.255.255.0
inet6 addr: fe80::ae8c:23ff:fe9e:d0ea/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:376 errors:0 dropped:0 overruns:0 frame:0
TX packets:444 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:11412 (11.1 KiB) TX bytes:37211 (36.3 KiB)
下面的eth1便是4g模组网卡。
二、拨号上网
1.拨号
拨号上网的过程还是少不了AT指令的,可以通过usb的ACM接口进行AT指令操作,也可以通过模组接出的tx、rx串口进行AT指令操作。具体流程如下所示,当然,你要有一张正常能上网的手机卡。
AT
OK
AT+CPIN?
+CPIN: READY
OK
AT+CSQ
+CSQ: 25,0
OK
AT+CREG?
+CREG: 0,1
OK
AT$MYNETCON=0,”APN”,”CMNET”
OK
AT$MYNETCON=0,”USERPWD”,”user,password”
OK
AT$MYUSBNETADDR=”192.168.100.0”,”255.255.255.0”
OK
AT$MYUSBNETACT=0,1//激活网络连接
OK
AT$MYUSBNETACT?//查询网络激活状态及真实 IP
$MYUSBNETACT: 0,1,”10.10.1.12”
OK
2.上网
此时,你已经激活了4g模组的网络,模组获得了一个真实IP,这意味着你可以在公网上进行网络通讯了。确认能接通外网的最简单的方法就是ping了。由于开发板暂时不支持域名ping,所以我们现在windows下运行cmd,输入ping www.baidu.com,以获得百度的IP。
C:\\Users\\86157>ping www.baidu.com
正在 Ping www.a.shifen.com [39.156.66.18] 具有 32 字节的数据:
来自 39.156.66.18 的回复: 字节=32 时间=24ms TTL=49
来自 39.156.66.18 的回复: 字节=32 时间=23ms TTL=49
来自 39.156.66.18 的回复: 字节=32 时间=23ms TTL=49
来自 39.156.66.18 的回复: 字节=32 时间=24ms TTL=49
然后在开发板中ping 39.156.66.18,如果ping不通,大概率是因为linux的路由没有配置好。在终端中输入route,将列出系统的路由表。
~ # route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.1 0.0.0.0 UG 202 0 0 eth0
default 192.168.100.1 0.0.0.0 UG 203 0 0 eth1
172.21.25.0 * 255.255.255.0 U 0 0 0 eth0
192.168.1.0 * 255.255.255.0 U 202 0 0 eth0
192.168.100.0 * 255.255.255.0 U 203 0 0 eth1
发现除了4g模组网卡的192.168.100.1,系统中还有一个默认192.168.1.1,网卡为eth0的路由,很可能是这个默认路由导致ping的时候将ping包分给了eth0网卡。解决这个问题有两个办法:
1.route del default gw 192.168.1.1
删除这个多余的默认路由,然后再ping。
2.ping -I eth1 39.156.66.18
指定使用网卡eth1来ping。
这次ping得通了。
/ # ping 39.156.66.18
PING 39.156.66.18 (39.156.66.18): 56 data bytes
64 bytes from 39.156.66.18: seq=0 ttl=52 time=50.603 ms
64 bytes from 39.156.66.18: seq=1 ttl=52 time=48.138 ms
64 bytes from 39.156.66.18: seq=2 ttl=52 time=48.145 ms
64 bytes from 39.156.66.18: seq=3 ttl=52 time=48.148 ms
64 bytes from 39.156.66.18: seq=4 ttl=52 time=48.141 ms
64 bytes from 39.156.66.18: seq=5 ttl=52 time=48.040 ms
64 bytes from 39.156.66.18: seq=6 ttl=52 time=48.144 ms
^C
--- 39.156.66.18 ping statistics ---
7 packets transmitted, 7 packets received, 0% packet loss
round-trip min/avg/max = 48.040/48.479/50.603 ms
三、网络编程
既然能ping的通外网,那么剩下的就是网络编程进行tcp通讯了。网上网络编程的例子有很多,以客户端为例,大体流程即为【创建socket】->【配置服务器IP、Port】->【连接服务器】->【数据收发】。这里推荐一个比较方便的公网TCP测试工具【通讯猫】,
在网络编程时将服务器IP、Port分别设置为红框内容,即可连接到此服务器,之后你通过send函数发送的内容将会显示在下方的调试框中,同样的,可以从下方的调试框像你的客户端发送数据,以测试模组的接收功能。
以上是关于Linux将4G模组挂载为网卡,利用socket进行网络通讯的主要内容,如果未能解决你的问题,请参考以下文章