如何使用Android和Wi-Fi连接打开或关闭开关?
我使用SparkFuns IOIO来控制继电器。但是我该如何无线进行呢?
答案 0 :(得分:1)
你可以使用带有以太网盾的Arduino - 或者可能是Netduino。基本上,任何具有无线互联网功能的设备,因为这是Android使用的唯一无线协议 - 除了蓝牙(或NFC)。当用户按下按钮时,您可以打开Socket
或BluetoothSocket
以与第二个设备进行通信,以便打开交换机。相当简单 - 如果您有无线家庭网络,那么只要您的Android设备和微处理器位于同一网络上,您的设备就可以通过物理线路插入路由器。您可以使用其他无线选项 - 这些只是我能做到的最简单的选择。希望这有帮助!
答案 1 :(得分:1)
这就是为什么我用我的iPhone做的(在Android上应该是这样的):
答案 2 :(得分:1)
我有一个像这样的项目。我正在发送转向系统的位置数据,但想法是一样的。我很快就会将其上传到Google Code。您可以在 PowerWheelino 上查看。
基本结构如下:
请记住,当通过串行接收数据(在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板,可以提供简单的网页和控制输入/输出。