DGIOT是一个面向物联网的开源数据分析平台,它为用户提供了快速、高效采集、管理和分析物联网设备数据的能力,并具备多种数据处理和可视化展示方式。
DGIOT的安装实例数已经超过 35.2k,用户遍布全球。拿下多个物联网产品的领域赛道冠军。
已承建多个重大国际赛事场馆数字驾驶舱、平安校园数据中台、电信级设备监管平台、千亿级产业大脑等。
全开放源码,全流程低代码。
强大开源社区,集成和兼容各种开源工具。
商业级物联网基座,快速承接物联网项目。
面向工业物联网的轻量级开源平台,致力于平台的标准化和工具化。打造全面、丰富、专业的开源生态产品及服务。
首页 › 技术文章
[小 迪 导读]:OPC软件作为工业自动化领域应用最广泛的软件,深受工业控制人员的喜爱。但也有许多情况下,OPC软件并不能满足实际的使用需求: 使用场景 1.OPC只在内网运行,希望可以将数据传递至外网,随时随地查看 2.OPC数据难以存库 3.希望可以更好展示数据,进行数据分析
在opc与kepserver完成连接之后,dgiot_dtu通过调用GetOpcDaService函数连接kepserver实现数据回调
public OpcDaService GetOpcDaService(string host, string serviceProgId) { var service = hostCollection.Where(a => a.ServiceIds.Contains(serviceProgId) && a.Host == host) .FirstOrDefault(); if (service == null) { return null; } OpcDaService service1 = null; if (CheckServiceExisted(service, serviceProgId)) { service1 = opcDaServices.Find(item => { return item.Host == service.Host && item.ServiceId == serviceProgId; }); } else { OpcDaServer daService = new OpcDaServer(serviceProgId, service.Host); service1 = new OpcDaService() { Host = service.Host, ServiceId = serviceProgId, Service = daService, OpcDaGroupS = new Dictionary<string, OpcDaGroup>() }; opcDaServices.Add(service1); } if (service1.Service.IsConnected == false) { try { service1.Service.ConnectionStateChanged += new EventHandler<OpcDaServerConnectionStateChangedEventArgs>(ConnectionStateChanged); service1.Service.Connect(); } catch (Exception e) { LogHelper.Log("Connect " + service1.Host + ", ServiceId " + service1.ServiceId + "error!!" + e.Message); } } return service1; }
dgiot_dtu在完成数据收集后,和dgiot平台连接是通过mqtt来进行连接,dgiot_dtu作为设备端进行发布、dgiot平台作为服务端进行订阅
public void ValueChangedCallBack(OpcDaGroup group, OpcDaItemValue[] values) { string groupKey = ""; JsonObject properties = new JsonObject(); values.ToList().ForEach(v => { if (v.Item != null && v.Value != null) { properties.Add(v.Item.ItemId, v.Value); groupKey = v.Item.UserData as string; OpcDa.setItems(groupKey, v.Item.ItemId, properties); } }); string topic = "$dg/thing/" + productId + "/" + devAddr + "/properties/report"; MqttClientHelper.Publish(topic, Encoding.UTF8.GetBytes(properties.ToString())); return; }
在dgiot收到订阅信息时,在dink中调用on_message_publish来匹配topic类型进行点位转换
on_message_publish(Message = #message{topic = <<"$dg/thing/", Topic/binary>>, payload = Payload, from = _ClientId, headers = _Headers}, _State) -> case re:split(Topic, <<"/">>) of [ProductId, DevAddr, <<"properties">>, <<"report">>] -> dgiot_dlink_proctol:properties_report(ProductId, DevAddr, get_payload(Payload)); [ProductId, DevAddr, <<"firmware">>, <<"report">>] -> dgiot_dlink_proctol:firmware_report(ProductId, DevAddr, get_payload(Payload)); _ -> pass end, {ok, Message};
完成点位转换之后,将数据存入TD数据库、同时也将数据上报给物模型展示
save_td(ProductId, DevAddr, Ack, AppData) -> case length(maps:to_list(Ack)) of 0 -> #{}; _ -> NewAck = dgiot_task:get_collection(ProductId, [], Ack, Ack), NewData = dgiot_task:get_calculated(ProductId, NewAck), Keys = dgiot_product:get_keys(ProductId), DeviceId = dgiot_parse_id:get_deviceid(ProductId, DevAddr), Interval = maps:get(<<"interval">>, AppData, 3), AllData = merge_cache_data(DeviceId, NewData, Interval), AllDataKey = maps:keys(AllData), case Keys -- AllDataKey of List when length(List) == 0 andalso length(AllDataKey) =/= 0 -> ChannelId = dgiot_parse_id:get_channelid(dgiot_utils:to_binary(?BRIDGE_CHL), <<"DGIOTTOPO">>, <<"TOPO组态通道"/utf8>>), dgiot_channelx:do_message(ChannelId, {topo_thing, ProductId, DeviceId, AllData}), dgiot_tdengine_adapter:save(ProductId, DevAddr, AllData), Channel = dgiot_product:get_taskchannel(ProductId), dgiot_bridge:send_log(Channel, ProductId, DevAddr, "~s ~p save td => ProductId ~p DevAddr ~p ~ts ", [?FILE, ?LINE, ProductId, DevAddr, unicode:characters_to_list(jsx:encode(AllData))]), dgiot_metrics:inc(dgiot_task, <<"task_save">>, 1), NotificationTopic = <<"$dg/user/alarm/", ProductId/binary, "/", DeviceId/binary, "/properties/report">>, dgiot_mqtt:publish(DeviceId, NotificationTopic, jsx:encode(AllData)), AllData; _ -> save_cache_data(DeviceId, AllData), AllData end end.
[小 迪 点评]
想了解更多 dgiot 的具体细节,欢迎大家在GitHub上查看相关源代码。
加微信咨询
请填写下面表单,我们的工作人员会与您联系。
报错: 未找到这个表单
请填写下面表单,我们会即时将最新版本下载地址发到您的邮箱。
加小迪为好友即可加入交流群