如何正确的使用开源物联网系统 - MIVMS

如何正确的使用开源物联网系统 - MIVMS

如何正确的使用开源物联网系统 - MIVMS

 

MIVMS,全称为Mole intelligent vending machine system,为什么要取名为Mole,mole也就是鼹鼠,这和笔者看过的一部动画短片有关,短片名字叫Big Buck Bunny,是用开源动画软件Blender制作的,那里面有一只鼹鼠给我留下深刻影像,那贱贱的玩世不恭的小眼神顿时吸引了我,因此我把这套开源物联网系统取名为MIVMS,也是希望这套系统能有那么一点点与众不同。

项目地址:

https://gitee.com/akinggw/MIVMS/tree/master/f1c100s-rtt

这套东西很多,基本涉及到物联网的方方面面,我就不一一讲解,我们这篇文章中主要讲解关于基于全志f1c100s芯片上rt-thread系统的使用。

全志f1c100s是一颗性价比非常高的多媒体芯片,拥有32m的内存,但价格才8元左右,这么大的内存,能够让我们干许多有趣的事情。

rt-thread是一个rtos,也就是实时操作系统,是一个完全国产,功能全面,结构简单的系统。

我们的MIVMS就是基于他们基础之上编写而成,以便于更加简单高效的应用于物联网运用。

 

废话少说,让我们把系统跑起来吧

 

首先,要运行MIVMS,首先你需要购买一个f1c100s开发板,淘宝上可选的有2种,荔枝派nano大概36左右,widora tiny200,价格在50左右,另外最好能购买一块支持gt911触摸驱动,分辨率在800X480的电容触摸屏。最后因为我们的系统需要联网才能工作,因此,你还需要一个wifi芯片,建议购买nodemcu,或者其它基于esp8266的开发板。

首先nodemcu如果没有烧写固件,建议先烧写,固件和烧写工具在tools目录下:


esp8266_at_bin_v1.5.1_0.zip - 固件

ESP32-CAM烧录工具.rar - 烧写工具

烧写的文档在doc/esp8266下,按照文档所示进行烧写就可以了。

然后就是烧写MIVMS,MIVMS的烧写工具在tools下:

sunxi-tools-win32_f1_flash.zip

首先,先下载系统到本地:

git clone https://gitee.com/akinggw/MIVMS/

先烧写bootloader,bootloader在目录f1c100s-rtt/f1c100s_spl目录下的boot.bin。

烧写语句:

sunxi-fel -p spiflash-write 0x00000000 ../f1c100s_spl/boot.bin

我们这里使用了widora tiny200,它的进入烧写模式,是先按住BOOT按钮,然后再按下RESET按钮,然后再依次松开RESET按钮和BOOT按钮。

bootloader烧写完成后,我们再烧写主体程序固件,在目录
f1c100s-rtt/rt-thread/rtthread.bin。

烧写语句:

sunxi-fel -p spiflash-write 0x00010000 rtthread.bin

如果一切顺利,我们的系统就烧写完成了。

先照下图所示,将esp8266和widora tiny200进行连接:

如何正确的使用开源物联网系统 - MIVMS

 

然后,我们可以打开手机建立一个wifi热点,记住热点名称和密码,然后在widora tiny200上插入普通手机数据线,上电启动。

启动后会显示系统logo,如图所示:

如何正确的使用开源物联网系统 - MIVMS

 

然后开始连接wifi,第一次使用系统并没有保存wifi的信息,所以稍等几秒,会自动进入wifi设置,如图所示:

如何正确的使用开源物联网系统 - MIVMS

 

设置好你手机热点的wifi名称和密码后,系统将重启。然后会重新进入上面的页面,如果wifi连接成功后,系统会自动下载网站上的脚本文件,然后进行执行,因为这里的固件使用的是我的服务器,因此界面会显示一些我测试系统的东西。

如何正确的使用开源物联网系统 - MIVMS

 

如何烧写你自己的固件

先按照系统提供的文档搭建编译环境:

https://gitee.com/akinggw/MIVMS/tree/master/f1c100s-rtt

你最好先租一台vps,建立一个网站,然后上传f1c100s-rtt/lua_demo目录下main.lua文件到你的vps网站中,然后在rt-thread系统下进行配置,打开
f1c100s-rtt/rt-thread/rtconfig.h文件,然后搜索HTTP_LUA_URL。

然后设置成你的网站目录,比如像下面这样:

http://www.demo.cn/Public/main.lua

另外,我们这里rt-thread并没有支持https,只支持http。

你可以拷贝我们系统提供的一些测试代码到这个main.lua文件中进行测试,我们提供了许多功能的测试代码,都在f1c100s-rtt/lua_demo目录下。

