物联网浏览器(IoTBrowser)-顶尖OS2电子秤协议实现
本教程基于 物联网浏览器(IoTBrowser)-Web串口自定义开发 ,详细的过程可以翻看之前的文章。
本篇以实现顶尖OS2系列电子秤协议对接,并集成到IoTBrowser平台。由于没有找到OS2协议的官方文档,用串口助手抓包分析了一下,简单封装了一下实现代码有点潦草。
所有的串口或者需要实时数据同步的业务都可以集成ComBase类,重量数据采集是典型的实时推送场景,由于电子秤基本只需要推送重量,需要往串口写数据,所以不需要实现发送数据接口。
代码如下:
using DDS.IoT.Com;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace DDS.IoT.DJ
{
public class Os2Driver : ComBase
{
public override string Type => "DJ_Os2"; public override string Name => "顶尖OS2"; /// <summary>
/// 最近一次重量
/// </summary>
private string _lastValue = string.Empty;
private object _locker = new object(); public override bool Init(int port, int baudRate = 9600, string extendData = null)
{
if (SP == null)
{
this.Port = port;
var portName = "COM" + port;
SP = new SerialPort(portName);
base.PortName = portName;
SP.BaudRate = baudRate;
SP.Parity = System.IO.Ports.Parity.None;
SP.DataBits = 8;
SP.StopBits = System.IO.Ports.StopBits.One;
//SP.DtrEnable = true;
//SP.RtsEnable = true;
SP.DataReceived += SP_DataReceived;
Console.WriteLine("初始化Os2驱动程序成功!");
}
return true;
} private void SP_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
lock (_locker)
{
if (false == SP.IsOpen) return;
int bytesRead = SP.BytesToRead;//获取接收缓冲区中数据的字节数
if (bytesRead < 16)
{
return;
}
byte[] bytesData = new byte[16];
//var strData = "1,2,83,45,48,48,46,48,49,56,107,103,101,3,4,0";
SP.Read(bytesData, 0, 16);
if (bytesData[0] != 0x01)
{
SP.DiscardInBuffer();
return;
}
List<byte> buffer = new List<byte>();
buffer.AddRange(bytesData);
SP.DiscardInBuffer();
var weight = ConvertWeight(buffer);
// 验证数据是否有效,且与上一次数据不一致
if (weight != this.Data)
{
if (this.OnPushData != null)
{
this.OnPushData(this.Id,weight);// 触发事件
this.Data = weight;
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("串口操作失败:" + ex.Message);
}
} /// <summary>
/// Os2称重数据--读取字节为十进制数据 0x为十六进制
/// </summary>
/// <param name="byteFrame">帧数据(两位wn+8位数据带小数点+kg+两个固定字节回车换行)</param>
private float ConvertWeight(List<byte> byteFrame)
{
float value = 0f;
if (byteFrame == null || byteFrame.Count == 0)
{
return value;
} if (true)
{
byte[] byteData = new byte[9];
byteFrame.CopyTo(3, byteData, 0, 9);
string weightData = Encoding.ASCII.GetString(byteData).Replace("kg", "").Replace("g", "");
value = float.Parse(weightData);
}
return value;
}
public bool Opened = false; public override event PushData OnPushData; public override bool Open()
{
var b = false;
try
{
if (!Opened)
SP.Open();
b = true;
Opened = true;
}
catch (Exception ex)
{ string msg = string.Format("Os2串口打开失败:{0} ", ex.Message);
Console.WriteLine(msg);
}
return b;
} public override bool Close()
{
if (SP.IsOpen)
SP.Close();
Opened = false;
OnPushData = null;
return true;
} }
}
同样,先需要本地测试,所以需要在main方法中编写测试代码。
static void Main(string[] args)
{
var ok = false;
do
{
Os2Driver driver = new Os2Driver();
driver.OnPushData += OnPushData;
Console.Write("请输入串口号:");
var port = Convert.ToInt32(Console.ReadLine());
ok=driver.Init(port);
ok = driver.Open();
if(ok)
Console.Write("打开成功,重量监听中...");
} while (!ok);
Console.ReadLine();
} private static void OnPushData(string id, dynamic weight)
{
Console.WriteLine(DateTime.Now.ToString()+ ":" + weight);
}
本地编译,拷贝到Plugins/Com文件夹下,在IoTBrowser中将驱动型号改为DJ_Os2,串口号根据实际情况填写即可。
示例代码:
https://gitee.com/yizhuqing/IoTBrowser/tree/master/Plugins/DDS.IoT.DJ
物联网浏览器(IoTBrowser)-顶尖OS2电子秤协议实现的更多相关文章
- 《连载 | 物联网框架ServerSuperIO教程》- 9. 协议过滤器,解决一包多发、粘包、冗余数据
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 转战物联网·基础篇09-选择MQTT协议还是CoAP协议
前面章节介绍过,MQTT协议和CoAP协议都是物联网中比较流行的协议,都对传输量做了很大的精简,传输开销小,以适应物理网的网络环境. XMPP协议也有人说是适合物联网通信的,但它是基于XML, ...
- 转战物联网·基础篇08-例说MQTT协议各控制报文
前面讨论了MQTT协议的控制报文的格式,下面分别举例探讨各个控制报文的详细内容. 01.CONNECT – 连接服务端 客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CO ...
- 无线物联网中CoAP协议的研究与实现【转】
无线物联网中CoAP协议的研究与实现 时间:2013-04-09 来源:电子科技 作者:汤春明,张 荧,吴宇平 关键字:CoAP 无线 物联网 协议 摘要:由于物联网中的很多设备都是资源受 ...
- 浏览器与服务端请求响应流程与HTTP协议
浏览器与服务端请求响应流程图: 1.HTTP概要 1.1. 定义 HTTP(HyperText Transfer Protocol,超文本传输协议)最早就是计算机与计算机之间沟通的一种标准协议,这种 ...
- 在IE中启动火狐——自定义浏览器链接协议
有时候需求就是这么奇葩,特别是在这个浏览器混战收尾的节骨眼上,有的客户正在将全单位的浏览器统一到Chrome.有的正在统一到Firefox.还有的正在统一到360上.于是就有了如题的需求,客户正在将浏 ...
- C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序
本教程适用于Windows系统 从浏览器上打开本地程序,主要用到了本地URL协议,其实主要就是改注册表 先建立一个项目,我建的是控制台项目 在Program.cs写2个静态方法用来添加注册表.移除注册 ...
- fiddler抓取火狐浏览器上https协议请求
前言:现在很多网站采用https协议,当打开fiddler时.浏览https协议的网站会提示不安全,若使用fiddler抓取https协议的请求,则需要向浏览器导入证书,才能抓取https协议的请求, ...
- MQTT协议之 Apache Apollo服务
一.说明 MQTT是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网) ...
- 深入理解 Web 协议 (三):HTTP 2
本篇将详细介绍 HTTP 2 协议的方方面面,知识点如下: HTTP 2 连接的建立 HTTP 2 中帧和流的关系 HTTP 2 中流量节省的奥秘:HPACK 算法 HTTP 2 协议中 Server ...
随机推荐
- GaussDB(for openGauss)让数据“存得下、算得快、算得准”
摘要:本文从总体架构.数据分布方式.计算下推.数据强一致等方面进行介绍GaussDB(for openGauss). 1.前言 随着云计算规模越来越大,企业业务数据量呈指数级增长,传统数据库在海量数据 ...
- 解密GaussDB(for Influx)时序洞察
摘要:GaussDB(for Influx)是一款基于华为自研的计算存储分离架构,兼容InfluxDB生态的云原生NoSQL时序数据库,提供一站式时序数据存储.分析.展示功能.其中时序洞察提供了针对时 ...
- 广告策划师如何做 AB 测试
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近年来,随着消费者的心理需求逐步趋向于精神层面.科技的迭代迅速以及市场环境的复杂性逐步上升,我国的广告行业逐步展开 ...
- 火山引擎DataLeap数据质量解决方案和最佳实践(三):最佳实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 最佳实践 前面介绍了DataLeap数据质量平台的一些实现方式,下面为大家介绍一些我们在数据量和资源这两个方面的最 ...
- DataLeap的全链路智能监控报警实践(一):常见问题
随着字节跳动业务的快速发展,大数据开发场景下需要运维管理的任务越来越多,然而普通的监控系统只支持配置相应任务的监控规则,已经不能完全满足当前需求,在日常运维中开发者经常会面临以下几个问题: 任务多,依 ...
- Solon 的常用配置
一.服务端基本属性 #服务端口(默认为8080) server.port: 8080 #服务的 http 信号端口(默认为 ${server.port}) server.http.port: 8080 ...
- 玩转Python:用Python处理文档,5个必备的库,特别实用,附代码
在Python中,有几个流行的库用于处理文档,包括解析.生成和操作文档内容.以下是一些常用的库及其简介和简单的代码示例: PyPDF2 - 用于处理PDF文件. 简介:PyPDF2是一个纯Python ...
- ChatGPT插件权限给Plus用户放开了
大家好,我是章北海mlpy ChatGPT插件权限给Plus用户放开了 我稍微测试了俩,感觉还行,后续我会对一些热门插件深入测测,敬请期待. 官方对插件的介绍如下: 1.插件由非由OpenAI控制的第 ...
- Educational Codeforces Round 82 (Rated for Div. 2) A. Erasing Zeroes(超简单的写法)
题意: 统计间隔在1中0的个数 思路: 超简单写法,直接利用string的find.rfind函数即可 #include<bits/stdc++.h> using namespace st ...
- L2-010. 排座位(种类并查集)
布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席. 输入格式: ...