**
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();
}
}
}
}