Dongle 4G fonctionnel et pas cher à base de Quectel BG96

Bonjour,

J’utilisais depuis un moment un module SIM800C pour envoyer des SMS depuis Jeedom, mais du jour au lendemain, impossible de le faire fonctionner. Après plusieurs recherches, j’ai suspecté que mon opérateur de carte SIM avait coupé le réseau 2G dans ma région.

Je suis donc parti à la recherche d’une solution compatible 4G, mais comme beaucoup, j’ai d’abord eu peu de succès avec des dongles Huawei.

Heureusement, grâce à skwat (un grand merci à lui !), j’ai pu installer une alternative qui fonctionne parfaitement du premier coup.

Il avait donné des infos ici : https://community.jeedom.com/t/cle-sms-4g/91914/42 et m’a donné des conseils pour créer une règle udev afin de créer un lien symbolique /dev/ttyUSB_GSM pointant vers l’interface série du dongle 4G qui permet d’identifier le dongle de manière stable (même si /dev/ttyUSBx venait à changer au rédémarrage).

J’ai donc acheté un dongle 4G et je l’ai installé avec succès, voilà comment j’ai procédé.

Il s’agit du modèle BG96 que l’on trouve sur aliexpress ici :
Dongle USB 4G LTE BG96, Communication globale, Modem Portable, prise en charge GPS Cat M1 nb-iot EGPRS BG96MA-128-SGN

Il faut prendre le modèle avec la grande antenne 4G noire (TS9 LTE Antenna).
Capture d’écran 2025-06-18 100650

L’antenne se branche, avec l’adaptateur fourni, sur la prise de gauche :
AntennaLTEplug

Il faut insérer la carte nano SIM dans ce sens :
SIM

Une fois que vous aurez branché le dongle, il devrait y avoir une led bleue qui clignote.

Vous pouvez alors passer à la configuration logicielle.

Pour vérifier la détection de la clé, vous pouvez taper la ligne de commande suivante :

ls -l /dev/serial/by-id

Vous devriez voir plusieurs ports USB de type :
usb-Quectel__Incorporated_Quectel_fbd748b2-if00-port0

Notez bien la valeur avant if00 qui correspond à l’id du port série (chez moi c’est fbd748b2).

Le port /dev/ttyUSBx peut changer à chaque redémarrage, ce qui peut perturber le plugin Jeedom. Pour éviter ça, on va créer un lien symbolique fixe /dev/ttyUSB_GSM.

Pour cela, il faut créer un fichier de règle udev comme ceci :

sudo nano /etc/udev/rules.d/99-dongle-lte.rules

Vous mettez le texte suivant dans le fichier :

SUBSYSTEM!="tty", GOTO="serial_end"

SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
SUBSYSTEMS=="pci", ENV{ID_BUS}=="", ENV{ID_BUS}="pci", \
  ENV{ID_VENDOR_ID}="$attr{vendor}", ENV{ID_MODEL_ID}="$attr{device}", \
  IMPORT{builtin}="hwdb --subsystem=pci"

KERNEL!="ttyUSB[0-9]", GOTO="serial_end"

ENV{ID_VENDOR_ID}!="2c7c", GOTO="serial_end"
ENV{ID_MODEL_ID}!="0296", GOTO="serial_end"
ENV{ID_SERIAL_SHORT}!="fbd748b2", GOTO="serial_end"
ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="ttyUSB_GSM"

LABEL="serial_end"

Pensez à changer la valeur du paramètre ID_SERIAL_SHORT et remplacer par celle que vous aurez notée précédemment (dans l’exemple c’est fbd748b2).

Enregistrez le fichier (control+O), quittez l’éditeur, puis rechargez les règles udev comme ceci en deux lignes de commandes :

sudo udevadm control --reload-rules

puis

sudo udevadm trigger

Maintenant, avec la commande

ls -l /dev/ttyUSB_GSM

vous devriez voir quelque chose du type

/dev/ttyUSB_GSM -> ttyUSB3

Vous n’avez maintenant plus qu’à configurer le plugin SMS de Jeedom. Vous pouvez utiliser /dev/ttyUSB_GSM comme port SMS.

Je vous partage ma configuration du plugin avec une carte SIM de chez SOSH à 1,99€ par mois.

N’oubliez pas :

  • de renseigner le code PIN de la SIM.
  • d’indiquer le bon numéro du SMS Center (SMSC) :
    • Orange +33689004000
    • SFR +33609001390
    • Bouygues Télécom +33660003000
    • Free +33695000900