一些系统控制命令

为了更方便的开发和调试程序,我们系统了一些基于mqtt的命令:

ota -- 用于更新系统固件

reset -- 重置系统固件,这里什么意思,比如你更新了系统固件,使用这个命令后,就会使用初始烧录的系统

restart -- 重新启动系统

lua -- 重新下载和启动脚本

这些系统的使用方法如下:

mosquitto_pub -h mq.tongxinmao.com -p 18830 -t /mqtt/system -m restart

lua 这个命令在我们修改脚本时非常有用,比如我们在网站上修改lua脚本后,就可以使用这个命令,让单片机重新下载和执行脚本。

这样就可以避免单片机反复烧录,另外这种方式对于远程修改系统需求和更改系统bug也非常有用。

系统使用和程序结构

笔者在设计MIVMS之前,有一段使用arduino的经验,arduino的系统结构给笔者留下了深刻的印象,因此我在设计MIVMS时也参考了arduino的这种程序结构,将arduino的这种简单使用的方法带入到MIVMS中。

下面我们来看一个点灯程序:

GPIO_PORT_A = 0;
GPIO_PIN_0 = 0;
IO_INPUT = 0;
IO_OUTPUT = 1;
function setup()
    sys.println("gpio test.",0);
    gpio.pinMode(GPIO_PORT_A,GPIO_PIN_0,IO_OUTPUT);    
end 
function loop()
    gpio.digitalWrite(GPIO_PORT_A,GPIO_PIN_0,IO_OUTPUT);
    sys.delay(1000);    
    gpio.digitalWrite(GPIO_PORT_A,GPIO_PIN_0,IO_INPUT);
    sys.delay(1000); 
end 

和ardunio一样,我们的程序主结构也有两个函数,setup和loop。

setup用于系统一些资源的加载和一些系统配置。

loop是消息主循环

在上面这个程序中,sys.println用于换行打印日志,第二个参数表示是否要把日志通过mqtt发送,这个功能很有用,比如你要修改一台已经运营的机器,你不可能到现场去修改把,通过这个功能,日志会通过网络传送到本地进行查看。查看日志的命令如下:

mosquitto_sub -h mq.tongxinmao.com -p 18830 -t /mqtt/debug

sys.println还有另外一个命令sys.print是不换行输出。这里和arduino差不多,只是多了一个网络功能。

gpio.pinMode(GPIO_PORT_A,GPIO_PIN_0,IO_OUTPUT);

设置引脚0为输出,如果你接一个led,就可以查看到效果,led一闪一闪的。

以上是最基本的功能,下面我们再来看看mqtt的使用,代码如下:

function mqtt_sub_callback(topic_name,payload)
    sys.println(topic_name..":"..payload,0);
    if(payload == "test")
    then
        mqtt.Public("/mqtt/test","hello,the world!",0);
    end
end
function setup()
    sys.println("mqtt test.",0);
    mqtt.Subscribe("/mqtt/test",0,mqtt_sub_callback);
end 
function loop()
    sys.delay(1000);
end 

代码也非常简单,除了setup和loop函数外,我们有多了一个mqtt_sub_callback函数,这是一个回调函数,我们订阅一个mqtt消息时可以设置它的回调函数,比如这里代码:

mqtt.Subscribe("/mqtt/test",0,mqtt_sub_callback);

"/mqtt/test"就是我们订阅的消息,第二个参数是这个消息的质量,可以设置0,1,2三种质量。mqtt_sub_callback就是这个消息的回调,当我们收到这个消息时,消息就会到达这里进行处理。

function mqtt_sub_callback(topic_name,payload)

topic_name - 我们订阅的消息

payload - 消息内容

我们这里的代码是,我们订阅消息"/mqtt/test",如果我们收到"test"消息,就返回一个消息回去。

最后,我们再展示gui的一个使用例子:

button1 = -1;
button2 = -1;
imgbtnres = -1;
HIDDEN = 0;
SHOW = 1;
    
function btn_event(objindex,event)
    if(event == 6)
    then
        sys.println(objindex..":"..event,0);
        if(objindex == button1)
        then
            gui.addMsgbox("你点到普通按钮了"); 
        elseif(objindex == button2)  
        then 
            gui.addMsgbox("你点到图形按钮了");             
        end
    end
