Задачи
Следуя неблокирующей философии работы TiOS, объект wln. не останавливает выполнение приложения Tibbo BASIC/C, чтобы дождаться завершения операции интерфейса Wi-Fi («задачи»). Программа передаёт объекту wln. задачу и затем свободно выполняет другие действия. Исключениями являются только методы wln.boot и wln.waitforupgradecompletion: они приостанавливают систему до окончания своего выполнения.
В виде задач реализованы девять операций Wi-Fi:
- Пассивное сканирование сетей Wi-Fi (wln.scan)
- Активное сканирование сетей Wi-Fi (wln.activescan)
- Установка режима и ключа WEP (wln.setwep)
- Установка режима и ключа WPA (wln.setwpa)
- Подключение к сети (wln.associate)
- Создание собственной сети (wln.networkstart)
- Отключение от сети (wln.disassociate)
- Остановка собственной сети (wln.networkstop)
- Установка мощности передатчика (wln.settxpower)
Объект wln. может обработать только одну задачу за раз. Перед вызовом следующего метода задачи приложение должно убедиться, что предыдущая задача завершилась. Это можно узнать по свойству только для чтения wln.task. Три задачи из списка - wln.setwep, wln.setwpa и wln.settxpower - являются так называемыми немедленными задачами: они завершаются сразу после запуска. Если выполнение переходит к следующему оператору программы, значит, эти задачи выполнены. Все остальные задачи требуют времени.
Каждый метод задачи возвращает код accepted_rejected, который показывает, принята ли задача к обработке. Задачи могут быть отклонены по разным причинам, поэтому этот код важно проверять.
Следующий пример показывает неправильный способ постановки задач:
'THIS WON'T WORK!
...
wln.scan("NET1")
wln.associate(wln.scanresultbssid,"NET1",wln.scanresultchannel,wln.scanresultbssmode) 'this task will be rejected and skipped over!
Здесь ошибки в трёх местах. Во-первых, код не проверяет, принята или отклонена каждая задача. Во-вторых, он не ждёт завершения первой задачи перед запуском второй. В-третьих, «задача завершена» не равно «задача успешно завершена». Например, задача подключения в любом случае рано или поздно завершится, но это не гарантирует, что подключение установлено: это нужно проверить отдельно.
Вот как это следует сделать:
'A BETTER WAY
...
if wln.scan("NET1")<>ACCEPTED then
'task rejected -- react to this
end if
while wln.task<>PL_WLN_TASK_IDLE 'waiting for the task to complete...
wend
...
if wln.associate(wln.scanresultbssid,"NET1",wln.scanresultchannel,wln.scanresultbssmode)<>ACCEPTED
'task rejected -- react to this
end if
while wln.task<>PL_WLN_TASK_IDLE 'waiting for the task to complete...
wend
If wln.associationstate<>PL_WLN_ASSOCIATED Then
'something went wrong and association failed
End If
...
Недостаток этого кода в том, что он блокирующий. По сути, он сводит на нет все усилия, потраченные на построение асинхронной системы. Приложение ничего полезного не делает, пока интерфейс Wi-Fi сканирует или подключается.
Чтобы использовать событийную природу TiOS, можно построить ход выполнения на событии on_wln_task_complete, которое генерируется при каждом завершении задачи. Аргумент completed_task обработчика события содержит код завершённой задачи. Поэтому этапы выполнения приложения можно проходить так:
'THIS CODE TAKES FULL ADVANTAGE OF THE EVENT-DRIVEN NATURE OF THE SYSTEM
'-------------------------------------------
Sub On_sys_init
...
wln.scan("CISCO1") 'start the task and don't wait
End Sub
'-------------------------------------------
Sub On_wln_task_complete(completed_task As pl_wln_tasks)
Select Case completed_task
Case PL_WLN_TASK_SCAN:
'wln.scan() completed
If wln.scanresultssid="" Then
'failed to find the network, respond to this
end if
'network discovered, proceed to associating
wln.associate(wln.scanresultbssid,"CISCO1",wln.scanresultchannel,wln.scanresultbssmode)
Case PL_WLN_TASK_ASSOCIATE:
'association task completed, check the result
If wln.associationstate<>PL_WLN_ASSOCIATED Then
'something went wrong and association failed
End If
End Select
End Sub