AS3 сокет класу з'єднання з serproxy і передачі даних

Я все ще борюся з AS3, але хочу вивчити якомога більше. Я намагаюся написати невелику прикладну програму Flash, яка зможе надіслати змінні до послідовних портів за допомогою класу сокетів. Я зробив домашнє завдання, і я знаю, що спалах не може передавати дані через послідовні порти, такі як COM та USB. Для цього вам доведеться скористатися програмою, яка отримає вихідні дані з Flash і відправить її в порт бажання. Кращий приклад такого процесу описаний на сайті Arduino. Звідти я дізнався, що найкращим способом є використання serproxy, який я завантажив і встановив на моєму комп'ютері Win7. Я пройшов різноманітні підручники з цього питання, і я поставив разом програму fla, яку я думав зробить саме те, що хочу. На жаль, проблема полягає в тому, що навіть додаток підключається до serproxy, я не можу відправляти будь-які дані.

І вся ідея полягає в тому, щоб мати змогу керувати простими пристроями, з'єднаними локально через USB або COM-порт.

Як ви бачите, я створив кнопку, яка може встановити і закрити з'єднання з локальним хостом на серproxy, використовуючи порт 5331. Я також створив кнопки, які повинні надсилати два типи даних через сокет, рядки та цілі числа. На жаль, жоден із них не досягає компорту. Я перевірив файл конфігурації для serproxy, і він налаштовано правильно, тому останній варіант полягає в тому, що я можу зламати щось у AS3. Я не знаю, чи це актуально, але я перевіряв це у флеш-плеєрі, а також у AIR 2.6 - не допомогло.

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

For better clarity yoy may also download my zipped fla file from here

І це мій код (написаний на кадрі в 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"
}
1

3 Відповіді

Де ваша команда socket.flush() ? :)

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

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

Закінчення з нульовим символом допомагає в більшості випадків.

Але, будь ласка, пам'ятайте, як згортати розетку після написання на нього.

0
додано
команда write basically записує в буфер, а команда flush така ж, як і надсилання буферних даних на сервер
додано Автор The_asMan, джерело
Дякуємо за ваш внесок The_asMan Я оновлю скрипт, як ви запропонуєте, і перевірите його, і повідомте, чи це працює для мене.
додано Автор mad robot, джерело
Я змінив код і протестував його з Wireshark, як це запропонував wvxvw, і це виглядає так, як він працює :). таким чином, я вважаю, що команда flush має вирішальне значення. Я точно не знаю, що робить інше команда, String.fromCharCode (0), але, я впевнений, це також допомагає. Ще раз спасибі за вашу допомогу !!!
додано Автор mad robot, джерело

Я не бачу проблеми з кодом. Нічого, що б змусило його розбити, якщо тільки другий кадр не є ключовим кадром, у цьому випадку сокет у першому кадрі буде знищений, коли ви будете переходити далеко від першого кадру. (Загалом, код тимчасової лінії призначений для полегшення для анімацій сценаріїв для графічних дизайнерів. Якщо ви збираєтеся підтримувати дещо більшу кодову базу, я б запропонував вам написати код в окремих файлах * .as.

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

Взагалі, є ще кілька способів спробувати підключитися до паралельного порту або USB - оскільки AIR 3 має варіант для власних розширень (ANE), він дуже новий і ще недостатньо документований, але я б краще піти з цим, особливо якщо написання на іншій мові, крім АС, не є проблемою. Ще одним способом спілкування з іншою програмою за межами середовища виконання AIR є використання власного процесу. І.е. ви запустите програму, відповідальну за підключення до потрібного порту/пристрою, а потім використовуйте нативний процес для читання/запису, так само, як і за допомогою сокету.

0
додано
дякую за вашу втіху wvxvw, завжди добре знати, як речі, зроблені іншими, вивчають деякі нові способи. Ви маєте рацію, що я повинен почати використовувати окремі .as-файли, сподіваюсь, що моє розуміння AS3 вчасно покращиться. У мого фільму FLAO є тільки один ключовий кадр, де все сидить, так що це не проблема, але знову почнеться.
додано Автор mad robot, джерело

Combo я використовую є

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

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

HW Group's Hercules

Я сподіваюсь, це допоможе!

0
додано