Alexander Mylnikov

5Июл/150

Public Wi-Fi database. Geo-Location API. Public API of position by Wi-Fi (MAC, BSSID).

Wi-Fi

I would like to introduce public API implementation of Wi-Fi geo-position database. There are in Internet a lot of sources of Wi-Fi positions by all those disadvantages are small data base or not free data.

This database can be interesting to any applications that would like to know accurate user data or target in-app data for current location.

As a basis I took following open databases:

At this moment database contains about 19M+ of records and always getting new data.

If you have some reliable source share it with me by e-mail [email protected].

API doesn't contains any hidden limit or fees. All the data is provided "as is".

Specifications of Public API (Open data)

Request paths

https://api.mylnikov.org/wifi/main.py/get?bssid={wifi_bssid}

https://api.mylnikov.org/wifi/main.py/get?bssid={wifi_bssid}

{wifi_bssid} - BSSID of Wi-Fi AP (MAC address of network's AP card)

BSSID variants input:

  • A0:F3:C1:3B:6F:90
  • A0F3C13B6F90
  • a0f3c13b6f90
  • A0-F3-C1-3B-6F-90
  • a0-f3-c1-3b-6f-90

Example:

https://api.mylnikov.org/wifi/main.py/get?bssid=00:0C:42:1F:65:E9&data=open&v=1.1

Response example:

{"result":200, "data":{"range": 140, "lan": "60.05205150", "lon": "30.33848000", "signal": "-80"}}
Field "result" contains 200 if Wi-Fi was found, if not it returns 404

Description of successful response:

  • lat - latitude
  • lon - longitude
  • signal - avg signal level
  • range - accuracy of result in meters

Specifications of Public API (Data "as is")

https://api.mylnikov.org/wifi/main.py/get?bssid=A0:F3:C1:3B:6F:90&v=1.1

With this pattern of request to get "not licensed" data that should be used only in research purposes. The end-user uses the data at your own risk.

Refined location (Beta) multiple Wi-Fis

This section describes opportunity to fetch geo-location by multiple amount of Wi-Fi APs. It has the syntax: User sends the set of APs with them signal straight levels and server returns location coordinate. The request string should be wrapped with Base64

Example of input string:

28:28:5d:d6:39:8a,-76;90:94:e4:ac:12:26,-80

bssid,SS;bssid1,SS1

SS - Signal Strength

https://api.mylnikov.org/wifi/main.py/get?v=1.1&search=Mjg6Mjg6NWQ6ZDY6Mzk6OGEsLTc2OzkwOjk0OmU0OmFjOjEyOjI2LC04MA==

In this case of usage the key "data=open" works as well. And it brings only data from open sources. Unfortunately, this key can be reason of negative result due small amount of open data.

Licensing

This API contains two projects:

  • Open data GeoLocation API  that licensed with  MIT License. All the request with "data=open" key will get data from open source only.
  • GeoLocation API without any license. The data that will returns can contains data "as is" from private sources without any copyrights, but you can get more fresh and accurate data.

You can decide which license you need.

API database contains about 22.1M+ records. Usage of API is absolutely free, and always will be.)

P.S.

I you need full database of cells in .sql format you can download here. Unfortunately, I can share data from open sources only.

If you have some other sources that contains reliable data about cell towers location please contact me by e-mail. I'll add them into API sources.

I'll be happy to give you any help via e-mail [email protected].

Связано с категорией: GeoLocation, Web, Wi-Fi Нет комментариев
16Июн/150

Геолокация без GPS (часть 2)

wifi Здравствуйте! После предыдущей статьи (часть 1) я получил много отзывов о работе открытого API геолокации по WiFi и вышкам мобильных сетей. В этот раз я хочу представить свои исправления, лицензирование проекта, геопозиционирование по нескольким точкам доступа, кейсы использования и самое главное - текущие проблемы

Связано с категорией: GeoLocation, Mobile Towers, Wi-Fi Читать полностью
19Апр/150

Геолокация без GPS

wifiЗдравствуйте!

