【物联网智能网关-16】成功移植SQLite(STM32 .NET MF平台)

简介: .NET Micro Framework系统官方代码是不支持任何数据库的,这对一些具有用户管理的Web Server、RFID数据采集和复杂的手持机应用来说是非常不方便的。

前言

.NET Micro Framework系统官方代码是不支持任何数据库的,这对一些具有用户管理的Web Server、RFID数据采集和复杂的手持机应用来说是非常不方便的。

很早就知道了SQLite,但是一直没有深入研究,随着目前移植的.NETMicro Framework系统越来越成熟,用户对数据库支持的呼声也越来越高,迫切需要一个数据库平台了。考虑到移植难度和代码大小,最初原打算把YFIOs系统中的内存YFIODB数据库修改为文件版本,这样移植是最快的,代码也比较小,但是缺点是比较明显的,不支持Select等相关的SQL语句,这对熟悉数据库应用的用户来说,还需要重新了解数据库的操作方法,还不如用文件来实现了。

在这个过程中,也了解了其它的嵌入式数据库,如FastDB、Berkeley DB等开源嵌入式数据库,但其用户群和知名度远比不上SQLite,考虑到物联网中间件本身就是一个框架和平台,供用户二次开发,用户越熟悉的技术就应该优先选择。

确定了要移植SQLite数据库,但是又引出一个问题,是移植SQLite最新的版本?还是以前相对代码较小的版本?这着实让我踌躇了良久。

SQLite V2x和V3x比较
1.png
.NET Micro Framework的核心代码也不过300K左右,如果支持一个比自己核心还大的多的数据库,真有点小马拉大车的感觉,所以在满足基本功能的基础上(以前我比较担心V2x版本的国际化应用,比如是否支持中文),代码大小是我最关注的。

在Windows平台上对SQLiteV2.8.17进行测试后,决定移植V2x版本的SQLite(当然后续不排除再移植3.0版本),移植成功后,release版本的 SQLite的大小大概130K左右。

SQLite V2x和V3x .NET Framework开发

考虑到.NET Micro Framework是.NET框架,所以最初研究的是System.Data.SQLite.dll库,后来发现,一是System.Data.SQLite.dll封装的太过复杂,二是System.Data.SQLite.dll对.NET Framework的框架非常依赖,并且针对不同平台,很难做到直接拷贝就可以使用(必须要安装),三是没有支持SQLite V2x的版本。

所以最后还是决定用Interop的方式直接访问Win32 的 SQLite.dll。网上搜索了一下,有关于SQLite3的相关示例,SQLite V2x的就没有了。所以先研究了一下SQLite3的接口应用,然后根据C++相关的接口定义,反推了一下SQLite V2x的C#接口。

在Windows .NET Framework平台测试SQLite V2x接口(如下图)没有问题的情况下,才开始进行.NET Micro Framework 平台下的SQLite V2x的移植。
image.png
SQLite V2x .NET Micro Framework移植

理论情况下,只需要对OS.c代码中的接口进行.NET MF的实现即可(标准的OS.c文件已经支持Windows,UNIX、Mac OS平台)。但实际移植发现,远没有这么简单。

(1)、SQLite代码都是标准的C语言,但是OS.c中需要调用.NET MF本身的C++代码操作接口,所以SQLite所有源码的c扩展名一律修改为cpp接口,采用cpp编译器进行编译,但是这样修改后,会出现很多编译错误,大都是类型转换的错误。

(2)、.NET Micro Framework平台不支持(或不建议)直接采用标准的string.h、ctype.h、math.h和stdio.h等头文件定义的函数。.NET Micro Framework代码中已经有部分字符串操作的实现,但是为了实现SQLite的正确编译,还必须自己补全相关操作函数。时间、文件等操作函数,也需要转换为.NET Micro Framework平台下的,或者自己实现。

(3)、内存分配相关函数.NET MicroFramework有两类,一种就是private_开头的函数,另外就是TinyCLR支持的内存操作函数,由于二者使用的堆空间不同(private_开头的操作Custom_Heap,这个一般都比较小),所以我调试的时候采用private_开头的函数,实际应用则是TinyCLR内存操作函数。把SQLite内存相关操作的函数,修改为.NET MicroFramework的。

(4)、由于.NET Micro Framework底层代码对文件的操作相对简单,所以SQLite产生的临时文件,我是在上层C#代码中进行清除的。

(5)、锁操作,.NET MicroFramework底层是无法对文件进行锁定操作的,考虑到.NETMicro Framework本身的特点(单进程,多线程),所以在上层C#代码中进行了简单的锁实现(该锁读写不能同时)。

(6)、SQLite指针应用的非常多,稍有不慎,系统就会出异常,所以在移植过程中,一定要研究透各种接口指针的实际含义(比如定义char *p这类指针,我以前就很少遇到) ,否则调试过程将是一个噩梦。

