Commit 3040e83d authored by Andrey Filippov's avatar Andrey Filippov

test files for websockets to control camera from 2 devices

parent 53fb4a49
...@@ -8,9 +8,12 @@ CONFDIR = $(SYSCONFDIR)/elphel393 ...@@ -8,9 +8,12 @@ CONFDIR = $(SYSCONFDIR)/elphel393
INSTALL = install INSTALL = install
DOCS= index.html DOCS= index.html \
test_goggles.html \
test_rc.html
PHP_SCRIPTS_EXE=lwir16.php \ PHP_SCRIPTS_EXE=lwir16.php \
dualsock.php \
test_int.php \ test_int.php \
test_wpipe.php \ test_wpipe.php \
test_ps.php test_ps.php
......
#!/usr/bin/php
<?php
/*!*******************************************************************************
*! FILE NAME : dualsock.php
*! DESCRIPTION: Skeleton websockets server to connect to 2 smartphones -
*! 1 for stereo goggles, anothe as a hand-held RC
*! Copyright (C) 2021 Elphel, Inc
*! -----------------------------------------------------------------------------**
*!
*! This program is free software: you can redistribute it and/or modify
*! it under the terms of the GNU General Public License as published by
*! the Free Software Foundation, either version 3 of the License, or
*! (at your option) any later version.
*!
*! This program is distributed in the hope that it will be useful,
*! but WITHOUT ANY WARRANTY; without even the implied warranty of
*! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*! GNU General Public License for more details.
*!
*! You should have received a copy of the GNU General Public License
*! along with this program. If not, see <http://www.gnu.org/licenses/>.
*! -----------------------------------------------------------------------------**
*!
*/
// print_r($argv);
set_include_path ( get_include_path () . PATH_SEPARATOR . '/www/pages/include' );
include 'show_source_include.php';
include 'elphel_functions_include.php'; // includes curl functions
define('SOCK_GOGGLES_FILE', '/tmp/wstunnel-nobin.socket'); // defined in /etc/lighttpd.conf ws://<ip>:80/ws-nobin/"
define('SOCK_REMOTE_CONTROL_FILE', '/tmp/wstunnel-nobin1.socket'); // defined in /etc/lighttpd.conf ws://<ip>:80/ws-nobin1/"
define('SOCK_GOGGLES', 'SOCK_GOGGLES');
define('SOCK_REMOTE_CONTROL', 'SOCK_REMOTE_CONTROL');
define('LOGFILE', '/tmp/dualsock.log');
set_time_limit(0); // no limit - run forever
logmsg('Staring dualsock.php');
if(file_exists(SOCK_GOGGLES_FILE)) unlink(SOCK_GOGGLES_FILE); //delete socket if it was already there
if(file_exists(SOCK_REMOTE_CONTROL_FILE)) unlink(SOCK_REMOTE_CONTROL_FILE); //delete socket if it was already there
init();
$GLOBALS[SOCK_GOGGLES] = socket_create(AF_UNIX, SOCK_STREAM, 0);
$GLOBALS[SOCK_REMOTE_CONTROL] = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_bind($GLOBALS[SOCK_GOGGLES], SOCK_GOGGLES_FILE); // bind new socket with filesystem path
socket_bind($GLOBALS[SOCK_REMOTE_CONTROL], SOCK_REMOTE_CONTROL_FILE);
socket_set_block($GLOBALS[SOCK_GOGGLES]); // will wait for data available /ready to accept
socket_set_block($GLOBALS[SOCK_REMOTE_CONTROL]); // will wait for data available /ready to accept
socket_listen($GLOBALS[SOCK_GOGGLES]); // will listen to the socket for incoming data
socket_listen($GLOBALS[SOCK_REMOTE_CONTROL]); // will listen to the socket for incoming data
// Warning: socket_write(): unable to write to socket [32]: Broken pipe in /www/pages/lwir16/dualsock.php on line 103
// Main loop
while (1) {
$read = array(
$GLOBALS[SOCK_GOGGLES],
$GLOBALS[SOCK_REMOTE_CONTROL]
);
$write = NULL;
$except = NULL;
$select_timeout_sec = 5; // will be used for housekeeping actions, needed if there are no incoming commands
$select_timeout_usec = 0; // when need faster than number of seconds
$num_changed_sockets = socket_select(
$read, // will modify array to have only ready connections
$write,
$except,
$select_timeout_sec,
$select_timeout_usec
); // wait
if ($num_changed_sockets === false) {
/* Error handling */
logmsg ("Error: socket_select returned false!");
sleep (1);
continue;
} else if ($num_changed_sockets > 0) {
/* At least at one of the sockets something interesting happened */
$active_connections = array();
if (in_array($GLOBALS[SOCK_GOGGLES], $read)) {
$active_connections[SOCK_GOGGLES] = socket_accept($GLOBALS[SOCK_GOGGLES]);
}
if (in_array($GLOBALS[SOCK_REMOTE_CONTROL], $read)) {
$active_connections[SOCK_REMOTE_CONTROL] = socket_accept($GLOBALS[SOCK_REMOTE_CONTROL]);
}
// now $active_connections contain one or two temporary sockets, to read command through and respond, if empty - close
foreach ($active_connections as $name=>$conn) {
logmsg("Processing connection $name");
processConnection($conn, $name);
}
} else { // do housekeeping functions
logmsg ("No incoming commands - do housekeeping routines");
}
} // end of while (1) -main loop
function processConnection($conn, $name){
// Just read lines and respond with the name to each until read empty string
while (1) {
$sr = socket_read($conn, 1000);
logmsg($name." -> ".$sr." (".strlen($sr)." bytes)");
if (!$sr){
break; // happens when timeout and websocket is closed (or page refreshed)
}
if (strlen($sr) < 2){
break;
}
$sw = socket_write($conn, $name.", got ".$sr." from you");
}
socket_close($conn);
logmsg($name." closed");
}
function logmsg($msg){
file_put_contents(LOGFILE, time().': '.$msg."\n", FILE_APPEND);
}
function init(){
// Add all required initialization before establishing connection to the clients
}
?>
<!DOCTYPE html>
<meta charset="utf-8"/>
<!-- modified from example in https://github.com/joewalnes/websocketd README.md -->
<pre id="log"></pre>
<script>
// helper function: log message to screen
var logelt = document.getElementById('log');
function log(msg) { logelt.textContent += msg + '\n'; }
// helper function: send websocket msg with count (1 .. 5)
var host = location.hostname;
log('SERVER: '+host);
var ll = 0;
function send_msg() {
if (++ll <= 5) {
log('SEND: '+ll);
ws.send(ll+'\n');
} else if (ll <=6){
ws.send('\n');
log('SEND: '+ll);
}
console.log("ll="+ll);
}
// setup websocket with callbacks
var ws = new WebSocket('ws://'+host+':80/ws-nobin/');
ws.onopen = function() { log('CONNECT\n'); send_msg(); };
ws.onclose = function() { log('DISCONNECT'); };
ws.onmessage = function(event) { log('RECV: ' + event.data); send_msg(); };
</script>
<!DOCTYPE html>
<meta charset="utf-8"/>
<!-- modified from example in https://github.com/joewalnes/websocketd README.md -->
<pre id="log"></pre>
<script>
// helper function: log message to screen
var logelt = document.getElementById('log');
function log(msg) { logelt.textContent += msg + '\n'; }
// helper function: send websocket msg with count (1 .. 5)
var host = location.hostname;
log('SERVER: '+host);
var ll = 0;
function send_msg() {
if (++ll <= 5) {
log('SEND: '+ll);
ws.send(ll+'\n');
} else if (ll <=6){
ws.send('\n');
log('SEND: '+ll);
}
console.log("ll="+ll);
}
// setup websocket with callbacks
var ws = new WebSocket('ws://'+host+':80/ws-nobin1/');
ws.onopen = function() { log('CONNECT\n'); send_msg(); };
ws.onclose = function() { log('DISCONNECT'); };
ws.onmessage = function(event) { log('RECV: ' + event.data); send_msg(); };
</script>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment