USB로 QMI 배우기

4678 단어 USB리눅스

인식할 수 있었지만 연결할 수 없음



이전 기사 에서 L-03D의 인식은 가능했지만 qmicli--wds-start-network 에서는 APN에 접속할 수 없었다.
왠지 좋다. USB 모뎀의 제어 인터페이스인 QMI를 공부하는 동기 부여가 될 것 같다.

libqmi



qmicli


qmicli --verbose 그러면, QMI의 바이트열의 의미를 정중하게 설명해 준다.
# qmicli --verbose -d /dev/cdc-wdm0 --get-service-version-info
[26 Apr 2016, 22:57:24] [Debug] [/dev/cdc-wdm0] Opening device with flags 'none'...
[26 Apr 2016, 22:57:24] [Debug] QMI Device at '/dev/cdc-wdm0' ready
[26 Apr 2016, 22:57:24] [Debug] Getting service version info...
[26 Apr 2016, 22:57:24] [Debug] [/dev/cdc-wdm0] Sent message...
<<<<<< RAW:
<<<<<<   length = 12
<<<<<<   data   = 01:0B:00:00:00:00:00:01:21:00:00:00

[26 Apr 2016, 22:57:24] [Debug] [/dev/cdc-wdm0] Sent message (translated)...
<<<<<< QMUX:
<<<<<<   length  = 11
<<<<<<   flags   = 0x00
<<<<<<   service = "ctl"
<<<<<<   client  = 0
<<<<<< QMI:
<<<<<<   flags       = "none"
<<<<<<   transaction = 1
<<<<<<   tlv_length  = 0
<<<<<<   message     = "Get Version Info" (0x0021)
:

흠. 분위기는 알았다. 0x0021은 Get Version Info군요.

qmi_message_get_printable()



libqmi에, qmi_message_get_printable() 라고 하는 편리 함수가 있는 것을 발견.

Gets a printable string with the contents of the whole QMI message.
If known, the printable string will contain translated TLV values ​​as well as the raw data buffer contents.

라는 것으로, 반드시 바이너리 열을 먹이면 qmicli --verbose 같은 표시를 해 줄 것.

USBPcap



USB 프로아나는 과연 가지고 있지 않지만, Windows에서 움직이면서라면, USBPcap 로 할 수 있다.
최근에는 Wireshark의 기본 설치 프로그램에서 쉽게 넣을 수 있습니다.

Wireshark로 캡처하기



이더넷 캡처와 동일. USB를 선택하는 것만.
QMI는, USB의 Control 전송을 이용하고 있는 모양.
실제로 Windows에서 L-03D를 움직여 표시를 필터링한 모습이 이것.



잘 보면 조금 전의 qmicli --get-service-version-info에 나오는 '21:00'이라는 것이 들어 있다. 그 앞이 조금 다르지만.
이것을 Export해 qmi_message_get_printable() 에 먹이면, 여러가지 알 수 있는 것은.

Wireshark로 내보내기



필터링된 패킷만을 Plain Text로, 그리고 USB 헤더는 제거하고 페이로드만을 Export한다.



결과는 이런 느낌.
0000  1c 00 e0 cd 84 af ff ff ff ff 00 00 00 00 08 00   ................
0010  01 03 00 05 00 80 02 01 00 00 00 01 00            .............

0000  1c 00 58 28 79 bc ff ff ff ff 00 00 00 00 08 00   ..X(y...........
0010  01 03 00 05 00 00 02 10 00 00 00 01 01 0f 00 00   ................
0020  00 00 00 01 21 00 04 00 01 01 00 ff               ....!.......
:

호호. 패킷의 틈도 알기 쉽다.

적절한 파서 + qmi_message_get_printable()



qmicli를 깔개에 적당히 만들어 보았던 것이
밑바닥에 너무 libqmi의 build 환경에 의존.

Export한 Plain Text를 먹인 결과는…
len = 1
bin = 00
(null)---------------------------------------------------------------------------
len = 16
bin = 01 0f 00 00 00 00 00 01 21 00 04 00 01 01 00 ff
QMUX:
  length  = 15
  flags   = 0x00
  service = "ctl"
  client  = 0
QMI:
  flags       = "none"
  transaction = 1
  tlv_length  = 4
  message     = "Get Version Info" (0x0021)
TLV:
  type   = 0x01
  length = 1
  value  = FF
:

오! qmicli가 생성한 메시지에 비해 TLV 1개분의 파라미터가 추가되어 있네요. 같은 것을 알 수 있다.

다음 번에 드디어



L-03D에서 AT 명령을 사용하지 않고 네트워크에 Attach!

좋은 웹페이지 즐겨찾기