Соединение класса сокетов AS3 с серпрокси и отправка данных - PullRequest
1 голос
/ 28 октября 2011

Я все еще борюсь с AS3, но хочу учиться как можно больше. Я пытаюсь написать небольшой пример флеш-приложения, которое сможет отправлять переменные на последовательные порты, используя класс сокетов. Я сделал свою домашнюю работу, и я знаю, что флэш-память не может отправлять данные через последовательные порты, такие как COM и USB. Для этого вы должны использовать программу, которая будет получать исходящие данные из Flash и отправлять их по желанию порта. Лучший пример такого процесса описан на сайте Arduino. Оттуда я узнал, что лучший способ - использовать serproxy, который я скачал, и установить на мою машину с Win7. Я прошел различные уроки по этой проблеме и собрал вместе приложение fla, которое, как я думал, будет делать именно то, что я хочу. К сожалению, проблема в том, что даже приложение подключается к serproxy. Я не могу отправить какие-либо данные.

И вся идея в том, чтобы иметь возможность управлять простыми устройствами, подключенными локально через USB или COM-порт.

Как вы можете видеть, я создал кнопку, которая может устанавливать и закрывать соединение с локальным хостом через serproxy через порт 5331. Я также создал кнопки, которые должны передавать данные двух типов через сокет, строки и целые числа. К сожалению, никто из них не достигает ком-порта. Я проверил файл конфигурации для serproxy, и он настроен правильно, поэтому последний вариант - я могу что-то испортить в AS3. Я не знаю, уместно ли это, но я проверял это во флэш-плеере, а также в AIR 2.6 - не помогло.

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

Для большей наглядности вы можете также скачать мой zip-файл fla отсюда

А это мой код (написан на кадре в fla)

    import flash.display.Sprite
import flash.net.Socket
import flash.utils.*
import flash.events.*;


const PORT:Number = 5331
const LOCALHOST:String = "127.0.0.1"

var socket:Socket = null
socket = new Socket();

mess.text = "Click to open / close connection"
notext.text = "0"
onOffbtn.gotoAndStop(1)

var socketStatus:Boolean = false

onOffbtn.addEventListener(MouseEvent.MOUSE_DOWN, onOffbtnSocket)
function onOffbtnSocket(e:MouseEvent):void{
    if(socketStatus){
        socket.close()

        socketStatus = false
        onOffbtn.gotoAndStop(1)
        trace("_Connection with Serproxy has been closed")
        mess.text = "_Connection with Serproxy has been closed"
    }else{
        socket.connect( LOCALHOST, PORT )
        socketStatus = true
        onOffbtn.gotoAndStop(2)
    }
}


socket.addEventListener(IOErrorEvent.IO_ERROR,errorHandler)
socket.addEventListener( Event.CONNECT, doSocketConnect )
socket.addEventListener( Event.CLOSE, doSocketClose )

socket.addEventListener(Event.COMPLETE, onReady);

function onReady(e:Event):void
{
    trace("bytes has been send")
}

function errorHandler(errorEvent:IOErrorEvent):void {   
    trace("- "+errorEvent.text);
    trace("- Did you start the Serproxy program ?");
    mess.text = "! " + errorEvent.text + " \n! Please start the Serproxy program first"
    onOffbtn.gotoAndStop(1)
}
function doSocketConnect( event:Event ):void {
    trace("- Connection with Serproxy established.")
    mess.text = "_Connection with Serproxy established. \nTry to send data."
}
function doSocketClose( event:Event ):void {
    trace("_Connection with Serproxy has been closed")
    mess.text = "_Connection with Serproxy has been closed"
}
function onResponse(e:ProgressEvent):void{
    //var str:String = socket.readUTFBytes(bytesAvailable);
    //trace(str);
}

btn1.addEventListener( MouseEvent.MOUSE_DOWN, dobtn1 )
btn2.addEventListener( MouseEvent.MOUSE_DOWN, dobtn2 )
btn3.addEventListener( MouseEvent.MOUSE_DOWN, dobtn3 )
btn4.addEventListener( MouseEvent.MOUSE_DOWN, dobtn4 )
btn5.addEventListener( MouseEvent.MOUSE_DOWN, dobtn5 )

