PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Помогите разобраться в программе.


Помогите разобраться в программе.

Сообщений 1 страница 15 из 15

1

Здравствуйте. Помогите разобраться в программе.
Не могу понять, почему не передает команду модему.

Код:
Login.s="admin"
Password.s="admin"
IP_Address.s="192.168.0.1"
InitNetwork()
Procedure.s SendModemData(Connect, Command.s) ; Процедура, передающая команду модему и получающая от него ответ
Result_SendModemData.s=""
Count=0
Command=Command+Chr(13)+Chr(10)
SendNetworkData(Connect, @Command, Len(Command)) ; Передача команды
Repeat                                          ; В цикле ожидается ответ
   Delay(20)
   If NetworkClientEvent(Connect)=#PB_NetworkEvent_Data ; От модема получены данные
      *mem=AllocateMemory(10000)                 ; Память под данные
        If *mem
          ReceiveNetworkData(Connect,*mem,10000) ; Считывание данных
          In.s=PeekS(*mem)
          FreeMemory(*mem)
          Result_SendModemData=Result_SendModemData+In
        EndIf
   EndIf
   Count+1
Until Count>=80
ProcedureReturn Result_SendModemData
EndProcedure
Procedure Modem_Open(IP_Address.s, Login.s, Password.s)
Protected Result=0
  Connect=OpenNetworkConnection(IP_Address, 23) ; Установка связи с модемом
  If Connect
    Result=Connect
    Delay(100)
    SendModemData(Connect, Login) ; Логин доступа к модему
    SendModemData(Connect, Password) ; Пароль доступа к модему
    Delay(400)
    SendModemData(Connect, "ping")
      Delay(1000)
      CloseNetworkConnection(Connect)
    Else
      MessageRequester("", "No connect!")
  EndIf
ProcedureReturn Result
EndProcedure
  
Procedure ModReboot(IP_Address.s, Login.s, Password.s) ;перезагрузка модема
  Connect=Modem_Open(IP_Address, Login, Password)
  Delay(2000)
  Command.s="reboot"+Chr(13)+Chr(10)
  
EndProcedure
ModReboot(IP_Address.s, Login.s, Password.s)

0

2

Как минимум, нужно добавить

Код:
SendModemData(Connect, Command)

после строки

Код:
Command.s="reboot"+Chr(13)+Chr(10)

Иначе эта команда не будет отправлена модему.

0

3

Так имеется в виду

Код:
Procedure ModReboot(IP_Address.s, Login.s, Password.s) ;перезагрузка модема
  Connect=Modem_Open(IP_Address, Login, Password)
  Delay(2000)
  Command.s="reboot"+Chr(13)+Chr(10)
SendModemData(Connect, Command)

Пробовал,к успеху не привело

0

4

У модема вроде должен быть адрес "192.168.1.1".
Какой модем вообще?

0

5

DIR-300. Я и на DSL 2500u пробовал.Через Telnet все нормально подключается,перезагружает.
В таком варианте тоже работает.

Код:
Login.s="admin"
Password.s="admin"
IP_Address.s="192.168.0.1"
InitNetwork()
Procedure.s SendModemData(Connect, Command.s) ; Процедура, передающая команду модему и получающая от него ответ
Result_SendModemData.s=""
Count=0
Command=Command+Chr(13)+Chr(10)
SendNetworkData(Connect, @Command, Len(Command)) ; Передача команды
Repeat                                          ; В цикле ожидается ответ
   Delay(20)
   If NetworkClientEvent(Connect)=#PB_NetworkEvent_Data ; От модема получены данные
      *mem=AllocateMemory(10000)                 ; Память под данные
        If *mem
          ReceiveNetworkData(Connect,*mem,10000) ; Считывание данных
          In.s=PeekS(*mem)
          FreeMemory(*mem)
          Result_SendModemData=Result_SendModemData+In
        EndIf
   EndIf
   Count+1
Until Count>=80
ProcedureReturn Result_SendModemData
EndProcedure
Procedure Modem_Open(IP_Address.s, Login.s, Password.s)
Protected Result=0
  Connect=OpenNetworkConnection(IP_Address, 23) ; Установка связи с модемом
  If Connect
    Result=Connect
    Delay(100)
    SendModemData(Connect, Login) ; Логин доступа к модему
    SendModemData(Connect, Password) ; Пароль доступа к модему
    Delay(400)
    SendModemData(Connect, "reboot")
      Delay(1000)
      CloseNetworkConnection(Connect)
    Else
      MessageRequester("", "No connect!")
  EndIf
