Как добиться передачи произвольного сигнала по расписанию - PullRequest
1 голос
/ 01 ноября 2019

В моем случае я хочу разбудить субнеромодем в определенное время и передать сигнал, сгенерированный мной. Согласно главе 25 руководства unetStack, модуль планировщик имеет возможность организовать активацию модема в определенное время. Поэтому я попытался протестировать модем с помощью следующего скрипта groovy. Без сомнения, это не работает.

addsleep 1.minutes.later 5.minutes.later;
phy << new GetSleepScheduleReq();
plvl = -30;
signal = load('sig.txt');
5.times {
    phy << new TxBasebandSignalReq(signal:signal, fc:0);
    delay(5000);
}

Я обнаружил, что есть функция с именем «WakeFromSleepNtf», которая будет полезна для управления модемом, однако, нет подробных иллюстраций о такой функции.

Хотя функцию delay или параметр с именем TxTime из TxBasebandSignalReq можно использовать для составления расписания управления модемом, работающим вопределенный график времени, он требует, чтобы модем работал все время. Таким образом, батарея модема является проблемой, особенно когда модем интегрирован с транспортным средством.

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

1 Ответ

1 голос
/ 02 ноября 2019

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

Если это так, я бы сделал что-то подобное на оболочке:

// part 1: wait until its time to transmit
t = 5.minutes.later                  // calculate time of transmission
addsleep t                           // schedule sleep from now until time t
while (t-time/1000 > 1) delay(1000)  // wait until its time to transmit

// part 2: make your transmissions
plvl -30                             // set power level
signal = load('sig.txt')             // load your signal
5.times {                            // transmit it 5 times with 5 second delay
    phy << new TxBasebandSignalReq(signal:signal, fc:0)
    delay(5000)
}

Первая часть кода вычисляет время t (в секундах эпохи), в которое должна быть сделана передача, и просит модем запланировать режим ожидания до тех пор. Перевод модема в спящий режим занимает несколько секунд, поэтому сценарий продолжит работать в течение этого времени. Следовательно, нам нужно, чтобы следующий оператор ожидал, пока пришло время для передачи, проверяя текущее время (time дает текущее время в миллисекундах эпохи) против времени передачи каждую секунду.

Вторая часть кодатакой же, как у вас, но учтите, что после plvl не должно быть =.

PS Некоторые модемы (например, unet audio на ноутбуке) могут не иметь спящего режима с низким энергопотреблением, поэтому на самом деле могут не спать,Цикл ожидания в части 1 также обеспечивает корректную работу этого кода на таких модемах.

...