Projekt GSM zabezpečovací ústředna, porovnávání AT příkazů

Ahoj, naučil jsem se ovládat mobilní telefon pomocí AT příkazů po sériové lince z PC a teď to potřebuji aplikovat na ATMEGA16. AVR programuji v AVRGCC a AVR Studio. Nad čím teď tápu a co nevím, jak naprogramovat, je příjem a kontrola řetězců přijatých od modemu mobilu.
Řekněme, že mobil dává jednoduché echo :

OK

dostávám tedy od něj sekvenci Bytů

0D 0A 4F 4B 0D 0A
neboli v ASCII odřádkování, OK a odřádkování.

Pomocí OD 0A poznám, že modem začal a skončil své vysílání a nyní bych potřeboval mít nějaké pole s takovýmito řetězci jako je “4F 4B” nebo “OK”(asi ve Flash paměti) a s ním porovnávat ten příchozí a určovat o jaký šlo. Vůbec nemám představu jak na to, Jestli kontrolovat byte po bytu nebo je spojovat do celých řetězců a ty kontrolovat nějak najednou. V tomhle plavu a prosím o radu,nejlépe odkaz na nějaký kód nebo tutorial, jestli existuje.
Před časem jsem řešil podobný problém s přijímáním MIDI příkazů. Bylo jich málo a tak se mi to podařilo vyřešit pomocí různých podmínek, ale už tenkrát jsem o jakési lookuptable uvažoval. Teď na to asi přišel čas jen potřebuji nakopnout.
Děkuji Pavel

:arrow_right: administrator: přejmenováno z "jak zkontrolovat AT příkaz z GSM modemu?"
Přejmenování provedeno na žádost Pavelt.

cislo jak cislo 4F4B 32bit cislo… jednoduche a priame je switch - case (kolko to zozerie pameti a ako dlho to bude porovnavat netusim) napisat preplozit a pozriet asm…

Na 4F4B stačí 16bit.

Jesli to porovnávat jako řetězce nebo čísla záleží na tom, co všechno ti může chodit zpátky. Pokud očekáváš delší texty než “ok”, asi by byly lepší stringové funkce, jesli ne, tak zůstaň u čísel.
Můžeš si bezproblému uložit do proměnné znak a ten číselně porovnávat nebo ho mít ve switch.

V manuálu gcc se podívej na následující:
<string.h>
memcmp(), strcmp(), strcasecmp()

<avr/pgmspace.h>
PROGMEM, strcpy_P()

Děkuji za rychlou reakci. Tak jednoduché hlášky to nejsou. Třeba po dotazu na stav baterie vrátí mobil, že je nabitá na 88%:
textově:
+CBC: 0,88
OK

neboli v ASCII:
0D 0A 2B 43 42 43 3A 20 30 2C 38 38 0D 0A 0D 0A 4F 4B 0D 0A
nebo třeba že na mobil volá někdo z číslem ???
+CLIP: “???”,145
2B 43 4C 49 50 3A 20 22 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 22 2C 31 34 35 0D 0A
0D 0A

(omlouvám se, že jsem číslo vyjádřil otazníky, jsou tam samozřejmě číslice v textové verzi a hex kódy v ASCII)
Potřebuji to celé od začátku do 0D 0A přijmout, zjistit, co to je za příkaz, zda OK nebo +CLIP nebo +CBC a mnoho dalších různě dlouhých, vyrýpat jejich parametry, jako je zde třeba nabití baterky na 0.88 nebo telefonní číslo, které volá a to zas zpracovávat dál. Třeba pod určitou minimální úrovní nabití baterie zasílat SMS nebo přijmout hovor oprávněné osoby a odmítnout neoprávněnou.
Pavel

Tohle bude asi docela složité. Kus kódu ti spáchám, ale nejsem si jist, jesli to pochopíš. Je naprosto nezbytné pracovat s manuálem gcc, vědět co jsou pointery, jak se s nimi pracuje, znát pointerovou aritmetiku a jak se pracuje s řetězci(pole char) v C.
Jesli tohle neumíš, tak v simulátoru v AVR studiu to bude velmi těžké.
Sám nevim, jesli to v tý demoverzi vývojovýho prostředku, jakým AVR Studio je, rozjedu. Možná budu muset nahodit visual studio na odladění a pak to přepsat. No uvidíme.

Nakonec se cosi podařilo přímo v AVR Studiu.
Kód vytáhne procenta z příkazu CBC.

[code]#include <avr/io.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <stdlib.h>

//#define NULL 0