Tout fonctionne parfaitement chez moi, sous Jeedom sur Proxmox.
Encore merci à skwat pour son aide précieuse :blush:

13 « J'aime »

Merci, dongle commandé.

1 « J'aime »

tu pourras me faire un retour sur le tuto ci-dessus quand tu as pu faire l’installation ?

1 « J'aime »

Très bon tuto

Merci

1 « J'aime »


En me servant de l’autre connecteur DATA, je n’ai pas eu besoin d’adaptateur.

J’ai fait des tests avec une carte SIM Free mais elle ne se connectait pas au réseau (['+CREG: 0,2', 'OK']).
Par contre, pas de problème avec une carte SIM Bouygues Télécom (['+CREG: 0,1', 'OK']).
J’ai donc pris un abonnement à 1,99/mois sur le réseau Bouygues Télécom.

La réception est tellement bonne que l’antenne "papier" fournie avec le dongle est suffisante.


Capture d’écran du 2025-06-21 12-53-18
Sinon merci pour ton tuto qui permet de faire rapidement l’installation.
Merci aussi pour la découverte de ce dongle.

1 « J'aime »

Juste pour info, il parait que certains opérateurs, s’ils constatent que la carte SIM est toujours sur le réseau et qu’il n’est pas détecté de déplacement (comme avec un Smartphone que l’on a sur soit et qu’on se déplace) ; celui-ci peut suspendre la ligne pour utilisation non conforme.

Pour être sur d’avoir une continuité de service, il vaut mieux avoir une offre en M2M.

Sinon, de temps en temps ; il faut mettre la carte SIM dans un smartphone et aller faire un tour avec pour provoqué un changement de relais.

Merci pour l’info et de l’existence de ce dongle 4G en tout cas !!

Quelques docs sur la puce Quectel BG96.

Quectel_BG96_AT_Commands_Manual_V2.5.pdf (1,2 Mo)
Quectel_BG96_MQTT_Application_Note_V1.0.pdf (471,4 Ko)
Quectel_BG96_Firmware_Release_Notes_V0207_01.200.01.200.pdf (912,4 Ko)
Quectel_BG96_Firmware_Release_Notes_V0207_01.201.01.201.pdf (933,7 Ko)
Quectel_BG96_Firmware_Release_Notes_V0207_01.202.01.202.pdf (894,6 Ko)
Quectel_BG96_Firmware_Release_Notes_V0207_01.300.01.300.pdf (1,4 Mo)

1 « J'aime »

Bonjour,

Ca faisait longtemps que je cherchais une alternative à la clé 2G.

J’étais parti sur une solution avec box 4G Huawei, mais ça n’est qu’à moitié satisfaisant.

Du coup, je pense que je vais tester cette clé 4G.

Par contre, petite question : serait-il possible d’exploiter la data pour commuter sur la 4G en cas de coupure internet ?

Pour les dev python.

je ne l’utilise que pour les SMS, je n’ai pas étudié la question pour en faire un modem 4G

Depuis quelque jours j’ai une erreur 500 à l’envoi des SMS.

J’utilise une carte SIM free, ma config n’a pas bougé depuis des siècles, le log de debug ne remonte pas d’erreur, sauf au moment de l’envoi

Précision, aucun problème avec ma sim orange.

Ça vous dit qq chose ?

