Autor Téma: AT příkazy z modemu - parsing v Delphi  (Přečteno 1192 krát)

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 390
  • Karma: 9
    • Verze Delphi: XE2
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #15 kdy: 19-03-2021, 14:42:28 »
Kód: Delphi [Vybrat]
  1. ATZ^MAT&FX3V1E0^M
ale dost se to lisi, treba nejake ty posledni Siemens moduly jsme iniciovali
Kód: Delphi [Vybrat]
  1. ATZ^MATV1E0+CLIP=1^MAT+CMEE=2^M

No nazdar :-)

Díky bohu mě se v praxi bude jednat v 80 % odesílání SMS  a 20%   přijimání  SMS.
Takže mě jde hlavně o to, že když budu v dávce odesilat SMS tak během toho odchytit nevyžádané oznámení (RING, CLIP atd.) a odfiltrovat tak
aby mi to nenarušilo vyhodnocení   komunikace SMS, například jestli  mi přišel '> ' 

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3172
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #16 kdy: 19-03-2021, 14:51:28 »
odesilat SMS tak během toho odchytit nevyžádané oznámení (RING, CLIP atd.)
CLIP se da u nekterych vypnout, jestli RING uz si nepamatuju. Ale je otazka, jestli to ma pracovat jen s vybranymi/otestovanymi zarizenimi nebo by to melo fungovat s kde cim.

A jeste pozor na odesilani SMS s pozadavkem na potvrzeni: SMS v GSM siti pouzivaji signalni kanal, ktery je poloduplexni, takze kdyz odesilas batch a SMSC ti do toho zacne posilat dorucenky, obcas se to vlivem poloduplexu rozpadne, takze je treba resend jak na tvoji strane, tak na strane SMSC, ktere navic pouziva exponencialne rostouci prodlevy u retry, takze se ty dorucenky pak mohou trousit docela s velkym zpozdenim.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2867
  • Karma: 106
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #17 kdy: 19-03-2021, 15:27:20 »
Hm, to tam maji nejakou race condition - to bych se obratil na vyrobce modemu, co k tomu rekne - poslal bych jim I/O log klidne ze vsech 300 cteni
Tady toto je nějaký Cinteron od https://www.seapraha.cz/produkt/gsm-bgs5-een/?target=popis_produktu
Příští týden si chci pořídit  SIM800L  a vyzkoušet komunikaci tam

Existují  nějaké univerzální AT  příkazy pro "studený restart"  či "tovární" nastavení  modemu ?

Celkem by mohl zafungovat AT+CFUN=1 ( u nekterych modemu to pouzivame, ale celkove jak pise PF je to magie).
Kukni sem: https://m2msupport.net/m2msupport/atcfun-set-phone-functionality/
Embarcadero MVP - Czech republic

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 390
  • Karma: 9
    • Verze Delphi: XE2
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #18 kdy: 19-03-2021, 17:55:16 »
Celkem by mohl zafungovat AT+CFUN=1 ( u nekterych modemu to pouzivame, ale celkove jak pise PF je to magie).
Možnosti  +CFUN: (0,1,4,6,7,8),(0-1)
Aktuální nastavení  +CFUN: 1,0

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 390
  • Karma: 9
    • Verze Delphi: XE2
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #19 kdy: 23-03-2021, 20:43:20 »
Řekl by mi někdo která syntaxe je správná ? Díky
Modem Cinterion
Příkaz AT
Odpověd AT<cr><cr><lf>OK<cr><lf>

Modem SIMCOM   - model SIM900
Příkaz AT
Odpověd AT<cr><lf><cr><lf>OK<cr><lf>




Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3172
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #20 kdy: 23-03-2021, 21:38:42 »
Vypni si echo

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 390
  • Karma: 9
    • Verze Delphi: XE2
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #21 kdy: 23-03-2021, 21:50:37 »
Vypni si echo

Echo bych si rád ponechal, ale ted jsem díval do https://drive.google.com/file/d/0B4B30jzMyzG8aUpIOVpRVFpaTXM/view
a píší že stačí pro odeslání AT zadat jen <CR>  a já zadával <CR><LF> stejně jako do modemu Cinetrion (prý bývalý Siemens)  a tam mi to procházelo.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3172
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #22 kdy: 24-03-2021, 06:13:15 »
a píší že stačí pro odeslání AT zadat jen <CR>  a já zadával <CR><LF> stejně jako do modemu Cinetrion (prý bývalý Siemens)  a tam mi to procházelo.
No jasne, protoze echo slouzi pro pripad, ze zadavas prikazy z klavesnice a tam prikaz ukoncujes klavesou Enter, ktera posila samotne CR, coz je spravna syntaxe prikazu. Na to, jestli modem akceptuje i LF bych se nespolehal.

Ale protoze se z prapodivnych duvodu na nekterych platformach jako oddelovac radku prezila posloupnost CR+LF z doby el. psacich stroju, kde se skutecne jednim znakem (CR) sepnula spojka, ktera tahla vozik doprava a dalsim (LF) se pootacelo valcem a u nekterych stroju se to z duvodu zrychleni operace posilalo obracene tj. LF+CR, tak je v tom bordel.

