简易的火焰预警系统设计制作

今天给大家介绍一个物联网案例的制作:简易火焰预警系统。系统通过火焰传感器采集数据,通过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 进行讨论 。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜鹰教程网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值