char text1] PROGMEM = “OK”; //text ve FLASH
char text2] PROGMEM = “+CBC:”;
char text3] PROGMEM = “+CLIP:”;

char prijatyText[40] = “+CBC: 0,88”;
// řetězec musí být standartně ukončen (’\0’).
// Pokud ho prijmeš bez ukončovacího znaku, je třeba doplnit.

volatile unsigned char procenta;

void main (void)
{
char tempStr[20];
char *indexStart;

// ==============
// zjistit procenta
// ==============
indexStart = strstr_P((char *)prijatyText, (PGM_P)(&text2));
		// indexStart je pointer do "prijatyText" (v RAM) na pozici
		// vyskytu text2, jinak receno take string
if(indexStart != NULL)
{
	// řetězec "+CBC:" nalezen, zjistit hodnotu
	
	indexStart += strlen_P((PGM_P)text2) + 3;	// posun indexu za desetin. carku
	strlcpy ((char *)tempStr, (char *)indexStart, 3);	// kopie "88" do temp
	procenta = (unsigned char)atoi(tempStr);			// prevod na cislo
}
// ==============
// ==============
// ==============

for(;;);

}[/code]

edit: na řádku, kde je “(&text2)” by se to snad mělo makat i jen s “text2”.

Říkal jsem si, snad se těm pointerům nebudu muset učit. Chi, a je to tu. Tak jdu do nich. Děkuju za pomoc, na oplátku mohu poskytnout zatím nalezené poznatky ohledně komunikace s GSM moduly a jejich řízení, bude-li zájem.


Pane jo, dám jen náhled textu, který jsem napsal a už je tu odpověď. Píšu pomaleji, než kolega programuje.

Ještě bys snad mohl uvést typ modulu - já jsem se dost natrápil se SIM 300D - možná bysme se mohli vzájemně doplnit se svými zkušenostmi.

A těm ukazatelům, pointerům se samozřejmě nevyhneš pokud se chceš programování věnovat vážněji a čím dřív začnš tím líp. Už jen proto aby ses orientoval v cizích programech jako je např. ten , který uvádím jinde https://forum.mcontrollers.com/t/vypnuti-optimalizace-v-avr-studiu/1724/1 - tam je to samá struktura ukazatelů na ukazatele a jiné špeky :slight_smile:

Začátek s pointery je pro mne těžší, než jsem čekal. Našel jsem ale moc pěkný návod v HTML i PDF na
pweb.netcom.com/~tjensen/ptr/cpoint.htm
třeba někomu odkaz pomůže.
K modulu: Stavím si zabezpečovačku. nejdřív jsem jí chtěl koupit hotovou, ale za rozumnou cenu řekněme do 10000kč to skoro nic neumí a nad tuto hranici už si troufám přístroj vyrobit sám. Pak byla úvaha o nějakém průmyslovém modulu. Shodou náhod, kdy jem musel dát svůj mobil do opravy a vzít náhradu “ze sklepa” jsem si uvědomil, že ten starý Ericsson T65 neměl nikdy vůbec žádný problém. Bude to tedy založené na něm. Mám s ním ty nejlepší zkušenosti a kdyby ho někdo vyhazoval do recyklačního boxu, nechť jej dá do obálky a pošle mi. Zaplatím poštovné i pivo.

text jako takovy je v takzvanem PUD formatu, ktery je povetsinou sedmibitovy. take jsem se s tim trapil, ale da se to zvladnout. jako napovedu jak na to zkus mrknou na www.dhservis.cz tusim. ma tam ohledne PUD formatu dostatek informaci vcetne prikladu.

Nemyslíš PDU formát? Pokud ano, ten je určený pro kódování SMS zpráv a ty využívat nebudu. Na DHservis.cz, což je mimochodem velice kvalitně zpracovaný web co se informací o tématu komunikace s GSM modemy týká, se nenalézá řešení kontroly AT příkazů pomocí C. S panem Hankovcem, který je provozovatelem webu jsem se spojil a on mi ochotně předal nějaké další informace. Teď to musím jen sešrotovat v hlavě, znovu si to nějak poskládat pro svoje chápání a zkusit naprogramovat do MCU.
(Díky info na bramo.ic.cz/mobtel.htm
doveda.byl.cz/gsm/uvod.htm)

No nevím , jestli je ti málo toto: flajzar.cz/gsm-komunikator-g … 00-usb.htm a jestli se starým ericssonem nota bene bez použití sms postavíš něco lepšího.

