如何使用 Android 和 Wi-Fi 连接打开或关闭开关?
我使用 SparkFuns IOIO 来控制继电器。但是我如何通过无线方式做到这一点?
您也可以使用Rugged Circuits Yellowjacket。它有一个板载 Wifi,可以提供简单的网页和控制输入/输出。
您可以使用带有以太网屏蔽的 Arduino - 或者可能是 Netduino。基本上,任何具有无线互联网功能的设备,因为这是 Android 使用的唯一无线协议 - 除了蓝牙(或 NFC)。当用户按下按钮时,您可以打开 aSocket
或 aBluetoothSocket
以与第二个设备通信它需要打开开关。相当简单——如果你有一个无线家庭网络,那么你的设备可以通过物理线插入你的路由器——只要你的安卓设备和你的微处理器在同一个网络上。您可能还可以使用其他无线选项——这些只是我能想到的最简单的。希望这可以帮助!
这就是为什么我用我的 iPhone 做的(在 Android 上应该是一样的):
我有一个像这样的项目。我的正在发送转向系统的位置数据,但想法是一样的。我很快就会把它上传到谷歌代码。您可以在PowerWheelino上查看。
基本结构是这样的:
请记住,当通过串行(IDE 串行接口之外)接收数据时,Arduino 会自动重置。请在此处查看我关于此主题的帖子以及解决此问题的方法。以前知道这一点可以为我节省很多故障排除。
免责声明:
此代码需要一些小的修改才能完成 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();
}