Configuration SIM868 pour internet

Bonjour !
Je viens d’acheter ce module :

J’arrive a appeler, envoyer des SMS, et avoir la localisation.

J’ai suivi ce tuto (https://www.waveshare.com/wiki/SIM868_PPP_Dail-up_Networking) afin d’obtenir internet, mais cela ne fonctionne pas, car au moment de taper la commande « route add -net 0.0.0.0 ppp0 » cela me renvoie l’erreur : « Protocol-Reject for ‹ Compression Control Protocol › (0x80fd) received »

Quelqu’un aurait une idée d’où cela pourrait venir ?

En vous remerciant,

Hello,

Je fais un petit up car toujours bloqué…

Merci beaucoup à ceux qui prendront le temps de répondre !

hello,

j"ai le même HAT qui me sert à envoyer des SMS.
j’avais aussi testé d’autres fonctionnalités ( MMS ( avec de petits fichiers ) ,GPS,internet) mais pour l’internet j’ai pas réussi non plus a utiliser le pppd

pour info il y a des procédures de connections dans les documents:
. SIM800 Series_AT Command Manual_V1.10.pdf
. SIM800 Series_IP_Application Note_V1.03.pdf
téléchargeable notamment sur simcom.ee ou waveshare.com

avec des commandes AT on peut envoyer/recevoir avec les commande http ou ftp.
Clairement il ne faut pas espérer un débit suffisant pour surfer sur le web …

source:

Merci pour ta réponse ! Je viens de voir dans la doc (https://www.waveshare.com/wiki/GSM/GPRS/GNSS_HAT) que le module SIM868 ne peut utiliser que la 2G…Je pense que c’est donc pour cela que ça ne fonctionne pas … bien dommage !

Je suis cependant curieux de connaître comment tu procèdes pour envoyer des MMS !

ça fait un moment que j’ai écrit ce programme donc il fonctionne en python 2.7
à noter que le fichier envoyer ( une image) fait 6783 octets.
comme je n’ai fais que des tests, le programme ,n’est pas paramétrable ( il est fait pour free - notion d’APN à changer suivant ton opérateur )
le fichier envoyé est:/home/pi/Documents/python_gsm/camille1.jpg
le numéro appelé est +33NNNNNNN
le fichier envoyé est celui là ( si tu utilises un autres il faudra changer la taille ds la ligne:
["AT+CMMSDOWN=\"PIC\",6753,30000,\"camille1.jpg\"\r","","nop"]
camille1

et le programme qui tue :wink:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import serial
import time
import os
from threading import Thread, RLock

verrou = RLock()

_global_variable = {
   'value': "",
}
_global_commande = {
   'value': [],
   'retour': [],
   'action': [],
   'iter': 0,
   'flag': True,
   'fin': False,
}
class entree(Thread):
   """Thread chargé d envoyer la commande """
   def __init__(self, ser):
      Thread.__init__(self)
      self.ser = ser

   def run(self):
      """ code execute """
      print "thread entree\n"
      while _global_commande['fin'] == False:
         time.sleep(2)
         with verrou:
            if _global_commande['flag'] == True:

               if len(_global_commande['value'])  > _global_commande['iter']:
                  _global_variable['value'] = ""
                  
                  if _global_commande['value'][_global_commande['iter']][0:2] == "AT":
                     ser.write(_global_commande['value'][_global_commande['iter']])
                     time.sleep(3)
                  else:
                     exec(_global_commande['value'][_global_commande['iter']])
                  _global_commande['iter'] += 1
                  _global_commande['flag'] = False
               else:
                  _global_commande['fin'] = True  
                  _global_commande['flag'] = True



class sortie(Thread):
   """Thread chargé de lire la reponse du HAT """
   def __init__(self, ser):
      Thread.__init__(self)
      self.ser = ser
   def run(self):
      print "thread sortie\n"
      while _global_commande['fin'] == False:
#         with verrou:
            while _global_commande['flag'] == False:
               while "OK" not in _global_variable['value'] and "ERROR" not in _global_variable['value'] and _global_commande['retour'][_global_commande['iter']-1] not in _global_variable['value']:
                  while ser.inWaiting()>0:
                     _global_variable['value'] = _global_variable['value'] + ser.readline(None)
 
               if _global_commande['action'][_global_commande['iter']-1] != "nop" and _global_commande['retour'][_global_commande['iter']-1] in _global_variable['value']:
                  _global_commande['value'].insert(_global_commande['iter'],_global_commande['action'][_global_commande['iter']-1])
                  _global_commande['retour'].insert(_global_commande['iter'],"nop")
                  _global_commande['action'].insert(_global_commande['iter'],"nop")
               if "ERROR" in _global_variable['value']:
                  _global_commande['fin'] = True
                  print " erreur on arrete !!!\n"
#                  _global_commande['flag'] = False
               _global_commande['flag'] = True
               print "T2 : \n" + _global_variable['value'] + "\n"


#fonction test retour
def test(cherche, res):
   message = ""
   retour = False
   if "OK" in res:
      ok =True
      if cherche in res:
         retour = True
      else:
         retour = False
         message = cherche + " n'est pas dans la réponse"
#         print message 
   else:
      ok = False
      message = "commande en erreur"
   return ok,retour,message


# ouverture connection
ser = serial.Serial("/dev/ttyS0", 9600, timeout=5)

# variables fichier joint
"""
type_fichier = "TEXT"
nom_fichier = "/home/pi/Documents/python_gsm/test1.txt"
if exists(nom_fichier):
   taille_fichier = os.path.getsize(nom_fichier)
   print "la taille du fichier ", nom_fichier," est de ",taille_fichier,"."
else:
   print "le fichier ",nom_fichier," n'existe pas !!!"
   exit(5)
"""
type_fichier = "PIC"
nom_fichier = "/home/pi/Documents/python_gsm/camille1.jpg"
if os.path.isfile(nom_fichier):
   taille_fichier = os.path.getsize(nom_fichier)
   print "la taille du fichier ", nom_fichier," est de ",taille_fichier,"."
else:
   print "le fichier ",nom_fichier," n'existe pas !!!"
   exit(5)
# chargement plusieurs commandes
#liste = [
#["AT+CGATT?\r","nop","nop"],
#["print \"python\"\nser.write(AT\r)","nop","nop"],		apres le code python on attend "OK" dans la reponse du modem grace a la commande AT envoyée au modem 
#["AT+CGACT?\r","+CGACT 1,0","AT+CGACT=1,1\r"],			permet apres un test sur le code retout d executer une action (si "+CGACT 1,0" est ds la reponse on execute "AT+CGACT=1,1\r"
#["AT\r","nop","nop"],						on execute la commande "AT" sans code retout special ni action conditionnée
#["ser.write(\"AT+CMMSDOWN=\"TEXT\",65,30000,\"text1.txt\"\r\")\ntime.sleep(2)\nf = open(\"/home/pi/Documents/text1.txt\",\"r\")\ntout = \"\"\nwhile True:\n  bytes = f.read(1)\n  if bytes == \"\":\n     break;\n  tout = tout + bytes\nf.close()\nser.write(tout\r)"					on execute AT+CMMSDOWN on attend connect et on insert puis on execute action le ser.write envoi le fichier lu au modem
# 								a etoffer avec type de fichier, taille, timeout et nom du fichier en variable						
#]
#format :
#  commande AT ou python a executer
#  code retour attendu
#  action qui devient la commande suivante si code retour trouvé ds la reponse de la commande
#  un code retour et une action entraine donc la creation d une commande suivant la commande en cours si code ds la reponse de la commande
#  un code retour avec une action a "nop" permet juste a la commande de stopper avec un code different de "OK" ou "ERROR" ( CONNECT par exemple)
#  les commande commençant par AT sont envoyées au modem, les autres (code python) sont executées par exec(<commande>)

#["AT+CMMSTERM\r","nop","nop"],
#["AT+CMMSINIT\r","nop","nop"],

liste=[

["AT+CGATT?\r","+CGATT: 0","AT+CGATT=1\r"],
["AT+CGDATA=?\r","nop","nop"],
["AT+CMMSSCONT?\r","nop","nop"],
["AT+CGDCONT?\r","nop","nop"],
["AT+CGACT?\r","+CGACT: 1,0","AT+CGACT=1,1\r"],
["AT+CMMSINIT\r","nop","nop"],
["AT+SAPBR=3,1,\"APN\",\"mmsfree\"\r","nop","nop"],
["AT+SAPBR=1,1\r","nop","nop"],
["AT+CMMSEDIT?\r","+CMMSEDIT: 0","AT+CMMSEDIT=1\r"],
["AT+CMMSDOWN=\"PIC\",6753,30000,\"camille1.jpg\"\r","","nop"],
["f = open(\"/home/pi/Documents/python_gsm/camille1.jpg\",\"r\")\ntout = \"\"\nwhile True:\n  bytes = f.read(1)\n  if bytes == \"\":\n     break;\n  tout = tout + bytes\nf.close()\nser.write(tout\r)\ntime.sleep(3)","nop","nop"],
["AT+CMMSRECP=\"+33NNNNNNN\"\r","nop","nop"],
["AT+CMMSVIEW\r","nop","nop"],
["AT+CMMSSEND\r","nop","time.sleep(5)"],
["AT+CMMSEDIT=0\r","nop","nop"],
["AT+CMMSTERM\r","nop","nop"],
]

for enreg in liste:
#   print enreg[0:1]

   commande = enreg[0:1]
   res = commande[0]
   _global_commande['value'].append(res)
   retour = enreg[1:2]
   res = retour[0]
   _global_commande['retour'].append(res)
   action = enreg[2:3]
   res = action[0]
   _global_commande['action'].append(res)

#print _global_commande

thread_2 = sortie(ser)
thread_1 = entree(ser)

thread_1.start()
thread_2.start()
thread_1.join()
thread_2.join()


#fermeture connection
ser.close()

enfin un truc dont je me souvient plus c’est le resultat de la commande AT+CMMSSCONT? qui donne notamment un profile ( chez moi ;+CMMSPROFILE: « http://wap.huawei.com/uaprof/HuaweiU1250v100GPRS.xml » )
j’avais du trouvé ça là : http://validator.openmobilealliance.org/cgi/validation/profiles.html
je me souviens plus si c’est utile ou non de définir un tel profile :roll_eyes:

bien sur il faut avant d’exécuter ne pas démarrer gammu et envoyer le code pin pour connecter le réseau.
have fun :wink:

Super, merci beaucoup pour ton partage, je vais étudier cette piste :slight_smile:

Salut !

Pour ta petite information, j’ai réussi à configurer PPPD pour avoir de la connexion…enfin c’est vite dit !

J’arrive a ping des adresses IP mais pas de noms de domaine, j’imagine donc qu’il y a un problème de DNS que je n’ai pas réussi à solver pour le moment. Il faut également que je comprenne comment « assigner » cette connexion au RPi car rien n’apparait dans mes interfaces réseau (comme pour connecter un wifi par ex…).

Je ne sais pas si tu avais été dans le même cas que moi ?
Bonne journée !

tu as piqué ma curiosité et j’ai donc finit par avoir une page web sur mon vieil rpi3 (buster) via pppd avec une SIM free …
1/ creer /etc/chatscripts/gprs :

# a coller ds /etc/chatscripts/gprs
# You can use this script unmodified to connect to cellular networks.
# The APN is specified in the peers file as the argument of the -T command
# line option of chat(8).

# For details about the AT commands involved please consult the relevant
# standard: 3GPP TS 27.007 - AT command set for User Equipment (UE).
# (http://www.3gpp.org/ftp/Specs/html-info/27007.htm)

ABORT           BUSY
ABORT           VOICE
ABORT           "NO CARRIER"
ABORT           "NO DIALTONE"
ABORT           "NO DIAL TONE"
ABORT           "NO ANSWER"
ABORT           "DELAYED"
ABORT           "ERROR"

# cease if the modem is not attached to the network yet
ABORT           "+CGATT: 0"

""              AT
TIMEOUT         12
OK              ATH
OK              ATE1

# +CPIN provides the SIM card PIN
#OK             "AT+CPIN=1234"
# +CFUN may allow to configure the handset to limit operations to
# GPRS/EDGE/UMTS/etc to save power, but the arguments are not standard
# except for 1 which means "full functionality".
#OK             AT+CFUN=1
#OK             AT+CGDCONT=1,"IP","free","0.0.0.0",0,0

OK              AT+CGDCONT=1,"IP","free"
OK              ATD*99#
TIMEOUT         22
CONNECT         ""

2/ creer /etc/ppp/peers/gprs :

#
# a coller ds /etc/ppp/peers/gprs
#
# This optionfile was generated by pppconfig 2.3.18.
#
#
#hide-password
user "free@free"
connect "/usr/sbin/chat -v -f /etc/chatscripts/gprs"
/dev/ttyS0
115200
nocrtscts
debug

nodetach
ipcp-accept-local
ipcp-accept-remote
noipdefault
usepeerdns
defaultroute
#persist
noauth

3/ activer le code pin

4/ sudo pppd call gprs &
si ça plante une fois ne pas hesiter à relancer …
normalement si ça marche tu as une ip sur ppp0

5/ sudo route add -net 0.0.0.0 ppp0
la route par defaut qui permet d’atteindre le web via ppp0

6/ et là on arrive a ouvrir une page ! ( un coup de retro ! c’est a peut près la vitesse de connexion des vieux modem RTC année 90 :wink: )

J’arrive au même endroit que toi, quand je fais ifconfig j’ai bien ppp0 avec une IP ! Mais impossible d’atteindre une page web :confused:
Quand pppd se lance, il y apparait bien les DNS free pourtant… j’ai essayé en modifiant resolv.conf par plusieurs DNS possibles mais sans succès …

bizarre ! normalement l’option usepeerdns est censée créer les 2 DNS, fournit par le FAI ,dans le fichier /etc/ppp/resolv.conf
(je suppose que cette option est lié à noipdefault, ipcp-accept-local et ipcp-accept-remote)
dans mon /var/log/syslog j’ai ça :

pppd[2401]: sent [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
pppd[2401]: sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
pppd[2401]: rcvd [IPCP ConfReq id=0x1 <addr 192.168.254.254>]
pppd[2401]: sent [IPCP ConfAck id=0x1 <addr 192.168.254.254>]
pppd[2401]: rcvd [LCP ProtRej id=0x0 80 fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
pppd[2401]: Protocol-Reject for 'Compression Control Protocol' (0x80fd) received
pppd[2401]: rcvd [IPCP ConfRej id=0x1 <compress VJ 0f 01>]
pppd[2401]: sent [IPCP ConfReq id=0x2 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
pppd[2401]: rcvd [IPCP ConfNak id=0x2 <addr 10.155.181.196> <ms-dns1 212.27.40.240> <ms-dns2 212.27.40.241>]
pppd[2401]: sent [IPCP ConfReq id=0x3 <addr 10.155.181.196> <ms-dns1 212.27.40.240> <ms-dns2 212.27.40.241>]
pppd[2401]: rcvd [IPCP ConfAck id=0x3 <addr 10.155.181.196> <ms-dns1 212.27.40.240> <ms-dns2 212.27.40.241>]
pppd[2401]: not replacing default route to eth0 [192.168.3.1]
pppd[2401]: local  IP address 10.155.181.196
pppd[2401]: remote IP address 192.168.254.254
pppd[2401]: primary   DNS address 212.27.40.240
pppd[2401]: secondary DNS address 212.27.40.241
pppd[2401]: Script /etc/ppp/ip-up started (pid 2411)
NetworkManager[509]: <info>  [1662480709.8689] device (ppp0): state change: unmanaged -> unavailable (reason 'connection-assumed', sys-iface-state: 'external')
NetworkManager[509]: <info>  [1662480709.8800] device (ppp0): state NetworkManagechange: unavailable -> disconnected (reason 'none', sys-iface-state: 'external')
pppd[2401]: Script /etc/ppp/ip-up finished (pid 2411), status = 0x0

j’imagine que tu dois pas avoir tout à fait la même chose ! sur NetworkManager peut être ?

aucun rapport avec ton problème ,mais pour info, en rajoutant :

defaultroute
replacedefaultroute

ds /etc/ppp/peers/gprs, pppd remplace la default route par celle sur ppp0.

C’est vraiment bizarre, j’ai l’impression d’avoir la même chose que toi…

Aug 26 01:41:40 raspberrypi pppd[1111]: sent [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
Aug 26 01:41:40 raspberrypi pppd[1111]: sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
Aug 26 01:41:40 raspberrypi pppd[1111]: sent [IPV6CP ConfReq id=0x1 <addr fe80::c13d:7d24:8575:fe96>]
Aug 26 01:41:40 raspberrypi kernel: [  273.526965] PPP Deflate Compression module registered
Aug 26 01:41:40 raspberrypi pppd[1111]: rcvd [LCP EchoRep id=0x0 magic=0x0]
Aug 26 01:41:40 raspberrypi pppd[1111]: rcvd [IPCP ConfReq id=0x1 <addr 192.168.254.254>]
Aug 26 01:41:40 raspberrypi pppd[1111]: sent [IPCP ConfAck id=0x1 <addr 192.168.254.254>]
Aug 26 01:41:40 raspberrypi pppd[1111]: rcvd [LCP ProtRej id=0x0 80 fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
Aug 26 01:41:40 raspberrypi pppd[1111]: Protocol-Reject for 'Compression Control Protocol' (0x80fd) received
Aug 26 01:41:40 raspberrypi pppd[1111]: rcvd [IPCP ConfRej id=0x1 <compress VJ 0f 01>]
Aug 26 01:41:40 raspberrypi pppd[1111]: sent [IPCP ConfReq id=0x2 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
Aug 26 01:41:40 raspberrypi pppd[1111]: rcvd [LCP ProtRej id=0x0 80 57 01 01 00 0e 01 0a c1 3d 7d 24 85 75 fe 96]
Aug 26 01:41:40 raspberrypi pppd[1111]: Protocol-Reject for 'IPv6 Control Protocol' (0x8057) received
Aug 26 01:41:42 raspberrypi kernel: [  274.951049] hwmon hwmon1: Undervoltage detected!
Aug 26 01:41:43 raspberrypi pppd[1111]: sent [IPCP ConfReq id=0x2 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
Aug 26 01:41:46 raspberrypi pppd[1111]: sent [IPCP ConfReq id=0x2 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
Aug 26 01:41:46 raspberrypi pppd[1111]: rcvd [IPCP ConfNak id=0x2 <addr 10.12.21.9> <ms-dns1 212.27.40.240> <ms-dns2 212.27.40.241>]
Aug 26 01:41:46 raspberrypi pppd[1111]: sent [IPCP ConfReq id=0x3 <addr 10.12.21.9> <ms-dns1 212.27.40.240> <ms-dns2 212.27.40.241>]
Aug 26 01:41:46 raspberrypi pppd[1111]: rcvd [IPCP ConfAck id=0x3 <addr 10.12.21.9> <ms-dns1 212.27.40.240> <ms-dns2 212.27.40.241>]
Aug 26 01:41:46 raspberrypi pppd[1111]: Script /etc/ppp/ip-pre-up started (pid 1131)
Aug 26 01:41:46 raspberrypi pppd[1111]: Script /etc/ppp/ip-pre-up finished (pid 1131), status = 0x0
Aug 26 01:41:46 raspberrypi pppd[1111]: local  IP address 10.12.21.9
Aug 26 01:41:46 raspberrypi NetworkManager[452]: <info>  [1661470906.7460] device (ppp0): state change: unmanaged -> unavailable (reason 'connection-assumed', sys-iface-state: 'external')
Aug 26 01:41:46 raspberrypi pppd[1111]: remote IP address 192.168.254.254
Aug 26 01:41:46 raspberrypi pppd[1111]: primary   DNS address 212.27.40.240
Aug 26 01:41:46 raspberrypi pppd[1111]: secondary DNS address 212.27.40.241
Aug 26 01:41:46 raspberrypi pppd[1111]: Script /etc/ppp/ip-up started (pid 1134)
Aug 26 01:41:46 raspberrypi NetworkManager[452]: <info>  [1661470906.7604] device (ppp0): state change: unavailable -> disconnected (reason 'none', sys-iface-state: 'external')
Aug 26 01:41:46 raspberrypi pppd[1111]: Script /etc/ppp/ip-up finished (pid 1134), status = 0x0

Les DNS sont identiques également…

Merci pour le tip ! Ca évite la commande « sudo route add -net 0.0.0.0 ppp0 » si j’ai bien compris ?

Merci de prendre le temps de m’aider ! :wink:

EDIT: si cela peut t’aider, quand je fais « nmcli device », ppp0 est en mode déconnecté (wlan0 et eth0 sont en mode indisponibles et lo est en mode non-géré…
Je précise également que quand j’éteints le module, la page web affiche aucun accès internet (avec le petit dinosaure), et lorsque le module est allumé avec pppd, la page affiche " ce site est inaccessible…" (donc pas la même page, il a donc bien quelque chose qui se passe lorsque je me connecte avec PPD