To ale neznamená, že bych tě chtěl odradit - jednoduchou ústředničku, která tě při poplachu prozvoní s tím ericssonem pořídíš za pár šupů a pěkně se procvičíš v programování MCUček.

No a nakonec si musíš ujasnit co vlastně chceš - jeden den napíšeš, že chceš posílat sms a druhý , že je nebudeš využívat. :smiley:

lou: Díky za odkaz. Pět vstupů je docela legračně málo na komplexní zabezpečení budovy.
Strávil jsem mnoho desítek hodin konzultacemi u profi firem zabývajících se zabezpečovacími zařízeními i hledáním na webu, než jsem se rozhodl si místo koupě alarm postavit. Tedy vím proč, nejen kvůli procvičení programování v C. To je bonus, který sice trochu zaměstná hlavu, ale to já rád.
To se zasláním SMS při vybité baterii byl jen příklad. Asi každý máme zkušenost, že některá SMS přijde dlouho po jejím odeslání. Třeba, až bude byt vykraden. To je základní a veliký nedostatek pagerů využívajících jen a pouze SMS.
Pojďme se ale vrátit k tématu kontroly přijatých řetězců. Diskuse o vlastnostech GSM alarmů na současném trhu nebo vhodnosti mobilních telefonů pro stavbu alarmů se rád zúčastním, jestli takové vlákno někde bude.
Pavel

Sice trochu mimo, ale…
Ikdybys měl pouze 1 vstup, tak přeci není problém ho pomocí mcu rozšířit na libovolné množství :wink:

To je pravda, proto jsem rád, že jsem kdy s mcu začal. Ještě tedy trochu o tom, k čemu jsem časem o zabezpečení došel. Dobrá, budeme diskutovat o řetězcích, pointerech i o GSM alarmech. Třeba to bude užitečné.
Vyhledal jsem víc jak desítku různých alarmů s různými možnostmi a pro stavbu svého jsem se rozhodl po zralé úvaze. Proč? Co mi na těch profi alarmech, které jsou odladěné chybí a proč se pouštím do takové práce jako udělat si nějaké udělátko? Protože žádný z alarmů na trhu, které jsem poznal není komplexní - pro mou potřebu. Vždy řeší jen část problému. Třeba alarm s jedním vstupem byl můj první nápad kdysi asi před dvěma lety, kdy jsem s MCU uměl jen kontrolovat stav pinů na portech a měnit je. Našel jsem návod jak rozrýpnout Ericsson T10 a mechanicky mu spínat tlačítka klávesnice. Alarm? Nič jednoduchšie! Stačilo by přivést na port sadu čidel a v případě alarmu dlouze “stisknout” tlačítko s předvolenou rychlou volbou telefonu. Ale co dál? Telefon zvoní, nic ve sluchátku neslyším, je zloděj ve vedlejší místnosti nebo je to planý poplach? Mám volat hasiče nebo policii? Hm. Jeden vstup nestačí. Co když mobil vypoví službu? Můžu vyřešit nějak watchdog a hardwarový reset mobilu? Jak zálohovat napájení, když mobilu dojde šťáva? Co když ho někdo najde a urve ode zdi a zahodí? Je třeba řešit i kontrolu zařízení sebe sama - watchdog s tím resetem, opravdový záložní zdroj a nejen malou olověnou baterku paralelně k napájení, mít možnost prostor odposlouchávat, komunikovat s ním, mít možnost přijímat různé stavy o různých hodnotách, nejen 0 a 1. Co bylo v hlídaném prostoru narušeno, v jaké posloupnosti. Hlášení je třeba přijímat ihned, tedy pouze voláním, ne SMS. Ty mohou být užitečné opravdu jen pro ten stav baterie, ale jen když není těsně před vybitím. Tohle chci a nic na trhu to nenabízí. A i kdyby se našlo, má to povětšinou málo vstupů. Jediným zařízením, které má vstupů dostatek je GSM modem nebo starý mobilní telefon. A když umožní ten watchdog … tak co je na něm horšího, i když je starý? Bude dobře ukrytý a to že má šrámy nikdo neuvidí .-)

