自言自语-常

  • Home

  • Tags

  • Categories

  • Archives

三百行边缘计算之数据透传(DTU)功能

Posted on 2019-07-13 Edited on 2019-11-04 In freeioe , 300lines

三百行边缘计算系列 — DTU(数据透传)功能开发

什么是三百行边缘计算系列

基于FreeIOE开发一系列完整边缘计算应用,将代码锁定在300行以内。用以展示如何使用FreeIOE快速开发边缘计算应用。

上代码

DTU应用

功能需求

应用只支持一个串口数据透传功能,如透传多个串口,需要多次安装应用。

支持串口配置

  • 支持串口参数配置,如波特率,数据位,停止位等等。
  • 支持可视化配置(安利一下冬笋云的可视化配置面板功能,文档

支持TCP客户端和服务端模式

二选一模式,并不支持两种并存。

支持客户端模式

  • 可配置服务器地址和端口
  • 连接失败、被断开后要重连
  • 统计本次连接的收发字节数

支持服务器模式

  • 可配置本地监听地址和端口(默认是0.0.0.0,即所有网卡)
  • 有新客户端连接后,踢掉之前的连接,保证只有一个客户端能进行数据首发
  • 统计当前活跃客户端的首发字节数

功能设计

串口读写

这里我们选择 FreeIOE内置的模块 SerialDriver 来进行串口读写。具体接口文档请参考

网络读写

FreeIOE的底层框架是Skynet,所以我们可以直接使用Skynet底层的socket操作模块。文档在此

代码实现

应用基础类

可以叫基础类吧,毕竟我是C艹程序员。上文档

我们需要实现的接口只有:

  1. initialize: 初始化
  2. on_start: 打开串口、发起连接/监听端口
  3. on_close: 关闭连接和串口
  4. on_run: 统计数据透传字节数

initialize, on_close, on_run这些就不罗嗦了,看代码就好,很简单。重点讲on_start函数。

on_start做了什么?

  • 创建透传数据依赖的设备模型实例
  • 根据配置打开串口
  • 设定串口数据接收处理函数
  • 开启TCP连接/监听

串口数据接收监听

1
2
3
port:start(function(data, err)
...
end)

这里设定的数据接收回调有两个参数: data, err
data是接收到的数据流,为空时说明发生了串口错误
err是串口错误信息

遇到串口错误怎么处理? 当然是不处理(老板扣工资ing…)
这里应该做的是发送设备事件,让用户知道这个错误,并重启应用自身(参考应用开发手册)。如此老板会给你加薪的!!!

这部分代码只需要实现:

* 检测一下连接是否存在,存在就将数据流发往socket。
* 调用dump_comm保证调试时能看到数据流

网络连接(客户端 )

无论是Client还是Server模式,这里都做了一个重启链接的方法 function app:connect_proc

主要逻辑是递增式发起连接/监听请求,直到成功为止。 发起连接的时间间隔是不停的×2,来增加间隔时间,当然最大时间间隔不超过64秒。

而客户端模式只需要调用socket.open函数,调用成功后就转入watch_client_socket函数,进行无限制的数据接手并写入串口句柄。

网络监听(服务器)

服务方式要先进行端口监听,即调用socket.listen函数。 listen成功后调用socket.start(fd, function(fd, addr) end) 对连接进来的客户端进行处理。

这里要特别注意进来的客户端fd, 要调用一次socket.start(fd), 让本应用来处理这个客户端句柄的数据流(skynet的设计机制是可以将这个句柄传输给其他服务进程,从而让另外一个服务进程处理数据流)。

服务器模式的下的watch_server_socket比客户端复杂的地方在于需要同时检测监听用的句柄和当然客户端句柄。

完善

这个应用本身只是做了一个简单的透传应用,逻辑也只是无限制透明传输,甚至服务器模式处理新连接的方式也只有踢掉前一个连接。因此如果想将这个应用做的更好:

  1. 支持更多配置参数(Socket心跳,限制客户端登入地址,限制重连次数)
  2. 支持简单的包解析(包头、包尾)
  3. 支持安全认证

Three Ways to Use Android NDK Cross Compiler

Posted on 2019-02-28 In android

Three Ways to Use Android NDK Cross Compiler

http://zwyuan.github.io/2015/12/22/three-ways-to-use-android-ndk-cross-compiler/

OpenWRT GPIO 按键绑定

Posted on 2019-01-30 In openwrt

OpenWRT GPIO Button

GPIO Button

OpenWRT gpio button有两种方式:

  1. 普通gpio-keys/gpio-key-polled按键
    这种相当于普通键盘事件
  2. 启用gpio-button-hotplug
    OpenWRT会将按键事件触发为hotplug事件,从而procd就可以接收事件从而运行/etc/rc.button下对应的脚本。 使用netlink转发按键事件到procd还是比较麻烦的,gpio-button-hotplug算是比较直接的方式。

gpio-keys 和 gpio-key-polled

使用此方法映射按键,需要去make menuconfig中的Kernel Modules->Input Modules里面选中对应的选项。而此后在/dev/input下就会出现event<n>文件

gpio-button-hotplug 按键映射

OpenWRT的gpio-button-hotplug提供了以下按键的映射,即按键code对应的脚本文件名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

#define BH_MAP(_code, _name) \
{ \
.code = (_code), \
.name = (_name), \
}

static struct bh_map button_map[] = {
BH_MAP(BTN_0, "BTN_0"),
BH_MAP(BTN_1, "BTN_1"),
BH_MAP(BTN_2, "BTN_2"),
BH_MAP(BTN_3, "BTN_3"),
BH_MAP(BTN_4, "BTN_4"),
BH_MAP(BTN_5, "BTN_5"),
BH_MAP(BTN_6, "BTN_6"),
BH_MAP(BTN_7, "BTN_7"),
BH_MAP(BTN_8, "BTN_8"),
BH_MAP(BTN_9, "BTN_9"),
BH_MAP(KEY_BRIGHTNESS_ZERO, "brightness_zero"),
BH_MAP(KEY_CONFIG, "config"),
BH_MAP(KEY_COPY, "copy"),
BH_MAP(KEY_EJECTCD, "eject"),
BH_MAP(KEY_HELP, "help"),
BH_MAP(KEY_LIGHTS_TOGGLE, "lights_toggle"),
BH_MAP(KEY_PHONE, "phone"),
BH_MAP(KEY_POWER, "power"),
BH_MAP(KEY_RESTART, "reset"),
BH_MAP(KEY_RFKILL, "rfkill"),
BH_MAP(KEY_VIDEO, "video"),
BH_MAP(KEY_WIMAX, "wwan"),
BH_MAP(KEY_WLAN, "wlan"),
BH_MAP(KEY_WPS_BUTTON, "wps"),
};

问题

在折腾OrangePi One设备按键的时候,浪费了将近两天的时间在gpio-button-hotplug不起作用上。 原因是package的dependency并不会强制使kmod模块被开启,我的config文件是从树莓派的config文件修改而来,导致即使有了

1
CONFIG_DEFAULT_kmod-gpio-button-hotplug=y

也不代表下面这个被选中

1
CONFIG_PACKAGE_kmod-gpio-button-hotplug=y

两天的大好时光啊~~

Orange Pi One First Day

Posted on 2019-01-27 Edited on 2019-01-30 In openwrt , orangepi

Orange Pi One 上手日记

Why Orange Pi One

刚刚入手OrangePi One,主要目标是选定一款国内设计生产的单板机,方便19年的市场宣传。

手头也弄好了树莓派3B+,OpenWRT的编译也做过了,WIFI驱动缺少的bin文件什么的(更新了一下openwrt master,这部分已经集成无需再折腾)。其实我并不满意树莓派,主要是串口太少,默认也没启用调试串口(虽然可以通过显示器来显示信息)。这对于FreeIOE来说是个天生的不足,使用扩展卡不利于做市场宣传。

国内不少单板机,BananaPi, NanoPi等等。最终选择OrangePi的原因是他的板子价格诚意更高,社区资料也算国内比较完善的,CPU是全志的,也能算得上鼓励国产?

亮照

OrangePi One 包装盒

OrangePi One 和树莓派3B+

移植OpenWRT 18.06

OrangePi PC固件

OrangePi PC固件是能让OrangePi One跑起来的,直接make menuconfig时选择Orange Pi PC即可编译生成镜像文件。(直接解压ext4的img文件,然后dd到tf卡上即可)

OrangePi One专属固件

One和Pc还是有一些差别的,比如电源芯片部分PC用的是SY8106A,同时从sunxi的uboot configs里面看到CONFIG_DRAM_CLK也不一致。

http://linux-sunxi.org/Table_of_Allwinner_based_boards

OpenWRT的改动:

  1. u-boot
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--- a/package/boot/uboot-sunxi/Makefile
+++ b/package/boot/uboot-sunxi/Makefile
@@ -156,6 +156,12 @@ define U-Boot/orangepi_pc
BUILD_DEVICES:=sun8i-h3-orangepi-pc
endef

+define U-Boot/orangepi_one
+ BUILD_SUBTARGET:=cortexa7
+ NAME:=Orange Pi One (H3)
+ BUILD_DEVICES:=sun8i-h3-orangepi-one
+endef
+
define U-Boot/orangepi_plus
BUILD_SUBTARGET:=cortexa7
NAME:=Orange Pi Plus (H3)
@@ -231,6 +237,7 @@ UBOOT_TARGETS := \
nanopi_neo_plus2 \
orangepi_r1 \
orangepi_pc \
+ orangepi_one \
orangepi_plus \
orangepi_2 \
pangolin \
  1. target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--- a/target/linux/sunxi/image/cortex-a7.mk
+++ b/target/linux/sunxi/image/cortex-a7.mk
@@ -149,6 +149,16 @@ endef
TARGET_DEVICES += sun8i-h3-orangepi-pc


+define Device/sun8i-h3-orangepi-one
+ DEVICE_TITLE:=Xunlong Orange Pi One
+ DEVICE_PACKAGES:=kmod-rtc-sunxi kmod-gpio-button-hotplug
+ SUPPORTED_DEVICES:=xunlong,orangepi-one
+ SUNXI_DTS:=sun8i-h3-orangepi-one
+endef
+
+TARGET_DEVICES += sun8i-h3-orangepi-one
+
+
define Device/sun8i-h3-orangepi-plus
DEVICE_TITLE:=Xunlong Orange Pi Plus
DEVICE_PACKAGES:=kmod-rtc-sunxi
  1. 串口启用(非必要)

以下是 patches-4.14/900-ARM-dts-sun8i-kooiot-Orange-Pi-One.patch 文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
--- a/arch/arm/boot/dts/sun8i-h3-orangepi-one.dts
--- b/arch/arm/boot/dts/sun8i-h3-orangepi-one.dts
@@ -84,7 +84,7 @@

sw4 {
label = "sw4";
- linux,code = <BTN_0>;
+ linux,code = <KEY_RESTART>;
gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
};
};
@@ -156,19 +156,19 @@
&uart1 {
pinctrl-names = "default";
pinctrl-0 = <&uart1_pins>;
- status = "disabled";
+ status = "okay";
};