function dobtn1( event:MouseEvent ):void {
    socket.writeInt( 1 )
    notext.text = "1"
}

function dobtn2( event:MouseEvent ):void {
    socket.writeInt( 2 )
    notext.text = "2"
}

function dobtn3( event:MouseEvent ):void {
    socket.writeInt( 3 )
    notext.text = "3"
}

function dobtn4( event:MouseEvent ):void {
    socket.writeInt( 4 )
    notext.text = "4"
}

function dobtn5( event:MouseEvent ):void {
    socket.writeInt( 5 )
    notext.text = "5"
}

btnA.addEventListener( MouseEvent.MOUSE_DOWN, dobtnA )
btnB.addEventListener( MouseEvent.MOUSE_DOWN, dobtnB )
btnC.addEventListener( MouseEvent.MOUSE_DOWN, dobtnC )
btnD.addEventListener( MouseEvent.MOUSE_DOWN, dobtnD )
btnE.addEventListener( MouseEvent.MOUSE_DOWN, dobtnE )

function dobtnA( event:MouseEvent ):void {
    socket.writeUTFBytes("This is a test for A")
    notext.text = "A"
}

function dobtnB( event:MouseEvent ):void {
    socket.writeUTFBytes("This is a test for B")
    notext.text = "B"
}

function dobtnC( event:MouseEvent ):void {
    socket.writeUTFBytes("This is a test for C")
    notext.text = "C"
}

function dobtnD( event:MouseEvent ):void {
    socket.writeUTFBytes("This is a test for D")
    notext.text = "D"
}

function dobtnE( event:MouseEvent ):void {
    socket.writeUTFBytes("This is a test for E")
    notext.text = "E"
}

Вы также можете скачать jpg с двумя программами, работающими с подключением

Заранее спасибо всем, кто готов помочь!

Вот обновленный код, который работает так, как я хотел, благодаря The_asMan.

import flash.display.Sprite
import flash.net.Socket
import flash.utils.*
import flash.events.*;


const PORT:Number = 5331
const LOCALHOST:String = "127.0.0.1"

var socket:Socket = null
socket = new Socket();

mess.text = "Click to open / close connection"
notext.text = "0"
onOffbtn.gotoAndStop(1)

var socketStatus:Boolean = false

onOffbtn.addEventListener(MouseEvent.MOUSE_DOWN, onOffbtnSocket)
function onOffbtnSocket(e:MouseEvent):void{
    if(socketStatus){
        socket.close()
        socketStatus = false
        onOffbtn.gotoAndStop(1)
        trace("_Connection with Serproxy has been closed")
        mess.text = "_Connection with Serproxy has been closed"
    }else{
        socket.connect( LOCALHOST, PORT )
        socketStatus = true
        onOffbtn.gotoAndStop(2)
    }
}


socket.addEventListener(IOErrorEvent.IO_ERROR,errorHandler)
socket.addEventListener( Event.CONNECT, doSocketConnect )
socket.addEventListener( Event.CLOSE, doSocketClose )

socket.addEventListener(Event.COMPLETE, onReady);

function onReady(e:Event):void
{
    trace("bytes has been send")
}

function errorHandler(errorEvent:IOErrorEvent):void {   
    trace("- "+errorEvent.text);
    trace("- Did you start the Serproxy program ?");
    mess.text = "! " + errorEvent.text + " \n! Please start the Serproxy program first"
    onOffbtn.gotoAndStop(1)
}
function doSocketConnect( event:Event ):void {
    trace("- Connection with Serproxy established.")
    mess.text = "_Connection with Serproxy established. \nTry to send data."
}
function doSocketClose( event:Event ):void {
    trace("_Connection with Serproxy has been closed")
    mess.text = "_Connection with Serproxy has been closed"
    onOffbtn.gotoAndStop(1)
    notext.text = "0"
}
function onResponse(e:ProgressEvent):void{
    //var str:String = socket.readUTFBytes(bytesAvailable);
    //trace(str);
}

btn1.addEventListener( MouseEvent.MOUSE_DOWN, dobtn1 )
btn2.addEventListener( MouseEvent.MOUSE_DOWN, dobtn2 )
btn3.addEventListener( MouseEvent.MOUSE_DOWN, dobtn3 )
btn4.addEventListener( MouseEvent.MOUSE_DOWN, dobtn4 )
btn5.addEventListener( MouseEvent.MOUSE_DOWN, dobtn5 )