end   
function setup()
    sys.println("gui btn test.",0);
    gui.setStatus(1,"正在加载资源,请稍后...");
    sys.delay(10);
    imgbtnres = gui.addImgres("http://www.51sccy.cn/Public/logo.png",-1);
    sys.delay(10);
    button1 = gui.addButton("测试按钮",0,50,100,HIDDEN,btn_event);
    gui.setSize(button1,150,30);
    button2 = gui.addImgbtn(imgbtnres,imgbtnres,0,250,100,HIDDEN,btn_event);
    --gui.setSize(button1,150,30);
    gui.setStatus(0,"");
    gui.setDisplay(button1,SHOW); 
    gui.setDisplay(button2,SHOW);     
end 
function loop()  
    sys.delay(10);
end 

这里,我们使用了最常用的按钮控件来进行演示,按钮控件分成普通按钮和图像按钮,我们下面来详细看看代码。

gui.setStatus(1,"正在加载资源,请稍后...");

显示一个状态消息

sys.delay(10);

延时10个tick

imgbtnres = gui.addImgres("http://www.51sccy.cn/Public/logo.png",-1);

从指定网站下载图片,第一个参数是网络图片的下载地址,第一个参数是指定的索引,这个参数一般情况下设置成-1,它只有当和删除图片资源配合时才能使用,否则有内存泄露的风险,请小心使用。

图片资源加载成功后,就返回一个图片资源的索引ID。

另外值得注意的是,我们的控件数量和图片资源数量最大只支持100个,当然这个可调,具体请看代码。

button1 = gui.addButton("测试按钮",0,50,100,HIDDEN,btn_event);

然后添加一个普通按钮,第一个参数是按钮名字,第二个参数表示按钮是否为toggle按钮,一般情况设置成0,第三第四个参数是显示位置,第五个参数是表示是否添加后就显示,第六个参数是事件回调函数。

按钮建立成功后返回控件索引ID。

button2 = gui.addImgbtn(imgbtnres,imgbtnres,0,250,100,HIDDEN,btn_event);

然后添加图像按钮,唯一不同的是前两个参数,分别表示正常和按下后显示的图片索引ID。

gui.setStatus(0,"");

gui.setDisplay(button1,SHOW);

gui.setDisplay(button2,SHOW);

然后隐藏状态消息,把所有按钮显示出来。

我们来看看事件回调函数:

function btn_event(objindex,event)
    if(event == 6)
    then
        sys.println(objindex..":"..event,0);
        if(objindex == button1)
        then
            gui.addMsgbox("你点到普通按钮了"); 
        elseif(objindex == button2)  
        then 
            gui.addMsgbox("你点到图形按钮了");             
        end
    end
end   

objindex就是我们前面建立的控件的索引ID,event是事件ID,关于event的解析,请参考代码或者littlevgl,littlevgl是一个成熟的开源的GUI库,可以去它的官网查看文档。

我们这里代码的解释是,你点击某个按钮就弹一个相应的消息框出来。

从以上这些代码可以看出,我们的系统使用非常的简单,感觉比ardunio还要简单,有莫有。

当然,MIVMS拥有的功能还有很多,需要你慢慢去发现。

系统不足和一些远景规划

系统可能还存在一些未知的bug,当然这些bug,我们会在后期的运用中慢慢修改。

另外,系统不支持音频,视频,摄像头等等东西,这些也需要在后期增加。

