Linux отправка at команды

Sending AT Commands

AT Commands are instructions that provide communication and control between any cellular modem and a host controller. Cellular modems can be controlled using special AT commands provided by the module manufacturer. There are several serial monitor tools that can be used to send AT commands to the cellular module. The most common is the minicom application on Linux. One can use Cutecom as GUI supported tool.

As long as the right configurations such as the device port, baud rate are selected right; any tool can be used. This tutorial will explain how to use the ATCom and Minicom tools. These tools can communicate with cellular modems on Sixfab HATs.

Before you start sending AT commands to your modem, be sure the check the port your modem is connected to as well as the baudrate. Use the built-in logs to identify the different serial ports on your system. Follow the steps below to find the name of your port(s).

Before connecting USB to your HAT, open Terminal and type the following command:

[email protected]:~ $ ls /dev/tty* /dev/tty /dev/tty14 /dev/tty20 /dev/tty27 /dev/tty33 /dev/tty4 /dev/tty46 /dev/tty52 /dev/tty59 /dev/tty8 /dev/tty0 /dev/tty15 /dev/tty21 /dev/tty28 /dev/tty34 /dev/tty40 /dev/tty47 /dev/tty53 /dev/tty6 /dev/tty9 /dev/tty1 /dev/tty16 /dev/tty22 /dev/tty29 /dev/tty35 /dev/tty41 /dev/tty48 /dev/tty54 /dev/tty60 /dev/ttyAMA0 /dev/tty10 /dev/tty17 /dev/tty23 /dev/tty3 /dev/tty36 /dev/tty42 /dev/tty49 /dev/tty55 /dev/tty61 /dev/ttyprintk /dev/tty11 /dev/tty18 /dev/tty24 /dev/tty30 /dev/tty37 /dev/tty43 /dev/tty5 /dev/tty56 /dev/tty62 /dev/tty12 /dev/tty19 /dev/tty25 /dev/tty31 /dev/tty38 /dev/tty44 /dev/tty50 /dev/tty57 /dev/tty63 /dev/tty13 /dev/tty2 /dev/tty26 /dev/tty32 /dev/tty39 /dev/tty45 /dev/tty51 /dev/tty58 /dev/tty7

This should return all USB devices currently plugged into your computer. Now that we know which devices are not cellular modems, it will be easier to identify when plugged in.

Читайте также:  Запустить линукс на флешке

[email protected]:~ $ ls /dev/tty* /dev/tty /dev/tty14 /dev/tty20 /dev/tty27 /dev/tty33 /dev/tty4 /dev/tty46 /dev/tty52 /dev/tty59 /dev/tty8 /dev/ttyUSB3 /dev/tty0 /dev/tty15 /dev/tty21 /dev/tty28 /dev/tty34 /dev/tty40 /dev/tty47 /dev/tty53 /dev/tty6 /dev/tty9 /dev/tty1 /dev/tty16 /dev/tty22 /dev/tty29 /dev/tty35 /dev/tty41 /dev/tty48 /dev/tty54 /dev/tty60 /dev/ttyAMA0 /dev/tty10 /dev/tty17 /dev/tty23 /dev/tty3 /dev/tty36 /dev/tty42 /dev/tty49 /dev/tty55 /dev/tty61 /dev/ttyprintk /dev/tty11 /dev/tty18 /dev/tty24 /dev/tty30 /dev/tty37 /dev/tty43 /dev/tty5 /dev/tty56 /dev/tty62 /dev/ttyUSB0 /dev/tty12 /dev/tty19 /dev/tty25 /dev/tty31 /dev/tty38 /dev/tty44 /dev/tty50 /dev/tty57 /dev/tty63 /dev/ttyUSB1 /dev/tty13 /dev/tty2 /dev/tty26 /dev/tty32 /dev/tty39 /dev/tty45 /dev/tty51 /dev/tty58 /dev/tty7 /dev/ttyUSB2

Whatever new entries appear is your cellular modem.

Alternatively, you can check dmesg:

