1. 程式人生 > >Linux Windows下USB RNDIS網路傳輸方式詳解

Linux Windows下USB RNDIS網路傳輸方式詳解

 在介紹USB的驅動開發時,我通常會用用Linux的的USB網路來演示,它相容RNDIS網路,一臺Linux即可充當USB的device端,也可以由另一臺Linux來充當USB的Host端,Host端的也可以由安裝的微軟的標準的Rndis驅動來充當.   這種網路有相當強的實用價值,而且完整實現的Linux USB Slave驅動和Linux USB Gadget兩種驅動,因此有很強演示效果.   應用場景:    一.智慧手機共享網路      現在智慧手機採用3G網路,通過Linux/Android手機上安裝相關驅動,可以用USB線在主機和手機建一個共享網路,這樣智慧手機充當一個無線路由器的功能.現在手機一般都有這個功能,WINDOWS安裝Rndis驅動即可.而且就是用的我們後面提到的g_ether.ko驅動.      這種方式,遠遠優於把手機當成3G的modem,用USB來撥號這種方式,共享網路相當於手機和電腦都上網不誤.    這種方式跟用手機WIFI作無線熱點的功能一樣,但是APN的實現的要求較高,很多手機不一定能支援,而且USB還有同時供電.還是有其優點.  二.增加第二個有線網路.
   在教室上課時,很多時候伺服器和學生用機只有一個網路口介面,我把網線接到區域網時,我的開發板就無法用NFS接我的機器,學生機也是如此,現在伺服器上把有線網路接入區域網,而我的開發板與伺服器則直接相連. 一.USB 網路的結構   在與乙太網不同,在USB網路裡各終端不是對等的,即USB Host端和USB Device端的所需要軟體和硬體介面不一樣.    USB網路有很多種,其中用得最多是RNDIS網路。它的全稱是    Remote Network Device Interface Specification. 它是由微軟制定的規範,因為手機使用用得較多,因此LINUX也在驅動中相容這個規範   (PS:Android手機這個功能幾乎是標配,而手機需要支援的功能FAT,RNDIS,MTP(媒體傳輸協議),都是MS的專利,這幾張牌成了MS向Android手機制造產家收取專利費的重要武器,三星已經交了錢了)   一般象PC機充當USB Host角色,帶USB Host的介面的Linux開發板也可以充當這個角色.    如果是LINUX主機,需要安裝安裝 rndis_host.ko 這個驅動。一般發行版均已經編譯好,直接執行即可。   如果嵌入式開發板可以配置核心的rndis_host為動態模組 它位於
  1. │ Prompt: Host for RNDIS and ActiveSync devices (EXPERIMENTAL) │
  2. │ Defined at drivers/net/usb/Kconfig:234                        │
  3. │ Depends on: NETDEVICES && USB && NET && USB_USBNET && EXPERIMENTAL │
  4. │ Location: │
  5. │ -> Device Drivers                                             │
  6. │ -> Network device support (NETDEVICES [=y])                   │
  7. │ -> USB Network Adapters │
  8. │ -> Multi-purpose USB Networking Framework (USB_USBNET [=m])   │