[2025-07-29 20:11:55][INFO] : Start smsd
[2025-07-29 20:11:55][INFO] : Log level : debug
[2025-07-29 20:11:55][INFO] : Socket port : 55002
[2025-07-29 20:11:55][INFO] : Socket host : 127.0.0.1
[2025-07-29 20:11:55][INFO] : PID file : /tmp/jeedom/sms/deamon.pid
[2025-07-29 20:11:55][INFO] : Device : /dev/ttyUSB_GSM
[2025-07-29 20:11:55][INFO] : Callback : http://127.0.0.1:80/plugins/sms/core/php/jeeSMS.php
[2025-07-29 20:11:55][INFO] : Cycle : 30.0
[2025-07-29 20:11:55][INFO] : Serial rate : 115200
[2025-07-29 20:11:55][INFO] : Pin :
[2025-07-29 20:11:55][INFO] : Text mode : no
[2025-07-29 20:11:55][INFO] : SMSC : None
[2025-07-29 20:11:55][DEBUG] : Writing PID 3861360 to /tmp/jeedom/sms/deamon.pid
[2025-07-29 20:11:55][DEBUG] : Init request module v2.32.4
[2025-07-29 20:11:55][DEBUG] : Starting new HTTP connection (1): 127.0.0.1:80
[2025-07-29 20:11:55][DEBUG] : http://127.0.0.1:80 "GET /plugins/sms/core/php/jeeSMS.php?apikey=xjhMIrFPlhXfRrL3K6KQHxQfnZf7DiuhscOjgyD0qYrDisfhdqydu4T9GGRc37R1 HTTP/1.1" 200 0
[2025-07-29 20:11:55][DEBUG] : Socket interface started
[2025-07-29 20:11:55][DEBUG] : LoopNetServer Thread started
[2025-07-29 20:11:55][DEBUG] : Start listening...
[2025-07-29 20:11:55][DEBUG] : Listening on: [127.0.0.1:55002]
[2025-07-29 20:11:55][DEBUG] : Connecting to GSM Modem...
[2025-07-29 20:11:55][DEBUG] : Text mode false
[2025-07-29 20:11:55][DEBUG] : Enter pin code : 
[2025-07-29 20:11:55][INFO] : Connecting to modem on port /dev/ttyUSB_GSM at 115200bps
[2025-07-29 20:11:55][DEBUG] : write: AT
[2025-07-29 20:11:55][DEBUG] : response: ['OK']
[2025-07-29 20:11:55][DEBUG] : write: ATZ
[2025-07-29 20:11:55][DEBUG] : response: ['OK']
[2025-07-29 20:11:55][DEBUG] : write ATZ done
[2025-07-29 20:11:55][DEBUG] : write: ATE0
[2025-07-29 20:11:55][DEBUG] : response: ['ATE0\r', 'OK']
[2025-07-29 20:11:55][DEBUG] : write: AT+CFUN?
[2025-07-29 20:11:55][DEBUG] : response: ['+CFUN: 1', 'OK']
[2025-07-29 20:11:55][DEBUG] : write: AT+CMEE=1
[2025-07-29 20:11:55][DEBUG] : response: ['OK']
[2025-07-29 20:11:55][DEBUG] : write: AT+CPIN?
[2025-07-29 20:11:55][DEBUG] : response: ['+CPIN: READY', 'OK']
[2025-07-29 20:11:55][DEBUG] : write: AT+CLAC
[2025-07-29 20:12:05][DEBUG] : write: AT
[2025-07-29 20:12:05][DEBUG] : response: ['OK']
[2025-07-29 20:12:05][DEBUG] : write: AT^CVOICE=?
[2025-07-29 20:12:05][DEBUG] : response: ['ERROR']
[2025-07-29 20:12:05][DEBUG] : write: AT+VTS=?
[2025-07-29 20:12:05][DEBUG] : response: ['ERROR']
[2025-07-29 20:12:05][DEBUG] : write: AT^DTMF=?
[2025-07-29 20:12:05][DEBUG] : response: ['ERROR']
[2025-07-29 20:12:05][DEBUG] : write: AT^USSDMODE=?
[2025-07-29 20:12:05][DEBUG] : response: ['ERROR']
[2025-07-29 20:12:05][DEBUG] : write: AT+WIND=?
[2025-07-29 20:12:05][DEBUG] : response: ['ERROR']
[2025-07-29 20:12:05][DEBUG] : write: AT+ZPAS=?
[2025-07-29 20:12:05][DEBUG] : response: ['ERROR']
[2025-07-29 20:12:05][DEBUG] : write: AT+CSCS=?
[2025-07-29 20:12:05][DEBUG] : response: ['+CSCS: ("IRA","GSM","UCS2")', 'OK']
[2025-07-29 20:12:05][DEBUG] : write: AT+CNUM=?
[2025-07-29 20:12:05][DEBUG] : response: ['OK']
[2025-07-29 20:12:05][DEBUG] : write: AT+CGMI
[2025-07-29 20:12:05][DEBUG] : response: ['Quectel', 'OK']
[2025-07-29 20:12:05][DEBUG] : write: AT+CGMI
[2025-07-29 20:12:05][DEBUG] : response: ['Quectel', 'OK']
[2025-07-29 20:12:05][DEBUG] : write: AT+ZPAS?
[2025-07-29 20:12:05][DEBUG] : response: ['ERROR']
[2025-07-29 20:12:05][INFO] : Unknown/generic modem type - will use polling for call state updates
[2025-07-29 20:12:05][DEBUG] : write: AT+COPS=3,0
[2025-07-29 20:12:05][DEBUG] : response: ['OK']
[2025-07-29 20:12:05][DEBUG] : write: AT+CMGF=0
[2025-07-29 20:12:05][DEBUG] : response: ['OK']
[2025-07-29 20:12:05][DEBUG] : write: AT+CSCA?
[2025-07-29 20:12:05][DEBUG] : response: ['+CSCA: "33695000900",129', 'OK']
[2025-07-29 20:12:05][DEBUG] : write: AT+CSMP=49,167,0,0
[2025-07-29 20:12:05][DEBUG] : response: ['OK']
[2025-07-29 20:12:05][DEBUG] : write: AT+CSCA?
[2025-07-29 20:12:05][DEBUG] : response: ['+CSCA: "33695000900",129', 'OK']
[2025-07-29 20:12:05][DEBUG] : write: AT+CPMS=?
[2025-07-29 20:12:05][DEBUG] : response: ['+CPMS: ("ME","MT","SM","SR"),("ME","MT","SM","SR"),("ME","MT","SM","SR")', 'OK']
[2025-07-29 20:12:05][DEBUG] : write: AT+CPMS="ME","ME","ME"
[2025-07-29 20:12:05][DEBUG] : response: ['+CPMS: 0,23,0,23,0,23', 'OK']
[2025-07-29 20:12:05][DEBUG] : write: AT+CNMI=2,1,0,2
[2025-07-29 20:12:05][DEBUG] : response: ['OK']
[2025-07-29 20:12:05][DEBUG] : write: AT+CLIP=1
[2025-07-29 20:12:05][DEBUG] : response: ['ERROR']
[2025-07-29 20:12:05][WARNING] : Incoming call calling line identification (caller ID) not supported by modem. Error: AT+CLIP=1
[2025-07-29 20:12:05][DEBUG] : write: AT+CVHU=0
[2025-07-29 20:12:05][DEBUG] : response: ['ERROR']
[2025-07-29 20:12:05][DEBUG] : Waiting for network...
[2025-07-29 20:12:05][DEBUG] : write: AT+CREG?
[2025-07-29 20:12:05][DEBUG] : response: ['+CREG: 0,5', 'OK']
[2025-07-29 20:12:06][DEBUG] : write: AT+CSQ
[2025-07-29 20:12:06][DEBUG] : response: ['+CSQ: 27,99', 'OK']
[2025-07-29 20:12:06][DEBUG] : Ok
[2025-07-29 20:12:06][DEBUG] : write: AT+COPS?
[2025-07-29 20:12:06][DEBUG] : response: ['+COPS: 0,0,"Free Free",0', 'OK']
[2025-07-29 20:12:06][DEBUG] : Send to jeedom :  {'number': 'network_name', 'message': 'Free Free'}
[2025-07-29 20:12:06][DEBUG] : Starting new HTTP connection (1): 127.0.0.1:80
[2025-07-29 20:12:06][DEBUG] : write: AT+CPMS="ME","ME","ME"
[2025-07-29 20:12:06][DEBUG] : response: ['+CPMS: 0,23,0,23,0,23', 'OK']
[2025-07-29 20:12:06][DEBUG] : write: AT+CMGD=1,4
[2025-07-29 20:12:06][DEBUG] : http://127.0.0.1:80 "POST /plugins/sms/core/php/jeeSMS.php?apikey=xjhMIrFPlhXfRrL3K6KQHxQfnZf7DiuhscOjgyD0qYrDisfhdqydu4T9GGRc37R1 HTTP/1.1" 200 0
[2025-07-29 20:12:06][DEBUG] : response: ['OK']
[2025-07-29 20:12:06][DEBUG] : write: AT+CPMS="SM","SM","SM"
[2025-07-29 20:12:06][DEBUG] : response: ['+CPMS: 0,100,0,100,0,100', 'OK']
[2025-07-29 20:12:06][DEBUG] : write: AT+CMGD=1,4
[2025-07-29 20:12:06][DEBUG] : response: ['OK']
[2025-07-29 20:12:28][DEBUG] : Client connected to [127.0.0.1:46344]
[2025-07-29 20:12:28][DEBUG] : Message read from socket: b'{"apikey":"xjhMIrFPlhXfRrL3K6KQHxQfnZf7DiuhscOjgyD0qYrDisfhdqydu4T9GGRc37R1","number":"0612785419","message":"Test"}'
[2025-07-29 20:12:28][DEBUG] : Client disconnected from [127.0.0.1:46344]
[2025-07-29 20:12:36][DEBUG] : write: AT+CREG?
[2025-07-29 20:12:36][DEBUG] : response: ['+CREG: 0,5', 'OK']
[2025-07-29 20:12:37][DEBUG] : write: AT+CSQ
[2025-07-29 20:12:37][DEBUG] : response: ['+CSQ: 27,99', 'OK']
[2025-07-29 20:12:37][DEBUG] : write: AT+CMGL=0
[2025-07-29 20:12:37][DEBUG] : response: ['OK']
[2025-07-29 20:12:37][DEBUG] : write: AT+CSQ
[2025-07-29 20:12:37][DEBUG] : response: ['+CSQ: 27,99', 'OK']
[2025-07-29 20:12:37][DEBUG] : write: AT+CSQ
[2025-07-29 20:12:37][DEBUG] : response: ['+CSQ: 27,99', 'OK']
[2025-07-29 20:12:37][DEBUG] : write: AT+CSQ
[2025-07-29 20:12:37][DEBUG] : response: ['+CSQ: 27,99', 'OK']
[2025-07-29 20:12:37][DEBUG] : Send to jeedom :  {'number': 'signal_strength', 'message': '27'}
[2025-07-29 20:12:37][DEBUG] : Message received in socket JEEDOM_SOCKET_MESSAGE
[2025-07-29 20:12:37][DEBUG] : write: AT+CREG?
[2025-07-29 20:12:37][DEBUG] : Starting new HTTP connection (1): 127.0.0.1:80
[2025-07-29 20:12:37][DEBUG] : response: ['+CREG: 0,5', 'OK']
[2025-07-29 20:12:37][DEBUG] : http://127.0.0.1:80 "POST /plugins/sms/core/php/jeeSMS.php?apikey=xjhMIrFPlhXfRrL3K6KQHxQfnZf7DiuhscOjgyD0qYrDisfhdqydu4T9GGRc37R1 HTTP/1.1" 200 0
[2025-07-29 20:12:38][DEBUG] : write: AT+CSQ
[2025-07-29 20:12:38][DEBUG] : response: ['+CSQ: 27,99', 'OK']
[2025-07-29 20:12:38][INFO] : Envoi d'un message à 06xxxxxxxxx: Test
[2025-07-29 20:12:38][DEBUG] : write: AT+CSCS=?
[2025-07-29 20:12:38][DEBUG] : response: ['+CSCS: ("IRA","GSM","UCS2")', 'OK']
[2025-07-29 20:12:38][DEBUG] : write: AT+CSCS="GSM"
[2025-07-29 20:12:38][DEBUG] : response: ['OK']
[2025-07-29 20:12:38][DEBUG] : write: AT+CMGS=16
[2025-07-29 20:12:38][DEBUG] : response: ['> ']
[2025-07-29 20:12:38][DEBUG] : write: 0021000AA16021874591000004D4F29C0E
[2025-07-29 20:12:40][DEBUG] : response: ['+CMS ERROR: 500']
[2025-07-29 20:12:40][ERROR] : CMS 500
[2025-07-29 20:13:10][DEBUG] : write: AT+CREG?
[2025-07-29 20:13:10][DEBUG] : response: ['+CREG: 0,5', 'OK']
[2025-07-29 20:13:11][DEBUG] : write: AT+CSQ