[email protected]:~ $ dmesg | grep tty [ 0.000000] Kernel command line: coherent_pool=1M 8250.nr_uarts=0 snd_bcm2835.enable_compat_alsa=0 snd_bcm2835.enable_hdmi=1 smsc95xx.macaddr=DC:A6:32:49:FB:39 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 console=ttyS0,115200 console=tty1 root=PARTUUID=9c0c76f5-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait [ 0.001546] printk: console [tty1] enabled [ 1.193107] fe201000.serial: ttyAMA0 at MMIO 0xfe201000 (irq = 29, base_baud = 0) is a PL011 rev2 [ 35.807711] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB0 [ 35.808358] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB1 [ 35.808916] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB2 [ 35.810673] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB3

In order to, send AT commands to a cellular device, one needs to check several parameters and might need a serial monitor tool. ATCom is a command-line interface tool that makes AT command operations easier.​

Источник

Выполнение AT/USSD команд к /dev/ttyUSB* модему из консоли Linux

Утилиты и скрипты для коммуникации с /dev/ttyUSB* устройством из shell консоли (bash скриптов).

Теория

Отправить в /dev/ttyUSB* терминал AT команду не составляет проблем. Но результат вывода мы не увидим!

echo ATI > /dev/ttyUSB2 # или echo ATI | sudo tee /dev/ttyUSB2

Мы можем читать поток stdout c /dev/ttyUSB2 (результат выполнения команд):

  1. Нужно получить только результат выполнения конкретной AT команды, а не весь поток вывода.
  2. Нужно использовать gsm7bit кодировку для кодирования параметров и получения ответа при выполнении USSD запросов:
echo AT+CUSD=1,AA182C3602,15 | sudo tee /dev/ttyUSB2

Выполнение AT/USSD команд

bash

Скрипт at.sh для отправки AT команды и получения ответа в переменную:

at.sh "AT+COPS=3,0\nAT+COPS?" /dev/ttyUSB2
#!/bin/bash AT="$1" TTY="$2" SLEEP=0 RESULT=$(cat $TTY & echo -e "$AT" > $TTY; sleep $SLEEP; kill %cat) echo $RESULT

Но вы получите ответ вида:

AT+COPS? +COPS: 0,0,"lifecell",2 OK ^BOOT:36507742,0,0,0,87 ^RSSI:3 ^RSSI:3 ^RSSI:3

minicom

Можно отправить AT команду и перенаправить весь вывод в файл:

sudo minicom -D /dev/ttyUSB2 -S ./at/carrier-name.txt -C output.txt

После этого нужно закрыть терминал и разобрать/декодировать весь вывод из файла output.txt. Не круто..

ussd.py

В сети нашел python скрипт для отправки USSD запросов (немного поправил):

122 SMS po Ukraine. 3G: 1024 MB Nomer do 01.05.18.
#!/usr/bin/python #coding: utf8 import base64, io, tty, sys import time ussd = sys.argv[1] modem = '/dev/ttyUSB5' if len(sys.argv) > 2: modem = sys.argv[2] else: modem = '/dev/ttyUSB2' def write2p(a): #sp.write(bytes(a + '\r\n', 'utf8')) sp.write(a + '\r\n') def gsm7bitencode(src): """ Encode ASCII text to 7-bit encoding """ result, count, last = [], 0, 0 for c in src: this = ord(c) > 8) | (this & 0xFF))) count = (count + 1) % 8 last = this result.append('%02x' % (last >> 8)) return ''.join(result) def gsm7bitdecode(f): f = ''.join(["".format(int(f[i:i+2], 16)) for i in range(0, len(f), 2)][::-1]) return ''.join([chr(int(f[::-1][i:i+7][::-1], 2)) for i in range(0, len(f), 7)]) ### sp = io.open(modem, 'w+b', 0) tty.setraw(sp) write2p('AT+CUSD=1,' + gsm7bitencode(ussd) + ',15') ### start = time.time() while (time.time() - start < 10): l = sp.readline() #print(l) if l.startswith('+CUSD'): ussd_response = l[10:l.rfind('"')] response_decoded = gsm7bitdecode(ussd_response) print(response_decoded) break # @note Реализация без таймаута # @todo Нужен таймаут для прерывания ридера потока, если ничего #for l in sp: ##print(l) #if l.startswith('+CUSD'): #ussd_response = l[10:l.rfind('"')] ##print(ussd_response) #response_decoded = gsm7bitdecode(ussd_response) #print(response_decoded) #break sp.close() 

