物联网浏览器(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 ...
随机推荐
- SARIF:DevSecOps工具与平台交互的桥梁
摘要:静态扫描工具融入在DevSecOps的开发过程中,对提高产品的整体的安全水平发挥着重要的作用.为了获取安全检查能力覆盖的最大化,开发团队通常会引入多个安全扫描工具.为了降低各种分析工具的结果汇总 ...
- 从下个月开始,App Store 要求使用 Xcode 14 构建的 iOS 16 兼容应用程序
Xcode 继向开发者发布第一个iOS 16.5 测试版后,苹果公司周二宣布了对开发者向 App Store 提交应用程序的新要求.从下个月开始,Apple 将要求每个应用程序都必须使用 Xcode ...
- Mac下安装mysqlclient出错解决「mysql_config not found」
错误信息如下图 解决方法 安装mysql-client brew install mysql-client 设置环境变量 export PATH=$PATH:/usr/local/Cellar/mys ...
- 本地安装mysql (zip)
下载 https://downloads.mysql.com/archives/community/ 解压到文件夹且添加系统环境变量 C:\Dinstall\Dmysql\mysql-8.2.0-wi ...
- auth认证模块 auth_user表扩展
目录 auth认证模块前戏 django后台管理功能 创建超级管理员 auth认证相关模块及操作 用户注册 用户登录 网站首页效果 校验用户登录的装饰器 用户修改密码 用户注销登录 auth_user ...
- PS组件相关BAPI
一.新增组件BAPI "-----------------------------------------@斌将军-------------------------------------- ...
- POJ3414 Pots( BFS搜索)
题目: 给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i) 将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DROP(i) 将第i个容器抽干 POUR(i,j) 将第i个 ...
- vue项目使用el-table实现无限滚动
https://blog.csdn.net/weixin_44994731/article/details/107980827 1.安装el-table-infinite-scroll yarn ad ...
- vite2.0+vue3.2部署Nginx 刷新404
vite2.9 + vue3.2 打包部署到nginx上刷新页面404问题 在本地运行没问题,部署到服务器上,能正常访问,但是刷新之后页面404 原有的Nginx配置为: server { liste ...
- lucene.net全文检索(二)lucene.net 的封装
查询 public class LuceneQuery : ILuceneQuery { #region Identity private Logger logger = new Logger(typ ...