Быстрый старт
За несколько минут вы подключитесь к WebSocket API, подпишетесь на данные устройств и увидите первый uplink. Ниже — готовые примеры на Python и Node.js: их можно скопировать и запустить.
Что понадобится
- APP_ID — идентификатор приложения, 8 hex-символов, и токен этого приложения. Оба есть на странице приложения в веб-интерфейсе ONS.
- Python 3.8 или новее с библиотекой
websockets(pip install websockets) либо Node.js 22 или новее. - В приложении — хотя бы одно устройство, которое присылает данные.
Как это работает
- Клиент открывает соединение по адресу
wss://kz1.orion-m2m.online/ws/v2/?app_id=APP_ID&token=APP_KEY. Сервер присылает сообщениеconnected— подробнее в разделе Подключение. - Клиент отправляет
consume_req— подписку на данные устройств. Флаг"downlink_status": trueдобавляет сообщения о статусах кадров, отправленных устройствам. - Сервер присылает каждый uplink от устройств сообщением
realtime_data. - Чтобы соединение не закрылось, клиент раз в минуту отправляет
ping_req: без него сервер закрывает соединение по умолчанию через 300 секунд.
Попробовать в браузере
Подключитесь со своими APP_ID и токеном, выберите команду — Playground подставит пример запроса — и отправьте её. Ответы сервера и данные устройств появятся в журнале; запись раскрывается по щелчку.
Python
client.py
# Клиент WebSocket API Orion Network Server: подключение, подписка, данные устройств.
# pip install websockets
import asyncio
import json
import os
import websockets
URL = os.environ.get("ONS_URL", "wss://kz1.orion-m2m.online/ws/v2/")
APP_ID = os.environ["ONS_APP_ID"]
TOKEN = os.environ["ONS_TOKEN"]
PING_EVERY = 60 # секунд; сервер закрывает соединение без ping_req через 300 секунд
async def keepalive(ws):
while True:
await asyncio.sleep(PING_EVERY)
await ws.send(json.dumps({"cmd": "ping_req"}))
async def main():
async with websockets.connect(f"{URL}?app_id={APP_ID}&token={TOKEN}") as ws:
hello = json.loads(await ws.recv())
if hello.get("cmd") != "connected" or hello.get("status") != 1:
raise SystemExit(f"Подключиться не удалось: {hello}")
print("Подключено, uuid соединения:", hello.get("uuid"))
await ws.send(json.dumps({"cmd": "consume_req", "operation_id": "sub-1", "downlink_status": True}))
ping = asyncio.create_task(keepalive(ws))
try:
async for raw in ws:
msg = json.loads(raw)
cmd = msg.get("cmd")
if cmd == "consume_resp":
if msg.get("status") == 1:
print("Подписка оформлена")
elif msg.get("error_code") == 2:
print("Соединение уже подписано: в настройках приложения включена автоподписка")
else:
raise SystemExit(f"Подписка не оформлена: {msg}")
elif cmd == "realtime_data":
print("Данные от", msg["devEui"], "порт", msg["data"].get("fport"), ":", msg["data"].get("data"))
elif cmd == "downlink_status":
print("Кадр", msg["dataId"], "→", msg["downlink_status_text"])
finally:
ping.cancel()
asyncio.run(main())
Запуск:
export ONS_APP_ID=77179F01
export ONS_TOKEN=ваш_токен
python3 client.py
Node.js
client.mjs
// Клиент WebSocket API Orion Network Server: подключение, подписка, данные устройств.
// Node.js 22 и новее — WebSocket встроен, ставить ничего не нужно.
const URL = process.env.ONS_URL ?? 'wss://kz1.orion-m2m.online/ws/v2/';
const { ONS_APP_ID, ONS_TOKEN } = process.env;
const PING_EVERY = 60_000; // мс; сервер закрывает соединение без ping_req через 300 секунд
const ws = new WebSocket(`${URL}?app_id=${ONS_APP_ID}&token=${ONS_TOKEN}`);
let ping;
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
switch (msg.cmd) {
case 'connected':
if (msg.status !== 1) throw new Error(`Подключиться не удалось: ${event.data}`);
console.log('Подключено, uuid соединения:', msg.uuid);
ws.send(JSON.stringify({ cmd: 'consume_req', operation_id: 'sub-1', downlink_status: true }));
ping = setInterval(() => ws.send(JSON.stringify({ cmd: 'ping_req' })), PING_EVERY);
break;
case 'consume_resp':
if (msg.status === 1) console.log('Подписка оформлена');
else if (msg.error_code === 2) console.log('Соединение уже подписано: в настройках приложения включена автоподписка');
else throw new Error(`Подписка не оформлена: ${event.data}`);
break;
case 'realtime_data':
console.log('Данные от', msg.devEui, 'порт', msg.data.fport, ':', msg.data.data);
break;
case 'downlink_status':
console.log('Кадр', msg.dataId, '→', msg.downlink_status_text);
break;
}
};
ws.onclose = () => clearInterval(ping);
Запуск:
export ONS_APP_ID=77179F01
export ONS_TOKEN=ваш_токен
node client.mjs
Что дальше
- Отправка данных на устройство — как отправить команду и узнать, дошла ли она.
get_data_req— данные устройств за прошедший период.- Общие понятия — уровни доступа токенов,
operation_id, коды ошибок.