GSM модем SIM900
В тази статия искам да споделя моя опит с модема SIM900. Тук няма да давам извадки от листа с данни с характеристиките на модула, да обяснявам диаграмите на свързване и да се спирам на описанието на всички команди за управление на модема. Статиите по тези теми лесно се търсят в Google за "SIM900". Написани са изчерпателно, така че не искам да се повтарям. Ще говоря само за характеристиките на модула, който изпробвах, и проблемите, които срещнах, докато го правех.
Опитът от използването на SIM900, описан по-долу, ще бъде по-полезен за тези, които вече са успели да работят малко с модула. За тези читатели, които току-що започват да изучават тази микросхема и планират да я използват за обмен на данни чрез Интернет, сме подготвили серия от уроци по тази тема. Ето я и първата.
И така, SIM900 е GSM модул от SIM COM, управляван от AT команди, способен да изпраща SMS, да осъществява повиквания, да организира директна CSD връзка и да обменя информация чрез GPRS.
В ръцете ми беше платката за отстраняване на грешки в щита SIM900 GPRS, поръчана от Китай - съвместима с платформата Arduino.
Платката съдържа самия чип SIM900, жакове за микрофон и слушалки, ключ за захранване (от външен конектор или от Arduino), антена, няколко светодиода за индикация на режимите на работа, конектор за батерия (ако е необходим часовник в реално време), бутон за включване / изключване. Намерих добро описание в уикито на производителятук. Има и код за управление на модема в различни режими.Arduino SIM900 GSM/GPRS щит
Според производителя, платката е идеално съвместима с Arduino Uno. Наистина платката SIM900 просто се включва в Uno и веднага започва да работи. Въпреки това, както се оказа,Arduino Uno може да е "слаб" за реализиране на някои от функциите, но ще говоря за това малко по-късно.
Платката работи с Arduino Mega с някои ограничения. Това се дължи на факта, че Mega, за разлика от Uno, щифтове 7 и 8 не са налични за използване като софтуерен сериен (софтуер USART). Това се решава чрез превключване на интерфейса USART към крака 0 и 1; за това са осигурени джъмпери на платката SIM900.
Като цяло, платката може да бъде свързана към всеки контролер с интерфейс USART. Например, опитах се да контролирам модема с помощта на контролера STM32F4.
SIM900: SMS и обаждания
Тестовете на модула за обмен на SMS съобщения и обаждания преминаха "с гръм и трясък"! Модулът се справи с тези задачи без никакви проблеми, за това просто копирах от същия сайт, компилирах и внесох този код в Arduino Uno:
За да изпращате команди към модула, той трябва да е свързан към компютър. Това може да стане с помощта на USB порта Arduino. На компютър това изисква монитор на COM порт. Може да бъде изтеглен от тук или можете да използвате монитора, вграден в Arduino IDE.
GPRS трансфер на данни с помощта на SIM900
Започнах първите си експерименти в предаването на данни чрез GPRS, използвайки платформата Arduino UNO за управление на SIM900 (просто защото беше под ръка). Като начало купих хостинг със сървър под Apache и разположих на него просто приложение, което можеше умело да отговаря на GET заявки. Се случи! Все още изпращах команди от компютъра до контролера Arduino, който от своя страна ги препраща към SIM900.
Всичко работеше правилно, стига GET заявките да бяха достатъчно кратки (до 100 знака). Но веднага щом заявките станаха по-дълги, започнаха неуспехи: заявките не бяха напълно предадени. Беше забелязаноче проблемите могат да се появят или изчезнат дори при увеличаване / намаляване на програмата за управление на Arduino с няколко реда. Впоследствие се оказа, че повреди са свързани със софтуера USART, който Arduino UNO използва за комуникация със SIM900, т.к. такъв USART зависи изцяло от програмния цикъл на ядрото на контролера. При малко количество данни те винаги имат време да бъдат предадени, а при увеличаване на количеството им резултатът от прехвърлянето зависи от продължителността на програмния цикъл.
Изводът от всичко по-горе е, че е НЕВЪЗМОЖНО да се използва софтуер USART при комуникация със SIM900, особено когато става дума за голямо количество предавани данни.
Arduino Uno има само един "железен" USART интерфейс, който беше зает от обмена с компютъра, така че трябваше да изоставя UNO, заменяйки го с Arduino Mega, който не страда от липса на "железни" USART. След такава „рокада“ работата на устройството стана стабилна и правилна.
SIM900: TCP-IP стек или HTTP? Кое е по-добро?
Докато изучавах ръководството за управление на модема, открих, че има две групи AT команди. Първата група се използва за прехвърляне на данни през вградения TCP-IP стек, а втората използва HTTP протокола, вече внедрен от вътрешната логика на SIM900. Колкото и да измъчвах Google и Yandex, опитвайки се да разбера как се различават тези методи, какви са плюсовете и минусите на всеки от тях, не намерих нищо, затова опитах и двете и споделям практическия си опит тук.
И двата метода работят и имат право на съществуване.
TCP-IP стекът е малко по-труден за инициализиране (трябва да се подадат повече команди към модула) и малко по-труден за управление. За да изпратите заявка, трябва да отворите връзка, да изчакате отговор и да я затворите елегантно.
HTTP е, с прости думи, браузървграден в SIM900. Лесно се инициализира, за да започнете обмен със сървъра, трябва да отворите сесия. В същото време отварянето и затварянето на връзката с всяка заявка и решаването на други "организационни задачи" пада върху плещите на SIM900. Това е удобно, освен това прехвърлянето на данни по този начин е малко по-бързо, само защото SIM900 е в състояние да изпълнява всички „спомагателни операции“ по-бързо, отколкото контролерът за управление.
По този начин, когато избирах метод на обмен, все още се спрях на HTTP протокола.
Невалидна GET заявка към сървъра
В самото начало на работата си по предаване на данни чрез GPRS направих грешка, която ми коства повече от един ден мъки. Нямайки достатъчно опит във взаимодействието със сървъра чрез GET заявки, аз, след като придобих повърхностни познания в Интернет, направих заявка под формата:
ВЗЕМЕТЕ http://xxx.ru/d_command.php?UC=1111 HTTP/1.1 ХОСТ: xxx.ru
Тази заявка не е коректна, но беше перфектно "изядена" от браузъра и прокси сървъра, от който изпращах заявки за отстраняване на грешки - затова сметнах заявката за правилна.
Най-изненадващото е, че SIM900 също се справи добре с „лоша“ заявка (и след това изпратих заявки през TCP-IP стека). Въпреки това, един прекрасен ден сървърът започна да отговаря на такива заявки с грешка 404. Това се случи поради обстоятелства, които не са изяснени, или хостинг доставчикът промени алгоритмите за обработка на заявките (той отрича това), или мобилният оператор го направи. Но фактът остава. След това се опитах да изпратя същата заявка през HTTP - всичко работи. Това се обяснява с факта, че вътрешният HTTP протокол на модула SIM900 (както казах, всъщност вграденият браузър) е в състояние правилно да "анализира" неправилнозаявки и излъчване към мрежата вече в правилната форма. Това е друго предимство (съмнително, разбира се) от използването на HTTP, тъй като позволява на програмиста някои неточности. Като цяло, разбира се, заявката трябва да бъде написана правилно и да изглежда така:
GET /d_command.php?UC=1111 HTTP/1.1 ХОСТ: xxx.ru
С такава коректна заявка SIM900 успешно обменя както през TCP-IP стека, така и през HTTP.
SIM900 блокира
Понякога при обмен чрез GPRS възникват ситуации, след които модулът може да замръзне. Това може да се дължи на неправилни данни, които идват по мрежата и карат SIM900 в ступор, или смущения в обменната линия на модула и контролера, при които SIM900 получава „не това, което очаква“, или някои други неизвестни проблеми. Производителят на чипа предупреждава, че това може да се случи и предлага в такива случаи модулът да се нулира чрез специална последователност от импулси, подадени на входа PWRKEY.
Заключение
В бъдеще планирам да пусна поредица от статии-уроци, в които ще ви кажа как да организирате обмен между сървърно уеб приложение и SIM900, като започнете с закупуване на хостинг от доставчик и завършите с писане на код за контролни програми.
Довиждане! СледетеLAZY SMART за актуализации.