SQLite.NET MF应用开发

   .NETMF C#接口又进行了封装,一是接口尽可能和System.Data.SQLite.dll兼容,二是做一些必要的内存释放和其它处理(如系统格式化,创建临时目录,磁盘刷新等等)。

   其实对相对简单的嵌入式应用来说,数据库无非就是建表,添加和修改数据,删除,获取表数据而已,而这些功能都可以通过SQL语句进行实现,所以说功能多,但是接口却很简单(如下图所示)。
image.png
测试代码如下:

public  static void Main()

    {

        stringdbPath = "\\ROOT\\mftest.db";

        using (SQLite db = new SQLite(dbPath)) //":memory:"))

        {

            //创建表

            db.ExecuteNonQuery("CREATE TABLE student(id INTEGER, name VARCHAR(20),sex VARCHAR(2));");

 

            //插入数据

            db.ExecuteNonQuery("INSERT INTO student VALUES(1, '小红', '女');");

            db.ExecuteNonQuery("INSERT INTO student VALUES(2, '小李', '男');");

            db.ExecuteNonQuery("INSERT INTO student VALUES(3, '小明', '男');");

 

            //读取表

            YFDataTabletable = db.ExecuteQuery("SELECT * FROMstudent"); // WHERE name = '小李';");

            stringinfo = "";

            foreach(YFColumn col intable.Columns)

            {

                info += col.Name + " ";

            }

            Debug.Print(info);

            foreach(YFDataRow row intable.Rows)

            {

                Debug.Print(row[0].ToString()+ "," + row[1] + "," + row[2]);

            }

        }

        Thread.Sleep(Timeout.Infinite);

    }

运行调试的场景如下图所示:
image.png
 -----------------------------------------------------------------------------------------

MF简介:http://blog.csdn.net/yefanqiu/article/details/5711770

MF资料:http://www.sky-walker.com.cn/News.asp?Id=25

相关硬件: http://www.sky-walker.com.cn/Products.asp?Id=24

相关实践学习
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
9月前
|
存储 算法 安全
.NET 平台 SM2 国密算法 License 证书生成深度解析
授权证书文件的后缀通常取决于其编码格式和具体用途。本文档通过一个示例程序展示了如何在 .NET 平台上使用国密 SM2 算法生成和验证许可证(License)文件。该示例不仅详细演示了 SM2 国密算法的实际应用场景,还提供了关于如何高效处理大规模许可证文件生成任务的技术参考。通过对不同并发策略的性能测试,开发者可以更好地理解如何优化许可证生成流程,以满足高并发和大数据量的需求。 希望这段描述更清晰地传达了程序的功能和技术亮点。
1095 14
.NET 平台 SM2 国密算法 License 证书生成深度解析
|
6月前
|
物联网
(手把手)在华为云、阿里云搭建自己的物联网MQTT消息服务器,免费IOT平台
本文介绍如何在阿里云搭建自己的物联网MQTT消息服务器,并使用 “MQTT客户端调试工具”模拟MQTT设备,接入平台进行消息收发。
2423 42
|
6月前
|
物联网
如何在腾讯云等平台搭建自己的物联网MQTT服务器Broker
物联网技术及MQTT协议被广泛应用于各种场景。本文介绍物联网MQTT服务助手下载,如何搭建自己的物联网平台,并使用 “MQTT客户端调试工具”模拟MQTT设备,接入平台进行消息收发。
544 37
|
存储
【TFT彩屏移植】STM32F4移植1.8寸TFT彩屏简明教程(二)
【TFT彩屏移植】STM32F4移植1.8寸TFT彩屏简明教程(二)
448 0
|
存储 芯片
【TFT彩屏移植】STM32F4移植1.8寸TFT彩屏简明教程(一)
【TFT彩屏移植】STM32F4移植1.8寸TFT彩屏简明教程(一·)
581 0
|
11月前
|
Linux API C#
基于 .NET 开发的多功能流媒体管理控制平台
基于 .NET 开发的多功能流媒体管理控制平台
196 9
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
249 3
|
存储 设计模式 编解码
.NET 8.0 通用管理平台,支持模块化、WinForms 和 WPF
【11月更文挑战第5天】本文分析了.NET 8.0 通用管理平台在模块化、WinForms 和 WPF 方面的优势。模块化设计提升了系统的可维护性和可扩展性,提高了代码复用性;WinForms 提供了丰富的控件库和简单易用的开发模式,技术成熟稳定;WPF 支持强大的数据绑定和 MVVM 模式,具备丰富的图形和动画功能,以及灵活的布局系统。
581 2
|
监控 安全 物联网
物联网:如何对接物联网卡的管理平台
对接物联网平台的API通常涉及几个关键步骤,这些步骤帮助你有效地与平台交互,实现设备数据的收集、处理、分析及控制等功能。以下是一个通用的对接流程:
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
1417 2

相关产品

  • 物联网平台
  • 下一篇
    oss云网关配置