最后祝你游戏愉快!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JetLinks开源物联网平台基于Java8、Spring Boot 2.x、WebFlux、Netty、Vert.x、Reactor等开发,是一个开箱即用,可二次开发的企业级物联网基础平台。平台实现了物联网相关的众多基础功能,能帮助你快速建立物联网相关业务系统。 JetLinks开源物联网平台核心特性: 支持统一物模型管理,多种设备,多种厂家,统一管理。 统一设备连接管理,多协议适配(TCP、MQTT、UDP、CoAP、HTTP等),屏蔽网络编程复杂性,灵活接入不同厂家不同协议的设备。 灵活的规则引擎,设备告警,消息通知,数据转发。可基于SQL进行复杂的数据处理逻辑。 地理位置:统一管理地理位置信息,支持区域搜索。 数据可视化:实现拖拽配置数据图表,设备组态等。 JetLinks开源物联网平台技术栈: Spring Boot 2.2.x Spring WebFlux 响应式Web支持 R2DBC 响应式关系型数据库驱动 Project Reactor 响应式编程框架 Netty、Vert.x 高性能网络编程框架 ElasticSearch 全文检索,日志,时序数据存储 PostgreSQL 业务功能数据管理 hsweb framework 4 业务功能基础框架     JetLinks开源物联网平台 更新日志: v1.9 1、增加设备独立物模型支持,可给单独的设备配置物模型. 2、基本实现GB28181国标视频设备接入,支持直播,云台控制,级联操作.(选配模块) 3、RabbitMQ增加routeKey配置,可在配置文件中指定device.message.writer.rabbitmq.consumer-route-key和device.message.writer.rabbitmq.producer-route-key.(Pro) 4、当设置了device.message.writer.rabbitmq.consumer=false时,不创建MQ消费者.(Pro) 5、设备支持独立物模型,可单独配置设备的物模型. 6、适配tdengine 2.0.16.0,优化sql长度策略. (pro) 7、优化规则引擎编辑器,实现组件模块化动态加载.(Pro) 8、修复启动服务时,如果某个产品物模型发布失败,导致后面的产品终止发布的问题. 9、增加ignoreLatest消息头,message.addHeader("ignoreLatest",true) 忽略记录最新数据到数据库. 10、修复租户下操作设备告警提示无权限.(Pro) 11、优化租户在解绑成员时,同时解绑成员的资产信息.(Pro) 12、优化子设备消息回复处理 13、物模型属性增加存储方式功能,可配置部分属性不存储. 14、增加虚拟属性功能,可通过规则来计算出虚拟属性值.(Pro) 15、增加租户成员绑定(TenantMemberBindEvent),解绑(TenantMemberUnBindEvent)事件.可通过spring-event订阅处理此事件.(Pro) 16、优化子设备状态检查,当检查子设备状态时,将会尝试发送ChildDeviceMessage<DeviceStateCheckMessage>给网关,处理后返回ChildDeviceMessageReply<DeviceStateCheckMessageReply>. 17、增加ClickHouse设备数据存储策略支持.(Pro) 18、增加权限过滤功能,可配置禁止赋予自己没有的权限给其他用户.hsweb.permission.filter相关配置 19、设备和产品的租户绑定逻辑优化: 绑定设备时,自动绑定产品.解绑产品时,自动解绑设备.(Pro) 20、用户管理增加租户权限控制.(Pro) 21、当向keepOnline的设备发送消息时,如果原始连接已断开,将返回CONNECTION_LOST错误. 22、设置keepOnline的会话将被持久化,重启服务后自动恢复.(Pro) 23、默认关闭设备最新数据存储,通过jetlinks.device.storage.enable-last-data-in-db=true开启.(Pro) 24、属性物模型增加属性值来源,配置为手动时,在发送修改属性指令(WritePropertyMessage)时,将直接生效,不会发送到设备. 25、优化租户资产解绑逻辑,当删除数据时,解绑资产全部的绑定关系.(Pro) 26、用户管理,机构管理增加租户端支持,租户可以自己管理自己的用户和机构.(Pro)
产品特性 • 高性能、低功耗的 8 位AVR® 微处理器 • 先进的RISC 结构 – 130 条指令 – 大多数指令执行时间为单个时钟周期 – 32个8 位通用工作寄存器 – 全静态工作 – 工作于16 MHz 时性能高达16 MIPS – 只需两个时钟周期的硬件乘法器 • 非易失性程序和数据存储器 – 8K 字节的系统内可编程Flash 擦写寿命: 10,000 次 – 具有独立锁定位的可选Boot 代码区 通过片上Boot 程序实现系统内编程 真正的同时读写操作 – 512 字节的EEPROM 擦写寿命: 100,000 次 – 1K字节的片内SRAM – 可以对锁定位进行编程以实现用户程序的加密 • 外设特点 – 两个具有独立预分频器8 位定时器/ 计数器, 其中之一有比较功能 – 一个具有预分频器、比较功能和捕捉功能的16 位定时器/ 计数器 – 具有独立振荡器的实时计数器RTC – 三通道PWM – TQFP与MLF 封装的8 路ADC 8 路10 位ADC – PDIP封装的6 路ADC 8 路10 位ADC – 面向字节的两线接口 – 两个可编程的串行USART – 可工作于主机/ 从机模式的SPI 串行接口 – 具有独立片内振荡器的可编程看门狗定时器 – 片内模拟比较器 • 特殊的处理器特点 – 上电复位以及可编程的掉电检测 – 片内经过标定的RC 振荡器 – 片内/ 片外中断源 – 5种睡眠模式: 空闲模式、ADC 噪声抑制模式、省电模式、掉电模式及Standby 模式 • I/O 和封装 – 23个可编程的I/O 口 – 28引脚PDIP 封装,32 引脚TQFP 封装,32 引脚MLF 封装 • 工作电压 – 2.7 - 5.5V (ATmega8L) – 4.5 - 5.5V (ATmega8) • 速度等级 – 0 - 8 MHz (ATmega8L) – 0 - 16 MHz (ATmega8) • 4 Mhz 时功耗, 3V, 25°C – 工作模式: 3.6 mA – 空闲模式: 1.0 mA – 掉电模式: 0.5 μA

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值