Представляю публичную базу геопозиций телефонных вышек и Wi-Fi роутеров. Мне понадобилась стабильная и безлимитная база для приложения Android в котором нужна была точная геолокация из всех доступных источников (GPS, Wi-Fi, Mobile). Пришлось создать базу данных положений сотовых вышек и Wi-Fi. Всех заинтересовавшихся прошу под кат.

Связано с категорией: GeoLocation, Mobile Towers, Web, Wi-Fi Читать полностью
15Апр/156

Определение местоположения по Wi-Fi (MAC, bssid) открытое API

Wi-FiСегодня я хочу представить публичный API для определения местоположения по данным точки доступа Wi-Fi. В итернете достаточно много ресурсов предлагающих определение местоположения по данным Wi-Fi, однако все они либо платные, либо содержат ограничение на количество запросов, либо очень маленькие.

Данная база может быть интересна любым приложениям которые имеют географическую привязку с помощью Wi-Fi.

В своей базе я собрал все доступные публичные источники:

В данный момент база  содержит 10М Wi-Fi и постоянно наполняется новыми. Если у вас обширная база Wi-Fi  или источники буду рад ее добавить в свою базу. Пишите на [email protected].

API не содержит никаких скрытых лимитов или задержек. Данные предоставляются "как есть".

Описание публичного API (Открытые источники)

Адреса обращения

https://api.mylnikov.org/wifi/main.py/get?bssid={wifi bssid}

https://api.mylnikov.org/wifi/main.py/get?bssid={wifi bssid}

{wifi bssid} - Bssid точки доступа (MAC адрес сетевой карты точки доступа)

Варианты:

  • A0:F3:C1:3B:6F:90
  • A0F3C13B6F90
  • a0f3c13b6f90
  • A0-F3-C1-3B-6F-90
  • a0-f3-c1-3b-6f-90

Пример:

https://api.mylnikov.org/wifi/main.py/get?bssid=00:0C:42:1F:65:E9&data=open&v=1.1

Варианты ответа:

{"result":200, "data":{"range": 140, "lan": "60.05205150", "lon": "30.33848000", "signal": "-80"}}
Поле "result" содержит значение 200 если Wi-Fi найден, в противном случае возвращается 404

Описание успешного ответа:

  • lat - широта
  • lon - долгота
  • signal - средний уровень сигнала
  • range - точность определения координаты в метрах

Реализация API (Данные "как есть")

https://api.mylnikov.org/wifi/main.py/get?bssid=A0:F3:C1:3B:6F:90&v=1.1

При данном виде запроса данные представляются только в иследовательских целях. Конечный пользователь использует данные на свой страх и риск

Уточненное местоположение

Вводится новая функция получения приблизительного пожложения точки триангуляционного центра. Синтаксис следующий: на сервер передается набор точек доступа, видимых приемником и силу сигналов точек, а сервер по имеющимся данным получает приблизительное положение точки, качественно являющейся трианглуляционным центром. все данныые запроса оборачиваются в base64

Пример исходной строки:

28:28:5d:d6:39:8a,-76;90:94:e4:ac:12:26,-80

bssid,SS;bssid1,SS1

SS - Signal Strength

https://api.mylnikov.org/wifi/main.py/get?v=1.1&search=Mjg6Mjg6NWQ6ZDY6Mzk6OGEsLTc2OzkwOjk0OmU0OmFjOjEyOjI2LC04MA==

В данном моде так же работает тег data=open который сообщает серверу что данные должны быть получены исключительно из открытых источников. К сожалению, в этом случае часты ситуации с отрицательным результатом поиска.

Лицензирование

Через одно API доступно, на самом деле, два проекта.

Первый и лицензируемый проект это все запросы к API с ключем "data=open" и он работает под лицензией  MIT License.

Второй проект получает данные "как есть". Полностью законное получение данных не оговаривается. И обращение к API без ключа open=data в принципе не документируется и предоставляется как "пасхальное яйцо". Данные предоставляемые используются конечным пользователем на свой страх и риск.

О любых ошибках или сложностях использования прошу писать мне на почту [email protected].

Скачать данные

Раздел загрузок

Связано с категорией: GeoLocation, Web, Wi-Fi, Без рубрики 6 Комментарии
7Апр/150

Public mobile cells database. GeoLocation API

cell towerToday i would like to introduce my public API implementation of mobile cells database.