V jedne z prvnich odpovedi jsem ti psal, ze LF pri prijmu vypoustime a jako oddelovac radku pouzivame jen CR. Prikazy zadavane modemu ukoncujeme jen CR.

« Poslední změna: 24-03-2021, 06:15:12 od pf1957 »

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 390
  • Karma: 9
    • Verze Delphi: XE2
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #23 kdy: 24-03-2021, 09:30:43 »
Tu informaci o používání <CR><LF> jako celku jsem někde odchytil  a tak jsem to bral jako požadované pravidlo

Citace
No jasne, protoze echo slouzi pro pripad, ze zadavas prikazy z klavesnice a tam prikaz ukoncujes klavesou Enter, ktera posila samotne CR, coz je spravna syntaxe prikazu. Na to, jestli modem akceptuje i LF bych se nespolehal.

Už jsem to  předělal na čisté <CR>  , jak jsem včera večer zjistil , tak i Cinterion v dokumentaci uvádí pro ukončení příkazu čisté  <CR>

Citace
V jedne z prvnich odpovedi jsem ti psal, ze LF pri prijmu vypoustime a jako oddelovac radku pouzivame jen CR. Prikazy zadavane modemu ukoncujeme jen CR.

Tu filtraci jsem na začátku taky používal ale dělalo mi to bordel, tak jsem to filtrovani vynechal  - ale je klidně možné že ten "bordel" mi dělalo to přidávané <LF>

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 390
  • Karma: 9
    • Verze Delphi: XE2
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #24 kdy: 26-03-2021, 10:58:36 »
Na odeslaní SMS používám Synaser.SendString()
Pokud posílam text SMS bez nového odstavce tak je vše v pořádku
ale pokud zadám Enter,
memo komponenta mi tam vkládá<CR><LF> tak  to skončí na timeoutu,
vypadá to tak že SendString odešle tu část textu před odstavcem  a s tím zbytkem má problém.
Je nějaká cesta jak z toho ven a posílat SMS i s odstavcem ?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3172
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #25 kdy: 26-03-2021, 12:16:58 »
Na odeslaní SMS používám Synaser.SendString()
Pokud posílam text SMS bez nového odstavce tak je vše v pořádku
ale pokud zadám Enter,
memo komponenta mi tam vkládá<CR><LF> tak  to skončí na timeoutu,
vypadá to tak že SendString odešle tu část textu před odstavcem  a s tím zbytkem má problém.
Pokud tam nejak necarujes, tak to vypada na problem s kompatibilitou modemu, protoze podle GSM 3.38 jsou CR i LF akceptovane znaky a odesilany text se ukoncuje ^Z.

Citace
Je nějaká cesta jak z toho ven a posílat SMS i s odstavcem ?
Opustit Text mode a prejit na PDU, pokud to zarizeni zvlada? My jsme Text mode pouzivali jen tam, kde skutecne nebylo zbyti, protoze modem mel problemy s PDU.




Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 390
  • Karma: 9
    • Verze Delphi: XE2
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #26 kdy: 26-03-2021, 12:27:29 »

Citace
Pokud tam nejak necarujes, tak to vypada na problem s kompatibilitou modemu, protoze podle GSM 3.38 jsou CR i LF akceptovane znaky a odesilany text se ukoncuje ^Z.

Já jsem spíše myslel jestli  ten SendString nenarazí na první CRLF  začne ho zpracovávat a ten zbytek zprávy s tím ^Z. už nevezme a tím pádem to spadne ..

 PDU bych se alepoň v této fázi vyhnul (jsem rád že to mohu ladit v textu a ne  v Hexa a 7bit - což jsem nikdy  nepotkal )
Teď zkouším SendBuffer, ale tam mi neprojde nic ..

 

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3172
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #27 kdy: 26-03-2021, 14:21:58 »
Já jsem spíše myslel jestli  ten SendString nenarazí na první CRLF  začne ho zpracovávat a ten zbytek zprávy s tím ^Z. už nevezme a tím pádem to spadne ..
Vzdy mas zdrojovku ne? SendString vola jen SendBuffer a ten si obsahu nevsima

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 390
  • Karma: 9
    • Verze Delphi: XE2
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #28 kdy: 26-03-2021, 15:15:39 »
« Poslední změna: 26-03-2021, 15:29:28 od Jirka »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3172
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:AT příkazy z modemu - parsing v Delphi
« Odpověď #29 kdy: 26-03-2021, 19:45:01 »
Tady měli podobný problém ...
https://stackoverflow.com/questions/20092649/howto-properly-parse-response-data-received-from-gsm-module/20096236#20096236

Doplněno:    Pomohla náhrada  CRLF za LF
Dival jsem se do normy a spravne chovani vypada tak, ze jakmile prijme v datech CR, tak zobrazi dalsi prompt "> " a ceka na dalsi text -> proto ti to zustane viset. Podivej se do GSM 7.05, kde je v kapitole 3.5.6 priklad odesilani textu na nekolik radku v textovem rezimu.