ProcedureReturn Result
EndProcedure
  
EndProcedure
 Modem_Open(IP_Address.s, Login.s, Password.s)

При каждой команде столько строк.Это не удобно.Да и не правильно думаю

0

6

Artur написал(а):

При каждой команде столько строк.

Сколько?
По сути каждая команда отсылается двумя строками кода.

Код:
      SendModemData(Connect, "reboot")
      Delay(1000)

В место reboot вписываете требуемую команду.

0

7

Сделал так

Код:
Procedure ModReboot(IP_Address.s, Login.s, Password.s) ;перезагрузка модема
      SendModemData(Connect, "reboot")
      Delay(1000)
  
EndProcedure

ModReboot(IP_Address.s, Login.s, Password.s)

Выдает ошибку на эту строку

Код:
SendNetworkData(Connect, @Command, Len(Command))

Мне надо сделать каждую команду в отдельной процедуре.
Как в вашей программе, например

Код:
Procedure ATM_Test(Connect, port, vpi, vci)
Protected Result=0
; Проверка регистации pvc. Если нет такого то, 0, а если найден, тогда 1
Delay(400)
Command.s="atm operate vcc --stats "+Str(port)+"."+Str(vpi)+"."+Str(vci)+Chr(13)+Chr(10)
Otvet.s=SendModemData(Connect, Command.s)
If FindString(Otvet,"found error",1)=0
 Result=1
EndIf
ProcedureReturn Result
EndProcedure


Procedure ATM_Add(Connect, port, vpi, vci)
Protected PVC.s, Command.s, Otvet.s
; Регистрация pvc. Процедура вернёт 1 если всё ОК или 0 при возникновении ошибки
  PVC=Str(port)+"."+Str(vpi)+"."+Str(vci)
 
 Delay(400)
 Command="atm operate vcc --add "+PVC+" aal5 1 llcencaps"+Chr(13)+Chr(10)
 Otvet=SendModemData(Connect, Command)
 If FindString(LCase(Otvet),"error",1) Or FindString(LCase(Otvet),"invalid",1)
   ProcedureReturn 0
 EndIf
  Delay(400)
 Command="atm operate vcc --addq "+PVC+" 60 1"+Chr(13)+Chr(10)
 Otvet=SendModemData(Connect, Command)
 If FindString(LCase(Otvet),"error",1) Or FindString(LCase(Otvet),"invalid",1)
   ProcedureReturn 0
 EndIf
Delay(400)

Command="atm operate intf --settype 0 adsl"+Chr(13)+Chr(10)
Otvet=SendModemData(Connect, Command)
Delay(400)

Command="atm operate intf --state 0 enable"+Chr(13)+Chr(10)
Otvet=SendModemData(Connect, Command)
Delay(400)
 
ProcedureReturn 1
EndProcedure

0

8

Artur написал(а):

Сделал так

Выдает ошибку на эту строку

Мне надо сделать каждую команду в отдельной процедуре.
Как в вашей программе, например

Если нужно сделать так же, то ориентируйте на тот код. Обратите внимание какие там аргуметы в процедурах ATM_Test, ATM_Add и т. д. Там же нет ничего похожего на "IP_Address.s, Login.s, Password.s".

0

9

Доброе время суток.
в таком варианте заработало

Код:
Login.s="admin"
Password.s="admin"
IP_Address.s="192.168.1.1"

InitNetwork() ;Инициализация библиотеки функций


Procedure.s SendModemData(Connect, Command.s) ; Процедура, передающая команду модему и получающая от него ответ
 Result_SendModemData.s=""
 Count=0
 Command=Command+Chr(13)+Chr(10)
 SendNetworkData(Connect, @Command, Len(Command)) ; Передача команды
 
 Repeat                                          ; В цикле ожидается ответ
   Delay(20)
   If NetworkClientEvent(Connect)=#PB_NetworkEvent_Data ; От модема получены данные
      *mem=AllocateMemory(10000)                 ; Память под данные
        If *mem
          ReceiveNetworkData(Connect,*mem,10000) ; Считывание данных
          In.s=PeekS(*mem)
          FreeMemory(*mem)
          Result_SendModemData=Result_SendModemData+In
        EndIf
   EndIf
   Count+1
 Until Count>=80
ProcedureReturn Result_SendModemData
EndProcedure

Procedure Modem_Open(IP_Address.s, Login.s, Password.s)
Protected Result=0
  Connect=OpenNetworkConnection(IP_Address, 23) ; Установка связи с модемом
  If Connect
    Result=Connect
    Delay(100)
    SendModemData(Connect, Login) ; Логин доступа к модему
    SendModemData(Connect, Password) ; Пароль доступа к модему
    Delay(400)
    Out.s=SendModemData(Connect, "ping")
      If Out=""
        CloseNetworkConnection(Connect)
    EndIf
    EndIf
ProcedureReturn Result
EndProcedure
Procedure ModReboot(IP_Address.s, Login.s, Password.s) ;сохранение и перезагрузка модема
  
 Connect=Modem_Open(IP_Address.s, Login.s, Password.s)
 If Connect>0
   Delay(400)
   Command.s="save"
    SendModemData(Connect, Command)
 Delay(400)
 Command.s="reboot"
 SendModemData(Connect, Command)
 Else 
    MessageRequester("", "Нет связи с модемом!", #MB_OK|#MB_ICONERROR)
 EndIf
 
EndProcedure
Procedure ModReboot(IP_Address.s, Login.s, Password.s)

Еще вопрос. Как сделать сброс на заводские настройки и продолжить выполнение программы.
Например, я сделалтак

Код:
Login.s="admin"
Password.s="admin"
IP_Address.s="192.168.1.1"

InitNetwork() ;Инициализация библиотеки функций


Procedure.s SendModemData(Connect, Command.s) ; Процедура, передающая команду модему и получающая от него ответ
 Result_SendModemData.s=""
 Count=0
 Command=Command+Chr(13)+Chr(10)
 SendNetworkData(Connect, @Command, Len(Command)) ; Передача команды
 
 Repeat                                          ; В цикле ожидается ответ
   Delay(20)
   If NetworkClientEvent(Connect)=#PB_NetworkEvent_Data ; От модема получены данные
      *mem=AllocateMemory(10000)                 ; Память под данные
        If *mem
          ReceiveNetworkData(Connect,*mem,10000) ; Считывание данных
          In.s=PeekS(*mem)
          FreeMemory(*mem)
          Result_SendModemData=Result_SendModemData+In
        EndIf
   EndIf
   Count+1
 Until Count>=80
ProcedureReturn Result_SendModemData
EndProcedure

Procedure Modem_Open(IP_Address.s, Login.s, Password.s)
Protected Result=0
  Connect=OpenNetworkConnection(IP_Address, 23) ; Установка связи с модемом
  If Connect
    Result=Connect
    Delay(100)
    SendModemData(Connect, Login) ; Логин доступа к модему
    SendModemData(Connect, Password) ; Пароль доступа к модему
    Delay(400)
    Out.s=SendModemData(Connect, "ping")
      If Out=""
        CloseNetworkConnection(Connect)
    EndIf
    EndIf
ProcedureReturn Result
EndProcedure
 Procedure ATM_Add_0_33(IP_Address.s, Login.s, Password.s) ; Регистрация pvc_0.33
  
   Connect=Modem_Open(IP_Address.s, Login.s, Password.s) 
   If Connect>0
 Delay(400)
 Command.s="atm operate vcc --add 0.0.33 aal5 1 llcencaps"
 SendModemData(Connect, Command)
   Delay(400)
 Command.s="atm operate vcc --addq 0.0.33 60 1"
 SendModemData(Connect, Command)
 Delay(400)
   Delay(400)
 Command.s="wan config 0.0.33 --protocol bridge --encap llc  --qos disable"
 SendModemData(Connect, Command)
 Delay(400)
Command.s="atm operate intf --settype 0 adsl"
SendModemData(Connect, Command)
Delay(400)

Command.s="atm operate intf --state 0 enable"
SendModemData(Connect, Command)
Delay(400)
 Else 
    MessageRequester("", "Нет связи с модемом!", #MB_OK|#MB_ICONERROR)
 EndIf
 
EndProcedure
Procedure RestoreDefault(IP_Address.s, Login.s, Password.s)

 Connect=Modem_Open(IP_Address.s, Login.s, Password.s)
 If Connect>0
   Delay(400)
   Command.s="restoredefault"
    SendModemData(Connect, Command)
 Else 
    MessageRequester("", "Нет связи с модемом!", #MB_OK|#MB_ICONERROR)
 EndIf
 
EndProcedure
Procedure ModPing(IP_Address.s, Login.s, Password.s)
  
   Connect=Modem_Open(IP_Address.s, Login.s, Password.s) 
   If Connect>0
 Delay(400)
 Command.s="ping"
 SendModemData(Connect, Command)
Delay(400)
 Else 
    MessageRequester("", "Нет связи с модемом!", #MB_OK|#MB_ICONERROR)
 EndIf
 
EndProcedure
  RestoreDefault(IP_Address.s, Login.s, Password.s)
  Repeat
 ModPing(IP_Address.s, Login.s, Password.s) 
Until Connect>0
 Delay(400)
 ATM_Add_0_33(IP_Address.s, Login.s, Password.s)

Зацикливается, "ATM_Add_0_33(IP_Address.s, Login.s, Password.s)" не выполняется

0

10

В процедурах, связь с модемом устанавливается, но не закрывается. Нужно закрывать (разрывать связь).

Artur написал(а):

Зацикливается, "ATM_Add_0_33(IP_Address.s, Login.s, Password.s)" не выполняется

Потому что в строке 103 в переменной Connect всегда будет 0. В эту переменную вообще ничего не записывается, а по умолчанию в ней 0.

0

11

Петр, я сделал так

Код:
Login.s="admin"
Password.s="admin"
IP_Address.s="192.168.1.1"

InitNetwork() ;Инициализация библиотеки функций


Procedure.s SendModemData(Connect, Command.s) ; Процедура, передающая команду модему и получающая от него ответ
 Result_SendModemData.s=""
 Count=0
 Command=Command+Chr(13)+Chr(10)
 SendNetworkData(Connect, @Command, Len(Command)) ; Передача команды
 
 Repeat                                          ; В цикле ожидается ответ
   Delay(20)
   If NetworkClientEvent(Connect)=#PB_NetworkEvent_Data ; От модема получены данные
      *mem=AllocateMemory(10000)                 ; Память под данные
        If *mem
          ReceiveNetworkData(Connect,*mem,10000) ; Считывание данных
          In.s=PeekS(*mem)
          FreeMemory(*mem)
          Result_SendModemData=Result_SendModemData+In
        EndIf
   EndIf
   Count+1
 Until Count>=80
ProcedureReturn Result_SendModemData
EndProcedure

Procedure Modem_Open(IP_Address.s, Login.s, Password.s)
Protected Result=0
  Connect=OpenNetworkConnection(IP_Address, 23) ; Установка связи с модемом
  If Connect
    Result=Connect
    Delay(100)
    SendModemData(Connect, Login) ; Логин доступа к модему
    SendModemData(Connect, Password) ; Пароль доступа к модему
    Delay(400)
    Out.s=SendModemData(Connect, "ping")
      If Out=""
        CloseNetworkConnection(Connect)
    EndIf
    EndIf
ProcedureReturn Result
EndProcedure

Procedure RestoreDefault(IP_Address.s, Login.s, Password.s)

 Connect=Modem_Open(IP_Address.s, Login.s, Password.s)
 If Connect>0
   Delay(400)
   Command.s="restoredefault"
   SendModemData(Connect, Command)
   Delay(400)
   CloseNetworkConnection(Connect)
 Else 
    MessageRequester("", "Нет связи с модемом!", #MB_OK|#MB_ICONERROR)
 EndIf
 
EndProcedure
Procedure ModPing(IP_Address.s, Login.s, Password.s) ; Регистрация pvc_0.33
  
   Connect=Modem_Open(IP_Address.s, Login.s, Password.s) 
   If Connect>0
 Delay(400)
 Command.s="ping"
 SendModemData(Connect, Command)
 Delay(400)
 CloseNetworkConnection(Connect)
 EndIf
 
EndProcedure

 Procedure ATM_Add_0_33(IP_Address.s, Login.s, Password.s) ; Регистрация pvc_0.33
  
   Connect=Modem_Open(IP_Address.s, Login.s, Password.s) 
   If Connect>0
 Delay(400)
 Command.s="atm operate vcc --add 0.0.33 aal5 1 llcencaps"
 SendModemData(Connect, Command)
   Delay(400)
 Command.s="atm operate vcc --addq 0.0.33 60 1"
 SendModemData(Connect, Command)
 Delay(400)
   Delay(400)
 Command.s="wan config 0.0.33 --protocol bridge --encap llc  --qos disable"
 SendModemData(Connect, Command)
 Delay(400)
Command.s="atm operate intf --settype 0 adsl"
SendModemData(Connect, Command)
Delay(400)

Command.s="atm operate intf --state 0 enable"
SendModemData(Connect, Command)
Delay(400)
 Else 
    MessageRequester("", "Нет связи с модемом!", #MB_OK|#MB_ICONERROR)
 EndIf
 
EndProcedure
RestoreDefault(IP_Address.s, Login.s, Password.s)
  Repeat
 ModPing(IP_Address.s, Login.s, Password.s) ; Регистрация pvc_0.33
 Until Connect>0
  Delay(400)
  ATM_Add_0_33(IP_Address.s, Login.s, Password.s)

Все равно так же в цикле остается.

0

12

Ситуация по сути не изменилась.

Пётр написал(а):

Потому что в строке 103 в переменной Connect всегда будет 0. В эту переменную вообще ничего не записывается, а по умолчанию в ней 0.

Только в текущем коде это строка 104.
А раз в переменной 0, то как может выполнится это условие?

Artur написал(а):

Until Connect>0

И в процедуре ATM_Add_0_33() так же нужно закрывать связь с модемом.

0

13

Петр,спасибо. Понял
Вместо

Код:
Until Connect>0
Код:
Until Connect=0

0

14

Но тогда наличие цикла теряет смысл.

0

15

В таком виде вроде работает

Код:
Login.s="admin"
Password.s="admin"
IP_Address.s="192.168.1.1"

InitNetwork() ;Инициализация библиотеки функций


Procedure.s SendModemData(Connect, Command.s) ; Процедура, передающая команду модему и получающая от него ответ
 Result_SendModemData.s=""
 Count=0
 Command=Command+Chr(13)+Chr(10)
 SendNetworkData(Connect, @Command, Len(Command)) ; Передача команды
 
 Repeat                                          ; В цикле ожидается ответ
   Delay(20)
   If NetworkClientEvent(Connect)=#PB_NetworkEvent_Data ; От модема получены данные
      *mem=AllocateMemory(10000)                 ; Память под данные
        If *mem
          ReceiveNetworkData(Connect,*mem,10000) ; Считывание данных
          In.s=PeekS(*mem)
          FreeMemory(*mem)
          Result_SendModemData=Result_SendModemData+In
        EndIf
   EndIf
   Count+1
 Until Count>=80
ProcedureReturn Result_SendModemData
EndProcedure

Procedure Modem_Open(IP_Address.s, Login.s, Password.s)
Protected Result=0
  Connect=OpenNetworkConnection(IP_Address, 23) ; Установка связи с модемом
  If Connect
    Result=Connect
    Delay(100)
    SendModemData(Connect, Login) ; Логин доступа к модему
    SendModemData(Connect, Password) ; Пароль доступа к модему
    Delay(400)
    Out.s=SendModemData(Connect, "ping")
      If Out=""
        CloseNetworkConnection(Connect)
    EndIf
    EndIf
ProcedureReturn Result
EndProcedure

Procedure RestoreDefault(IP_Address.s, Login.s, Password.s)
  Connect=Modem_Open(IP_Address.s, Login.s, Password.s)
  If Connect
   Delay(400)
   Command.s="restoredefault"
   SendModemData(Connect, Command)
   Delay(400)
   CloseNetworkConnection(Connect) 
   
   EndIf
 
EndProcedure

Procedure ModPing(IP_Address.s, Login.s, Password.s) ; Проверка связи в цикле
Repeat
 Connect=Modem_Open (IP_Address.s, Login.s, Password.s)
   If Connect
     Delay(100)
     Command.s="ping"
    SendModemData(Connect, Command) ; Логин доступа к модему
    Delay(400)
    CloseNetworkConnection(Connect)
    EndIf
     Until Connect>0

ProcedureReturn Result
 
EndProcedure

 Procedure ATM_Add_0_33(IP_Address.s, Login.s, Password.s) ; Регистрация pvc_0.33
  
   Connect=Modem_Open(IP_Address.s, Login.s, Password.s) 
   If Connect
 Delay(400)
 Command.s="atm operate vcc --add 0.0.33 aal5 1 llcencaps"
 SendModemData(Connect, Command)
   Delay(400)
 Command.s="atm operate vcc --addq 0.0.33 60 1"
 SendModemData(Connect, Command)
 Delay(400)
   Delay(400)
 Command.s="wan config 0.0.33 --protocol bridge --encap llc  --qos disable"
 SendModemData(Connect, Command)
 Delay(400)
Command.s="atm operate intf --settype 0 adsl"
SendModemData(Connect, Command)
Delay(400)

Command.s="atm operate intf --state 0 enable"
SendModemData(Connect, Command)
Delay(400)
CloseNetworkConnection(Connect)
MessageRequester("", "0.33 OK")
 Else 
    MessageRequester("", "Нет связи с модемом!", #MB_OK|#MB_ICONERROR)
 EndIf
 
EndProcedure

 Procedure ATM_Add_1_32(IP_Address.s, Login.s, Password.s) ; Регистрация pvc_1.32
  
   Connect=Modem_Open(IP_Address.s, Login.s, Password.s) 
   If Connect
 Delay(400)
 Command.s="atm operate vcc --add 0.1.32 aal5 1 llcencaps"
 SendModemData(Connect, Command)
   Delay(400)
 Command.s="atm operate vcc --addq 0.1.32 60 1"
 SendModemData(Connect, Command)
 Delay(400)
   Delay(400)
 Command.s="wan config 0.1.32 --protocol bridge --encap llc  --qos disable"
 SendModemData(Connect, Command)
 Delay(400)
Command.s="atm operate intf --settype 0 adsl"
SendModemData(Connect, Command)
Delay(400)

Command.s="atm operate intf --state 0 enable"
SendModemData(Connect, Command)
Delay(400)
CloseNetworkConnection(Connect)
MessageRequester("", "1.32 OK")
 Else 
    MessageRequester("", "Нет связи с модемом!", #MB_OK|#MB_ICONERROR)
 EndIf
 
EndProcedure

 Procedure ATM_Add_1_34(IP_Address.s, Login.s, Password.s) ; Регистрация pvc_1.34
  
   Connect=Modem_Open(IP_Address.s, Login.s, Password.s) 
   If Connect
 Delay(400)
 Command.s="atm operate vcc --add 0.1.34 aal5 1 llcencaps"
 SendModemData(Connect, Command)
   Delay(400)
 Command.s="atm operate vcc --addq 0.1.34 60 1"
 SendModemData(Connect, Command)
 Delay(400)
   Delay(400)
 Command.s="wan config 0.1.34 --protocol bridge --encap llc  --qos disable"
 SendModemData(Connect, Command)
 Delay(400)
Command.s="atm operate intf --settype 0 adsl"
SendModemData(Connect, Command)
Delay(400)

Command.s="atm operate intf --state 0 enable"
SendModemData(Connect, Command)
Delay(400)
CloseNetworkConnection(Connect)
MessageRequester("", "1.34 OK")
 Else 
    MessageRequester("", "Нет связи с модемом!", #MB_OK|#MB_ICONERROR)
 EndIf
 
EndProcedure

RestoreDefault(IP_Address.s, Login.s, Password.s)
ModPing(IP_Address.s, Login.s, Password.s)
 
ATM_Add_0_33(IP_Address.s, Login.s, Password.s)
Delay(100)
ATM_Add_1_32(IP_Address.s, Login.s, Password.s)
Delay(100)
ATM_Add_1_34(IP_Address.s, Login.s, Password.s)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Помогите разобраться в программе.