Метеостанция на Orange Pi Zero + Геолокация

Геолокация

Для того, чтобы наша база данных превратилась в ГИС, необходимо, чтобы наша метеостанция начала информировать нас о своём местоположении)

В большинстве случаев используются разные трекеры на основе GPS данных или других систем, в нашем случае мы будем получать данные от сотового оператора, рассмотрим как это работает:

Есть несколько способов осуществить данный функционал:

Установить GPS трекер и его данные передавать в базу данных

Использовать сервисы по определению адресов через IP (уровень детализации – город)

Использовать информацию, полученную от вышек для определения геолокации.

Вот последний случай я и буду пытаться настроить.

 

Настраиваем (triangular cellular):

Итак, для реализации данного метода, необходимо связаться с модемом и уже непосредственно через или у него запрашивать информацию, для этого:

sudo apt-get install cu

Установил эту программу, но пошёл по другому пути:

Сначала разбираемся, где у нас установлен 3g modem:

Открыв 2 терминал, в одном:

 

ls /dev/ttyACM* /dev/ttyUSB*

Выведет нам список устройств, дальше:

 

echo “ATi” > /dev/<DEVICE>

Это команду вводим в одном терминале, во втором вводим: cat /dev/<DEVICE> Рано или поздно выдаст:

root@orangepizero:~# cat /dev/ttyUSB2
ATi^M

Manufacturer: QUALCOMM INCORPORATED

Model: 209

Revision: WU_7.01.025

IMEI: 867036016957934

+GCAP: +CGSM,+DS,+ES

 

Теперь мы уверены, что наш модем находится по адресу /dev/ttyUSB2.

Нашёл программу для связи с модемом – minicom;

Вот ссылка на команды для связи с модемом: ссылка

Итак, всё вроде бы хорошо, но проблема в модеме – нужные нам команды он не распознаёт, здесь остаётся либо менять прошивку у модема, либо покупать новый модем, либо использовать в тестовых целях скрипт с получением геоданных по IP.

Следующий код позволяет получить геоданные по айпи (python):

import json
import urllib2

def location_lookup():
  try:
    return json.load(urllib2.urlopen('http://ipinfo.io/json'))
  except urllib2.HTTPError:
    return False

location = location_lookup()

# print city and latitude/longitude
print location['city'] + ' (' + location['loc'] + ')' 

Данные, которые нам нужны loc он выводит вместе и с разделителем запятая, поэтому мы эти данные разделим:

 

longitude,latitude = location[‘loc’],split(‘,’,1)

print longitude

print latitude

 

Теперь полученное художество добавим к нашему файлу, который отправляет данные на сервер, чтобы он ещё отправлял и информацию о местонахождении датчика.

Всё сделано, теперь метеостанция отправляет информацию о своём местоположении на платформу (пока информация о положении определяется по ip, но данное решение реализовано временно, будет реализован вариант определения местоположения от сотовых вышек).

Из-за ограниченного количества запросов, которые устройство может отправлять, пришлось на данный момент полностью отключить получение геолокационных данных, но зато был приобретён sim800L.

 

Автозапуск приложения

По поводу запуска приложений при старте это реализовано через /etc/rc.local,

Периодически возникает ситуация, что при кратковременной отсутствии связи программа выключается, нашёл способ это исправить:

В планировщике заданий

crontab -e

добавил следующую запись:

*/5 * * * * sudo /root/run-one-1.17/run-one /usr/bin/python /t1/send1.py

Предварительно скачал и распаковал программу run-one:

ссылка

Что происходит – каждые 5 минут происходит запуск программы run-one, которая проверяет, запущена ли уже до этого программа send1.py или нет, и запускает её, если она не запущена. Пытался реализовать это решение другими способами, наткнулся на сложности – либо вообще ничего не запускается, либо сразу по 3 процесса и по нарастающей) run-one помогла решить вопрос)

 

Дополнение:

После нескольких ребутов и изменений перестала работать run-one, а может кстати и не перестала, непонятно, но всё равно изменил решение, связанное с запуском нескольких процессов crontab ом с помощью локрана:

вот подробная инструкция

Скачиваем и устанавливаем:

wget unixwiz.net/tools/lockrun.c
gcc lockrun.c -o lockrun
sudo cp lockrun /usr/local/bin/

Пример использования:

crontab -e

* * * * * /usr/local/bin/lockrun --lockfile=/tmp/megacache.lockrun -- /path/to/megacache/generator


Собственно команда и параметры lockrun разделяются двумя минусами.

Данная программа при запуске задачи из кронтаба создаёт файл, который удаляется, когда задача будет выполнена, таким образом происходит защита от повторного запуска задачи.

 

 

Вернёмся к определению местоположения по информации от станций

На данный момент ситуация немного изменилась – у меня теперь целая коллекция моделей Orange Pi, в том числе и модель Orange Pi 2G-IOT со встроенным gsm модулём, к тому же у меня имеются модули sim800l и sim900 аля IOT-GA6. Так что попробуем сначала с ними разобраться:

Пробовал многократно подключить их разными способами через GPIO напрямую в плату – ничего не получилось, ещё правда не пробовал подключить к Orange Pi Zero, так у него немного другое программное обеспечение вроде, ну да не об этом.

Я приобрёл несколько переходников USB – TTL , один из них вставил в USB вход на плате Pi One, от него контакты я подключил к сим800л RX в TX, Tx в RX, в таком виде вроде заработало, для связи с подключенным устройство я использую команду

 

minicom -b 115200 -o -D /dev/ttyUSB0

 

Питание модулей я настроил от отдельного блока питания, не от платы микрокомпьютера.

Периодически вылезают кракозябры, скорей всего связано это с baudrate, с этим необходимо разбираться отдельно.

 

Please follow and like us:
0
Метеостанция на Orange Pi Zero + Геолокация

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Перейти к верхней панели