Git Product home page Git Product logo

asterisk-dongle-setup's Introduction

Asterisk-dongle-setup

This project aims at wiring together many pieces of Linux software required to do the following:

  • Receive SMS messages and forward them to a Telegram chat.
  • Receive GSM voice calls and forward them to Telegram voice calls.
  • Forward outgoing voice calls from Telegram back to GSM.
  • Handle some incoming voice calls with a Lenny prank bot.
  • Voice room with a chat bot.

Specifically, the setup includes Asterisk server with the GSM-modem dongle and tg2sip bridge and many other components glued together with Shell and Python scripts. The high degree of build automation is achieved thanks to the Nix package manager.

Scheme

Contents

  1. Contents
  2. Setup
  3. Usage
  4. Hardware notes
  5. Known issues
  6. Thirdparty issues
  7. Administration hints
  8. References

Setup

Walkthrough

  1. Install Nix package manager and update Nixpkgs repositories. This whole project is designed as a collection of nix-build expressions.

    • Note that Nix could co-exist with your native package manager.
    • We use 21.05 Nixpkgs branch commit as a base, but older 20.03 commits should also work.
  2. Go and get a GSM modem.

    Modem E173

    You need to find a supported GSM modem and plug it into the USB port of your computer. We tested Huawei-E173 only, but in theory any model supported by chan_dongle should work.

    • A somewhat outdated document about supported hardware is available here. We typically do care about Voice and SMS functions and don't care about USSD.
    • ./run.sh will check for the presence of /dev/ttyUSB0. If it is not present, the script would attempt to run the usb_modeswitch procedure.
    • Currently we automate switching only for Huawei E173 modem. For other models, try to follow the section about manual mode-switching.
  3. git clone --recursive <this-repo-url> ; cd ...

  4. Create ./secrets.nix file by copying and editing ./secrets_template.nix.

    • You need a mobile phone which is bound to some Telegram account.
    • Go to https://my.telegram.org/auth and register an API Client instance. You will be provided with api_id and api_hash values.
    • The bot token field is not currently used.
    • The Chat id field is a (typically negative) identifier of a chat to send SMS messages to. ./run.sh will print available chat identifiers at some point during the startup.
  5. Please be informed that the main script ./run.sh is VERY INSECURE. It configures Asterisk to use binary codec and then runs it as root.

  6. If you are OK with the above notice, run ./run.sh.

    • The script asks Nix to (re-)build everything that is required.
    • At first run script will initialize Telegram session for python relay script.
      • As a part of initialization, Telegram server will send a digital code to your Telegram account.
      • You are to type this code back into the script.
    • At first run the script will also initialize another Telegram session, this time for tg2sip (TODO: find out how to reuse the first session).
      • It will ask you a phone number with Telegram account.
      • Telegram will send a code to your account. You have to read it and type it back into the script.
    • At every run, the script runs a number of background services including the Asteris ARI client, SMS spool script, tg2sip application etc.
    • Finally, the Asterisk is run in foreground. You should see its *CLI> console prompt and be able type commands.
  7. ???

  8. Check the Usage section.

Doing USB Modeswitch manually

run.sh attempts to run usb_modeswitch procedure automatically for devices known to author. In case the procedure fails, one could attempt the manual way:

  1. nix-build -A usb_modeswitch.
  2. lsusb to find out your modem's vendor:product numbers
  3. sudo ./result/usr/sbin/usb_modeswitch -v <vendor> -p <product> -X
  4. /dec/ttyUSB[01] devices should appear. You should be able to minicom -D /dev/ttyUSB0 and type some AT command, say ATI.
  5. Update run.sh script by adding new line like below to the corresponding place
    try_to_deal_with "<your_device_id>" "<your_device_vendor>" && wait_for_chardev "/dev/ttyUSB0"
    
  6. Send us a PR with it.

Nix-shell

Author uses VIM as the main development IDE. The start procedure is as follows:

$ nix-shell
(nix-shell) $ vim .   # Edit sources enjoying code navigaiton
(nix-shell) $ ipython # Testing telethon bot, etc

Usage

  • To send SMS from the GSM modem, use the Asterisk CLI: dongle sms dongle0 89097777777 HiHi.
  • Send SMS or make a call to your GSMmodem SIM card's number. Asterisk will redirect the call to your Telegram account.
    • For voice calls, If you pick up the phone from your Telegram account (the green button), the GSM-to-Telegram connection will be established.
    • If you cancel the call by pressing the red button instead, the caller will be handled by the brave Lenny chatbot.
    • In either case, Asterisk will record the call and send the recording to the Telegram account as wav attachments.
  • From a thirdparty telegram account call to the account associated with secrets.telegram_phone, then go to the private chat and send a message with a phone number to call to. Asterisk will initiate an outgoing call from your Telegram account to the GSM network.

Hardware notes

We use the following USB dongle:

*CLI> dongle show devices
ID           Group State      RSSI Mode Submode Provider Name  Model      Firmware          IMEI             IMSI             Number
dongle0      0     Free       9    0    0       Beeline        E173       11.126.85.00.209  ***************  ***************  Unknown

See also somewhat outdated list of supported devices

Known issues

  • tg2sip calls seems are not working properly. GSM callers hear themselves but can't hear the telegram side. Softphone calls works fine.

Thirdparty issues

Administration hints

Ulaw audio operations:

  • Converting 3gpp to ulaw: ./3gpp2ulaw.sh
  • Playing ulaw file: aplay -t raw -f MU_LAW <FILE>

Cutting last x seconds from an audio file

cutlast() {
  ffmpeg -i "$2" -ss 0 -to $(echo $(ffprobe -i "$2" -show_entries format=duration -v quiet -of csv="p=0") - "$1" | bc) -c copy "$3"
}

Clearing dongle SMS messages

#!/bin/bash -x
cmds()
{
cat <<EOF
dongle cmd dongle0 AT+CPMS=\"SM\",\"SM\",\"SM\"
dongle cmd dongle0 AT+CMGD=1,4
dongle cmd dongle0 AT+CPMS=\"ME\",\"ME\",\"ME\"
dongle cmd dongle0 AT+CMGD=1,4
exit
EOF
}

cmds | asterisk -r

Useful Asterisk commands

Show channels

core show channels

References

GSM modems

Asterisk

ARI

Telegram

Fun

asterisk-dongle-setup's People

Contributors

grwlf avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.