GSMToolsTestGPRS

Bu çizim, GSM kalkanındaki GPRS veri bağlantısını test eder. Arduino.cc'ye bağlanmaya çalışır.

GSM kalkanıyla veri bağlantısı kullanmak için, sağlayıcınızın Erişim Noktası Adı (APN), oturum açma adı ve parolaya ihtiyacınız vardır. Bu bilgileri edinmek için en güncel bilgiler için şebeke sağlayıcısına başvurun. Bu sayfada çeşitli operatör ayarları hakkında bazı bilgiler var, ancak güncel olmayabilir.

Gerekli Donanım

Devre

Kod

İlk olarak, GSM kütüphanesini içe aktarın

#include <GSM.h>

SIM kartların işlevlerini etkinleştiren bir PIN numarası olabilir. SIM'inizin PIN kodunu tanımlayın. SIM'inizde PIN yoksa boş bırakabilirsiniz:

#define PINNUMBER ""

Kullanacağınız sınıfların örneklerini başlatın. GSM, GPRS ve GSMClient sınıflarına ihtiyacınız olacak.

GSMClient client;
GPRS gprsAccess;
GSM gsmAccess;
[Kodu Al]

Seri monitöre göndermek için bazı durum mesajları oluşturun:

Dize oktext = "Tamam" ;
Dize errortext = "ERROR" ;

Bağlanmak istediğiniz sunucuyu, yolu ve proxy'yi tutmak için bazı değişkenler oluşturun.

char url [ ] = "arduino.cc" ;
char yolu [ ] = "/" ;
char urlproxy [ ] = "http://arduino.cc" ;

Sunucudan gelen yanıtı tutmak için bir değişken ve vekil kullanıp kullanmayacağınızı belirten bir işaret oluşturun.

Dize yanıtı = "" ;

boolean use_proxy = yanlış ;

setup , bilgisayara seri bir bağlantı açın.

void setup ( ) {
Seri . başlar ( 9600 ) ;
}

Seri monitörden seri girişi işlemek için özel bir işlev oluşturacaksınız. char dizisini bağımsız değişken olarak kabul eden adlandırılmış bir işlev oluşturur.

int readSerial ( karakter sonucu [ ] )
{

sayaç olarak hareket etmek için bir değişken yapın. Seri bilgiler varken char dizisine okuyun. Yeni satır karakteri ile karşılaşılırsa, diziyi sonlandırın ve ana programa dönün.

int i = 0 ;
süre ( 1 )
{
(Seri. mevcuttur ()> 0) ise
{
char inChar = Seri . read ( ) ;
eğer ( inChar == ' \ n ' )
{
sonuç [ i ] = ' \ 0 ' ;
dönüş 0 ;
}
eğer ( inChar ! = ' \ r ' )
{
sonuç [ i ] = inChar ;
i ++;
}
}
}
}

loop() içinde proxy bayrağını false olarak ayarlayın