Open source project that i have aggregate:

For this moment it contains about 15M+ records. With this size database becomes world largest open source mobile cells database.

This API is absolutely free to use and have not hidden fees. Also it has no limitations to amount of request per any period.

If my first version I did spelling mistake in latitude's abbreviation in responce json (The field "lan" contained latitude data of mobile cell). The previos version is still available.

Download data

Download database in .sql Download database

Location of cell (Open data)

API accept only one request path. Parameters should be send with GET request.

  • http://api.mylnikov.org/mobile/main.py/get?v=1.1&data=open
  • https://api.mylnikov.org/mobile/main.py/get?v=1.1&data=open

There are 4 required parameters for request:

  1. mcc - Integer (Country code)
  2. mnc - Integer (Network operator code)
  3. cellid - Integer (Cell id)
  4. lac - Integer (Area or location code)
  5. (Optional) "data=open" key require only open source data

Example of usage:

http://api.mylnikov.org/mobile/main.py/get?v=1.1&mcc=250&mnc=02&cellid=200719106&lac=7840&data=open

250 is Russia, 02 - Megafon, 7840 - area code, 200719106 - cell id

Example of requests:

If cell fount you will get 200 in field result or 404 if request failed.

{  
   "result":200,
   "data":{  
      "lon":"30.378965994",
      "mcc":250,
      "lac":7840,
      "range":"1248.781274361",
      "radio":"GSM",
      "samples":0,
      "time":1431125998,
      "lat":"60.052802453",
      "mnc":2,
      "cellid":200719106
   }
}
{  
   "result":404,
   "data":{  
   },
   "real":6,
   "desc":"No information about location",
   "time":1431126043
}

Description of successful response:

  • lat - latitude of tower
  • lon - longitude of tower
  • range - accuracy of result in meters
  • samples - number of tower observations
  • radio - radio type of tower
  • mcc - Mobile country code
  • mnc - Mobile network code or system identifier
  • lac - Local area code, tracking area code or network id
  • cellid - Cell id or base station id

Location of cell

To fetch data from database with no restrictions for sources you have just delete key from path http://api.mylnikov.org/mobile/main.py/get?v=1.1 and you will get the most fresh and accurate data.

Refined location (Beta)

In version 1.1 I added new function of fetcing refined location by multiple amount of mobile cells.
The request path is https://api.mylnikov.org/mobile/main.py/get?v=1.1&search={search string}

{search string} - Base64 of string (mcc,mnc,lac,cellid,SS;mcc1,mnc1,lac1,cellid1,SS1;...)

Max amount of cells is 12.

Example of search string:
250,02,7810,318,-81;250,02,4711,24208,-83;250,02,4711,24214,-89;250,02,4711,619,-95;250,02,4711,16627,-95

mcc,mnc,lac,cellid,SS;mcc1,mnc1,lac1,cellid1,SS1

SS - Signal Strength

Example request:

https://api.mylnikov.org/mobile/main.py/get?v=1.1&search=MjUwLDAyLDc4MTAsMzE4LC04MTsyNTAsMDIsNDcxMSwyNDIwOCwtODM7MjUwLDAyLDQ3MTEsMjQyMTQsLTg5OzI1MCwwMiw0NzExLDYxOSwtOTU7MjUwLDAyLDQ3MTEsMTY2MjcsLTk1

Licensing

This API contains two projects:

  • Open data GeoLocation API  that licensed with  MIT License. All the request with "data=open" key will get data from open source only.
  • GeoLocation API without any license. The data that will returns can contains data "as is" from private sources without any copyrights, but you can get more fresh and accurate data.

You can decide which license you need.

API database contains about 15.3M+ records. Usage of API is absolutely free, and always will be.)

P.S.

I you need full database of cells in .sql format you can download here. Unfortunately, I can share data from open sources only.

If you have some other sources that contains reliable data about cell towers location please contact me by e-mail. I'll add them into API sources.

I'll be happy to give you any help via e-mail [email protected].

Связано с категорией: GeoLocation, Mobile Towers, Web Нет комментариев
5Апр/150

Публичная база телефонных станций мира. Публичное открытое API

cellСегодня я хочу представить всем желающим базу телефонных станций всего мира.