Кодировка GSM 7bit в USSD запросах

Кодирование в gsm7bit

При отправке USSD запросов нужно кодировать USSD-код в кодировку GSM 7bit (как я понял из-за того, что модем не поддерживает текстовый режим).

Следующие запросы вернут ERROR:

AT+CUSD=1,"*111#","15" AT+CUSD=1,"*121#",15

Python функция gsm7bitencode для кодирования utf8 строки в gsm7bit:

def gsm7bitencode(src): """ Encode ASCII text to 7-bit encoding """ result, count, last = [], 0, 0 for c in src: this = ord(c) > 8) | (this & 0xFF))) count = (count + 1) % 8 last = this result.append('%02x' % (last >> 8)) return ''.join(result)
Примечание

Смотрите онлайн-сервис для работы с кодировками: http://smstools3.kekekasvi.com/topic.php?id=288

Пример USSD команд в кодировке 7bit gsm проверки баланса:

AT+CUSD=1,"AA582C3602",15 # *111# AT+CUSD=1,"AA182C3602",15 # *121#

Кодированные ответы (ответ всегда приходит на устройство /dev/ttyUSB2):

+CUSD: 0,"C2303BEC9E83662E98ED2C77B340E2B7BB3E07C15C30D859EE762914",15 +CUSD: 0,"C2303BEC9E83662E98ED2C77B340E2B7BB3E07C15C30D859EE7629542A9502442CD3C3ECB40EA48AC9622317E8299687E9697A196477A7DB6177BACC02B9DFEDB21C4466E7C320B8FC6D2FCBD7699038CC0EBBE761103B6D2E8FCB6C3648158BC5460A05",15

Декодирование из gsm7bit

Python функция gsm7bitdecode для декодирования gsm7bit в utf8:

def gsm7bitdecode(f): f = ''.join(["".format(int(f[i:i+2], 16)) for i in range(0, len(f), 2)][::-1]) return ''.join([chr(int(f[::-1][i:i+7][::-1], 2)) for i in range(0, len(f), 7)])

Источник

How to send AT commands to a modem in Linux?

it seems to work. I type an AT and get an OK . I type some crap, I get an ERROR . It seems that modem1 for minicom is somehow configured to use the modem at /dev/ttyACM0 . How can I use socat to send AT commands? Do I need to configure something? Maybe I can use configurations for modem1 of minicom (I do not know how to find/see this configuration)?

Additional information

Is the given socat command correct? Should I play with some options? With the -v option I see the following:

AT > 2013/10/23 17:10:28.917413 length=3 from=0 to=2 AT < 2013/10/23 17:10:28.921598 length=3 from=0 to=2 AT AT ksjdhfjdgfhjkdfh >2013/10/23 17:10:30.244923 length=17 from=3 to=19 ksjdhfjdgfhjkdfh < 2013/10/23 17:10:30.251383 length=29 from=3 to=31 ksjdhfjdgfhjk\b \bd\b \bf\b \bh\b \b ksjdhfjdgfhj 
[5983726.808063] usb 2-1: USB disconnect, device number 3 [5983730.800021] usb 2-1: new full-speed USB device number 4 using uhci_hcd [5983730.920014] usb 2-1: device descriptor read/64, error -71 [5983733.629524] usb 2-1: New USB device found, idVendor=0572, idProduct=1329 [5983733.629533] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [5983733.629539] usb 2-1: Product: USB Modem [5983733.629544] usb 2-1: Manufacturer: Conexant [5983733.629549] usb 2-1: SerialNumber: 24680246 [5983733.632673] cdc_acm 2-1:1.0: ttyACM0: USB ACM device 
speed 57600 baud; line = 0; eof = ^A; min = 1; time = 0; -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -echo -echoe 

Источник

Оцените статью
Adblock
detector