使用Android通过Wi-Fi控制中继

时间:2012-07-05 14:32:00

标签: android embedded arduino

如何使用Android和Wi-Fi连接打开或关闭开关?

我使用SparkFuns IOIO来控制继电器。但是我该如何无线进行呢?

4 个答案:

答案 0 :(得分:1)

你可以使用带有以太网盾的Arduino - 或者可能是Netduino。基本上,任何具有无线互联网功能的设备,因为这是Android使用的唯一无线协议 - 除了蓝牙(或NFC)。当用户按下按钮时,您可以打开SocketBluetoothSocket以与第二个设备进行通信,以便打开交换机。相当简单 - 如果您有无线家庭网络,那么只要您的Android设备和微处理器位于同一网络上,您的设备就可以通过物理线路插入路由器。您可以使用其他无线选项 - 这些只是我能做到的最简单的选择。希望这有帮助!

答案 1 :(得分:1)

这就是为什么我用我的iPhone做的(在Android上应该是这样的):

  • 在与手机连接到同一网络的计算机上运行TCP服务器,并通过USB /串口运行到Arduino。
  • 此服务器应将所有通过Wi-Fi传入的数据从您的Android手机通过USB转发到Arduino。
  • 手机应该运行一个TCP客户端,它发送一个简单的单字节(可能是零和非零)命令
  • 应对Arduino进行编程,以便通过中断监听输入的串行数据;如果一个字节到达,它决定是否应该打开或关闭I / O引脚。

答案 2 :(得分:1)

我有一个像这样的项目。我正在发送转向系统的位置数据,但想法是一样的。我很快就会将其上传到Google Code。您可以在 PowerWheelino 上查看。

基本结构如下:

  1. Android上的触摸事件会将数据(通过UDP)发送到服务器。
  2. UDP服务器(本例中为WRT54G路由器)接收数据并通过串口转发给Arduino。
  3. Arduino决定如何处理来自串行连接的数据。
  4. 请记住,当通过串行接收数据(在IDE串行接口之外)时,Arduino会自动重置。请参阅我关于此主题的帖子here以及解决此问题的方法。之前知道这一点可以为我节省很多麻烦。

    <强>声明:

    此代码需要进行一些小修改才能完成OP请求的内容。由于您已经使用IOIO和Arduino草图制作了一个可用的Android程序,我认为这是在您的能力范围内。

    以下是Android UDP客户端代码:

    在触摸事件或按下按钮时执行UdpClient::sendData()

    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    import android.util.Log;
    
    public class UdpClient {
        String messageStr;
        DatagramSocket s;;
        int server_port;
        InetAddress local;
        int msg_length;
        byte[] message;
    
        public UdpClient (String ipAddress, int port){
            server_port = port;
            try {
                local = InetAddress.getByName(ipAddress);
                s = new DatagramSocket();
            }
            catch (Exception e) {
                e.printStackTrace();
                Log.d("Powerwheelino",e.getStackTrace() + "error");
            }
        }
    
        public boolean sendData(byte drive, byte steering){
            byte drvByte = (byte) (drive & 0xFF);
            byte steerByte = (byte) (steering & 0xFF);
            message = new byte[2];
            message[0] = drvByte;
            message[1] = steerByte;
            msg_length = message.length;
            //message = messageStr.getBytes();
            try {
                DatagramPacket p = new DatagramPacket(message, msg_length,local,server_port);
                s.send(p);
            }
            catch (Exception e) {
                // TODO Auto-generated catch block
                Log.d("Powerwheelino", e.getStackTrace() +"ERROR ");
                e.printStackTrace();
                return false;
            }
            return true;
        }
    }
    

    这是监听UDP服务器(C ++)代码

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <stdlib.h>
    #include <string>
    #include <SerialStream.h>
    
    using namespace std;
    
    class udp_server {
        int sock;
        int bytes_read;
        socklen_t addr_len;
    
        struct sockaddr_in server_addr , client_addr;
    
        public:
            udp_server(int portNum)
            {
                if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
                    perror("Socket");
                    exit(1);
                }
    
                server_addr.sin_family = AF_INET;
                server_addr.sin_port = htons(portNum);
                server_addr.sin_addr.s_addr = INADDR_ANY;
                bzero(&(server_addr.sin_zero),8);
    
    
                if (bind(sock,(struct sockaddr *)&server_addr,
                    sizeof(struct sockaddr)) == -1)
                {
                    perror("Bind");
                    exit(1);
                }
    
                addr_len = sizeof(struct sockaddr);
    
                printf("\nUDPServer Waiting for client on port %d", portNum);
                    fflush(stdout);
            }
    
            int listen(char recv_data[]) {
                while (1)
                {
                    bytes_read = recvfrom(
                                     sock,
                                     recv_data,
                                     1024,
                                     0,
                                     (struct sockaddr *)&client_addr,
                                     &addr_len
                                 );
    
                    recv_data[bytes_read] = '\0';
                    printf("\n(%s , %d) said : ",inet_ntoa(client_addr.sin_addr),
                                                 ntohs(client_addr.sin_port));
                    printf("%s", recv_data);
                    string drive;
                    string direction;
                    int speed, angle;
    
                    if ((recv_data[0] & 128) > 0) {
                        drive = "Fwd";
                    }
                    else {
                        drive = "Rev";
                    }
                    if ((recv_data[1] & 128) > 0) {
                        direction = "Left";
                    }
                    else {
                        direction = "Right";
                    }
                    speed = recv_data[0] & 127;
                    angle = recv_data[1] & 127;
                    printf("\t %s @ %d and %s @ %d",
                            drive.c_str(),
                            speed,
                            direction.c_str(),
                            angle);
                    fflush(stdout);
                }
                return 0;
            }
    };
    

    以下是使用LibSerial与Arduino进行串行通信的片段:

    LibSerial::SerialStream myss;
    SerialComm(int argc, char** argv) {
        myss = new LibSerial::SerialStream("/dev/ttyS0", ios_base::out);
        myss.SetBaudRate(LibSerial::SerialStreamBuf::BAUD_57600);
        myss.SetCharSize(LibSerial::SerialStreamBuf::CHAR_SIZE_8);
        myss.SetFlowControl(LibSerial::SerialStreamBuf::FLOW_CONTROL_NONE);
        myss.SetParity(LibSerial::SerialStreamBuf::PARITY_NONE);
        myss.SetNumOfStopBits(1);
    
        const int Dsize = 2;
        char buffer[1];
        buffer[0] = 125; //0b00000001;
        buffer[1] = '\0';
        bitset(buffer[0]);
        //myss << buffer;
        myss.write(buffer,1);
        //myss.Close();
    }
    

答案 3 :(得分:1)

您还可以使用Rugged Circuits Yellowjacket。它有一个Wifi板,可以提供简单的网页和控制输入/输出。