This is an old revision of the document!
3G/LTE 모뎀은 대부분 USB를 통해 통신하고 있어 3G/LTE과 통신할 수 있는 방법인 USB 네트워크 프로토콜에 대해 알아보고자 한다.
3G/LTE USB 모뎀, USB 디바이스 드라이버와 커넥티비티 소프트웨어가 필요하다.
USB 디바이스 드라이버는 USB모뎀을 OS에서 사용이 가능한 모뎀 및 네트워크 장치로 인식시키고 디바이스와 통신할 수 있는 버스 인터페이스를 제공한다.
커넥티비티 소프트웨어는 USB 디바이스를 통해 USB 모뎀의 상태를 체크하거나 네트워크 접속/해재 등의 기능을 제공한다.
USB 네트워크 디바이스 드라이버는 USB-IF나 통신 모듈 제조사, OS개발 사에서 제공하는 다양한 프로토콜에 따라 나누어 볼 수 있다.
초기 USB 모뎀은 PPP방식으로 인터넷에 접속하기 위해 시리얼 통신을 가상화 시킨 CDC ACM (Abstract Control Model) 을 지원했다. USB 모뎀을 PC에 연결하면 OS에서 모뎀 장치를 인식하고 인식된 모뎀장치로 AT 커맨드 명령어를 보내어 장치 상태를 체크하거나 네트워크에 접속 하였다. USB-IF의 표준인 CDC ACM을 따르는 대부분의 OS에서는 CDC ACM 지원 드라이버를 포함하고 있어 USB 모뎀 제조사에서 별도 USB 디바이스 드라이버 개발이 필요 없었다. 현재도 호환성을 위해 일부 3G모뎀의 경우 CDC ACM을 지원하고 있다.
하지만 2G에서 3G/LTE로 네트워크 속도가 발전하면서 IP 기반 네트워크 통신의 체계의 요구가 증가하게 되었고 이에 따른 USB 네트워크 장치들을 위한 통신 규약인 새로우 프로토콜들이 만들어졌다.
USB-IF 는 네트워크 장치를 가상화 시킨 CDC ECM (Ethernet Devices), CDC EEM (Ethernet Emulation Devices) 부터 대용량 데이터 처리를 할 수 있도록 패킷 처리 방식을 개선한 CDC NCM (Network Control Model)까지 기능 별 사양을 정의하고 있다.
마이크로소프트는 USB기반의 네트워크 장치 지원을 목적으로 윈도우XP부터 CDC ECM과 유사한 RNDIS( Remote NDIS )를 만들어 디바이스 드라이버를 OS에 포함시켜 제공하였다. 또한 패킷 처리 방식을 개선하고 커넥티비티 기능을 포함하는 CDC MBIM을 USB-IF 표준으로 등록하여 윈도우8 부터 해당 기능을 포함하고 있다. 퀄컴의 경우 자사 통신칩의 통신과 제어를 위한 QMI/RmNet 을 만들어 사용하고 있다.
LG나 GCT에서 제조한 LTE통신 칩셋도 칩셋 제조사 별 프로토콜을 개발하여 운영하고 있다.
*libqmi* is a glib-based library for talking to WWAN modems and devices which speak the Qualcomm MSM Interface (QMI) protocol.
https://www.freedesktop.org/wiki/Software/libqmi/
QMI is a binary protocol designed to replace the AT command based communication with modems, and is available in devices with Qualcomm chipsets from multiple vendors (Novatel, Huawei, Sierra Wireless, ZTE… and of course Qualcomm itself).
QMI 는 AT 커맨드 기반의 모뎀 통신을 대체하기 위한 바이너리 프로토콜이다. QMI 는 퀄컴 칩셋을 탑제한 단말에서 사용 가능하다.
The protocol defines different ‘services‘, each of them related to different actions that may be requested to the modem. For example, the ‘DMS’ (Device Management) service provides actions to load device information; while the ‘NAS’ (Network Access) service provides actions to register in the network. Similarly, other services will allow the user to request data connections (WDS), setup GPS location reporting (PDS), or manage internals of the user identity module (UIM service). The user needs to handle the creation of ‘clients’ for those services by allocating/deallocating ‘client IDs’ using the generic always-on ‘control’ (CTL) service.
프로토콜은 'services' 들로 이뤄져 있고, 이는 모뎀에 각기 다른 요청을 보내는것과 관련되어 있다. 예를 들어 'DMS' (Device Management) 서비스는 단말의 정보를 로드하는 기능을 제공한다. 반면에 'NAS' (Network Access) 는 네트웍에 등록하는 기능을 제공한다. 유사하게, 데이터 연결을 하거나(WDS), GPS 위치를 가져오거나(PDS), 사용자 신분확인 모듈 (UIM service) 등 도 있다. 사용자는 'control' (CTL) 서비스를 통해서 'client IDs' 를 할당/해제함으로서 서비스들에 대한 'clients' 를 만들어서 서비스를 핸들링 할 수 있다.
Each service in the protocol defines ‘Request and Responses‘ as well as ‘Indications‘. Each pair of request/response has a maching ID which lets the user concatenate multiple requests and get out-of-order responses that can be afterwards matched through the common ID. Indications arrive as unsolicited messages, sent either to a specific client or as a broadcast message to all the clients of a given service. Usually the user needs to request the enabling of the indications to receive via some request/response.
각 서비스는 'Request and Responses' 와 'Indications' 로 정의되어 있다. 각각의 reuqest/response 짝은 ID 가 있어서, 사용자가 합쳐 보낸 여러개의 request에 대해 비 순차 response가 오더라도 ID 를 통해 request/response 를 매칭할 수 있다. indications 는 (사용자 요청 없이)임의의 순간에 특정 client 나 혹은 브로드캐스팅을 통해 (특정 서비스의) 모든 client 에게 보내진다. 보통 사용자가 어떤 request/response 처리에 대한 indication 이 올라오도록 하려면, indication 을 받겠다(enabling)는 request 를 보내야 한다.
Finally, each message in the protocol defines a set of input (in requests) and output (in responses and indications) arguments, which we name as TLVs. Some of these are defined to be mandatory, others are optional, and others are only mandatory if some other argument is available and has a given value. For example, some output arguments in response messages are only mandatory if the result of the response (given as a TLV) is SUCCESS.
마지막으로, 프로토콜의 메세지들은 (request 상의) 입력 과 (response 와 indication 상의) 출력 인자(arguments) 로 정의된다. 이는 다른말로 TLV 라고도 한다. 이들중 몇몇은 필수적이며, 어떤것들은 특정 인자가 주어졌을때만 필수적이고, 전적으로 선택적인 것들도 있다. 예를들어, 몇몇 response 의 인자는 response 의 결과(TLV 에 위치함)가 SUCCESS 일때만 의미가 있다.
The QMI protocol defines different services, each of them related to different actions that may be requested from the modem. For example, the DMS (Device Management) service provides actions to load device information, the NAS (Network Access) service provides actions to register in the network, and the WDS (Wireless Data) service allows setting up IP connections. Before using a service, the user needs to handle the creation of clients for those services by allocating/deallocating client IDs using the generic always-on CTL (control) service.
Each service in the protocol defines Requests and Responses as well as Indications. Each pair of request and response has a matching ID which lets the user concatenate multiple requests and get out-of-order responses that can be matched through the common ID afterwards. Indications arrive as unsolicited messages, sent either to a specific client or as a broadcast message to all the clients of a given service.
Finally, each message in the protocol defines a set of input (in requests) and output (in responses and indications) arguments, specified as Type-Length-Value (TLV) fields. Some of these are defined to be mandatory, others are optional, and others are only mandatory if some other argument is available and has a given value. The Type of the field defines not only which field it is, but also the format of the value to be expected (e.g. an integer, or a string, or some other supported format).
Just this level of organization outlined in the previous paragraphs makes the communication with the modem much more clear, as the messages are transferred in an organized way and are self-contained packs of information with a predefined format. So, even if more complex, it is far more powerful and less error-prone than sending and receiving text-based AT strings via a serial port.
This protocol is easily accessible in recent enough Linux kernels (>= 3.4), through the cdc-wdm and qmi_wwan drivers. Once these drivers are in place and the modem gets plugged in, the kernel will expose a new /dev/cdc-wdm device which can talk QMI, along with a wwan interface associated to each QMI port.
이 프로토콜은 최근의 리눅스 커널 (>= 3.4) 에서 cdc-wdm 및 qmi_wwan 드라이버를 통해 쉽게 접근할 수 있다. 드라이버가 로드되고, 모뎀이 연결되면, 커널에서 /dev/cdc-wdm 디바이스를 만들어 준다. 이 경로를 통해 각 QMI 포트에 연결될 wwan 인터페이스에 QMI 통신을 할 수 있다.
libqmi is an on-going effort to get a library providing easy access to Qualcomm’s ‘QMI’ protocol. The current libqmi available is based on the GLib/GObject/GIO-powered ‘libqmi-glib’. libqmi tries to ease the use of the protocol by providing:
libqmi 는 Qualcomm 의 'QMI' 프로토콜에 쉽게 접근하기 위해 개발중인 라이브러리이다. 현재 libqmi 는 GLib/GOjbect/GIO-powered 'libqmi-glib' 에 기반한다. libqmi 는 다음과 같은것을 제공함으로서 프로토콜을 쉽게 사용할수 있도록 하고 있다.
- A ‘QmiDevice‘ object to control the access to the /dev/cdc-wdm device. This object allows creating new per-service ‘QmiClient’s. It also hides the use of the implicit ‘CTL’ service client.
'QmiDevice' 객체로 /dev/cdc-wdm 디바이스를 컨트롤 할수 있다. 이 객체는 서비스별 새로운 'QmiClient' 를 생성한다. 묵시적인 'CTL' 서비스 클라이언트가 보이지 않도록 한다.
- The ‘QmiClient‘ object provides an interface to the set of request/responses of a given service. Users of the library will just need to execute a GIO-asynchronous method to send the request and get the processed response.
'QmiClient' 객체는 연관된 서비스에 요청(request)/응답(response) 을 주고받을 수 있는 인터페이스를 제공한다. 라이브러리 사용자는 GIO-asynchronous 메쏘드를 실행해서 요청을 보내고, 응답을 받아보기만 하면 된다.
- The ‘QmiClient‘ object also provides signals for each of the indications given in the service.
- The input and output arguments needed in requests, responses and indications are compiled into ‘bundles’. These bundles are opaque structs with accessors for their elements, which allow us to add new TLVs to a given message in the future without breaking API/ABI.
The protocol is written in the library as a JSON dictionary of rules, and most of the code to handle the protocol in the library is autogenerated during compilation. If you want to take a look at the currently available interface, check the gtk-doc documentation at: http://www.freedesktop.org/software/libqmi/libqmi-glib/latest/
The libqmi project comes with a command line utility (qmicli) primarily used as a developer tool for testing the libqmi-glib library. Just run the program with ‘–help-all‘ to get all possible actions it can run. A quick example of usage:
$> sudo qmicli -d /dev/cdc-wdm0 --dms-get-manufacturer [/dev/cdc-wdm0] Device manufacturer retrieved: Manufacturer: 'Qualcomm Incorporated'
Hint: If you compile the project passing -DMESSAGE_ENABLE_TRACE to CFLAGS, it will dump as DEBUG logs the content and translation of all the QMI messages passed in both directions. You’ll also need ‘–verbose‘ or just ‘-v‘ to show the debug logs when running qmicli.
The project also comes with a small bash script called ‘qmi-network‘, which allows you to launch a broadband connection using libqmi-glib and qmicli. This script requires two arguments; first the cdc-wdm device to talk to, and secondly the action (start|stop|status) to execute. The script can definitely be improved in multiple ways (e.g. send PIN), so if anyone wants to do it patches are very welcome.
The project is currently available in the freedesktop.org infrastructure:
git: http://cgit.freedesktop.org/libqmi
mailing list: http://lists.freedesktop.org/mailman/listinfo/libqmi-devel
bugzilla: https://bugs.freedesktop.org/buglist.cgi?product=libqmi
ModemManager has QMI support through libqmi-glib since release 1.0.