我在学校得到一个项目,该项目由可通过WiFi控制的遥控车组成。它可以正常工作几秒钟,但随后它会停止连接并尝试重新连接。问题是,如果我制造的汽车依赖于这种不稳定的连接,可能会导致事故。本身或一个人。
也许我做错了什么?我的问题是,我如何始终保持该连接处于活动状态?到目前为止,这是我的程序:
Arduino客户端:
#include <SPI.h>
#include <WiFi.h>
int status = WL_IDLE_STATUS;
char ssid[] = "mynet";
char pass[] = "password";
IPAddress remoteIp(192,168,80,165);
int port = 37899;
String message = "";
WiFiClient client;
void setup()
{
// start the serial for debugging
Serial.begin(9600);
pinMode(9, OUTPUT);
digitalWrite(9, LOW);
//check if the wifi shield is present
if(WiFi.status() == WL_NO_SHIELD){
Serial.println("WiFi shield not present! Press reset to try again.");
while(true); //stops the program
}
connectWiFi();
printWifiStatus();
connectClient(3);
}
void loop(){
if(client){
if(client.available()){
char c = client.read();
if(c != '\n'){
message += c;
}
else{
Serial.println("Received message: "+message);
checkMessage();
sendMessage(message);
message = "";
}
}
}
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
}
void connectWiFi(){
if( status != WL_CONNECTED){
while(status != WL_CONNECTED){
Serial.print("Attempting connection to network...");
status = WiFi.begin(ssid, pass);
delay(3000);
if(status == WL_CONNECTED){
Serial.println(" SUCSESS");
}
else{
Serial.println(" FAILED");
delay(3000);
connectWiFi();
}
}
}
}
void connectClient(int retries){
//Attempt connection to server
if(retries <= 0){
Serial.println("FAILED");
Serial.println("Connection to server failed.");
while(true);
}
Serial.print("Attempting conenction to server... ");
if(client.connect(remoteIp, port)){
Serial.println("SUCSESS");
sendMessage("Hello server!");
}
else if(retries > 0){
Serial.println("FAILED");
connectClient(retries - 1);
}
}
void checkMessage(){
if(message == "on"){
digitalWrite(9, HIGH);
}
if(message == "off"){
digitalWrite(9, LOW);
}
}
void sendMessage(String toSend){
if(client){
client.println(toSend+'\n');
client.flush();
Serial.println("Sendt message: "+toSend);
}
else{
Serial.println("Could not send message; Not connected.");
}
}
Java服务器:
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Car_Client extends JFrame {
private JTextField userText;
private JTextArea chatWindow;
private static final int serverPort = 37899;
private ServerSocket server;
private Socket connection;
private BufferedWriter output;
private BufferedReader input;
private String message = "";
public Car_Client() {
userText = new JTextField();
userText.setEditable(false);
userText.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent event) {
sendMessage(event.getActionCommand());
userText.setText("");
}
}
);
add(userText, BorderLayout.NORTH);
chatWindow = new JTextArea();
add(new JScrollPane(chatWindow), BorderLayout.CENTER);
setSize(400, 300);
setVisible(true);
}
public void startRunning() {
try {
server = new ServerSocket(serverPort, 100);
while (true) {
try {
waitForConnection();
setupStreams();
whileConnected();
} catch (EOFException eofException) {
showMessage("Client terminated connection");
} catch (IOException ioException) {
showMessage("Could not connect...");
} finally {
closeStreams();
}
}
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
private void waitForConnection() throws IOException {
showMessage("Waiting for someone to connect...");
connection = server.accept(); //once someone asks to connect, it accepts the connection to the socket this gets repeated fast
showMessage("Now connected to " + connection.getInetAddress().getHostName()); //shows IP adress of client
}
private void setupStreams() throws IOException {
showMessage("creating streams...");
output = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
output.flush();
input = new BufferedReader(new InputStreamReader(connection.getInputStream()));
showMessage("Streams are setup!");
}
private void whileConnected() throws IOException {
ableToType(true); //makes the user able to type
do {
char x = (char) input.read();
while (x != '\n') {
message += x;
x = (char) input.read();
}
showMessage(message);
message = "";
} while (!message.equals("END")); //if the user has not disconnected, by sending "END"
}
private void closeStreams() {
ableToType(false);
showMessage("Closing streams...");
try {
output.close();
input.close();
connection.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
private void sendMessage(String message) {
try {
output.write(message + '\n');
output.flush();
showMessage("Sent: " + message);
} catch (IOException ex) {
chatWindow.append("\nSomething messed up whilst sending messages...");
}
}
private void showMessage(final String message) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
chatWindow.append('\n' + message);
}
}
);
}
private void ableToType(final boolean tof) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
userText.setEditable(tof);
}
}
);
}
}
干杯!
-kad
我解决了它,做到了这一点,以便Arduino每15秒将数据发送到Java程序。只需要在Arduino程序上写几行即可:
变量:
long lastSendt;
循环功能:
void loop(){
if(client){
if(millis() >= (lastSendt + 15000)){
sendCharacter('*')
}
if(client.available()){
char c = client.read();
if(c != '\n'){
message += c;
}
else{
Serial.println("Received message: "+message);
checkMessage();
sendMessage(message);
message = "";
}
}
}
}
sendCharacter函数:
void sendCharacter(char toSend){
if(client){
client.println(toSend){
lastSendt = millis();
}else{
Serial.println("Could not send character!");
}
}
我已经尝试了一个多星期通过串行端口从raspberry pi(QT C)到Arduino(Arduino IDE C)进行通信,但一直失败。 我在谷歌上做了一些搜索,阅读了这个例子。。。但我还是没有成功。好的,基本的事情是,我需要连续地通信从Raspberry pi发送到Arduino的串行端口命令。我试图使代码尽可能简单。 最初,我将J char从覆盆子pi(QT C)发送到Arduino(Ar
我有Jasper Reports服务器(安装在www.example.net上)和一个单独的Java/JSP应用程序(安装在www.example.net上),我在寻找不同的选项来生成报告。 选项1(当前工作解决方案) 我目前的工作解决方案是用户登录到Java /JSP应用程序,并选择一个报告。应用程序创建报告的XML表示,并将其保存为,然后使用以下代码将其发送到Jasper报告服务器: (请注意
问题内容: 在Windows上,我们有一个C ++应用程序来启动Java进程。这两个应用程序需要彼此通信(通过xml片段)。 您将选择哪种进程间通信方法,为什么? 我们桌上的方法是:共享文件,管道和套接字(尽管我认为这有一些安全问题)。我愿意接受其他方法。 问题答案: 我不确定为什么您认为基于套接字的通信会带来安全隐患(使用SSL)。假设您具有明确定义的通信协议,这通常是一种非常好的方法,因为它与
问题内容: 在回答问题时,按月份名称对熊猫的数据框系列进行排序?我们遇到了一些奇怪的行为。 似乎在中,数据按字母顺序排序。当我和OP期待时 背后的机制是什么?我知道它会保留文档中每个组 的顺序,但是组之间的顺序是否有规则 ?在我看来,当数据以这种方式排序时,一个非常简单的组顺序将是[“ jan”,“ mar”,“ aug”,“ dec”] 。 ps从[“ aug”,“ dec”,“ jan”,“
问题内容: 我试图弄清楚如何通过使用Android应用程序在网页上显示实时数据。 例如,用户正在使用android应用并获得评分(回答问题)。我的网页将实时显示分数。 IV得出使用Redis的结论,但是我需要什么才能使其正常工作?我是否需要一个可与我的网页进行通信的Web套接字。这个套接字可以是python,它在其中访问数据库,然后按顺序响应分数? 我正在努力寻找这种方法到底是怎么工作的,因为这对
mysqlcheck客户端可以检查和修复MyISAM表。它还可以优化和分析表。 mysqlcheck的功能类似myisamchk,但其工作不同。主要差别是当mysqld服务器在运行时必须使用mysqlcheck,而myisamchk应用于服务器没有运行时。使用mysqlcheck的好处是不需要停止服务器来检查或修复表。 Mysqlcheck为用户提供了一种方便的使用SQL语句CHECK TABLE