Это может быть полезно приложениям или сервисам, которые по идентификаторам мобильной станции хотят получить ее геопозицию и тип. Данная база частично является копией The OpenCellID map, однако в официальной реализации есть ограничение на количество запросов и обязательно выпускать API ключ. В базе так же собраны и другие источники данных.

Список открытых источников:

В моей реализации нет не лимитов, ни ключей.

Данные обновляются еженедельно.

Реализация API (Открытые источники)

http://api.mylnikov.org/mobile/main.py/get адрес запросов передаются методом GET

Так же доступен по протоколу https://api.mylnikov.org/mobile/main.py/get

Для запроса есть 4 обязательных поля:

  1. mcc - Integer (Код страны)
  2. mnc - Integer (Код телефонного оператора)
  3. cellid - Integer (Код телефонной станции)
  4. lac - Integer (Код региона или Area, Location)
  5. v - Номер версии (Актуацльная версия 1.1)
  6. data=open  - указание, что данные полученные из API строго открытые

Пример:

http://api.mylnikov.org/mobile/main.py/get?data=open&mcc=250&mnc=02&cellid=200719106&lac=7840&v=1.1

Ответ:

Строка JSON имеющее обязательное поле result.

Если станция найдена в поле result приходит ответ 200, при ошибках возвращается код 404.

{  
   "result":200,
   "data":{  
      "lon":"30.385654398",
      "mcc":250,
      "lac": 7840,
      "range":"869.994176272",
      "radio":"UMTS",
      "samples":49,
      "time":1430577060,
      "lat":"60.056594206",
      "mnc":2,
      "cellid":200719106
   }
}
{  
   "result":404,
   "data":{  
   },
   "real":6,
   "desc":"No information about location",
   "time":1430579063
}

Описание успешного ответа:

  • lat - широта
  • lon - долгота
  • range - точность определения координаты в метрах
  • samples - количество измерений
  • mcc - код страны
  • mnc - код мобильного оператора
  • lac - код мобильного региона
  • cellid - Id базовой станции
  • radio - тим базовой стании

Реализация API (Данные "как есть")

Для запроса есть 4 обязательных поля:

  1. mcc - Integer (Код страны)
  2. mnc - Integer (Код телефонного оператора)
  3. cellid - Integer (Код телефонной станции)
  4. lac - Integer (Код региона или Area, Location)
  5. v - Номер версии (Актуацльная версия 1.1)

Пример:

http://api.mylnikov.org/mobile/main.py/get?mcc=250&mnc=02&cellid=200719106&lac=7840&v=1.1

Уточненное местоположение

Вводится новая функция получения приблизительного пожложения точки триангуляционного центра. Синтаксис следующий: на сервер передается набор базовых станций, видимых приемником и силу сигналов станций, а сервер по имеющимся данным получает приблизительное положение точки, качественно являющейся трианглуляционным центром. все данныые запроса оборачиваются base64

Пример исходной строки:

250,02,7810,318,-81;250,02,4711,24208,-83;250,02,4711,24214,-89;250,02,4711,619,-95;250,02,4711,16627,-95

mcc,mnc,lac,cellid,SS;mcc1,mnc1,lac1,cellid1,SS1

SS - Signal Strength

https://api.mylnikov.org/mobile/main.py/get?v=1.1&search=MjUwLDAyLDc4MTAsMzE4LC04MTsyNTAsMDIsNDcxMSwyNDIwOCwtODM7MjUwLDAyLDQ3MTEsMjQyMTQsLTg5OzI1MCwwMiw0NzExLDYxOSwtOTU7MjUwLDAyLDQ3MTEsMTY2MjcsLTk1

В данном моде так же работает тег data=open который сообщает серверу что данные должны быть получены исключительно из открытых источников. К сожалению, в этом случае часты ситуации с отрицательным результатом.

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

Лицензирование

Через одно API доступно, на самом деле, два проекта.

Первый и лицензируемый проект это все запросы к API с ключем "data=open" и он работает под лицензией  MIT License.

Второй проект получает данные "как есть". Полностью законное получение данных не оговаривается. И обращение к API без ключа open=data в принципе не документируется и предоставляется как "пасхальное яйцо". Данные предоставляемые используются конечным пользователем на свой страх и риск.

