先说下实现效果和背景。软件在启动后,准备接收硬件的广播信号,与新风硬件绑定,握手。然后,实现软件和硬件的点对点的通信。
private int udpPort = 5668; //硬件那说好的端口
private InetAddress group;
private MulticastSocket socket;
private DatagramPacket packet;
byte[] buf = new byte[1024];
static InetAddress inetAddress = null;
private boolean isHasIntenet = false;//用来标记当前是否有网络
然后:
public void onCreate(Bundle savedInstanceState) {
//首先一个线程,先看有没有连接网络,如果没有连接网络肯定就没必要接收广播,没有发送消息的必要了
new Thread() {
public void run() {
try {
Thread.sleep(5000);
final String current_ssid = WifiUtility
.get_connected_ssid().replace("\"", "");
//wifi是否能有连接上
if (current_ssid != null && current_ssid.length() > 0) {
final String current_ip = WifiUtility.get_wifi_ip();
// 有网再发送
isHasIntenet = true;
new MulReceiverIP().start();
}
} catch (Exception e) {
}
}
}.start();
res = getActivity().getResources();
super.onCreate(savedInstanceState);
}
//这就是接收广播的地方
public class MulReceiverIP extends Thread {
public MulReceiverIP() {
try {
socket = new MulticastSocket(udpPort);
group = InetAddress.getByName("230.0.0.0");
socket.joinGroup(group);
packet = new DatagramPacket(buf, buf.length);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
while (!exitThread) {
try {
socket.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
inetAddress = packet.getAddress();
String message = new String(packet.getData(), 0,
packet.getLength());
chargeUdpMessage(message);//写个方法,来处理服务器来的数据
}
}
}
//操作服务器端的数据
private void chargeUdpMessage(String udpMsg) {
String info = (String) udpMsg;
if (info.contains("Lu_Ca")) {// 叫我呢
Log.i("I'm here", "I'm here" + info + "进入呼叫");
sendUDPMessage("I'm here");//回应服务器我在,可以发送数据
} else if (info.contains("wind0")) {//如果服务器端来的数据中有wind0,表示控制风速为0挡
Message m = new Message();
m.what = 0;
ControlFragment.h.sendMessage(m);
} else if (info.contains("wind1")) {//如果服务器端来的数据中有wind1,表示控制风速为1挡
Message m = new Message();
m.what = 1;
ControlFragment.h.sendMessage(m);
} else if (info.contains("wind2")) {//如果服务器端来的数据中有wind2,表示控制风速为2挡
Message m = new Message();
m.what = 2;
ControlFragment.h.sendMessage(m);
} else if (info.contains("wind3")) {//如果服务器端来的数据中有wind3,表示控制风速为3挡
Message m = new Message();
m.what = 3;
ControlFragment.h.sendMessage(m);
}
}
// 发送 udp message
private void sendUDPMessage(String message) {
//有地址才能发送,不然没有地址,发送就崩溃
if (inetAddress == null) {
return;
}
int message_length = message.length();
byte[] messageByte = message.getBytes();
DatagramPacket p = new DatagramPacket(messageByte, message_length,
inetAddress, udpPort);
try {
socket.send(p);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//到主线程更改ui界面显示
public static Handler h = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 0)// 接收关闭新风
{
wind_speed_image
.setBackground(res
.getDrawable(R.drawable.new_wind_speed_close_image_new));
return;
} else if (msg.what == 1)// 接收新风低风
{
wind_speed_image.setBackground(res
.getDrawable(R.drawable.new_wind_speed_low_image_new));
return;
} else if (msg.what == 2)// 接收新风中风
{
wind_speed_image
.setBackground(res
.getDrawable(R.drawable.new_wind_speed_middle_image_new));
return;
} else if (msg.what == 3)// 接收新风高风
{
wind_speed_image
.setBackground(res
.getDrawable(R.drawable.new_wind_speed_heigh_image_new));
return;
}
}
};