function dobtn1( event:MouseEvent ):void {
    socket.writeInt( 1 )
    socket.flush() 
    notext.text = "1"
}

function dobtn2( event:MouseEvent ):void {
    socket.writeInt( 2 )
    socket.flush() 
    notext.text = "2"
}

function dobtn3( event:MouseEvent ):void {
    socket.writeInt( 3 )
    socket.flush() 
    notext.text = "3"
}

function dobtn4( event:MouseEvent ):void {
    socket.writeInt( 4 )
    socket.flush() 
    notext.text = "4"
}

function dobtn5( event:MouseEvent ):void {
    socket.writeInt( 5 )
    socket.flush() 
    notext.text = "5"
}

btnA.addEventListener( MouseEvent.MOUSE_DOWN, dobtnA )
btnB.addEventListener( MouseEvent.MOUSE_DOWN, dobtnB )
btnC.addEventListener( MouseEvent.MOUSE_DOWN, dobtnC )
btnD.addEventListener( MouseEvent.MOUSE_DOWN, dobtnD )
btnE.addEventListener( MouseEvent.MOUSE_DOWN, dobtnE )

function dobtnA( event:MouseEvent ):void {
    socket.writeUTFBytes("This is a test for A" + String.fromCharCode(0))
    socket.flush() 
    notext.text = "A"
}

function dobtnB( event:MouseEvent ):void {
    socket.writeUTFBytes("This is a test for B" + String.fromCharCode(0))
    socket.flush() 
    notext.text = "B"
}

function dobtnC( event:MouseEvent ):void {
    socket.writeUTFBytes("This is a test for C" + String.fromCharCode(0))
    socket.flush() 
    notext.text = "C"
}

function dobtnD( event:MouseEvent ):void {
    socket.writeUTFBytes("This is a test for D" + String.fromCharCode(0))
    socket.flush() 
    notext.text = "D"
}

function dobtnE( event:MouseEvent ):void {
    socket.writeUTFBytes("This is a test for E" + String.fromCharCode(0))
    socket.flush() 
    notext.text = "E"
}

Ответы [ 3 ]

0 голосов
/ 29 октября 2011

Я не вижу проблемы с вашим кодом. Ничего, что могло бы сломать его, если только второй кадр не является ключевым кадром, и в этом случае сокет в первом кадре будет разрушен, как только вы уйдете от первого кадра. (В целом, временная шкала кода предназначена для того, чтобы графическим дизайнерам было проще создавать сценарии анимации. Если вы собираетесь поддерживать несколько большую базу кода, я бы посоветовал вам писать код в отдельных * .as файлах.

Несколько вещей, которые стоит попробовать: Wireshark / tcpdump - это программы, способные контролировать весь трафик на всех портах вашего ПК. Используя их, вы можете хотя бы увидеть, где отправленные данные теряются. Я бы сделал, по крайней мере ради эксперимента, простой прослушивающий сокет TCP и попытался бы подключиться к нему, чтобы увидеть, есть ли проблема.

В общем, есть несколько других вещей, которые можно попробовать подключить к параллельному порту или USB - поскольку в AIR 3 есть опция для собственных расширений (ANE), она очень новая и плохо документирована, но я бы предпочел пойти с этим один, особенно если письмо на языке, отличном от AS, не является проблемой. Еще один способ связи с другим приложением вне среды выполнения AIR - использование собственного процесса. То есть вы бы запустили приложение, отвечающее за подключение к нужному порту / устройству, а затем использовали бы собственный процесс для чтения / записи, как если бы вы использовали сокетное соединение.

0 голосов
/ 25 апреля 2013

Комбо, которое я использую:

socket.writeUTFBytes(myMessage);
socket.writeByte(0);
socket.flush();

Я также рекомендую для целей отладки

Hercules HW Group

Надеюсь, это поможет!

0 голосов
/ 29 октября 2011

Где твой socket.flush() command ??:)

Это также хорошая практика.

socket.writeUTFBytes("This is a test for E" + String.fromCharCode(0) );

В большинстве случаев помогает окончание с нулевым символом.

Но да, не забывайте очищать сокет после того, как вы напишитек этому.

...