Скачать данные

Раздел загрузок

Связано с категорией: GeoLocation, Mobile Towers, Web Нет комментариев
19Фев/150

Установка VMware Tools на Debian

vmwareМануалов много, решил просто скопировать себе на сайт.
Начинаетс все просто:

1. Входим в графическую консоль виртуальной машины и пробрасываем установочный диск VMware Tools в систему

Скрины

Для  гипервизора (ESXi)

vmware-tools-02

Для VMware Workstation

vmware-tools-01
2. Логинимся под пользователем, который может запускать sudo

Обновляем систему (опционально)
sudo apt-get update && sudo apt-get dist-upgrade
sudo shutdown -r now

Устанавливаем нужный софт для тула
sudo apt-get update && sudo apt-get install build-essential linux-headers-$(uname -r) libglib2.0-0

Запускаем установку
sudo mount /dev/cdrom /mnt
tar xvfz /mnt/VMwareTools-*.tar.gz -C /tmp/
sudo perl /tmp/vmware-tools-distrib/vmware-install.pl

Перезапускаем
sudo shutdown -r now

Поздравляю, VMware Tools установлен.

Связано с категорией: Manual Нет комментариев
15Ноя/140

CSC Бызы данных, 9 дз

Вам нужно посчитать некоторую статистику о багах в багтрекере. Статистику вы хотите видеть в представлениях, соответственно основной задачей является написание запросов, формирующих представления.

Во-первых, вам хочется для каждого проекта найти суммарное количество багов каждого из имеющихся у вас статусов. Хочется видеть примерно такое:

SELECT * FROM BusSummaryPerProject;

project_id  | new  | assigned | fixed | verified | not reproducible
1001          45     24         3       0          10
1002          56     10         37      104        15

Для упрощения можете считать, что множество статусов известно и не собирается меняться.

Во-вторых, для каждого статуса хочется видеть компоненту с максимальным, минимальным и медианным количеством багов с таким статусом. Например, если у нас 7 компонент и количество багов со статусом “new” в них распределено так:

C1 | 10
C2 | 50
C3 | 15
C4 | 30
C5 | 20
C6 | 25
C7 | 35

то в строке представления для статуса new должно быть:

SELECT * FROM StatisticsPerStatus WHERE status='new';

status | max_component | max_value | min_component | min_value | median_component | median_value
new      C2              50          C1              10          C6                 25

Если число компонент четное, то считайте медианой большее из двух возможных значений. Если медианное значение принадлежит нескольким компонентам, то добавьте лексикографическую сортировку по названию компоненты (так, если бы в примере выше в компоненте C4 было бы 25 багов, то медианой стала бы она, если бы в компоненте C5 было 25 багов, то медианой осталась бы C6, а если бы и в C4 и в C5 было бы 25 багов, то медианой стала бы C5)

Собсвтенно решение:

Пунт 1

Для вывода информаци по кадому проекту я построил впомогательно представление которое получает отношение "проект  - статус  - количество"

-- View: statustoproject

-- DROP VIEW statustoproject;

CREATE OR REPLACE VIEW statustoproject AS 
 SELECT count(bug.status_id) AS count, bug.status_id AS status, component.project_id AS project
   FROM bug
   JOIN bugcomponent ON bug.num = bugcomponent.bug_num
   JOIN component ON bugcomponent.component_id = component.id
  GROUP BY component.project_id, bug.status_id
  ORDER BY component.project_id, bug.status_id;

ALTER TABLE statustoproject
  OWNER TO postgres;

Далее, собственно, выбираю из вспомогательной выбоки и строю нужное отношение.

-- View: bussummaryperproject

-- DROP VIEW bussummaryperproject;

