moleus / domru

domru domofon client
MIT License
7 stars 4 forks source link

Docker: Как программно поймать входящий звонок (обходное решение) #12

Open twocolors opened 6 months ago

twocolors commented 6 months ago

Идея и оригинал взят https://github.com/alexmorbo/domru/issues/43

!!! Пути везде ставим свои, знание работы с docker приветствуется !!!

Мой кейс было все это завернуть в docker и стандартный AVD Ставим чистый docker без sdk и AVD , нам надо смонтировать свой SDK и AVD microG

sudo docker run -it -e MEMORY=2048 -e CORES=2 -e DISABLE_ANIMATION=true -e DISABLE_HIDDEN_POLICY=true -e SKIP_AUTH=true --rm --device /dev/kvm -p 5555:5555 --entrypoint /bin/bash -v /home/dietpi/.android/sdk:/opt/android -v /home/dietpi/.android/data:/data halimqarroum/docker-android:minimal

В контейнере добавляем репозиторий microG

root@android:/opt# cat /root/.android/repositories.cfg
count=1
disp00=microG System Images
src00=https://microg.org/sdk/sys-img.xml
enabled00=true
root@android:/opt#

Ставим microG AVD

export ABI=microg/x86_64
export INSTALL_ANDROID_SDK=1
export CMD_LINE_VERSION=9477386_latest
export ANDROID_PLATFORM_VERSION="platforms;android-29"
export PACKAGE_PATH="system-images;android-29;microg;x86_64"
root@android:/opt# ./install-sdk.sh

Все, теперь можно запускать контейнер с своим AVD и SDK, у меня это вот так

  android:
    container_name: "android"
    hostname: "android"
    image: "halimqarroum/docker-android:minimal"
    environment:
      - TZ=Europe/Moscow
      - MEMORY=2048
      - CORES=2
      - DISABLE_ANIMATION=true
      - DISABLE_HIDDEN_POLICY=true
      - SKIP_AUTH=true
      - ABI=microg/x86_64
      - ANDROID_PLATFORM_VERSION=platforms;android-29
      - PACKAGE_PATH=system-images;android-29;microg;x86_64
    volumes:
      - "/home/dietpi/.android/data:/data"
      - "/home/dietpi/.android/sdk:/opt/android"
    devices:
      - "/dev/kvm:/dev/kvm"
    restart: unless-stopped
    networks:
      - stalker
    ports:
      - 5555:5555
#    deploy:
#      resources:
#        limits:
#          cpus: '0.25'
#          memory: 2G

Подключаемся к контейнеру по средствам scrcpy (ключ берем приватный вот тут https://github.com/HQarroum/docker-android/blob/main/keys/adbkey)

Какие приложение надо поставить, что бы работало: 1. F-Droid , подключаем репу https://microg.org/download.html ставим microg service image 2. В microg , разрешаем все через FSM image image 3. Далее ставим Умный дом.ру и что бы ловить события я выбрал MacroDroid, MacroDroid разрешаем читать LOGCAT

adb shell pm grant com.arlosoft.macrodroid android.permission.WRITE_SECURE_SETTINGS
adb shell pm grant com.arlosoft.macrodroid android.permission.CHANGE_CONFIGURATION
adb shell pm grant com.arlosoft.macrodroid android.permission.DUMP
adb shell pm grant com.arlosoft.macrodroid android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER
adb shell pm grant com.arlosoft.macrodroid android.permission.READ_LOGS

4. Настраиваем Умный дом.ру через FSM и дальше делаем MacroDroid что бы ловить вхд. звонок image image

Текст макроса

GmsGcmMcsInput
com.ertelecom.smarthome*CALL_INCOMING

Все, приложение Умный дом.ру и MacroDroid , не закрывать !!! ...

twocolors commented 6 months ago

Пример события в logcat

05-19 16:52:17.404  5663  6259 D GmsGcmMcsInput: Incoming message: DataMessageStanza{id=D35AAA10, from=102439411****, to=fprWtGiM*******iYbXT, category=com.ertelecom.smarthome, app_data=[AppData{key=GateName, value_=Lenina strirtch}, AppData{key=PushType, value_=CALL_INCOMING}, AppData{key=Call-ID, value_=****-Dr.9-6VVOguAFW-}, AppData{key=PlaceId, value_=****}, AppData{key=CallInvalidated, value_=2024-05-19T13:52:48.825Z}, AppData{key=AccessControlId, value_=*****}, AppData{key=google.c.sender.id, value_=102439411****}, AppData{key=Apartment, value_=341}, AppData{key=AllowOpen, value_=true}, AppData{key=Sender, value_=341@**********}, AppData{key=google.c.a.m_l, value_=CALL_INCOMING}, AppData{key=CallStarted, value_=2024-05-19T13:52:18.825Z}, AppData{key=google.c.a.e, value_=1}, AppData{key=PushTitle, value_=Входящий вызов}], persistent_id=0:******%c6602597f9fd7ecd, last_stream_id_received=88, ttl=0, sent=****}

p.s. ловит 8 из 10 звонков, причина не прилетает звонок на андройд приложение

90amper commented 1 month ago

Ловил звонок через SIP-клиент. Парсил трафик приложухи — увидел в содержимом sip-сервер, логин и пароль. Вбил в сип клиент — звонки с домофона приходят, ответить можно. А вот позвонить на домофон нельзя, я пробовал :D

Проверял год назад https://myhome.proptech.ru/rest/v1/places/YYYYYYY/accesscontrols/XXXXX/sipdevices

twocolors commented 1 month ago

@90amper больше пожалуйста подробностей :) для golang есть клиент https://github.com/emiago/sipgo , возможно получиться встроить в клиент

