3

phpスクリプトを使用して生データを組み込みデバイスに送信しようとしています(ArduinoLeonardoに接続されたWizFiwlanモジュールに基づくWifiシールド)。次の手順を実行すると、デバイスにデータを正常に送信できます。

echo -n "teststring" | nc xx.xx.xx.xx 4000UNIX端末(Mac OS X)(xはデバイスのIPのプレースホルダーを表します)

または、IP、ポートを指定してPutty(Windows XPの場合)を使用し、接続タイプとして[RAW]を選択します。

同じことを実現するために、phpスクリプトでソケットを確立しようとしました(Webフォームを介してデバイスにデータを送信したいため)。

以下のサンプルコードを参照してください。

$mysocket = socket_create(AF_INET, SOCK_RAW,255);  

if ($mysocket === false) {
  $errorcode = socket_last_error();
  $errormsg = socket_strerror($errorcode);
  die("could not establish socket: [$errorcode] $errormsg");
}

// connect to socket
if (socket_connect($mysocket, 'xx.xx.xx.xx', 4000)) {
  $text = "Socket connection seems successful!";
} else {
  $text = "Unable to connect<pre>".socket_strerror(socket_last_error())."</pre>";
}

echo $text;

echo "Mystring: ";
echo $mystring;

echo "try to send data";


// send string to server
socket_write($mysocket, $mystring, strlen($mystring)) or die("Could not send data");
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

echo "errorcode:";
echo $errorcode;
echo $errormsg;

socket_close($mysocket);                                                     

socket createコマンド(引数の最後の整数)に対応するプロトコルは次のとおりです。(サーバー(Synology NAS)の/ etc/protocolsからコピーしたリスト。

<!-- language: none -->
ip      0       IP
icmp    1       ICMP
igmp    2       IGMP
ggp     3       GGP
tcp     6       TCP
pup     12      PUP
udp     17      UDP
idp     22      IDP
raw     255     RAW

この例では、RAWを使用しました。

php phpscriptinshell.php Webベースのphpスクリプトでコマンドを実行することが許可されていなかったため、SOCK_RAWオプションの使用で問題が発生したため、これらの例をシェル から実行します。

だからついに私はエラー出力を得ました:

ソケット接続は成功したようです!dataPHPを送信してみてください警告:socket_write():ソケットに書き込めません[22]:37行目の/volume2/web/phpscriptinshell.phpの引数が無効です

警告:socket_write():ソケットに書き込めません[22]:37行目の/volume2/web/phpscriptinshell.phpの引数が無効ですficus> php phpscriptinshell.php

プロトコルに他のオプションを使用する場合。たとえば、ICMPの場合は1ですが、エラーは発生しませんが、データは送信されません。IPに0を使用すると、「ソケットを確立できませんでした:[93]プロトコルがサポートされていません」というメッセージが表示されます。TCPに6を使用すると、端末が無応答になり、wifiチップがネットワークへの接続を失います。

だから私の質問は:

1)ソケットに書き込もうとすると、なぜ「無効な引数」が表示されるのですか?

2)プロトコル引数としてTCPを使用するとどうなりますか?

3)phpを使用してデータを送信する正しい方法は何ですか?

4)問題を解決するために何を提案しますか?

ヒントをありがとう!

Barmers Hintに続く2回目の試行として、同じスクリプトを試しましたが、

$mysocket = socket_create(AF_INET, SOCK_RAW,255);

$mysocket = socket_create(AF_INET, SOCK_STREAM,SOL_TCP);

そして再び

$mysocket = socket_create(AF_INET, SOCK_STREAM,6);

2番目のスクリプトとして使用した2番目のヒントに従います。

$socket = stream_socket_server("tcp://62.32.29.210:4000", $errno, $errstr);

if (!$socket) {
echo "$errstr ($errno)<br />\n";

} else {
while ($conn = stream_socket_accept($socket)) {
fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");

fclose($conn);
}
fclose($socket);
}

申し訳ありませんが、フォーマットに慣れていないので、お詫び申し上げます。そして、前回私の投稿を素敵に見せてくれた人に感謝します!

4

1 に答える 1

3

あなたがしたい:

$mysocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

SOCK_RAWパケット ヘッダーにアクセスする必要がある場合や、ICMP などの低レベル プロトコル用です。

于 2012-08-01T11:15:00.883 に答える