Показать сообщение отдельно
Старый 28.09.2012, 22:58   #29
serzh82saratov
Senior Member
 
Аватар для serzh82saratov
 
Регистрация: 13.01.2011
Адрес: Саратов
Сообщений: 626
По умолчанию

На AutoHotkey звонилка выглядит так

библиотека

Код:
Call:
StringReplace, command, command, %A_Space%, `%20, All
Call = GET /xbmcCmds/xbmcHttp?command=%command% HTTP/1.1`nHost: %Host%`nProxy-Connection: Close`n`n
s := socketConnect("" Host "", Port)
socketSendStr(s, Call)
if msg = 1
{
msgbox % socketReadStr(s)       ; %
msg = 0
}
socketClose(s)

global socketError = 0
if(!socketBufferSize)
   socketBufferSize := 0x8000
socketBuffer := DllCall("LocalAlloc", "uint", 0, "ptr", socketBufferSize, "ptr")
socketInit()
 
;читает строку в кодировке CP1251
socketReadStrA(Socket)
{
   return socketReadStr(Socket, "CP1251")
}
;отправляет строку в кодировке CP1251
socketSendStrA(Socket, String)
{
   return socketSendStr(Socket, String, "CP1251")
}
;инициализация
socketInit()
{
   if(DllCall("LoadLibrary", "str", "Ws2_32.dll", "ptr")=0)
   {
      SocketError := 1
      return 1
   }
   VarSetCapacity(WSAData, 108, 0)
   if(DllCall("Ws2_32.dll\WSAStartup", "ushort", 0x0202, "ptr", &WSAData))
   {
      SocketError := 2
   }
   VarSetCapacity(WSAData, 0)
   return
}
;отправляет строку в указанной кодировке
socketSendStr(Socket, String, Encoding="UTF-8")
{
   BufSize := (strlen(String)+1)*2
   VarSetCapacity(Buffer, BufSize, 0)
   BufSize := StrPut(String, &Buffer, BufSize, Encoding)
   ret := DllCall("Ws2_32.dll\send", "ptr", Socket, "ptr", &Buffer, "int", BufSize, "int", 0)
   VarSetCapacity(Buffer, 0)
   return ret
}
;сколько байт данных не прочитано
socketNewDataLength(Socket)
{
   ret := DllCall("Ws2_32.dll\ioctlsocket", "ptr", Socket, "uint", 0x4004667f, "uint*", Size, "int")
   if(!ret)
      return Size
   return -1
}
;читает данные
socketReadData(Socket, ByRef len, WaitTime = 1000)
{
   global socketBuffer
   StartTime := A_TickCount
   NewData := socketNewDataLength(Socket)
   while((NewData<=0)&&(A_TickCount-StartTime<WaitTime))
      NewData := socketNewDataLength(Socket)
   if(NewData>0)
   {
      len:=DllCall("Ws2_32.dll\recv", "ptr", Socket, "ptr", socketBuffer, "int", NewData, "int", 0, "int")
      return socketBuffer
   }
   return 0
}
;закрывает соединение
socketClose(s)
{
   return DllCall("Ws2_32.dll\closesocket", "ptr", s)
}
;читает строку в указанной кодировке
socketReadStr(Socket, Encoding="UTF-8")
{
   critical
   str := ""
   loop
   {
      Data := socketReadData(Socket, len, 100)
      if(Data)
         str .= StrGet(Data, len, Encoding)
      else
         break
   }
   SocketError := 0
   if(str != "")
      return str
   SocketError := -1
   return 0
}
;устанавливает подключение к порту "Port", хоста "HostOrIP".
socketConnect(HostOrIP, Port = 80, LocalPort = 0)
{
   global socketBufferSize
   if(!((Port>=0&&Port<=0xFFFF)&&(LocalPort>=0&&LocalPort<=0xFFFF)))
      return -10
   ret := 0
   VarSetCapacity(SockAddr, 16, 0)
   Socket := 0
   Socket := DllCall("Ws2_32.dll\socket", "int", 2, "int", 1, "int", 6, "ptr")
   if(Socket=-1)
   {
      ret := -11
      goto Clear
   }
   DllCall("Ws2_32.dll\setsockopt", "ptr", Socket, "int", 0xFFFF, "int", 0x1002, "int*", socketBufferSize, "int", 4, "int")
   if(LocalPort)
   {
      NumPut(2, &SockAddr, 0, "short")
      NumPut(sockethtons(LocalPort), &SockAddr, 2, "ushort")
      NumPut(0, &SockAddr, 4, "uint")
      if(DllCall("Ws2_32.dll\bind", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int")=-1)
      {
         ret := -12
         goto Clear
      }
   }
   NumPut(2, &SockAddr, 0, "short")
   NumPut(sockethtons(Port), &SockAddr, 2, "ushort")
   if(socketIsIP(HostOrIP))
   {
      NumPut(inet_addr(HostOrIP), &SockAddr, 4, "uint")
   }
   else
   {
      RemoteHost := DllCall("Ws2_32.dll\gethostbyname", "AStr", HostOrIP, "ptr")
      if(!RemoteHost)
      {
         ret := -13
         goto Clear
      }
      RemoteHost:=NumGet(NumGet(NumGet(RemoteHost|0, A_PtrSize*3, "ptr"), 0, "ptr"), 0, "uint")
      NumPut(RemoteHost, &SockAddr, 4, "uint")
   }
   if(DllCall("Ws2_32.dll\connect", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int")=-1)
   {
      ret := -14
      goto Clear
   }
   return Socket
Clear:
   if(Socket)
      DllCall("Ws2_32.dll\closesocket", "ptr", Socket)
   return ret
}
;в слове меняет порядок байт на сетевой
sockethtons(port)
{
   return ((port&0xFF)<<8)|(port>>8)
}
;конвертирует строку с IP-адресом в четырёхбайтовое число.
inet_addr(StringWithIP)
{
   RegExMatch(StringWithIP, "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ArrayWithIP)
   VarSetCapacity(ip, 4, 0)
   NumPut(ArrayWithIP1, &ip, 0, "uchar")
   NumPut(ArrayWithIP2, &ip, 1, "uchar")
   NumPut(ArrayWithIP3, &ip, 2, "uchar")
   NumPut(ArrayWithIP4, &ip, 3, "uchar")
   return NumGet(&ip, 0, "uint")
}
;Возвращает 1 если строка является корректным IP-адресом и 0 в ином случае.
socketIsIP(StringWithIP)
{
   ret := RegExMatch(StringWithIP, "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ArrayWithIP)
   if((ret="")||(ret=0))
      return 0
   if((ArrayWithIP1>255)||(ArrayWithIP2>255)||(ArrayWithIP3>255)||(ArrayWithIP4>255))
      return 0
   return 1
}

пример звонилки по кнопке 1 посылает сообщение, по 2 показывает инфо о воспроизводимом контенте.
Код:
#SingleInstance force
#NoEnv
Host = localhost ; нужный хост
Port = 8081 ; нужный порт
#IncludeAgain %A_ScriptDir%\CallPortLib.ahk ; загружаем библиотеку

1::
command=ExecBuiltIn(Notification(Привет, мир, 3000)) ; показать сообщение
GoTo, Call
Return
2::
command=GetCurrentlyPlaying ; инфо о воспроизводимом контенте
msg = 1 ; показывать ли сообщение (1 - показывать)
GoTo, Call
Return
почитать про команды общения с портом
Исправлена проблема с кирилицей.
Осталась проблема с выключением скринсейвера. В логе выдаёт команду типа "OnScreensaverDeactivated" но как её послать пока непонятно.
__________________
Windows 7-64 bit, NVidia GTX 570, ХВМС Kodi, Пульт IRLink + AutoHotkey.

Последний раз редактировалось serzh82saratov; 29.09.2012 в 01:22.
serzh82saratov вне форума   Ответить с цитированием