moleus commented 1 month ago

Ловил звонок через SIP-клиент. Парсил трафик приложухи — увидел в содержимом sip-сервер, логин и пароль. Вбил в сип клиент — звонки с домофона приходят, ответить можно. А вот позвонить на домофон нельзя, я пробовал :D

тоже получалось вбить перехваченный логин/пароль в приложении SIP клиента для андройда. Звонки приходили, где-то через неделю-полторы креды протухли и нужно было обновлять. Позвонить тоже не получилось)

moleus commented 1 month ago

доставал вот так:

# request
Authorization:    Bearerer xxx
https://188.186.144.249/rest/v1/places/{place-id}/accesscontrols/{ac-id}/sipdevices
{
  "installationId": "xxxxxxxx-e969-4282-9835-xxxxxxxxxxxx"
}
# response:
{
  "data": {
    "id": "xxxxxxxxxxxxxxxxxxxxxxd57f37c788",
    "login": "xxxxxxxxxbd5",
    "password": "xxxxxxxxxca9",
    "realm": "nnnnn.spb.domofon.domru.ru"
  }
}
90amper commented 1 month ago

@90amper больше пожалуйста подробностей :) для golang есть клиент https://github.com/emiago/sipgo , возможно получиться встроить в клиент

Ну вот как раз @moleus всё и расписал) Других подробностей нет. У меня тогда не было цели ловить звонки. Если есть sip-клиент на Go, то наверное да, можно триггериться событием входящего звонка для каких-то действий.

Я сейчас сделал динамическую обновлялку домофонных источников видео для AgentDVR. Ещё хочу, чтобы событие звонка запускало запись - вот как раз думаю модуль sip-клиента подрубить для этого. Но тот проект на питоне)

twocolors commented 1 month ago

@90amper больше пожалуйста подробностей :) для golang есть клиент https://github.com/emiago/sipgo , возможно получиться встроить в клиент

Ну вот как раз @moleus всё и расписал) Других подробностей нет. У меня тогда не было цели ловить звонки. Если есть sip-клиент на Go, то наверное да, можно триггериться событием входящего звонка для каких-то действий.

Я сейчас сделал динамическую обновлялку домофонных источников видео для AgentDVR. Ещё хочу, чтобы событие звонка запускало запись - вот как раз думаю модуль sip-клиента подрубить для этого. Но тот проект на питоне)

там в sip всего надо реализовать метод register и на звонок отдавать 180 ... в целом можно расписать, что делать и как , осталось реализовать на go (: - толстый намек !!!