IOT采集程序工作原理

**

IOT驱动采集原理

**
做为物联网行业中最主要的是数据采集。
采集协议根据协议特性分为:问答式、等待式
问答式:为一问一答。采集时需要不停的询问。才可以得到最新的数据结果。
由此。在设计采集程序时。需要使用类似于while的循环语句。通过sleep间隔时间控制请求的频率。实时获取设备数据结果。
等待式:为程序开启后。需要打开端口进行端口监测。等待下位机设备或系统传过来数据。这里根据实际情况是监测串口还是网口。
问答式:编程实例为实时Ping某个网络设备是否在线
private void Dll_cjFun()
{
while (dllcjstate)
{
foreach (var item in Dll_qstagmodes)
{
if (!dllcjstate)
{
break;//终止本次循环
}
Ping ping = new Ping();
string old_val = ((qstagmode)Dll_qstagmodes[item.Value.Itemname]).Itemvalue;
try
{
PingReply pingReply = ping.Send(item.Value.Qstagadd);
if (pingReply.Status == IPStatus.Success)
{
string _vlF = “1”;
if (old_val != null && old_val != “”)
{

                    if (old_val != _vlF)
                    {
                        string jsonstr = "{\"Itemname\":\"" + item.Value.Itemname + "\",\"Value\":\"" + _vlF + "\"}";
                        //向redis服务中推送变化的数据。
                        try
                        {
                            DassCtrl.Redispush.Publish("CtrlNewData", jsonstr);
                        }
                        catch (Exception ee)
                        {
                            DassCtrl.RedisState = false;
                        }
                    }
                }
                Dll_qstagmodes[item.Value.Itemname].Itemvalue = _vlF;
                try
                {
                    var database = DassCtrl.Manager.GetDatabase(3);//指定连接的库 0
                    database.StringSet(item.Value.Itemname, _vlF);
                }
                catch
                {
                    DassCtrl.RedisState = false;
                }
            }
            else
            {
                string _vlF = "0";
                if (old_val != null && old_val != "")
                {

                    if (old_val != _vlF)
                    {
                        string jsonstr = "{\"Itemname\":\"" + item.Value.Itemname + "\",\"Value\":\"" + _vlF + "\"}";
                        //向redis服务中推送变化的数据。
                        try
                        {
                            DassCtrl.Redispush.Publish("CtrlNewData", jsonstr);
                        }
                        catch (Exception ee)
                        {
                            DassCtrl.RedisState = false;
                        }
                    }
                }
                Dll_qstagmodes[item.Value.Itemname].Itemvalue = _vlF;
                try
                {
                    var database = DassCtrl.Manager.GetDatabase(3);//指定连接的库 0
                    database.StringSet(item.Value.Itemname, _vlF);
                }
                catch
                {
                    DassCtrl.RedisState = false;
                }
            }
        }
        catch
        {
            string _vlF = "0";
            if (old_val != null && old_val != "")
            {

                if (old_val != _vlF)
                {
                    string jsonstr = "{\"Itemname\":\"" + item.Value.Itemname + "\",\"Value\":\"" + _vlF + "\"}";
                    //向redis服务中推送变化的数据。
                    try
                    {
                        DassCtrl.Redispush.Publish("CtrlNewData", jsonstr);
                    }
                    catch (Exception ee)
                    {
                        DassCtrl.RedisState = false;
                    }
                }
            }
            Dll_qstagmodes[item.Value.Itemname].Itemvalue = _vlF;
            try
            {
                var database = DassCtrl.Manager.GetDatabase(3);//指定连接的库 0
                database.StringSet(item.Value.Itemname, _vlF);
            }
            catch
            {
                DassCtrl.RedisState = false;
            }
        }
        Thread.Sleep(10);
    }
    Thread.Sleep(100);
}

}

等待式:编程实例为打开串口等待数据传递
private void Dll_cjFun()
{
byte[] buffer1 = { 0x01, 0x30, 0x01, 0x00, 0x84 };//需要过滤的字节
string str1 = System.Text.Encoding.Default.GetString(buffer1);//转字符串
bool jx = false;
int Datlen = 0;
List<byte[]> a1 = new List<byte[]>();
ArrayList Allbyte = new ArrayList();
while (dllcjstate)
{
byte[] buffer = new byte[1024];
int length = client.Receive(buffer, buffer.Length, 0);//接收数据报
byte[] ComLJ = new byte[] { 0x01, 0x30, 0x01, 0x00, 0x84 };//表示COM口连接
if (length % 5 == 0)//就是握手、连接
{
byte[] newbyte = new byte[5];
newbyte = buffer.Skip(0).Take(5).ToArray();
if (newbyte.SequenceEqual(ComLJ))
{
byte[] ComLJHF = new byte[] { 0x01, 0x30, 0x01, 0x00, 0x84 };//表示COM口连接
client.Send(ComLJHF);
}
else
{
if (newbyte[0] == 0x01 && newbyte[1] == 0x00)
{
byte[] ComLJHF = new byte[5];
ComLJHF[0] = 0x81;
ComLJHF[1] = 0x00;
ComLJHF[2] = newbyte[2];
ComLJHF[3] = CRC16int.CRC_16IBM(ComLJHF, 0, 3)[0];
ComLJHF[4] = CRC16int.CRC_16IBM(ComLJHF, 0, 3)[1];
client.Send(ComLJHF);
}
}
}
//保证数据的完整性。
//00 A0开头–表示:帧数据第一帧 有时收不全。
if (buffer[0] == 0x00 && (buffer[1] == 0x80 || buffer[1] == 0xA0))
{
for (int i = 0; i < length; i++)
{
Allbyte.Add(buffer[i]);
}
try
{
byte dataleg = buffer[5];//尝试得到长度
Datlen = 6 + (int)dataleg + 2;//数据应该的长度
if (Allbyte.Count < Datlen)//得到的数据长度。小于应该的长度。者还需要增加。
{
jx = true;
continue;
}
else
{
//需要的数据收全了。可以直接解析
jx = false;
//进行解析
byte[] _Allbyte = (byte[])Allbyte.ToArray(typeof(byte));
JXdate(_Allbyte);
Allbyte.Clear();
}
}
catch
{
for (int i = 0; i < length; i++)
{
Allbyte.Add(buffer[i]);
}
jx = true;
continue;
}
}
if (jx)
{
for (int i = 0; i < length; i++)
{
Allbyte.Add(buffer[i]);
}
if (Allbyte.Count < Datlen)//得到的数据长度。小于应该的长度。者还需要增加。
{
jx = true;
continue;
}
else
{
//需要的数据收全了。可以直接解析
jx = false;
byte[] _Allbyte = (byte[])Allbyte.ToArray(typeof(byte));
JXdate(_Allbyte);
Allbyte.Clear();
}
}
}
}

  • 33
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值