CREATE OR REPLACE VIEW bussummaryperproject AS 
 SELECT project.id AS project_id, COALESCE(( SELECT statustoproject.count
           FROM statustoproject
          WHERE statustoproject.project = project.id AND statustoproject.status = 1), 0::bigint) AS new, COALESCE(( SELECT statustoproject.count
           FROM statustoproject
          WHERE statustoproject.project = project.id AND statustoproject.status = 2), 0::bigint) AS assigned, COALESCE(( SELECT statustoproject.count
           FROM statustoproject
          WHERE statustoproject.project = project.id AND statustoproject.status = 3), 0::bigint) AS fixed, COALESCE(( SELECT statustoproject.count
           FROM statustoproject
          WHERE statustoproject.project = project.id AND statustoproject.status = 4), 0::bigint) AS verified, COALESCE(( SELECT statustoproject.count
           FROM statustoproject
          WHERE statustoproject.project = project.id AND statustoproject.status = 5), 0::bigint) AS "not reproducible"
   FROM project;

ALTER TABLE bussummaryperproject
  OWNER TO postgres;

Пункт 2

Самым сложным для меня было создать функцию медианы

CREATE OR REPLACE FUNCTION array_median(numeric[])
  RETURNS numeric AS
$$
    SELECT CASE WHEN array_upper($1,1) = 0 THEN null ELSE asorted[ceiling(array_upper(asorted,1)/2.0)] END
    FROM (SELECT ARRAY(SELECT ($1)[n] FROM
generate_series(1, array_upper($1, 1)) AS n
    WHERE ($1)[n] IS NOT NULL
            ORDER BY ($1)[n]
) As asorted) As foo ;
$$
  LANGUAGE 'sql' IMMUTABLE;
CREATE  AGGREGATE median(numeric) (
                  SFUNC=array_append,
                  STYPE=numeric[],
                  FINALFUNC=array_median
                );

Далее как и в первом примере я строю вспомогательное представление.

-- View: statustocomponent

-- DROP VIEW statustocomponent;

CREATE OR REPLACE VIEW statustocomponent AS 
 SELECT DISTINCT count(bug.status_id) AS count, bug.status_id AS status, component.id, component.title AS componentname
   FROM bug
   JOIN bugcomponent ON bug.num = bugcomponent.bug_num
   JOIN component ON bugcomponent.component_id = component.id
  GROUP BY component.id, bug.status_id
  ORDER BY component.id, bug.status_id;

ALTER TABLE statustocomponent
  OWNER TO postgres;

Далее строю нужно отношение.

-- View: statisticsperstatus

-- DROP VIEW statisticsperstatus;

CREATE OR REPLACE VIEW statisticsperstatus AS 
 SELECT bugstatus.value AS status, COALESCE(( SELECT statustocomponent.componentname
           FROM statustocomponent
          WHERE statustocomponent.status = bugstatus.id
          ORDER BY statustocomponent.count DESC, statustocomponent.componentname
         LIMIT 1), 'null'::character varying) AS max_component, COALESCE(( SELECT max(statustocomponent.count) AS max
           FROM statustocomponent
          WHERE statustocomponent.status = bugstatus.id), 0::bigint) AS max_value, COALESCE(( SELECT statustocomponent.componentname
           FROM statustocomponent
          WHERE statustocomponent.status = bugstatus.id
          ORDER BY statustocomponent.count, statustocomponent.componentname
         LIMIT 1), 'null'::character varying) AS min_component, COALESCE(( SELECT min(statustocomponent.count) AS min
           FROM statustocomponent
          WHERE statustocomponent.status = bugstatus.id), 0::bigint) AS min_value, COALESCE(( SELECT statustocomponent.componentname
           FROM statustocomponent
          WHERE statustocomponent.status = bugstatus.id AND statustocomponent.count::numeric = (( SELECT median(statustocomponent.count::numeric) AS median
                   FROM statustocomponent
                  WHERE statustocomponent.status = bugstatus.id))
          ORDER BY statustocomponent.componentname
         LIMIT 1), 'null'::character varying) AS median_component, COALESCE(( SELECT median(statustocomponent.count::numeric) AS median
           FROM statustocomponent
          WHERE statustocomponent.status = bugstatus.id), 0::numeric) AS median_value
   FROM bugstatus;

ALTER TABLE statisticsperstatus
  OWNER TO postgres;

Работет все это достаточно шутсро, поэтому решиние претендует быть верным.
Вомозможно я неверно лексиграфически упрорячиваю названия компонент

Дамп базы dbhw9.sql

Связано с категорией: CSC Нет комментариев