Как получить IP-адрес устройства/шлюза из службы Bluemix IoT?

Что нужно?

Мне нужно получить текущий IP-адрес устройства/шлюза, чтобы определить его местоположение.

Как этого добиться?

Я нашел 2 варианта:

  1. Получите IP-адрес шлюза через API Bluemix, потому что я вижу его в панели администратора, поэтому решаю, что он доступен через API (но может быть и нет). Но не могу найти соответствующий вызов API. Пожалуйста, предложите один, если он реализован.
  2. В ответе API на сведения об устройстве я увидел дополнительный параметр местоположения, но не могу найти полное описание того, как его использовать. Этот параметр отправляет обратно со ссылками на журналы и коды ошибок. Но при любом запросе API параметр местоположения возвращает пустую строку.

Может ли кто-нибудь помочь мне с любым из этих вариантов или предложить другое решение?

P.S. Текущий обходной путь — отправка IP-адреса напрямую со шлюза, но это не самый лучший вариант.


person Maxim Gordienok    schedule 03.11.2016    source источник
comment
Параметр местоположения в API предназначен для широты и долготы, а не для IP-адреса. docs.internetofthings.ibmcloud.com/swagger/v0002.html# !/Устройства/   -  person ValerieLampkin    schedule 04.11.2016
comment
Да, это тоже решение. Но на любой запрос здесь у меня пустой ответ, как я уже упоминал в вопросе.   -  person Maxim Gordienok    schedule 04.11.2016
comment
Я сомневаюсь, что параметр местоположения заполняется во всех реализациях кода клиента/шлюза. Возможно, это работает только для подмножества шлюзов. Таким образом, ручное включение IP-адреса в сообщение от шлюза кажется возможным решением.   -  person Romeo Kienzler    schedule 06.11.2016
comment
@RomeoKienzler нет необходимости в прямом включении IP. Пока информации Bluemix о шлюзе (IP-адрес, когда шлюз появляется в сети) нам достаточно.   -  person Maxim Gordienok    schedule 25.03.2018
comment
Отлично, спасибо за обновление   -  person Romeo Kienzler    schedule 31.03.2018


Ответы (3)


Прямого API «дайте мне IP-адрес этого устройства» нет, но есть несколько разных источников этой информации:

Далее предположим, что существует устройство с type = "testDeviceType", id = "testDeviceId" и org = "123456".

  1. API журналов подключений

    GET /api/v0002/logs/connection?typeId=testDeviceType&deviceId=testDeviceId

    Ответ:

    [ { "timestamp": "2016-10-22T05:07:36.064Z", "message": "Closed connection from 127.0.0.1. The connection was closed by the client. Error=Connection timed out(110)" }, { "timestamp": "2016-10-22T03:59:36.182Z", "message": "Token auth succeeded: ClientID='d:123456:testDeviceType:testDeviceId', ClientIP=127.0.0.1" } ]

  2. Подписка на тему мониторинга по ключу API:

    topic = iot-2/type/+/id/+/mon

    Полезная нагрузка сообщения:

    RCV [iot-2/type/testDeviceType/id/testDeviceId/mon][retained] {"Action":"Connect","Time":"2016-11-01T14:18:36.550Z","ClientAddr":"127.0.0.1","ClientID":"d:123456:testDeviceType:testDeviceId","Port":8883,"Secure":true,"Protocol":"mqtt4","Durable":false }

  3. Как упоминалось в вопросе, это всегда можно указать в полезной нагрузке сообщения, но, может быть, есть какие-то причины не доверять этой информации, публикуемой устройством?

  4. Поле DeviceInfo на устройствах включает поле descriptive location, которое представляет собой просто строку и технически может быть установлено для IP-адреса устройства... хотя это может быть немного надуманным.

  5. Геолокацию устройства также можно настроить по протоколу HTTP или с помощью тем MQTT, посвященных управлению устройствами.

https://console.ng.bluemix.net/docs/services/IoT/devices/device_mgmt/index.html#update-location

{
    "d": {
        "longitude": number,
        "latitude": number,

        "elevation": number,
        "measuredDateTime": "string in ISO8601 format",
        "updatedDateTime": "string in ISO8601 format",
        "accuracy": number
    },
    "reqId": "string"
}

Еще одна вещь, о которой следует помнить, поскольку упоминаются шлюзы, заключается в том, что журналы подключений и темы мониторинга, упомянутые в (1) и (2), относятся только к устройствам, которые подключаются непосредственно к платформе.

person Mike Robertson    schedule 08.11.2016

Вызовите журналы подключений api... вы найдете IP-адрес, с которого устройство/шлюз в последний раз подключался, там IIRC...

Кроме того, подпишитесь на тему монитора через Mqtt, и вы можете получить IP-адрес из сообщения, доступного в этой теме, для устройства, подключенного в настоящее время, это будет текущий IP-адрес, для устройства, которое ранее подключалось, это будет последний известный IP-адрес, для того, кто никогда не подключался, не будет доступной информации.

person DavidParker    schedule 06.11.2016
comment
Я также пробовал /diag/logs вызов API, но он все время отправляет пустой ответ. Но другое решение, подписаться на тему мониторинга, мне кажется проще и удобнее. Благодарю вас! - person Maxim Gordienok; 08.11.2016

Если ваше подключенное устройство не опубликовало свое местоположение, вы ничего не сможете получить. Обновление местоположения зависит от вашего приложения или кода вашего устройства. Нет автоматического поиска местоположения по IP.

Для получения IP-адреса соединения у вас есть 2 варианта:

  • Журналы подключений

https://docs.internetofthings.ibmcloud.com/swagger/v0002.html#!/Problem_Determination/get_logs_connection

Имейте в виду, что сообщения в темах /mon/ могут не храниться бесконечно.

person Mikko Kujapelto    schedule 07.11.2016
comment
Конечно, я понимаю. Благодарю вас! Может быть, у вас также есть пример того, как настроить устройство для отправки информации о местоположении в соответствующем формате в Bluemix IoT? - person Maxim Gordienok; 08.11.2016