void loop ( )
{
use_proxy = yanlış ;

PIN numarasını (varsa) gsmAccess.begin() ileterek GSM şebekesine bağlantıyı gsmAccess.begin() .

Seri . print ( "GSM şebekesi bağlanıyor ..." ) ;
eğer ( gsmAccess. başlar ( PINNUMBER ) ! = GSM_READY )
{
Seri . println ( hata metni ) ;
while ( true ) ;
}
Seri . println ( oktext ) ;

APN'yi tutmak için bir char dizisi oluşturun. Seri monitörden bayt almak için oluşturduğunuz readSerial() işlevini kullanın

karakter apn [ 50 ] ;
Seri . print ( "APN'nizi girin:" ) ;
readSerial ( apn ) ;
Seri . println ( apn ) ;

APN oturumunu tutmak için bir char dizisi oluşturun. Seri monitörden bayt almak için oluşturduğunuz readSerial() işlevini kullanın

karakter girişi [ 50 ] ;
Seri . print ( "Şimdi girişinizi girin:" ) ;
readSerial ( giriş ) ;
Seri . println ( giriş ) ;

APN parolasını tutmak için bir char dizisi oluşturun. Seri monitörden bayt almak için oluşturduğunuz readSerial() işlevini kullanın

karakter şifresi [ 20 ] ;
Seri . print ( "Son olarak, şifrenizi girin:" ) ;
readSerial ( şifre ) ;

gprs.attachGPRS() kullanarak GPRS şebekesine gprs.attachGPRS() . Bu, az önce girdiğiniz APN, oturum açma adı ve şifreyi gerektirir.

Modem kendisini GPRS şebekesine gsmAccess() , gsmAccess() GSM_READY .

Seri . println ( " APN'nizle GPRS'ye ekleniyor ..." ) ;
if ( gprsAccess. attachGPRS ( apn , kullanıcı adı , şifre ) ! = GPRS_READY )
{
Seri . println ( hata metni ) ;
}
başka {

Seri . println ( oktext ) ;

İhtiyacınız olabilecek proxy bilgilerini saklamak için bir char dizisi oluşturun. Seri monitörden bayt almak için oluşturduğunuz readSerial() işlevini kullanın.

char proxy [ 100 ] ;
Seri . print ( "Operatörünüz bir proxy kullanıyorsa girin, değilse girin: tuşuna basın ) " ) ;
readSerial ( proxy ) ;
Seri . println ( proxy ) ;

Bir proxy belirtilmişse, bağlantı noktası numarasını isteyin ve proxy bayrağını true

int pport ;
if ( proxy [ 0 ] ! = ' \ 0 ' ) {
// kullanıcı tarafından tanıtılan proxy bağlantı noktasını oku
char proxyport [ 10 ] ;
Seri . print ( "Proxy bağlantı noktasını girin:" ) ;
readSerial ( proxyport ) ;
// tamsayıya cast proxy bağlantı noktası eklendi
pport = ( int ) proxyport ;
use_proxy = true ;
Seri . println ( proxyport ) ;
}

Sunucuya bağlı olup olmadığınızı belirtmek için bir değişken oluşturun. client.connect() ile client.connect() bağlantı kurun. Bağlantının nasıl yapılacağı proxy kullanıyorsanız veya kullanmamanıza bağlıdır.

Seri . print ( "arduino.cc'ye GET isteği bağlama ve gönderme ..." ) ;
int res_connect ;

eğer ( kullan_proxy )
res_connect = istemci. connect ( proxy , bağlantı noktası ) ;
Başka
res_connect = istemci. bağlayın ( url , 80 ) ;

bağlandıysanız, client.print() kullanarak bir HTTP GET isteği yapın.

eğer ( res_connect )
{
istemcisi. yazdır ( "GET" ) ;

eğer ( kullan_proxy )
istemcisi. baskı ( urlproxy ) ;
Başka
istemcisi. yazdırma ( yol ) ;

istemcisi. println ( "HTTP / 1.0" ) ;
istemcisi. println ( ) ;
Seri . println ( oktext ) ;
}

Bağlantı yapılmadıysa, bir hata yazdırın

Başka
{
// sunucuyla bağlantı bulamadıysanız
Seri . println ( hata metni ) ;
}

Sunucunun client.available() kullanarak bayt client.available() döndürmediğini kontrol edin. Varsa, response dizesine okuyun ve ardından bir char dizisine yayınlayın. Arduino.cc kaynağından geçerli bir yanıtı belirten "200 OK" alt dizesi için diziyi denetleyin.

Seri . print ( "Yanıt alınıyor ..." ) ;

boolean testi = doğru ;
süre ( test )
{
if ( istemci. kullanılabilir ( ) )
{
char c = istemci. read ( ) ;
cevap + = c ;

Char responsechar [cevap. uzunluk ( ) + 1 ] ;
tepki. toCharArray ( yanıt , yanıt. uzunluk ( ) + 1 ) ;

if ( strstr ( responseechar , "200 OK" ) ! = BOŞ ) {
Seri . println ( oktext ) ;
Seri . println ( "TEST TAMAMLANDI!" ) ;
test = yanlış ;
}
}

Sunucunun bağlantısı kesildiyse, istemciyi durdurun ve loop() kapatın loop()

if ( ! istemci. bağlı ( ) )
{
Seri . println ( ) ;
Seri . println ( "bağlantı kesiliyor." ) ;
istemcisi. stop ( ) ;
test = yanlış ;
}
}
}
}

Kodunuz yüklendikten sonra, bağlantının durumunu görmek için seri monitörü açın.

Çizimin tamamı aşağıdadır.

/ *

Bu çizim, GSM kalkanının bir
GPERS ağı. APN bilgilerini ister.
seri monitör ve arduino.cc bağlanmaya çalışır.

Devre:
* GSM kalkanı takılı
* Veri planlı SIM kart

18 Haz 2012 tarihinde oluşturuldu
ile David del Peral

Bu örnek kod, genel alanın bir parçasıdır

http: egitim.aspx e = GSMToolsTestGPRS

* /


// kütüphaneler
#include <GSM.h>

// PIN numarası
#define PINNUMBER ""

// kütüphane örneğini başlat
GSM gsmAccess ; // GSM erişimi: hata ayıklama için bir 'true' parametresi dahil et
GPRS gprsAccess ; // GPRS erişimi
GSMClient istemcisi ; // TCP bağlantısı için istemci hizmeti

// seri monitör yanıtı için mesajlar
Dize oktext = "Tamam" ;
Dize errortext = "ERROR" ;

// URL ve yol (örneğin: arduino.cc)
char url [ ] = "arduino.cc" ;
char urlproxy [ ] = "http://www.arduino.cc" ;
char yolu [ ] = "/" ;

// kaydedilen yanıtı kaydetmek için değişken
Dize yanıtı = "" ;

// proxy kullan
bool use_proxy = yanlış ;

void setup ( ) {
// seri iletişimi başlatın ve portun açılmasını bekleyin:
Seri . başlar ( 9600 ) ;
while ( ! Seri ) {
; // seri portun bağlanmasını bekleyin. Yalnızca Leonardo için gerekli
}
}