如果是WINDOWS主機,則需要安裝MS的Generic RNDIS驅動。 在USB的另一端,一般是嵌入式裝置,以嵌入式LINUX為例,需要安裝USB Gadget驅動g_ether.ko 來進行通訊。g_ether.ko在配置選單位置如下
  1. Symbol: USB_ETH_RNDIS [=n] │
  2. │ Prompt: RNDIS support │
  3. │ Defined at drivers/usb/gadget/Kconfig:609 │
  4. │ Depends on: <choice> && USB_ETH │
  5. │ Location: │
  6. │ -> Device Drivers │
  7. │ -> USB support (USB_SUPPORT [=y]) │
  8. │ -> USB Gadget Support (USB_GADGET [=y]) │
  9. │ -> USB Gadget Drivers (<choice> [=m]) │
  10. │ -> Ethernet Gadget (with CDC Ethernet support) (USB_ETH [=n │
因此一個完整RNDIS網路結構如下 二.Linux USB 網路搭建  USB Host安裝,以RHEL5為例,直接執行如下命令即可安裝 rndis_host.ko      modprobe rndis_host   它將安裝 rndis_host.ko和usbnet.ko
  1. [[email protected]]# find /lib/modules/2.6.18-194.el5/ -name "rndis*"
  2. /lib/modules/2.6.18-194.el5/kernel/drivers/usb/net/rndis_host.ko
  3. [[email protected]]# modprobe rndis_host
  4. [[email protected]]# lsmod | grep rndis_host
  5. rndis_host 10433 0
  6. cdc_ether 9793 1 rndis_host
  7. usbnet 19913 2 rndis_host,cdc_ether
在開發板上編譯好核心模組,g_ether.ko.執行如下命令    insmod g_ether.ko
  1. # insmod g_ether.ko
  2. g_ether gadget: ing random self ethernet address
  3. g_ether gadget: using random host ethernet addr
  4. usb0: MAC de:5e:8b:3d:84:db
  5. usb0: HOST MAC 32:90:92:52:a9
  6. g_ethethernet Gadget, morial Day 2008
  7. g_ether gadget: g_ether ready
  8. Registered gadget driver 'g_ether'
分別在主機和開發板之間抽入USB線,其中開發板使用D型的Slave端介面(不要插在HOST介面上!) 讓USB網絡卡結點生效,這裡一般是usb0  ifconfig usb0 192.168.3.101 up
  1. hub 1-0:1.0: unable to enumerate USB device 2
  2. g_ether gadget: high speed config #1: Chernet (ECM)
在主機端做類似配置,配成另一個IP即可 ifconfig usb0 192.168.3.120 up
  1. # ifconfig usb0 192.168.3.120 up
  2. usb 1-1: new high speed USB device using ehci_hcd and address 5
  3. usb 1-1: configuration #1 chosen from 2 choices
  4. usb0: register 'cdc_ether' at usb-0000:00:1d.7-1, CDC Ethernet Device, 32:90:26:92:52:a9
這時在兩端即可以互相 ping 通。 三.與Windows 建立聯接。   如果希望與Windows 建立RNDIS網路聯接,需要下載RNDIS驅動,並且根據g_ether.ko的產商號和裝置號調整安裝INF檔案。 1.確定VID和PID   首先確認g_ether.ko的RNDIS的vendor號和product號.它的定義在 drivers/usb/gadget/ether.c中
  1. #define RNDIS_VENDOR_NUM 0x0525 /* NetChip */
  2. #define RNDIS_PRODUCT_NUM 0xa4a2 /* Ethernet/RNDIS Gadget */
 2.下載WINDOWS的RNDIS驅動.     http://www.microsoft.com/china/whdc/device/network/NDIS/rndis.mspx       或    如果不成功,去找一下RNDIS-USB-Kit_05.exe 這個檔案。它是一個壓縮檔案,其中的rndismpy.sys,usb8023y.sys就是驅動檔案. 3.修改安裝inf檔案  以其中的RNDIS_Template.inf為藍本修改安裝檔案。主要修改兩個地方:     把 mm/dd/yyyy,x.y.v.z 修改成任意的時間和版本號,我修改是 09/28/2011,1.0.0.0    (注意有兩處)    把 USB\VID_vvvv&PID_pppp 修改成查到的數字,這裡必須是Linux定義的 USB\VID_0525&PID_A4A2 把inf和兩個sys放在一起,隨意取個名字,我取名 hxy_rndis.inf    如果不想修改,直接用我改好現成的  4.安裝驅動    在開發板與WINDOWS之間插入USB線。這時WINDOWS會提示安裝驅動,選擇手功安裝,並且選擇上一步的 sys所在目錄即可安裝            安裝後系統會出現一個RNDIS的網絡卡,配置IP即可與開發板通訊 參考程式碼補充:

USB驅動程式碼在/drivers/usb/gadget下,有三個檔案:android.c,f_adb.c,
       f_mass_storage.c;g_android.ko 是由這三個檔案編譯而來,其中android.c 依賴於
       f_adb.c 和 f_mass_storage.c(這兩個檔案之間無依賴關係)。
       可在android.c中看到:
       static int __init android_bind_config(struct usb_configuration *c)  
       {  
          struct android_dev *dev = _android_dev;  
          int ret;  
          printk(KERN_DEBUG "android_bind_config\n");  
          ret = mass_storage_function_add(dev->cdev, c, dev->nluns);  
          if (ret)  
              return ret;  
          return adb_function_add(dev->cdev, c);  
       }

cdc-ncm:
分為HOST端和Device端
在Linux中對應的驅動分別為host driver and gadget driver

Host Driver位於
drivers/net/usb/

gadget driver位於
drivers/usb/gadget/

drivers/net/usb/Kconfig
drivers/net/usb/Makefile
drivers/net/usb/cdc_ether.c
drivers/net/usb/cdc_ncm.c
drivers/net/usb/usbnet.c
drivers/usb/gadget/Kconfig
drivers/usb/gadget/Makefile
drivers/usb/gadget/f_ncm.c
drivers/usb/gadget/ncm.c
drivers/usb/gadget/u_ether.c
drivers/usb/gadget/u_ether.h
include/linux/usb/cdc.h
include/linux/usb/ncm.h
include/linux/usb/usbnet.h


相關推薦

Linux WindowsUSB RNDIS網路傳輸方式

 在介紹USB的驅動開發時,我通常會用用Linux的的USB網路來演示,它相容RNDIS網路,一臺Linux即可充當USB的device端,也可以由另一臺Linux來充當USB的Host端,Host端的也可以由安裝的微軟的標準的Rndis驅動來充當.   這種網路有相

一、Linux學習筆記:虛擬機器設定中的各種網路連線方式

說明:我本機安裝的VMWare10,吳老師的視訊教程用的是VirtualBox,配置虛擬機器連線方式是HostOnly。我在本機用VMWare使用HostOnly連線方式未配置成功:虛擬機器能ping通宿主機,但是宿主機ping不同虛擬機器,不知原因何在。因此改用

nginx-1.15.5 windows 64位版本編譯過程

編譯原始碼、工具、指令碼等和釋出在下面地址: 原始碼準備: 官網釋出的NGINX原始碼,不包含windows編譯部分,但是包含了主要的原始碼(片斷一): 下載地址:http://nginx.org/download/nginx-1.15.5.tar.gz windo

Android進階 一 幾種網路請求方式

Ref:http://blog.csdn.net/zuolongsnail/article/details/6373051 Android應用經常會和伺服器端互動,這就需要手機客戶端傳送網路請求,下面介紹四種常用網路請求方式,我這邊是通過Android單元測試來完成這四種方法的,還不清楚Androi

Windows的Mysql安裝和超入門教程推薦

一、Windows下的Mysql安裝 在Windows下,MySQL有兩種安裝方式: 1、ZIP安裝 ZIP安裝包下載連結:https://dev.mysql.com/downloads/mysql/ 點選download之後,出現下方圖片,無需註冊,點選下圖中的

VirtualBox中的網路連線方式

如果出現主機無法ping通虛擬機器的情況,請首先確認虛擬機器防火牆已關閉。 一、NAT模式 特點: 1、如果主機可以上網,虛擬機器可以上網 2、虛擬機器之間不能ping通 3、虛擬機器可以ping通主機(此時ping虛擬機器的閘道器,即是ping主機) 4、

Android中的幾種網路請求方式

Android應用經常會和伺服器端互動,這就需要手機客戶端傳送網路請求,下面介紹四種常用網路請求方式,我這邊是通過Android單元測試來完成這四種方法的,還不清楚Android的單元測試的同學們請看Android開發技巧總結中的Android單元測試的步驟一文。 java

全網最全最詳細的Windows安裝Anaconda2 / Anaconda3(圖文

  不多說,直接上乾貨!     說明:     Anaconda2-5.0.0-Windows-x86_64.exe安裝下來,預設的Python2.7     Anaconda3-4.2.0-Windows-x86_64.exe安裝下來,預設的Python3.5     Ana

計算機網路-傳輸

一、傳輸層的服務基本原理 1.多路複用和解複用(分路)技術 複用是指:傳送方的不同的應用程序都可以使用同一個傳輸層協議傳送資料; 分路技術是指:接收方的傳輸層剝去報文首部之後能把這些資料正確的傳輸到正確的應用程序上。 2.可靠資料傳輸 3.流量控制和擁塞控制 二、傳輸層提

Linux / Mac 基本的 bash shell 命令(touch 、cp、mv、rm)

前言 這一篇主要說了touch,cp,mv,rm這幾個很基本常用的命令。部落格會同時釋出在簡書和CSDN,希望大家支援。 處理檔案 bash shell 提供了很多在Linux檔案系統上操作檔案的命令。 建立檔案 touch 可以使用touch

四種網路請求方式

記錄四種常用網路請求方式的示例程式碼: java.net包中的HttpURLConnection類 Get方式: // Get方式請求 public static void requestByGet() throws Exception

Windows啟動RabbitMQ服務及安裝

安裝詳解步驟如下及問題的解決: RabbitMQ Service預設是自動勾選中的,這裡我們取消勾選。如選中啟動RabbitMQ服務時會報如下圖錯誤: 安裝完成後,Erlang和RabbitMQ環境變數是沒有配置的,需要自己手動去配置,如下圖:

c++ 網路程式設計(九)TCP/IP LINUX/windows 多執行緒超詳細教程 以及 多執行緒實現服務端

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <process.h> #include <winsock2.h> #include <win

c++ 網路程式設計(九)TCP/IP LINUX/windows 多執行緒超詳細教程 以及 多執行緒實現服務端

原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/9661012.html  先講Linux下(windows下在後面可以直接跳到後面看): 一.執行緒基本概念 前面我們講過多程序伺服器,但我們知道它開銷很大

linux/windows獲取gcc(mingw)編譯器預定義巨集的方式

我們在閱讀一些原始碼時經常發現類似這樣的巨集WIN32,_WIN64,__x86_64,__linux卻找不到在哪裡定義的,這些其實是編譯器預定義的巨集。在不同的作業系統內容不同。 為了知道gcc編譯

c++ 網絡編程(四)TCP/IP LINUX/windows socket 基於I/O復用的服務器端代碼 解決多進程服務端創建進程資源浪費問題

linux系統中 cin 通過 sel print 大小 查看 服務 集合 原文作者:aircraft 原文鏈接:https://www.cnblogs.com/DOMLX/p/9613861.html 好了,繼上一篇說到多進程服務端也是有缺點的,每創建一個

WindowsUSB磁碟開發系列二:列舉系統中所有USB裝置

上篇 《Windows下USB磁碟開發系列一:列舉系統中U盤的碟符》介紹了很簡單的獲取系統U盤碟符的辦法,現在介紹下如何列舉系統中所有USB裝置(不光是U盤)。 主要呼叫的API如下: 1,呼叫SetupDiGetClassDevs()獲取指定裝置型別的控制代碼; 2,呼叫SetupDi

WindowsUSB磁碟開發系列三:列舉系統中U盤、並獲取其裝置資訊

前面我們介紹了列舉系統中的U盤碟符(見《Windows下USB磁碟開發系列一:列舉系統中U盤的碟符》)、以及獲取USB裝置的資訊(見《Windows下USB磁碟開發系列二:列舉系統中所有USB裝置》)。有個時候我們不僅僅需要獲取U盤碟符(路徑),而且需要獲取該U盤的硬體資訊,比如廠商、friendl

WindowsUSB磁碟開發系列一:列舉系統中U盤的碟符

有個時候我們需要區分系統磁碟中,哪些是U盤,這樣我們在訪問的時候可以區別對待。具體方法如下: 1,呼叫GetLogicalDrives()返回系統碟符標記位 API GetLogicalDrives()將返回一個DWORD型別的標記值,將其轉換成二進位制之後,為1的位標識對應的碟符在系統中存

mysql 關於windows壓縮包的安裝方式

1:首先去官網下載mysql壓縮包解壓到本地(你想安裝的地方)為了方便配置你可以把資料夾名稱重新命名位mysql;我的是E:\mysql 2:然後在解壓縮的根目錄新建my.ini 配置檔案: 配置檔案如下: [mysql]   # 設定mysql客戶端預設字符集 &