Bonjour skwat
ça ne me dit rien mais j’ai eu un soucis récemment quand j’ai changé ma carte SIM (je n’ai pas changé d’opérateur, juste de carte SIM Orange). J’ai eu l’impression d’avoir des problèmes de contact dans le slot d’accueil de la carte SIM : j’ai refait plusieurs fois des tests en enlevant et remettant la carte SIM, en réinstallant le plugin et redémarrant Jeedom et même mon serveur proxmox.
Maintenant tout est revenu dans l’ordre mais je n’ai pas d’explication évidente.

Bonjour,

Dongle 4g fonctionnel chez moi, et même pas besoin dans mon cas de créer un lien pour le mapping du port USB car je suis sur une VM Proxmox et c’est fait par celle-ci.

En revanche, j’aurais une question : Y a-t-il moyen de lancer un appel téléphonique via ce dongle ?
Je m’explique : mon jeedom gère mon alarme et m’envoie des SMS en cas d’intrusion. Le souci c’est que mon tel est configuré pour ne pas me déranger la nuit. Par contre, je peux mettre un numéro de téléphone en prioritaire en cas d’appel téléphonique pour outrepasser ce mode ne pas déranger… pratique pour une alarme.

J’ai changé le numéro de passerelle par +33695000695 et ça refonctionne.

Pourquoi donner sont numéro de portable sur le net?

C est pas mon numéro portable, je suis pas c…c’est le numéro de la passerelle SMS pour free.