Jo eště mne napadá, to jsem řešil naposledy, jeden alarm z obchodu už by mi vyhověl, ale zase ten počet vstupů … sakra, jak to vyřešit? Pane prodavač, co kdybych použil ty vaše vstupy jako binárně kódované? Jak to myslíte pane? No podívejte. 5 vstupů, to máme, ehm, 2, 4, 8, 16 poplachových stavů, připojil bych k tomu mikrokontroler s 16 vstupy … posílal by váš alarm vždy jednu zprávu rozlišenou podle toho, jaké vstupy jsou aktivovány nebo by posílal tolik zpráv, kolik je aktivováno vstupů. Kolik - Tolik. Aha. Takže bych musel mít v kapse převodní tabulku: byl aktivován vstup 1 a 3, to je stav číslo 4 neboli někdo vlezl do sklepa. Uf. Tak na shledanou. To si to radši postavím celé sám, za alarm několik tisíc a plošňáky bych stejně leptal a Atmegu bych stějně programoval. Kurňa, starej dobrej Ericsson zadarmo, eště že sem ho nevyhodil.
Mimochodem, víte, že ho jde na dálku vypnout i zapnout. Vynikající. Nechcete ho fakt někdo vyhodit (funkční, ale baterka může bejt už za horizontem).

Raději ještě přidávám: Nemyslím ho na dálku zapnout a vypnout násadou od koštěte ani rozrýpávat klávesnici a pájet k ní dráty, ale pěkně elegantně, po standardně připojeném datovém konektoru.

Nemáš zrovna malé nároky. A i když to na co jsem tě odkázal splňuje plno tvých podmínek třeba ten odposlech , nebo mimo jiné nabízí možnost kombinace prozvonění/sms - to znamená , že ti zavolá a potom pošle zprávu co že se to vlastně děje.

Ale protože jsem se nějakých pár let zabezpečovačkami živil , tak o nich něco vím a tvoje požadavky jsou tak na úrovni ústředen prodávaných kolem 20 000 - bez zdroje (zálohovaného samozřejmě), bez komunikátoru, bez klávesnic.

ale jestli požaduješ více smyček, nějakou tu historii událostí + třeba ještě okamžitou indikaci stavu smyček - to ti opravdu ten flajzar neposkytne

a když už zacházíš tak daleko tak začni přemýšlet i o vyvážených smyčkách- to jsou takové co jedním vstupem dokážou hlídat 4 stavy rozpojený/spojený kontakt, zkrat na lince a přerušenou linku (např. uštípnutý kabel) - řeší se to za pomoci AD převodníků a dvou odporů v sérii - přes jeden z nich je potom kontakt čidla.

nechci sýčkovat, ale pořiď si na to procesor alespoň s 32k paměti, hóóóóóóódně času a ještě víc trpělivosti

a než přejdeme teda k řešení nějakých konkrétních věcí týkajícich se komunikace MCU s mobilem ještě bys mohl aspoň nastínit jak si představuješ , co se bude dít třeba při poplachu dáš volat číslo -prinf(“ATD123456789;\r”); a co pak?

Taky doufám, že máš seznam AT příkazů pro svůj typ - i když oni jsou v podstatě pro všechny stejné (je to myslím norma) ale přesto - hlavně ty starší všechny neumí a některé se liší udáváním parametrů - v příkazech s parametry samozřejmě.

Paráda, úplně jsem se rozzářil. Naladili jsme se na stejnou notu. Na komunikaci s ústřednou použiji DTMF a zpět hlasový modul. Budu testovat ISD1760. Časem se chci naučit připojit flash kartu k mcu, číst z ní tabulky audio dat a buď to posílat do DA převodníku nebo pravděpodobněji modulovat PWM. Ale to je hudba budoucnosti, protože zatím mám pořádný kopec práce před sebou a už vidím, že jakmile oživím ISD, zase trochu zlenivím.
Vyvážené smyčky mne nenapadly. Vynikající tip, pohledám na webu - nebo neměl bys odkaz na technické detaily?
Procesor uvažuji už od začátku ATmega32, taky protože je poslední v řadě v DIL provedení a já zatím umím jen “through hole”, ale kdybych zvládl SMD pájení, asi bych zvolil i vyšší model. Testovat základ budu na ATmega 16, ten mám na svém testovacím modulu.
Seznam příkazů jsem si dal mobilem vypsat a potřebné vždy otestuji prakticky, píšu si i jeho odezvu.

Atmega 32 již není poslední v řadě DIL. dnes jsou i ATmega644 a ATmega1284 která má i 16kB RAM a 128kB flash :wink:

no nevím jestli se to vyplatí.Léta montuji alarmy od Jablotronu a když vezmu že dnes mají PIR s foťákem,možnost odposlechu,mraky drátovývh vstupů s jednoduše i dvojitě vyváženým zapojením,možnost bezdrátových čidel a periferií .Ovládání dalších zařízení jako je kotel a další jak píšeš odladěné věci asi bych se do stavby nového nepouštěl.