&uart2 {
pinctrl-names = "default";
pinctrl-0 = <&uart2_pins>;
- status = "disabled";
+ status = "okay";
};

&uart3 {
pinctrl-names = "default";
pinctrl-0 = <&uart3_pins>;
- status = "disabled";
+ status = "okay";
};

&usb_otg {

至此make menuconfig并选中ext4镜像文件,之后就是等电脑干活了 -.-

镜像下载地址

百度网盘下载地址

TODO

  1. 重启键

重启按键绑定到KEY_RESTART也并没有启作用,这几天再研究一下。

[2019-01-30 补充]
由于config文件是从其他配置修改而来,导致kmod-gpio-button-hotplug并没有选中(CONFIG_PACKAGE_kmod-gpio-button-hotplug=y)。而选中此选项后,才能保证按键会正确触发/etc/rc.button中的脚本。

我已经将sw4案件改名为power,按下会让OrangePi One关机。(网盘镜像已经更新,如需指向其他案件脚本: 1. dts中改名 2. 更改/etc/rc.button/power脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--- a/arch/arm/boot/dts/sun8i-h3-orangepi-one.dts
--- b/arch/arm/boot/dts/sun8i-h3-orangepi-one.dts
@@ -82,9 +82,9 @@
pinctrl-names = "default";
pinctrl-0 = <&sw_r_opc>;

- sw4 {
- label = "sw4";
- linux,code = <BTN_0>;
+ power {
+ label = "power";
+ linux,code = <KEY_POWER>;
gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
};
};

FreeIOE 开源物联网智能网关项目

Posted on 2018-12-28 Edited on 2019-01-28 In freeioe

什么是FreeIOE

FreeIOE 是一个开源的物联网智能网关框架,方便用户快速构建物联网智能网关产品。

特点

  • 基于 Skynet 框架
    纯C语言的高扩展性框架,极少的系统依赖、方便快速移植
  • Lua 语言开发应用
    高效、灵活、跨平台的物联网应用开发
  • 集成云服务 - 冬笋云
    冬笋云提供FreeIOE网关的管理维护以及应用中心服务
  • 极简的设备模型
    低门槛、高扩展的设备模型
  • 丰富的开发方式
    设备在线开发、平台在线开发、VSCode开发插件
  • 丰富的调试信息
    应用日志、通讯报文的平台化支持

适用场景

  • 数据采集
    从电表、PLC、CNC等具备数据接口的设备收集设备运行/现场数据
  • 边缘计算
    在网关中进行业务数据逻辑运算,事件报警、自动控制等功能
  • 远程控制
    远程操作、控制现场设备
  • 远程维护
    远程设定现场设备流程、参数
  • 系统集成
    接入数据平台、云平台。如:
    • 阿里云
    • 百度云
    • 华为云
    • 冬笋云
  • 设备智能
    基于公众数据的智能化。如天气信息、地址位置、阶梯电价等等公众数据进行智能化生产

历程

在12年的时候,进入了旋思科技,踏入了工业自动化的圈子。感叹工业圈子技术落后的同时,萌发构建全新网关产品的想法。跟viccom童鞋在想法上相互学习了的很多。

于13年下半年开启构建全新网关产品,使用了lua多进程+zmq内部通讯的机制搭建了所谓的symlink v3产品,实现一些产品的想法,也完成了基础的配套平台的demo。奈何工业物联网市场在国内当时并未获得认可,这款产品匆匆结束了它的使命。 虽然后来也默默做了一些东西,但由于其架构的基础并不算稳定,我也失去了对其进行进一步开发的想法。代码在GoIoT项目

之后接触了云风的skynet项目(其实很久之前就知道这个项目,一直都并未花时间去了解),并用skynet开发了一款视频监控中GB28181的网关项目。所以在17年回归旋思科技之后,坚定了使用skynet重新打造智能网关产品的想法,于是有了FreeIOE项目的诞生。

而冬笋云最早是为了构造一个工业数据云平台,是为了一个储能项目构建的。技术调研后,决定使用ERPNext作为基础进行开发(储能项目有很大一部分需要erp的功能),而ERPNext项目的好处是他有一个基础框架Frappe。

通过了将近两年的时间,和viccom 联手打造了 FreeIOE + ThingsRoot Cloud的全新工业物联网解决方案。

FreeIOE 文档

Posted on 2018-12-28 Edited on 2019-01-28 In freeioe , document

文档

应用开发指南

  • 应用开发指南

Dirk Chang

6 posts
6 categories
8 tags
© 2019 Dirk Chang
Powered by Hexo v3.8.0
|
Theme – NexT.Pisces v7.2.0
0%