void loop ( ) {
use_proxy = yanlış ;

// GSM kalkanını başlat
// SIM'iniz PIN koduna sahipse, tırnak işaretleri halinde begin () parametresi olarak iletin
Seri . print ( "GSM şebekesi bağlanıyor ..." ) ;
eğer ( gsmAccess. başlar ( PINNUMBER ) ! = GSM_READY ) {
Seri . println ( hata metni ) ;
while ( true ) ;
}
Seri . println ( oktext ) ;

// kullanıcı tarafından tanıtılan APN'yi oku
karakter apn [ 50 ] ;
Seri . print ( "APN'nizi girin:" ) ;
readSerial ( apn ) ;
Seri . println ( apn ) ;

// Kullanıcı tarafından sunulan APN girişini okuyun
karakter girişi [ 50 ] ;
Seri . print ( "Şimdi girişinizi girin:" ) ;
readSerial ( giriş ) ;
Seri . println ( giriş ) ;

// kullanıcı tarafından girilen APN şifresini okuyun
karakter şifresi [ 20 ] ;
Seri . print ( "Son olarak, şifrenizi girin:" ) ;
readSerial ( şifre ) ;

// GPRS ekle
Seri . println ( " APN'nizle GPRS'ye ekleniyor ..." ) ;
if ( gprsAccess. attachGPRS ( apn , kullanıcı adı , şifre ) ! = GPRS_READY ) {
Seri . println ( hata metni ) ;
} başka {

Seri . println ( oktext ) ;

// kullanıcı tarafından sunulan proxy'yi oku
char proxy [ 100 ] ;
Seri . print ( "Operatörünüz bir proxy kullanıyorsa girin, değilse girin: tuşuna basın ) " ) ;
readSerial ( proxy ) ;
Seri . println ( proxy ) ;

// kullanıcı bir proxy tanıttıysa, ondan proxy bağlantı noktası ister
int pport ;
if ( proxy [ 0 ] ! = ' \ 0 ' ) {
// kullanıcı tarafından tanıtılan proxy bağlantı noktasını oku
char proxyport [ 10 ] ;
Seri . print ( "Proxy bağlantı noktasını girin:" ) ;
readSerial ( proxyport ) ;
// tamsayıya cast proxy bağlantı noktası eklendi
pport = ( int ) proxyport ;
use_proxy = true ;
Seri . println ( proxyport ) ;
}

// arduino.cc ile bağlantı ve HTTP isteğini gerçekleştirme
Seri . print ( "arduino.cc'ye GET isteği bağlama ve gönderme ..." ) ;
int res_connect ;

// proxy kullanıyorsanız, ona bağlanın
if ( kullan_proxy ) {
res_connect = istemci. connect ( proxy , bağlantı noktası ) ;
} başka {
res_connect = istemci. bağlayın ( url , 80 ) ;
}

if ( res_connect ) {
// HTTP 1.0 GET isteği yapma (istemci isteği gönderir)
istemcisi. yazdır ( "GET" ) ;

// proxy kullanıyorsanız, yol arduino.cc URL'sidir
if ( kullan_proxy ) {
istemcisi. baskı ( urlproxy ) ;
} başka {
istemcisi. yazdırma ( yol ) ;
}

istemcisi. println ( "HTTP / 1.0" ) ;
istemcisi. println ( ) ;
Seri . println ( oktext ) ;
} başka {
// sunucuyla bağlantı bulamadıysanız
Seri . println ( hata metni ) ;
}
Seri . print ( "Yanıt alınıyor ..." ) ;

bool testi = doğru ;
while ( test ) {
// kullanılabilir gelen bayt varsa
// sunucudan okuyun ve kontrol edin
if ( müşteri. kullanılabilir ( ) ) {
char c = istemci. read ( ) ;
cevap + = c ;

// karakter dizisinden karakter dizisine alınıyor
Char responsechar [cevap. uzunluk ( ) + 1 ] ;
tepki. toCharArray ( yanıt , yanıt. uzunluk ( ) + 1 ) ;

// yanıt "200 OK" alt dizesi içeriyorsa
if ( strstr ( responseechar , "200 OK" ) ! = BOŞ ) {
Seri . println ( oktext ) ;
Seri . println ( "TEST TAMAMLANDI!" ) ;
test = yanlış ;
}
}

// sunucunun bağlantısı kesilirse, istemciyi durdurun:
if ( ! istemci. bağlı ( ) ) {
Seri . println ( ) ;
Seri . println ( "bağlantı kesiliyor." ) ;
istemcisi. stop ( ) ;
test = yanlış ;
}
}
}
}

/ *
Giriş dizisini oku
* /

int readSerial ( karakter sonucu [ ] ) {
int i = 0 ;
yaparken ( 1 ) {
while ( Seri . kullanılabilir ( ) > 0 ) {
char inChar = Seri . read ( ) ;
if ( inChar == ' \ n ' ) {
sonuç [ i ] = ' \ 0 ' ;
dönüş 0 ;
}
eğer ( inChar ! = ' \ r ' ) {
sonuç [ i ] = inChar ;
i ++;
}
}
}
}

See Also