物联网外设管理服务平台

1 开发目标

1.1 架构图

操作系统:基于Linux5.10.10源码和STM32MP157开发板,完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪;

驱动层:为每个外设配置DTS并且单独封装外设驱动模块。其中电压ADC测试,采用linux内核自带的stm32mp-xx驱动。

应用层:在linux环境下,通过xxx、xxx、xxx使用c语言开发一款WebServer,对内访问驱动获取数据或遥控硬件,向外部用户提供restful api访问接口;

1.2 驱动层功能

|--------|-----------|---------------------------------------------------|------------|--------------------------------|
| 序号 | 驱动名称 | 挂载设备 | 技术点 | 备注 |
| 1 | wd_drv | /dev/wd_drv | i2c总线模型 | 同一总线不同地址 |
| 2 | light_drv | /dev/light_drv | i2c总线模型 | 同一总线不同地址 |
| 3 | led_drv | /dev/led_drv | platform模型 | |
| 4 | dd_drv | /dev/dd_drv | spi总线模型 | |
| 5 | key_drv | /dev/key_drv | io信号驱动 | 阻塞式IO获取中断事件; 根据不同按钮事件开关不同的led灯 |
| 6 | 电压测量 | /sys/bus/iio/devices/iio:device0 /in_voltage1_raw | adc数据采集 | |

1.3 应用层功能

|--------|--------|------------------------------|----------------------------------------------------------------------------------------------------------------|
| 序号 | 名称 | api | api描述 |
| 1 | led1控制 | xx.xx.xx.xx:8080/api/led1 | {"value":true} value的值控制灯的亮/灭 |
| 2 | led2控制 | xx.xx.xx.xx:8080/api/led2 | {"value":false} |
| 3 | 数显管控制 | xx.xx.xx.xx:8080/api/dd_show | {"value":"0-温度"} 显示温度,2位小数 {"value":"1-湿度"} 显示湿度,2位小数 {"value":"2-光照"} 显示光照,整数 {"value":"3-电压值"} 显示电压值,整数,单位mV |
| 4 | 获取测量值 | xx.xx.xx.xx:8080/api/state | 返回值: { "voltage": 95.9244, //电压值,单位mV "light": 83, //光照强度 "sd": 54.8788, //湿度 "wd": 24.7079 //温度 } |

2 效果展示(部分)

2.1 webserver的界面效果

PS:并非通过html/css写的,而是通过mongoose官网编辑器生成: Mongoose官网

2.2 驱动模块安装列表

2.3 控制效果展示

(1)在web上,通过点击LED1或LED2的Toggle组件,可以实时控制LED亮灭

(2)在web上,通过下拉框,可以选择当前数显管显示什么内容(例如:温度和电压)

2.4 postman测试restful-api接口(部分)

3 源码

源码地址

iot_drivers: 驱动源码(见git)

webserver: webserver源码(见git)

linux设备树配置(部分):

bash 复制代码
/ {
	myled{  //led设备树
		compatible = "zr,myled";
		led-gpios = <&gpioe 10 0>,<&gpiof 10 0>,<&gpioe 8 0>;
	};

    mykey{  //按键设备树
		interrupt-parent = <&gpiof>;
		interrupts=<9 0>,<7 0>,<8 0>;
	};

};

//基于I2C总线的 温度度传感器树 和 光照传感器设备树
&i2c1{
	pinctrl-names = "default", "sleep";//指定管脚复用的两种不同模式
    pinctrl-0 = <&i2c1_pins_b>;//设置默认模式下的管脚复用
    pinctrl-1 = <&i2c1_sleep_pins_b>;
    i2c-scl-rising-time-ns = <100>;//设置时钟线上升沿的时间
    i2c-scl-falling-time-ns = <7>;
    status = "okay";//状态设置为OKAY
    /delete-property/dmas;  //删除无用的属性
    /delete-property/dma-names;
   	mywd@40{
    	compatible="zr,mywd";
    	reg=<0X40>;
   };

	mylight@1e{
		compatible="zr,mylight";
		reg=<0x1e>;
	};
};

//基于spi总线的 数显管设备树
&spi4{
    pinctrl-names="default","sleep";
    pinctrl-0=<&spi4_pins_b>;
    pinctrl-1=<&spi4_sleep_pins_b>;
    //添加对片选线管脚的描述
    cs-gpios=<&gpioe 11 0>;
    status="okay";
    mydd@0{
        compatible="zr,mydd";
        spi-max-frequency = <10000000>;//设置当前spi工作的最大频率为10M
        reg=<0>;    
    };
};

//基于iio的电压采集设备树
&adc {
	vdd-supply = <&vdd>;
	vdda-supply = <&vdd>;
	vref-supply = <&vdd>;
	status = "okay";
	adc1: adc@0 {
		st,adc-channels = <0 1>;
		st,min-sample-time-nsecs = <10000>;
		status = "okay";
	};
};

4、待探索问题

(1)基于webserver的websocket的实现

(2)pwm、dma、定时器的输入捕获中断驱动的编写

(3)ADC驱动手动编写

相关推荐
腾讯蓝鲸智云30 分钟前
嘉为蓝鲸可观测系列产品入选Gartner《中国智能IT监控与日志分析工具市场指南》
运维·人工智能·信息可视化·自动化
路溪非溪2 小时前
Linux下蓝牙框架的数据流
linux·arm开发·驱动开发
能不能别报错2 小时前
openclaw-linux部署教程+mimo-v2-pro
linux·运维·服务器
小虎卫远程打卡app3 小时前
光通信与视频编码前沿技术综述:从超大容量传输到实时神经网络编码
运维·网络·信息与通信·视频编解码
钛态3 小时前
Flutter for OpenHarmony:mockito 单元测试的替身演员,轻松模拟复杂依赖(测试驱动开发必备) 深度解析与鸿蒙适配指南
服务器·驱动开发·安全·flutter·华为·单元测试·harmonyos
ToB营销学堂3 小时前
B2B营销自动化新解法:MarketUP聚焦高转化场景
大数据·运维·自动化
TK云大师-KK3 小时前
TikTok自动化直播遇到内容重复问题?这套技术方案了解一下
大数据·运维·人工智能·矩阵·自动化·新媒体运营·流量运营
济6173 小时前
ARM Linux 驱动开发篇---基于 pinctrl+GPIO 子系统的蜂鸣器驱动开发(设备树版)--- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
AiGuoHou13 小时前
Debian/Ubuntu 各个版本一键更换国内镜像源
linux·ubuntu·国内源·debian·镜像源·换源
蓝羽天空3 小时前
Ubuntu 24.04 安装 Docker
linux·ubuntu·docker