【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进入内核配置页面,依次进入
Device Drivers --->-*- Network device support --->{M} USB Network Adapters --->{*} Multi-purpose USB Networking Framework (CONFIG_USB_NET=m){M} CDC Ethernet support (smart devices such as cable modems)(CONFIG_USB_NET_CDCETHER=m)
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函数发送的内容将会显示在下方的调试框中,同样的,可以从下方的调试框像你的客户端发送数据,以测试模组的接收功能。

猜你喜欢

转载自blog.csdn.net/spiremoon/article/details/107261463
今日推荐