今天给大家介绍一个物联网案例的制作:简易火焰预警系统。系统通过火焰传感器采集数据,通过arduino接收火焰预警信号,通过wifi模块把火焰预警信号传回服务器,服务器端通过接口将预警信息发送到手机端APP,手机端APP监测到火焰预警信息立即响铃、震动、亮屏,APP支持持续预警和关闭监听预警。可以学到如下技术:传感器数据采集技术,arduino信号控制技术,串口通讯技术,AT指令,8266wifi模块透传技术,服务器监听技术,服务器API接口开发,安卓原生APP开发技术,安卓服务、广播和广播接收器等技术。本案例没有借助任何一个第三方的物联网平台,所有程序全部自己搭建,通过这样一个简易的火焰预警系统,把物联网的每一个环节都已打通,形成技术闭环体系,大家如果学会此技术,可以举一反三,做出各种各样的预警系统。比如:温湿度数据采集和分析系统,煤气报警系统,森林防火系统,气象监测系统,大棚蔬菜环境监测系统等,在这个万物互联的时代,IT行业已悄然发生着改变,程序内卷已经白热化,单纯的掌握一些软件技术已经不能满足职场的需要了,掌握一些物联网技术是非常有必要的,在提高我们的竞争力的同时还能丰富我们兴趣和爱好,可以说是一举多得。
先看效果:
arduino代码如下:
const int digitalInpin = 8;
void setup() {
pinMode(digitalInpin, INPUT);
while (!Serial) {
}
Serial.begin(9600);
Serial.println("AT");
delay(1000);
if(Serial.find("OK"))
{
Serial.println("AT+CIPSTART=\"UDP\",\"192.168.31.201\",8899");
}
delay(5000);
if (Serial.find("CONNECT"))
{
Serial.println("AT+CIPSEND=10");
delay(1000);
Serial.println("connect ok");
delay(1000);
}
}
void loop() {
int state = digitalRead(digitalInpin);
Serial.println("AT+CIPSEND=2");
delay(500);
Serial.println(state);
delay(1000);
}
服务器关键代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace IOTAlarm
{
public partial class Form1 : Form
{
private static Socket udpServer;
public static ListBox listbox_all_static;
public static ListBox listbox_error_static;
private Thread th1;
public Form1()
{
InitializeComponent();
tbIP.Text= GetLocalIp();
Control.CheckForIllegalCrossThreadCalls = false;//忽略跨线程检查
listbox_all_static = listbox_all;
listbox_error_static = listbox_error;
}
/// <summary>
/// 获取本机的ip地址
/// </summary>
/// <returns></returns>
public static string GetLocalIp()
{
string ip = "1.1.1.1";
try
{
string HostName = Dns.GetHostName();
IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
for (int i = 0; i < IpEntry.AddressList.Length; i++)
{
if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
{
ip = IpEntry.AddressList[i].ToString();
return ip;
}
}
return ip;
}
catch (Exception ex)
{
MessageBox.Show("获取本机IP出错:" + ex.Message);
return ip;
}
}
private void btnStart_Click(object sender, EventArgs e)
{
tbIP.Enabled = false;
tbPort.Enabled = false;
btnStart.Enabled = false;
btnStop.Enabled = true;
if (udpServer != null)
{
udpServer.Close();
udpServer = null;
}
udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpServer.Bind(new IPEndPoint(IPAddress.Parse(tbIP.Text), 8899));
th1 = new Thread(ReceiveMessage)
{
IsBackground = true
};
th1.Start();
}
public static void ReceiveMessage()
{
while (true)
{
byte[] data = new byte[1024];
EndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
int count = udpServer.ReceiveFrom(data, ref endPoint);
if (count > 0)
{
string message = Encoding.UTF8.GetString(data, 0, count);
message = message.Replace("\r", "");
String t = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
String s = String.Format("[{0} ({1}:{2}) ]:{3}", t, (endPoint as IPEndPoint).Address.ToString(), (endPoint as IPEndPoint).Port, (message == "1") ? "正常" : "异常");
listbox_all_static.Items.Insert(0, s);
if (message == "0")
{
listbox_error_static.Items.Insert(0, s);
AddAlarmData(t, message);
}
}
}
}
/// <summary>
/// 将预警信息插入数据库
/// </summary>
/// <param name="t">预警时间</param>
/// <param name="message">火焰的状态</param>
private static void AddAlarmData(string t,string message)
{
YYCMS.TbDatas Dal = new YYCMS.TbDatas();
Dal.CreateTime = t;
Dal.Msg = message;
Dal.Add();
}
private void btnStop_Click(object sender, EventArgs e)
{
tbIP.Enabled = true;
tbPort.Enabled = true;
btnStart.Enabled = true;
btnStop.Enabled = false;
th1.Abort();
}
private void btnClearAll_Click(object sender, EventArgs e)
{
listbox_all.Items.Clear();
}
private void btnClearError_Click(object sender, EventArgs e)
{
listbox_error.Items.Clear();
}
}
}
手机端关键代码:
package com.example.iotalarm;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Timer;
import java.util.TimerTask;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.PowerManager;
import android.util.Log;
public class AlarmService extends Service {
private String httpurl="http://192.168.31.201:8866/mapi.ashx";
private String res= "";
private TimerTask task;
private Timer timer;
private PowerManager.WakeLock wakeLock = null;
public static final String TAG = "AlarmService";
@Override
public void onCreate() {
super.onCreate();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, AlarmService.class.getName());
wakeLock.acquire();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(task==null)
{
task = new TimerTask() {
@Override
public void run() {
sendHttp(httpurl,"rnum=1");
}
};
if(timer==null)
{
timer = new Timer();
}
timer.schedule(task,0, 5000);//0秒后执行一次task,然后每隔5秒执行一次task
}
return super.onStartCommand(intent, flags, startId);
}
private void sendHttp(final String urlStr, final String paramStr){
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection conn = null;
try {
URL url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestMethod("POST");
conn.setConnectTimeout(8000);
conn.setReadTimeout(8000);
String param = paramStr;
OutputStream outputStream = conn.getOutputStream();
DataOutputStream out = new DataOutputStream(outputStream);
out.writeBytes(param);
out.flush();
out.close();
InputStream inputStream = conn.getInputStream();
res=FilesUtils.readInfo(inputStream);
try {
JSONObject jsonObject = JSON.parseObject(res);
String isAlarm = jsonObject.getString("isAlarm");
if(isAlarm.equals("true"))
{
Intent intentBroadcastReceiver = new Intent();//在Service服务类中发送广播消息给Activity活动界面
intentBroadcastReceiver.setAction(MainActivity.ACTION_SERVICE_NEED); //设置意图过虑器Action(用来区分广播来源,相当于是广播的身份证)
intentBroadcastReceiver.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); //添加NEW_TASK标志位(必须加这个,否则不能在锁屏下实现消息提醒)
sendBroadcast(intentBroadcastReceiver); //发送无序广播
}
} catch (JSONException e) {
e.printStackTrace();
}
if (conn != null) {
conn.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
@Override
public void onDestroy() {
timer.cancel();
if (wakeLock != null) {
wakeLock.release();
wakeLock = null;
}
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
本案例没有借助任何一个第三方的物联网平台,所有程序全部自己搭建,通过这样一个简易的火焰预警系统,把物联网的每一个环节都已打通,形成技术闭环体系,大家如果学会此技术,可以举一反三,做出各种各样的预警系统。比如:温湿度数据采集和分析系统,煤气报警系统,森林防火系统,气象监测系统,大棚蔬菜环境监测系统等,在这个万物互联的时代,IT行业已悄然发生着改变,程序内卷已经白热化,单纯的掌握一些软件技术已经不能满足职场的需要了,掌握一些物联网技术是非常有必要的,在提高我们的竞争力的同时还能丰富我们兴趣和爱好,可以说是一举多得。 如果在制作过程中遇到技术问题或者有更好的方案可以加QQ:1416759661 进行讨论 。